作者:彼得·詹森(Peter Jensen)
这是我第一次尝试“有用”的物联网项目。我有一段时间Arduino Uno,但除了通过闪烁的LED教程外,没有真正使用它。是时候将其使用了。我发现考虑一个项目的想法,然后在需要时寻找所需的信息是很有意义的。当然,通常您会发现其他人做了类似的事情,但这没关系,您仍然会从过程中学习。
我想要一种设备来衡量房屋中的功耗,并在发生变化时将其报告为“云”服务;灯打开/关闭的灯光等。此外,我想要在盒子上显示一个显示,以便我可以阅读当前的功耗。
我首先将电流传感器连接到模拟输入引脚。像这样:
资料来源:openenergymonitor.org
为了进行校准,我使用的是能够测量10A的万用表,并将其连接到一个为三个灯泡灯提供动力的电线。每个灯泡都可以单独打开和关闭。插座上有60W灯泡,我可以获得60W,120W和180W的样品。
请注意,电流传感器必须只围绕一根电线,以使AC电流穿过该电线以诱导传感器中的电流。
测得的电流是电流传感器所包围的电源线的电流。
如果您在arduino草图中的loop()函数中所做的只是调用analogRead()并将结果存储在内存缓冲区中,那么您将能够在一个周期(60hz -16.7ms)中获得大约100个样本。 Arduino在16MHz运行。这应该足以计算输入的根平方(RMS)值。
为什么需要RMS值?模拟输入引脚上的输入是负载/负担电阻器上的电压下降。电压下降是直接成比例的,电流通过测量时测量的电源线。
当电流和电压随着时间而变化时,使用I和V的RMS值,将功率计算为60Hz鼻窦波的平均功率:
电力公司以120V保持稳定,因此有趣的是I RMS值。 Arduino类似于数字的转换器为10位,并且设计了电路,因此窦输入的中点为2.5V,应导致读数约511。如果读数的及时间隔相等,则可以将I RMS值计算为:
其中n是覆盖60Hz鼻窦波的整个周期所需的样品数量,k是一个校准常数,在用万用表测量实际的i rms值后将确定,v i是呼叫返回的analogRead()返回的值
有关数学的更多信息,请参见:Wikipedia
<todo:插入测试测量设置的图片>
我在Amazon Prime上买了我需要的一切。如果您不是主要订户,则最终可能会支付更多。对于某些物品,购买多个单位是有意义的,因为这只会增加几美元,而且如果您炸一个,那么拥有一个备用总是很高兴的。另外,如果您想制作第二个(或第三个)单元,则已经拥有所需的东西。
| 物品 | 总成本 | 单位成本 |
|---|---|---|
| Arduino Pro Mini(3件包) | $ 11 | $ 4 |
| 3.3V/5V电源模块(5件包) | $ 9 | $ 2 |
| ESP8266 ESP-01(4包) | $ 14 | $ 4 |
| 2X SCT-013-000非侵入性交流电流传感器 | $ 26 | $ 13 |
| 16x2 LCD显示模块 | $ 6 | $ 6 |
| 110VAC-> 9V适配器 | $ 6 | $ 6 |
| 10pcs 4x6cm双侧原型PCB | $ 7 | $ 1 |
| 10%3.5毫米女性PCB固定千斤顶 | $ 8 | $ 2 |
| 杂项:电容器,电阻,按钮,电线 | 〜$ 2 | $ 2 |
| 全部的 | $ 89 | $ 40 |
这就是我将所有内容连接在一起的方式:
我使用Digkikey SchemiT-IT软件来创建上面的硬件接线图。它在浏览器中运行!
有几件事要指出:
按下按钮时,通过此信息在2行LCD周期上显示的信息:
如果在显示“高级选项”时检测到很长的按下,则这些额外的屏幕包含在旋转中:
为了更改ON/OFF状态或重置数据,必须执行长时间按下按钮。
总功率 | 线电源 |
线电流 | 自上次重置以来的总能源使用 |
本地IP地址 | 长按先进的选择 |
wifi传输开/关 | 传输每个样本值 |
传输正在进行中 |
浏览器显示/接口当前看起来像这样:

黑线和红线代表了从两个阶段中的每个阶段中汲取的力量。顶部的左右箭头按钮将进入前一天或第二天。如果您在今天的一天,将获取新数据。无需打“刷新”!
这是可以从中得出的一些事情:
“黑色”待机消耗约为125W,“红色”为25W。这是所有处于待机模式的设备(电视,微波炉,计算机,网络摄像头等)的寄生绘制
“黑色”线上的上/下方平方图是冰箱中打开和关闭的压缩机。
我凌晨6点左右醒来,开始开灯和电视打开。电视是从“黑色”线上绘制的。
“红色”中的尖峰是我在热水器上的二氧化碳风扇。热水器运行约10分钟
热水器尖峰之后的较小的尖峰是车库门开口。
我使用openscad设计一个盒子。 .scad文件和渲染.stl文件在此存储库中。带有显示,按钮和各种连接器的切口的盒子看起来像这样:

片状电源
依靠USB的电源引起了模拟销读数的一些片状。另外,为了为ESP-01供电,我需要3.3V的电源。 Arduino Pro Mini没有像UNO一样的3.3V电压调节器。非常便宜的电源模块符合该账单,并且似乎提供了足够稳定的电源以确保稳定的读数。
ESP8266 ESP-01的波特率
我不得不在Arduino上使用几个数字I/O引脚进行Arduino和ESP-01模块之间的串行通信。需要常规的TX/RX引脚将软件刷到Arduino上。在使用数字I/O引脚的软件模块使用软件模块时,不可能以默认的115200波特率获得与ESP-01的可靠通信链接。由于Arduino和ESP-01之间的数据交换数量相当有限,因此我将BAUD率设置为安全的9600波特。
Arduino上的记忆用完
Arduino只有2K的RAM内存。 RAM用于所有全局数据,堆栈数据,甚至用于常量的字符串数据。 Atmel 328 GCC编译器在消除所有死亡代码和数据方面做得很好,我很惊讶您实际上可以在少量的RAM中运行1000多行C ++程序。确实需要一些摆弄才能使其适合。
new操作员分配对象:String对象: 顶视图 | 电源连接器 |
CT连接器 | ESP8266的天线部分 |
底部视图 | 没有arduino的底部视图 |
无arduino和ESP8266的底部视图 | ![]() |
纽扣和液晶连接到顶部 | ![]() |
PCB底面 | 带盖的盒子 |
here's some code
这是一个桌子:
| 1 | 2 | | | | | adadf | adfadf |