通过 Modbus、MKR WiFi 1010 和 RS485 监控您的能源账单
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
| ||||
| ||||
|
应用和在线服务
| ||||
| ||||
|
关于这个项目
如果您真的想让您的家更智能,您可能需要从每月的账单(即能源、天然气等)开始。正如某些人所说,对地球、钱包和底线都有好处 .开源硬件是我们在家庭环境中实现可持续性的方式!这个想法让我们构建了一个简单而安全的解决方案,易于与任何家庭自动化软件集成,因为它通过 MQTT 公开数据(在我们的例子中,我们将向您展示如何将其集成到家庭助理中)。
概览
为了测量电能消耗,我们选择使用 Finder Energy Meter,因为它专为 DIN 导轨使用而设计,并且非常适合我们房屋的主柜。这个产品很酷的一点是它有一个RS485 Modbus 接口,一种工业标准通信协议,它使与 Arduino 通信变得非常容易。事实上,Arduino 已经发布了一个官方盾牌,MKR485 和两个用于解码协议的库。作为主板,我们选择了Arduino MKR WiFi 1010, 因为它共享 MKR 外形并具有 WiFi 连接。
设置
警告! 检查您所在国家/地区有关处理房屋电气系统的法规,并要格外小心,因为它可能是致命的!如果你不知道 如何,请致电电工。 第一步是将仪表安装在您的电气柜中。为确保您在安全的环境中工作,关闭系统前电气端子的电源 用万用表仔细检查端子之间没有电压 .
然后将电表放在机柜内,并将主断路器的火线和零线连接到电表的输入端,记住使用颜色约定(蓝色代表零线,棕色/黑色/灰色代表欧盟带电)。输出必须连接到系统的其余部分。
完毕?是时候拧入 RS485 连接了!我们将使用双绞线接地,通常用于电话线。使用此电缆,您可以远距离传输(1.2 公里)。然而,我们只是使用一根足够长的电缆从机柜中取出并将 arduino 放在一个容易接近的地方。
RS485 接口将其端子命名为 A、B 和 COM。
由于 MKR 屏蔽也支持全双工,您会看到另外两个端子 Y 和 Z。在这里我们将拧紧电缆的另一端,因为我们从数据表中知道半双工通信仅发生在 Y 和 Z 上终端。 COM 端子必须连接到 ISOGND。由于我们使用半双工连接并且由于布线是对等的,我们必须在 MKR485 屏蔽上设置开关以匹配我们的设置:我们设置 HALF(2 为 OFF)并在 YZ 上终止(3开);第一个无关紧要。 终端是连接两个数据终端的电阻,用于抑制干扰。
就是这个。现在你可以关上柜子,专注于软件方面!
软件
启动您的计算机并打开您的 IDE。您可以使用 Arduino IDE 或 Arduino Create Editor。代码满足以下要求:
- Modbus 通讯,
- 无线网络管理
- MQTT 协议
Modbus 是工业传感器和机器的开源协议。为了让 Arduino 使用 Modbus,我们将使用 Arduino Modbus 库。这个库包含了所有的处理程序,并且可以非常快速地连接任何 Modbus 设备。由于我们要读取寄存器,按照电表的数据表,我们可以找到所有需要的信息,如功能代码、寄存器地址和寄存器大小(以字为单位)。但为了更清楚,让我们解释一下 Modbus 的工作原理:
Modbus 消息遵循一个简单的结构:
01 03 04 00 16 00 02 25 C7
0x01
是设备地址
0x03
是功能代码 告诉设备我们是要读取还是写入数据 *在这种情况下读取保持寄存器
0x04
对于 Byte Count00 16 - 我们发送 4 个字节的寄存器地址 (00 16) 告诉设备我们想读什么
00 02
- t那么寄存器的大小 (00 02) 文字 (每个字长2个字节)
最后 4 个字节是 CRC 码 .这段代码是由一个数学函数在前面的字节上生成的,这确保了消息被正确接收。
在 Arduino 中,所有这些东西都在 if
中处理 条件:
// Created by Alberto Perro - Officine Innesto//// 从保存寄存器的 modbus 设备读取整数float readCurrent(){ float ampere =0.; //next 命令格式化请求并通过 RS485 发送 if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) { //Error Handling Serial.print("failed to read voltage!"); Serial.println(ModbusRTUClient.lastError()); } else { uint16_t word1 =ModbusRTUClient.read(); //从缓冲区读取MSW uint16_t word2 =ModbusRTUClient.read(); //从缓冲区读取LSW int32_t milliamp =word1 <<16 |字2; //加入单词来检索 int ampere =milliamp/1000.0; //转换为安培}返回安培;}
在 else
部分我们有响应处理程序。
由于这个寄存器是两个字长,我们必须用二进制数学将它们连接起来。我们从缓冲区读取字并将它们存储在一个 16 位长(2 个字节或一个字)的无符号整数中,然后我们将它们连接到一个 32 位长的有符号整数中,将第一个字向左移动并应用 或代码> 过了第二个字。通过这种方式,我们以 mA 为单位检索电流测量值,将其除以 1000,我们得到了以安培为单位的电流。
同样的过程适用于我们想要阅读的所有内容。
其余代码专门用于处理 MQTT 和 WiFi 网络。
家庭助理集成
将仪表添加到 Home Assistant 非常简单。假设您配置了一个 MQTT 代理(这是指南),您需要做的就是在 configuration.yaml 文件下添加新定义。
sensor:- platform:mqtt name:"Main Voltage" state_topic:"energy/main/voltage" unit_of_measurement:"V"
在这里,您必须输入度量的名称、要读取的 MQTT 主题和数量的度量单位。保存文件,检查配置并重新加载 Home Assistant,现在测量值将出现在主页上。
Home Assistant 将负责创建图表并自动化由您的读数触发的过程。本教程已完成,现在由您来添加功能并根据自己的目的进行自定义!
代码
Finder 的 Modbus RTU 到 MQTT 桥
此草图提供了 finder 能量计和 mqtt 之间的完整桥梁。开发用于监控 Casa Jasmina 的电力成本和使用情况。制造工艺
- 使用 Arduino 和 Raspberry Pi 构建您的 Internet 控制的视频流机器人
- 使用 Arduino 制作流光溢彩监视器
- 如何构建 Arduino 能源监视器和数据记录器
- LCD 动画和游戏
- 使用 Arduino 和智能手机的 DIY 电压表
- 使用物联网的心率监测器
- Arduino 温度。使用 3.2 显示的监视器和实时时钟
- WebServerBlink 使用 Arduino Uno WiFi
- Arduino - 通过串口向 Web 发送温度
- Python3 和 Arduino 通信
- 使用 Alexa 和 Arduino IoT Cloud 完全控制您的电视
- 能量形式:动能和势能