如何构建 Arduino 能源监视器和数据记录器
组件和用品
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 |
关于这个项目
(这篇文章基于 2017 年 9 月 19 日首次发布在 Medium 上的一篇文章,并在此处进行了更新和更新,包括在 GitHub 上发布的库和示例的详细信息)。
在这篇文章中,我将向您展示我如何构建 Arduino 能量监视器和数据记录器,它可以帮助我轻松收集不同负载的电流和能量数据,并使用 Excel 等程序绘制该信息。

你们中的一些人可能知道我已经创建了一个新的能源监控分线板,我称之为 Wattson 博士(它基于#Microchip #MCP39F521,一个电源监控 IC)以及一个 #Arduino 库和 #Python 库(适用于#RaspberryPi 和#BeagleBoneBlack 等电路板),以便将优质能源数据轻松集成到您的下一个项目中!如果您还没有听说过它并想了解更多信息,请查看 https://upbeatlabs-wattson.launchrock.com/ 了解更多信息。它也可以在 Tindie 上找到。
为了帮助我研究不同负载的能量特性,我继续创建了一个 Arduino 能量监视器和数据记录器,这就是本文的主题!
它包括一个 Arduino(当然!)与 Dr. Wattson 板对话以获取能量数据,以及一个用于写入数据的 SD 卡。我还添加了一个按钮来切换数据记录,以及一个 LED 指示灯以显示何时记录数据。当我插入适当的负载时,按钮和 LED 使启动数据记录变得非常容易。
为了方便日志记录和后续分析,我还实现了日志轮换方案,因此每次运行都会记录到不同的文件中。输出为 CSV 格式,这意味着它可以轻松导入 Excel(或 Mac 上的 Numbers 或其他等效文件),并绘制数据。

设置
我将 Dr. Wattson 电路板放在亚克力外壳中,这样就可以封闭交流电线,您可以安全地使用它!像这样:

后来我稍微更新了外壳,现在可以在 Tindie 上找到它。这就是现在的样子。使用额外的 IEC 插座和铲形连接器进行了更多清理,以便于连接。


我准备了一份用户手册,展示了如何完成接线,现在可以在 GitHub 上找到。
来自 Wattson 博士的数字输出与电源完全隔离,因为能量测量是使用电流和电压互感器以隔离方式完成的,因此数字输出非常安全。
进入外壳后,您所需要做的就是将电缆插入现有的插座,然后将任何设备插入外壳上的插座 — PCB 设计用于高达 12A 的电流,因此它的构造非常好!它经过校准以测量高达 4A 的电流(因此我可以测量非常小的电流以测量待机功率 — 它所基于的 MCP39F521 芯片具有 4000:1 的动态比,这意味着它可以测量从 4A 到 1mA 的电流)

电路
这是我使用的电路:
我使用了一个类似于 Adafruit 的 SD 卡突破(所以我在 Fritzing 中使用了它,因为那是最接近的部分)。连接非常标准 — CLK(Arduino Uno pin 13)、MISO(Arduino Uno pin 12)、MOSI(Arduino Uno pin 11)和CS(芯片选择)。 CS 是可配置的,尽管它默认为硬件 CS 的引脚 10 — 我只是使用它。
对于按钮,我使用了 Jack Christensen 的 Button 库,它在一个易于使用的包中提供了去抖动和各种有用的东西。 (https://github.com/JChristensen/Button)。按钮使用Arduino的内部上拉,所以它没有任何外部上拉,也使用反相逻辑(高为OFF,低为ON) — 所有这些都可以配置为按钮构造函数的参数!我已将按钮连接到引脚 4,但您可以使用任何您喜欢的可用引脚。
我真的没有时间和耐心将 Dr. Wattson 建模为 Fritzing 的新角色,所以我作弊,并使用了 Z-HUT 的建议 毫不费力地轻松制作自定义零件。我强烈推荐观看! https://www.youtube.com/watch?v=dfxx8wF3Uhs — 谢谢Z-HUT ! :-)
唯一的缺点是我必须满足于使用我修改后代表 Wattson 博士的“通用 IC”部分的面包板图像。 C'est la vie!
下面是 Wattson 博士的针脚(从左到右):
- SCL — 用于I2C通信,转到Arduino Uno A5
- SDA — 用于I2C通信,转到Arduino Uno A4
- ZCD — 零交叉检测 — 我们在本示例中不使用此功能
- 事件 — 事件指示器 — 我们在这个例子中没有使用这个特性
- GND — 连接到Arduino GND
- VIN — 连接到Arduino 5V
- 3.3v — 连接到Arduino 3.3v
- GND — 连接到Arduino GND(你只需要连接一个GND引脚)

素描
好的,现在开始实际编程!
让我先从解释草图开始。在 setup() 中,我首先通过调用各自的 begin() 方法来设置 SD 卡通信和 Dr.Wattson 通信。
// 查看卡是否存在,可以初始化: if (!SD.begin(CHIP_SELECT)) { Serial.println(F("Card failed, or not present")); // 不要再做任何事情:} wattson.begin(); // 传入合适的地址。默认为 0x74
我还将 LED 引脚初始化为 OUTPUT。
// 将数字引脚初始化为输出。 pinMode(LED, OUTPUT);
该按钮是全局声明的,因此我无需为该按钮进行任何设置。
#define BUTTON_PIN 4 //连接一个触觉按钮开关(或类似的东西)//从 Arduino 引脚 4 到地。 #define PULLUP true //为了简单起见,我们使用Arduino的内部上拉电阻。#define INVERT true //因为上拉电阻会使引脚保持高电平,除非//开关关闭,这是负逻辑,即高电平状态 //表示按钮未被按下。 (假设一个常开开关。)#define DEBOUNCE_MS 20 //20 毫秒的去抖动时间通常适用于触觉按钮开关。Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //声明按钮
我的数据记录是在名称类似于 DATAXX.CSV 的文件中完成的,其中 XX 是一个数字(从 00 到 99,因此是 100 个文件)。我检查 SD 卡中是否存在现有文件名,并选择最新未使用的文件名 — 例如 DATA15.CSV
char filename[] ="DATA00.CSV";setup() { ... // 创建一个新文件 for (uint8_t i =0; i <100; i++) { filename[4] =i /10 + '0';文件名[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("Data file is ")); Serial.println(文件名); // 只打开一个不存在的新文件 break; // 离开循环!文件名现在将是我们想要的文件名 } }...}
在 loop() 函数中,一旦按下按钮,它就会切换 readData 变量,该变量控制我是否读取能量数据。
void loop() { ... myBtn.read(); //读取按钮 if (myBtn.wasReleased()) { //如果按钮被释放,改变 LED 状态 readData =!readData;数字写入(LED,读取数据); } if (readData) { ... // 读取数据并保存到SD卡等......}
一旦 readData 被切换,我从 Wattson 博士那里读取能量数据,并记录时间:
UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.readMCP39F521(&data, NULL); unsigned long currentMillis =millis();
并将其写入 SD 卡:
// 如果文件可用,则写入: File dataFile =SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(fData.currentRMS); dataFile.print(","); dataFile.print(fData.activePower); dataFile.print(","); dataFile.print(fData.reactivePower); dataFile.print(","); dataFile.println(fData.apparentPower); // 也打印到串口:dataFile.close(); } // 如果文件没有打开,弹出一个错误: else { Serial.print(F("error opening ")); Serial.println(文件名); } 代码>
如果再次切换按钮,我将停止数据读取/记录。
行动!
将草图编译并上传到我的 Arduino 后,获取能量数据非常容易。
我插入了选择的负载 — 一个 CFL 灯。我想从冷启动和热启动的角度查看电流和能耗。我插上了灯,但没有打开。
我按下电路上的按钮开始能量测量 — 在记录时,红色 LED 告诉我!然后我打开 CFL 灯,一直等到我认为我已经获得了足够的数据 — 你看,CFL 在启动时消耗的能量比宣传的要多(在我的例子中是一个 14W 的 CFL 灯泡),然后稳定下来最终达到14W左右。我一直等到读数稳定下来。然后我按下按钮关闭阅读。
我现在可以弹出我的 SD 卡并开始查看数据!
PS — 要从其他设备记录数据,您所要做的就是重置Arduino — 它会选择下一个可用的DATAXX.CSV来记录数据,因此您可以轻松地将数据分开。
注意: 我没有使用 Arduino 串行监视器,而是使用 Mac 终端上的内置“屏幕”命令作为串行终端。在我的 Sketch 中,我将能量数据打印到 Serial,并发出“clearscreen”命令,因此输出不会移动
Serial.write("\x1B" "c"); // 清除普通终端上的屏幕 wattson.printMCP39F521Data(&data);
这仅适用于可以接受上述终端命令的常规终端,不幸的是,它不适用于 Arduino 串行监视器。然而,一旦你尝试 屏幕 ,你可能永远不会回到 Arduino 串行监视器!
命令将是这样的:
$ screen /dev/tty.usbmodem1411 9600
其中第一个参数是“串行端口”,第二个参数是您在 Arduino 草图中为串行连接配置的速度。
在 Excel 中绘制数据
因为文件是 CSV 格式,所以在 Excel 中加载和绘制它非常容易。我不会在这里详细介绍,因为有很多在 Excel 中创建图表的教程。我插入了一行包含列标题
时间戳、电流有效值、有功功率、无功功率、视在功率
(请注意自我 — 这将是我 Sketch 的未来增强功能 — 直接在 CSV 中添加列标题!)
我选择了上面的数据点来记录和绘图。随着时间的推移,电流消耗显然很有趣。为什么选择有功功率、无功功率和视在功率?根据设备的电气特性,它可以是阻性负载、无功负载或介于两者之间,因此这三个功率参数告诉我们它的整体特性,以及它们是否随时间变化。或者我认为......
让我们来看看冷启动 CFL 灯的结果:

电流在 0.21 安培左右达到峰值,然后最终稳定在 0.18 安培左右。
有功功率峰值约为 17 瓦,然后最终稳定在 14.2 瓦左右。
在它稳定下来后,我关闭 CFL 并等待了一会儿,然后再次打开它(因此上图中的电流下降)。您可以看到,一旦 CFL“预热”,它就会迅速稳定到稳定状态。
结论
您可以使用来自电器和设备的能源数据进行许多有趣的数据和实验。我很高兴开始着手处理一些数据并与您分享!
我与 Wattson 博士的目标是为 Maker 提供高质量的能源数据并使其更易于访问,这样您就可以将其用作您疯狂想法的基石。
Wattson 博士的设计确保使用安全(尤其是外壳),经过校准(因此您可以立即获得高质量的能源数据),但也为认真的用户提供了更复杂的功能
- 校准程序
- ZCD(过零检测器)
- 事件通知(过电流、过功率、电压骤降/浪涌事件)
- 能够自定义读数范围(通过修改负载电阻器和/或 CT 并使用上述校准程序重新校准),
- 将多个 Dr. Wattsons 与单个 MCU 结合使用(通过更改可配置的 I2C 寻址)。
如果您对能源监测感兴趣并喜欢 Wattson 博士,请在 (https://upbeatlabs-wattson.launchrock.com/) 注册以了解新闻和更新!
干杯,
斯里达尔
这是整个Sketch,供您参考!您还可以在 Upbeat Labs drwattson GitHub 存储库中找到它和 Dr. Wattson 库,以及许多其他示例。
/*********************************************** ************************************ 这是 Upbeat Labs Dr. Wattson Energy Monitoring Breakout 的示例草图--> https://www.tindie.com/products/UpbeatLabs/dr-wattson-energy-monitoring-board-2/ 此示例演示了从 Wattson 博士那里获取能源数据并将其以逗号分隔的形式写入 SD 卡(CSV) 格式。一个按钮用于切换数据收集,因此您可以在准备好时记录数据。当按钮切换测量时,草图开始轮询模块以获取能量数据并将其打印出来。为便于查看值,请使用 screen 之类的程序来显示串行输出。串行写入在常规终端上清除屏幕所需的字符,这意味着串行输出将保持原位并随着时间的推移而更新。打开输入电源查看电压有效值,线频值变化到合适的值。打开连接到输出的负载以查看电流 RMS、功率因数、有功、无功和视在功率值的变化。所有这些值都以 CSV 格式写入 SD 卡,然后可以与 Excel 等程序一起使用以查看/绘制数据。文件名的格式为 DATAnn.CSV。在设置时,选择了一个不存在的新文件名,因此文件将是 DATA00.CSV、DATA01.CSV、DATA02.CSV 等。日志会循环到新文件,直到 DATA99.CSV。通信通过 I2C 进行。接口需要 2 个引脚。每块板有 4 个可选的 I2C 地址可能性(可通过两个焊料跳线选择(选择每个引脚为高电平或低电平)。基于此,有 4 个可能的地址: I2C 地址 SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 HIGH HIGH Dr. Wattson 有两个输出,ZCD 或 Event,用于通知,因此通常会连接到外部可中断引脚(如 Arduino Uno 上的 pin2 或 pin3)。在这个例子中,ZCD 和 Event 不是使用。按钮连接到引脚 4。 * SD 卡连接到 SPI 总线如下:** MOSI - 引脚 11 ** MISO - 引脚 12 ** CLK - 引脚 13 ** CS - 引脚 10 LED 连接到引脚 9 写作者:Sridhar Rajagopal for Upbeat Labs LLC。BSD 许可。以上所有文本必须包含在任何重新分发中*/#include #include "UpbeatLabs_MCP39F521.h"#include #include //https://github.com/JChristensen/Button#define BUTTON_PIN 4 //连接一个触觉按钮开关(或类似的东西)//来自Arduino pin 4接地。#define PULLUP true //为了简单起见,我们使用Arduino的内部上拉电阻。#define INVERT true //因为除非开关关闭,否则上拉电阻将保持引脚高电平,这是负逻辑,即一个高状态//意味着按钮没有被按下。 (假设一个常开开关。)#define DEBOUNCE_MS 20 //20 毫秒的去抖动时间通常适用于触觉按钮开关。Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //声明按钮#define LED 9 //将LED(通过220ohm电阻)从引脚9(阳极)连接到GND(阴极)。 #define CHIP_SELECT 10UpbeatLabs_MCP39F521 wattson =UpbeatLabs_MCP39F521();bool readData =false;char filename[] ="DATA00.CSV";void setup() { Serial.begin(9600); //开启串口通讯Serial.println(F("**Upbeat Labs Dr. Wattson Example Sketch**")); Serial.println(F("Upbeat Labs Dr. Wattson Energy Data SD Card Logging Example Sketch")); Serial.println(F("*********************************************** ************************")); // 将数字引脚初始化为输出。 pinMode(LED,输出); pinMode(芯片选择,输出); // 查看卡是否存在并且可以初始化: if (!SD.begin(CHIP_SELECT)) { Serial.println(F("*** SD Card failed, or not present ***")); // 不要再做任何事情:} wattson.begin(); // 传入合适的地址。默认为 0x74 // 创建一个新文件 for (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0';文件名[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("Data file is ")); Serial.println(文件名); // 只打开一个不存在的新文件 break; // 离开循环!文件名现在将是我们想要的文件名 } } Serial.println(F("**initialization complete.**"));}void loop() { myBtn.read(); //读取按钮 if (myBtn.wasReleased()) { //如果按钮被释放,改变 LED 状态 readData =!readData;数字写入(LED,读取数据); } if (readData) { UpbeatLabs_MCP39F521_Data 数据; UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.read(&data, NULL); unsigned long currentMillis =millis(); if (readMCPretval ==UpbeatLabs_MCP39F521::SUCCESS) { // 打印出来 Serial.write("\x1B" "c"); // 清除普通终端上的屏幕 wattson.convertRawData(&data, &fData);打印MCP39F521Data(&fData); // 如果文件可用,则写入: File dataFile =SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(fData.currentRMS); dataFile.print(","); dataFile.print(fData.activePower); dataFile.print(","); dataFile.print(fData.reactivePower); dataFile.print(","); dataFile.println(fData.apparentPower); // 也打印到串口:dataFile.close(); } // 如果文件没有打开,弹出一个错误: else { Serial.print(F("error opening ")); Serial.println(文件名); } } else { Serial.print(F("Error!")); Serial.println(readMCPretval); } }}void printMCP39F521Data(UpbeatLabs_MCP39F521_FormattedData *data){ Serial.print(F("Voltage =")); Serial.println(数据->电压有效值,4); Serial.print(F("Current =")); Serial.println(data->currentRMS, 4); Serial.print(F("行频 =")); Serial.println(data->lineFrequency, 4); Serial.print("模拟输入电压 ="); Serial.println(data->analogInputVoltage, 4); Serial.print(F("功率因数 =")); Serial.println(data->powerFactor, 4); Serial.print(F("Active Power =")); Serial.println(data->activePower, 4); Serial.print(F("无功功率 =")); Serial.println(data->reactivePower, 4); Serial.print(F("视在功率 =")); Serial.println(data->apparentPower, 4);}
代码
- 代码片段 #1
- 代码片段 #3
- 代码片段 #4
- 代码片段 #5
- 代码片段 #7
- 代码片段 #11
代码片段 #1纯文本
// 查看卡是否存在并且可以初始化: if (!SD.begin(CHIP_SELECT)) { Serial.println(F("Card failed, or not present")); // 不要再做任何事情:} wattson.begin(); // 传入合适的地址。默认为 0x74
代码片段 #3纯文本
#define BUTTON_PIN 4 //连接一个触觉按钮开关(或类似的东西)//从 Arduino 引脚 4 到地。 #define PULLUP true //为了简单起见,我们使用Arduino的内部上拉电阻。#define INVERT true //因为上拉电阻会使引脚保持高电平,除非//开关关闭,这是负逻辑,即高电平状态 //表示按钮未被按下。 (假设一个常开开关。)#define DEBOUNCE_MS 20 //20 毫秒的去抖动时间通常适用于触觉按钮开关。Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //声明按钮
代码片段 #4纯文本
char filename[] ="DATA00.CSV";setup() { ... // 创建一个新文件 for (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0';文件名[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("Data file is ")); Serial.println(文件名); // 只打开一个不存在的新文件 break; // 离开循环!文件名现在将是我们想要的} }...}
代码片段 #5纯文本
myBtn.read(); //读取按钮 if (myBtn.wasReleased()) { //如果按钮被释放,改变 LED 状态 readData =!readData;数字写入(LED,读取数据); } if (readData) { ... // 读取数据并保存到 SD 卡等 ....
代码片段 #7纯文本
// 如果文件可用,则写入: File dataFile =SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(data.currentRMS); dataFile.print(","); dataFile.print(data.activePower); dataFile.print(","); dataFile.print(data.reactivePower); dataFile.print(","); dataFile.println(data.apparentPower); // 也打印到串口:dataFile.close(); } // 如果文件没有打开,弹出一个错误: else { Serial.print(F("error opening ")); Serial.println(文件名); }
代码片段 #11纯文本
/**************************************************** ***** 这是 Upbeat Labs Dr. Wattson Energy Monitoring Breakout 的示例草图通信通过 I2C 进行。接口需要 2 个引脚。每块板有 4 个可选的 I2C 地址可能性(可通过两个焊料跳线选择(选择每个引脚为高电平或低电平)。基于此,有 4 个可能的地址:I2C 地址 SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 HIGH HIGHDr. Wattson 有两个输出,ZCD 或 Event,用于通知,因此通常会连接到外部可中断引脚(如 Arduino Uno 上的 pin2 或 pin3)。在此示例中,不使用 ZCD 和 Event .Button 连接到 pin 4。 * SD 卡连接到 SPI 总线如下: ** MOSI - pin 11 ** MISO - pin 12 ** CLK - pin 13 ** CS - pin 10 LED 连接到 pin 9 写者Sridhar Rajagopal for Upbeat Labs LLC. BSD 许可证。以上所有文本必须包含在任何重新分发中 */ #include#include "MCP39F521.h"#include #include / /https://github.com/JChristensen/Button#define BUTTON_PIN 4 //连接一个触觉按钮开关(或类似的东西)//从Arduino pin 4到地. #define PULLUP true //为了简单起见,我们使用Arduino的内部上拉电阻。#define INVERT true //因为上拉电阻会使引脚保持高电平,除非//开关关闭,这是负逻辑,即高电平状态 //表示按钮未被按下。 (假设一个常开开关。)#define DEBOUNCE_MS 20 //20 毫秒的去抖动时间通常适用于触觉按钮开关。Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //声明按钮#define LED 9 //将LED(通过220ohm电阻)从引脚9(阳极)连接到GND(阴极)。#define CHIP_SELECT 10MCP39F521 wattson =MCP39F521();bool readData =false;char filename[ ] ="DATA00.CSV";void setup() { Serial.begin(9600); //开启串口通讯Serial.println(F("**Upbeat Labs Dr. Wattson Example Sketch**")); // 将数字引脚初始化为输出。 pinMode(LED,输出); pinMode(10,输出); // 查看卡是否存在并且可以初始化: if (!SD.begin(CHIP_SELECT)) { Serial.println(F("Card failed, or not present")); // 不要再做任何事情:} wattson.begin(); // 传入合适的地址。默认为 0x74// 创建一个新文件 for (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0';文件名[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("Data file is ")); Serial.println(文件名); // 只打开一个不存在的新文件 break; // 离开循环!文件名现在将是我们想要的} } Serial.println(F("**初始化完成。**")); }// 这是MCP39F521Data的样子,供参考!//typedef struct MCP39F521Data {// uint16_t systemStatus;// uint16_t systemVersion;// uint16_t电压RMS;// uint16_t lineFrequency;// uint16_t power analogInputVoltage;// / uint32_t currentRMS;// uint32_t activePower;// uint32_treactivePower;// uint32_tapparentPower;//} MCP39F521Data; void loop() { myBtn.read(); //读取按钮 if (myBtn.wasReleased()) { //如果按钮被释放,改变 LED 状态 readData =!readData;数字写入(LED,读取数据); } if (readData) { MCP39F521Data 数据; int readMCPretval =wattson.readMCP39F521(&data, NULL); unsigned long currentMillis =millis(); if (readMCPretval) { // 打印出来 Serial.write("\x1B" "c"); // 清除普通终端上的屏幕 wattson.printMCP39F521Data(&data); // 如果文件可用,写入它: File dataFile =SD.open(filename, FILE_WRITE);if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(data.currentRMS); dataFile.print(","); dataFile.print(data.activePower); dataFile.print(","); dataFile.print(data.reactivePower); dataFile.print(","); dataFile.println(data.apparentPower); // 也打印到串口:dataFile.close(); } // 如果文件没有打开,弹出一个错误: else { Serial.print(F("error opening ")); Serial.println(文件名); } } else { Serial.println(F("错误!")); } }}
Github
https://github.com/JChristensen/Buttonhttps://github.com/JChristensen/ButtonUpbeat Labs Dr. Wattson 能源监测板库
与 Dr. Wattson 能量监测板一起使用的库Wattson 是适用于 Arduino、Raspberry Pi 和其他创客友好型微控制器的能量监控分线板。轻松将高质量的交流电能测量集成到您的下一个项目中!基于 Microchip 的单相电源监控芯片 MCP39F521,该板设计为可承受各种电压,这意味着它也可以与Raspberry Pi 或任何其他 3.3v MCU 也同样容易。该单元经过预校准(支持从 1mA 到 4A 的测量),让您只需几个简单的命令即可开始进行质量测量。您不需要任何额外的 CT 或其他组件。如果您是一个更高级的用户,您可以从丰富的库中获得广泛的功能,并且能够调整硬件以满足您的需求并使用library.https://github.com/upbeatlabs/drwattson示意图

制造工艺