一、项目描述
使用Esplorer软甲编写lua代码控制nodemcu实现获取模块HLW8032的数据
二、使用工具
(下方有链接)
- HLW8032电计量模块
- 上位机软件
- 杜邦线
- 插座、电线
- nodemcu模块
- TTL转USB模块
三、项目过程
①设备连接电脑,测试是否可用
将HLW8032通过TTL转USB模块连接到电脑,电脑打开上位机软件,测试是否可用。
- 注意HLW8032模块的T要连接下方模块的RXD。原因为T为电计量模块的数据发送端,对应下方模块的数据接收端RXD。
- 注意在电计量模块通电后,不能触摸 。
②将电计量模块连接到nodemcu,并编写代码获取数据
- 注意nodemcu只有两组引脚支持串口方法数据传输,因此电计量模块的RX、TX两个引脚只能从这两组里面选择连接。
//每当串口数据达到24字节就进行后面的方法。这是因为HLW8032会发送的是24位的16进制数据,每次获得24位,这24位数据的顺序是乱的,需要处理。如下
2 248 40 0 6 67 0 63 237 4 3 7 80 125 120 64 53 115 97 0 1 52 242 90
//这里我采用的方法:数据中有些数据是与设备有关的参数,这些参数是不变的,确定这个参数的位置,进行排序。
//比如,确定90的位置,90在正确的数据中位于第二位,根据这个位置重新排序。
uart.on("data",24,function(data)
//获取data里24位的每个数据
d01=string.byte(data,1)
d02=string.byte(data,2)
d03=string.byte(data,3)
d04=string.byte(data,4)
d05=string.byte(data,5)
d06=string.byte(data,6)
d07=string.byte(data,7)
d08=string.byte(data,8)
d09=string.byte(data,9)
d10=string.byte(data,10)
d11=string.byte(data,11)
d12=string.byte(data,12)
d13=string.byte(data,13)
d14=string.byte(data,14)
d15=string.byte(data,15)
d16=string.byte(data,16)
d17=string.byte(data,17)
d18=string.byte(data,18)
d19=string.byte(data,19)
d20=string.byte(data,20)
d21=string.byte(data,21)
d22=string.byte(data,22)
d23=string.byte(data,23)
d24=string.byte(data,24)
end,0)
//放入数组array01
array01={d01,d02,d03,d04,d05,d06,d07,d08,d09,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24}
array02={}
array03={}
array={}
info={}
//根据文档确定一部分参数
dianya=0
dianyaji=0
dianyacanji=194600
dianliucanji=16365
dianliu=0
dianliuji=0
gonglvcanji=5275000
gonglvji=0
gonglv=0
dianliang=0
//确定24位数据均不为空,并确定90这个数据所在位置,赋值给temp
for i=1,24 do
if(array01[i] ~= nil) then
if (array01[i] ==90) then
temp = i
timer2:stop()
updata()
break
end
else
print("wait....")
end
end
end)
function updata()
//如果90的索引大于二。
//如52 242 90 2 248 40 0 6 67 0 63 237 4 3 7 80 125 120 64 53 115 97 0 1
//此时90为第三位,242为第二位,那么只要把52移到最后,就变成了一个正确的数据
if (temp>2) then
for i=1,26-temp do
array[i]=array01[temp+i-2]
end
for i=1,temp-2 do
array[26-temp+i]=array01[i]
end
//如果90刚好在第二位,那么这条数据就是正确的,不需要处理
elseif(temp==2) then
for i=1,24 do
array[i]=array01[i]
end
//如果90在第一位,那么要把最后一位移到最前面,就行了
elseif(temp==1) then
array[1]=array01[24]
for i=2,24 do
array[i]=array01[i-1]
end
else
print("temp is nil")
end
//将排序好的数据根据文档计算,就可以得到正确的电压、电流、功率
dianyaji=array[6]*65536+array[7]*256+array[8]
dianya=(dianyacanji/dianyaji)*1.88
dianliuji=array[12]*65536+array[13]*256+array[14]
dianliu=dianliucanji/dianliuji
gonglvji=array[18]*65536+array[19]*256+array[20]
gonglv=gonglvcanji/gonglvji*1.88
四、参考链接
-
HLW参考文档、软件链接
提取码:2qjw