智能电表DDSU666配ESP32详细安装教程

DDSU666电表RS485 + ESP32 + ESPHome

Posted by Carl on November 14, 2021

本方案是使用 正泰DDSU666 带RS485通讯的电表,添加一个 ESPHome模块连接到 HomeAssistant 智能家居系统,在线查看电压、电流、功率等数据。

最终选择此方案原因:

  • 导轨式安装方便小巧
  • 数据在本地随便自己折腾
  • 精度有足够保障及安全性

考虑过的方案:

立新 DDS238-2 这款有可以直接使用渡鸦APP控制,不过数据是直接到他们的服务器,再通过 APP 查看,同步到 HA 比较麻烦。优势是可以远程拉闸,不过这个对于我使用价值不大。价格 140元左右相对较贵。

培正那种 DIY 的也有,不过那种精度和安全性就没法和品牌的比了。

数据加入 HA 都需要一个 485 转换模块,才能将电表数据传输给 HA 设备,通过 Wi-Fi 或 网线 或 其他,我选择了最简单的 Wi-Fi 无线也方便。

所以这一套系统的基本结构就是:

电表 + 485转换模块 + 模块电源

485 模块都不便宜,还要供电电源也不小,网上找了很多方案都不太满意。

最后是看到这个大佬 https://github.com/liwei19920307/ESP485 的教程做的,应该是最小化了,安装后简洁美观。

我买的这个电表是 Modbus-RTU 协议,直接使用,其他协议不懂如何调试。

准备工作

打印 PCB 板

去大佬 Github ESP485 中找到 EDA 文件下载,解压后里面有 3个文件,找到 1-PCB_PCB_ESP485.json 这个文件需要用到。

1、打开 立创 网站注册登陆后,选择菜单 文件 > 打开 > 立创EDA ;

2、选择刚刚的 1-PCB_PCB_ESP485.json 文件,打开后可以看到 PCB板了,接着选择菜单 制造 > PCB制版文件Gerber > 生成 将这个文件保存到电脑;

3、进入下单网址 PCB下单 这里是同一个账号,使用 Windows 系统安装 PC小助手 进去下单可以免费包邮样板 5片。下单需要的 PCB 文件就是刚刚保存的 Gerber 文件,不清楚可以在线客服咨询。

购买硬件

名称 型号 数量
ESP-C3-13U 4M 1
AMS1117-3.3 稳压电源芯片降压IC AMS1117-3.3 1
MAX13487EESA SOIC-8 / 1
0603贴片电阻 4.7KΩ / 1
0603贴片电容 50V 100NF ±10% / 1
2.4G内置柔性FPC软天线 IPEX接头 1
220V转5V700mA电源模块 5V700mA 1
正泰DDSU666 5-80A ModBus 1
正泰模数化插座 AC30-103 1
尖嘴元件镊子 弯嘴 1
热缩管 直径5mm 1
40P彩排杜邦线 公对母 1
CH341A编程器 / 1
电烙铁(要有尖烙铁头) / 1
电线(连接电表强电) 6平方 1

图片

IMG_3827

IMG_3830

刷固件

对于我这样的小白这个地方折腾了很久,从来没有刷过一头雾水。

ESPHome

安装这个错误很多次,很多不能用各种报错。Windows10 命令安装后不能编译,后来使用 R2S(OpenWrt)中的 Docker 安装 ESPHome 还是无法编译,最后使用 macOS 系统安装 Docker 再安装 ESPHome 后终于编译成功了。

ESPHome 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
esphome:
  name: esp32_c3
  platform: ESP32
  board: esp32-c3-devkitm-1
  platformio_options:
    platform: https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream
    platform_packages:
      - framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git#2.0.0
    board_build.variant: esp32c3
    board_build.f_cpu: 160000000L
    board_build.f_flash: 40000000L
    upload_protocol: esptool
    board_build.flash_mode: dio

wifi:
  ssid: "#你的WIFI名称#"
  password: "#你的WIFI密码#"

captive_portal:

logger:

api:
  password: '#api密码,简单好记就行#'

ota:
  password: '#ota密码,可以跟上面一样#'

web_server:
  port: 80
  
time:
  - platform: sntp
    id: esp485_time
  
uart:
  id: esp485_uart
  rx_pin: 18
  tx_pin: 19
  baud_rate: 9600
  data_bits: 8
  stop_bits: 1

modbus:
  id: esp485_modbus
  send_wait_time: 200ms

modbus_controller:
  - id: esp485_modbus_controller
    modbus_id: esp485_modbus
    address: 0x01 #设备地址码(一般是1根据实际情况填)#
    command_throttle: 200ms
    setup_priority: -10
    update_interval: 10s

sensor:
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_u
    name: "U"
    address: 0x2000
    register_count: 2
    unit_of_measurement: "V"
    register_type: holding
    value_type: FP32
    accuracy_decimals: 1
    device_class: voltage
    
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_i
    name: "I"
    address: 0x2002
    register_count: 2
    unit_of_measurement: "A"
    register_type: holding
    value_type: FP32
    accuracy_decimals: 3
    device_class: current
    
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_p
    name: "P"
    address: 0x2004
    register_count: 2
    unit_of_measurement: "W"
    register_type: holding
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 1000
    device_class: power
    
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_q
    name: "Q"
    address: 0x2006
    register_count: 2
    unit_of_measurement: "var"
    register_type: holding
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 1000
    device_class: power
    
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_s
    name: "S"
    address: 0x2008
    register_count: 2
    unit_of_measurement: "VA"
    register_type: holding
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 1000
    device_class: power
    
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_pf
    name: "PF"
    address: 0x200A
    register_count: 2
    unit_of_measurement: "cosΦ" #无法显示可以删除这行#
    register_type: holding
    value_type: FP32
    accuracy_decimals: 3
    device_class: power_factor
    
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_freq
    name: "Freq"
    address: 0x200E
    register_count: 2
    unit_of_measurement: "Hz"
    register_type: holding
    value_type: FP32
    accuracy_decimals: 2
    
  - platform: modbus_controller
    modbus_controller_id: esp485_modbus_controller
    id: esp485_modbus_ep
    name: "Ep"
    address: 0x4000
    register_count: 2
    unit_of_measurement: "kWh"
    register_type: holding
    value_type: FP32
    accuracy_decimals: 2
    device_class: energy
    state_class: total_increasing

安装 Docker

使用 macOS 安装 Docker (点击进入有其他系统安装方法)

1
$ brew install --cask --appdir=/Applications docker

安装 ESPHome 及 编译固件

使用刚刚安装好的 Docker 安装 ESPHome 容器

下载镜像文件

1
docker pull esphome/esphome:latest

运行,端口 6052,打开网页

1
2
3
4
docker run -d -p 6052:6052 esphome/esphome

# 打开网页
http://localhost:6052/

添加设备

根据提示输入名称、Wi-Fi、芯片类型 创建完成

创建后点击卡片 EDIT 编辑,删除其中代码,将上面的 ESPHome 代码复制进去,记得修改其中的Wi-Fi及密码信息,点击保存。

继续操作点击 Insta > Manual download

编译成功会输出 INFO Successfully compiled program. 并自动下载 bin 文件。

将下载文件 esp32_c3.bin 改名成 firmware.bin 等会刷机会用到

图片

截屏2021-11-14 12.46.02

截屏2021-11-14 12.47.21

近期更新

最近(22/10/2)因为更新了 Wi-Fi 密码造成无法联网,本想换回原来的 Wi-Fi 名称和密码通过无线连接手动刷入固件,没想到直接在 sephome 中就自动刷入固件成功,不需要自己手动上传。

⚠️ 需要注意的点是,编译的时候一定要使用科学上网而且要使用增强模式,不然速度很慢下载会出问题,选择的无线方式后会自动编译完成后就通过无线方式刷入固件。

截屏2022-10-02 21.06.08

选择无线编译成功后自动刷入固件成功

截屏2022-10-02 21.05.44

esp32 更新后的界面和以前的不一样了。

esptool.py 安装

Python3 安装

使用 Windows10 到 Python 官方网站下一个 Python3 版本文件直接安装,安装时需要勾选 PATH 。(eg:安装的 Python 3.8.7(64-bit) 版本,勾选 Add Python 3.8 to PATH)

1
2
3
4
5
6
7
8
# 命令窗口输入 py 查看是否安装成功

C:\Users\Carl>py
Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

# 输入 exit() 退出

CH34X 驱动安装

使用 Windows10 系统安装,首先安装刷机设备需要的驱动,购买 CH341 时找卖家要一个驱动文件,安装就可以了。可以在 开始 > 右键 > 设备管理器 > 端口COM 中看到设备及端口号,记住这个端口,比如:COM3。

CH341SER.EXE及其他版本驱动下载

根据自己使用的刷机设备安装对应驱动即可。

安装 esptool.py

Windows10 打开CMD命令窗口,输入:

1
2
3
4
5
6
7
8
9
pip install esptool
  
.... 等待安装完成
  
# 最后输出下面代码成功

Installing collected packages: esptool
	Running setup.py install for esptool ... done
Successfully installed esptool-3.2

可以在刷写固件前先执行擦除固件

1
esptool.py --port COM4(你的端口) erase_flash

刷写固件

芯片接线

刷机设备对应接芯片 3.3VGND

刷机设备 TX 接芯片 RXD,刷机设备 RX 接芯片 TXD

芯片 IO9 接一根线备用,在刷机时需要接刷机设备 GND

接线参考图片

IMG_3877

IMG_3876

写入固件

Windows10 桌面新建文件夹 esp32 ,去 Github ESP485 下载 firmware 文件夹中 3个固件,并将文件放到刚刚创建好的esp32文件夹中,还有刚刚编译成功的改名固件 firmware.bin 也放在这个文件夹,共有以下 4个固件。

boot_app0.bin / bootloader_dout_40m.bin / partitions.bin / firmware.bin

其他系统刷机根据自己情况选择。

刷写固件前,将 IO09 接到刷机设备 GND ,再插入电脑刷机USB。

1
2
3
4
5
6
7
8
# esptool.py 命令应该是全局命令
# 进入固件所在目录

cd /xxx/xxx/

# 命令窗口粘贴以下命令回车运行

esptool.py --chip esp32c3 --port COM3(改成你的端口) --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x0000 bootloader_dout_40m.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin

图片

Screenshot 2021-11-13 102322

查看是否成功

固件刷写完成后,从电脑拔下刷写设备,将刚刚接地的 IO9 线断开接地,再次插入电脑 USB 通电,等待一会。

登陆你的路由器(刚刚填写Wi-Fi密码的路由器),查找到新连网设备 esp32 ,找到设备 IP 地址复制。

在浏览器中打开此 IP 地址,如果成功加载页面并显示正常,就是说明刷写固件成功了,接下来焊接芯片连接电表。

图片

截屏2021-11-25 11.41.49

  • 数据是没有的,接电表后才有数据
  • 下次可以直接在线升级固件,不用刷机了,点击“选择文件”上传更新就好了。

焊接芯片和安装

焊接芯片和元器件

焊接芯片时注意不要有虚焊,PCB板质量一般容易掉焊盘,把握好温度。

连接电源模块和芯片板

电源模块可以用绝缘胶包起来防止短路

截屏2021-11-25 11.51.29

改造数字插座

数字插座铜片用的热缩管包起来绝缘作用,电源 L N 线是焊接在铜片上,需要用刀片对塑料外壳做小加工以更好的盖合外壳。芯片下面用了双面胶粘在外壳上,其实不沾也可以,只要做好了绝缘工作。

IMG_3883

连接模块和电表

esp32 模块 rs485 通讯线 A(黄),B(橙)依次接正泰电表 24 和 25 端口。

IMG_3885

测试功能

先用家中插座接电源测试功能完整性,如果能够获取电表数据并正常显示说明刷写固件成功了,并且焊接没有问题。

装入电箱

⚠️ 强电危险操作,请勿模仿

经过测试没有问题后,断开家中总闸开关,一定要确认家中强电接线情况,并且用测电笔经过检测电压情况,准备工作做好后,按照下面指示图接线,一定不能接错。

图片

963D368F768A54D3DDA3160C848350F3

产品说明书接线方法(我购买的上图升级款,就是下图中 5(80)A 款)

IMG_3943

我是按照上图中接线

自己购买的 6平方电线,接入户空气开关输出端,再接到电表输入端(下面),电表输出端(上面)再接到空开旁边的欠压保护器的输入端(下面)。

IMG_3887

数字插座 零N 火L 线接到上面电表旁的空气漏保开关上了。

esp32 模块 rs485 通讯线 A B 依次接电表 24 25 端口。

数字插座引出黑色天线,尽量不要遮挡以防信号不好。

IMG_3888

通电后可以看到智能电表已经在工作了,按 蓝色箭头 按钮可以依次切换显示的各种数据信息,说明书有详细说明。这款电表带背光,一段时间后自动熄灭。

IMG_3889

看起来简洁美观,也有安全保障。

配置 HomeAssistant

完成这些操作后,打开 HomeAssistant 后台,进入配置应该就能看到新的 esp32-c3 设备,直接添加就行了,可以在能源中设置相关信息。

图片

IMG_4053

可以在 配置 - 能源 中设置一个电费价格,我设置的固定价格,不会弄阶梯价格。

截屏2021-12-04 15.07.33

下载文件

CH34x_Install_V1.5.pkg(macOS 10.15 安装无效)

DDSU666 电表说明书.pdf

esp-c3-13u 规格书.pdf

ESP32-C3 资料

GitHub 库文件:ESP485-main

阿里云盘下载:https://www.aliyundrive.com/s/B9MzKMJKUuG

DDSU666清零

电表清零方法

长按 蓝色按钮 会看到屏幕快速切换功能显示,大概 8 秒左右会停变成 P 0.0W ,已经成功清零。

电表通信模式切换

长按 蓝色按钮 会看到屏幕快速切换功能显示,马上松开,再次点按切换,看到 M- 8n1 停止,接着点按可以更改地址。

修改 Modbus 通信参数,将 8n2 改为 8n1,修改 Modbus 通信地址为默认 01