HLW8032是一款高精度的电能计量芯片,适用于电能计量、功率监测等应用场景。要获取HLW8032的电量数据,通常需要通过与微控制器(如STM32)的通信来实现。网上的都是与微控制器通信再与ESP8266连接获取数据,我这里就省去微控制器,直接用ESP01S获取数据,由于HLW8032是5V供电,ESP01S是3.3V供电,注意要将5V信号的转换3.3V信号,设计的电路图如下:
硬件设计好了,下一步的关键就是测试了,网上买的PL2303TTL有问题,总是得到错误的数据,我还以为是设计的电路有问题或焊接有问题,焊几个板子测试了个吧星期,都是错误的结果,在网上查资料想解决这一问题(中间怀疑换HLW8032芯片有问题,换了该芯片),还是不能解决,几乎要放弃了,后来想到换个CH340的TTL转USB试试,买回来一试果然数据不一样,也就知道之前买了个假的PL2303了。经测试有的板子数据是正常的,有的板子数据不正确,不正确的换HLW8032芯片后就正确了,说明网上卖的HLW8032芯片有好有坏,如果你碰到数据不正确的可以试试换个芯片。终于得到正确的数据了,下面是没插电源时的正确数据
得到正确的数据后说明硬件方面没问题,但将ESP01S的RX连接HLW8032的TX后,总是得不到正确的数据,代码是用Arduino IDE里下的HLW8032库,于是边修改边测试又搞了2个星期,可惜ESP01S的RX始终得不到正确的数据,难道是ESP01S与HLW8032的接口不兼容,非要用STM32等转换?都要准备按网上的方法加个STM32接ESP-01S,突然发现数据里有时有5A,F2的关键的数字,但数据是乱的。于是在网上找原因,看别人有没有遇到过这种情况,结果是一无所获。用文心一言等AI分析原因,也找不到答案,但给了我一启示,可能是ESP01S接收数据的速度跟不上HLW8032发送数据的速度,导致缓冲区溢出部分数据丢失,修改代码后测试果然是这原因,终于出现了正确的数据:
网上成功的案例中都没有说到这个问题,HLW8032每隔50ms发送一次24byte数据,Serial按一般方法来进行数据处理,这批没处理完,下批又来了,导致缓冲区的数据混乱,从而得不到正确数据,正确的做法说一下,如果你也遇到这类问题,可以参考下:在loop()函数里
if (Serial.available() > 0) {//循环读取8032数据
Serial.readBytes(buffer, BUF_SIZE);
hlw8032buffer();
}
定义的接收数据的缓冲区byte buffer[BUF_SIZE];,BUF_SIZE定义为96, hlw8032buffer()函数是处理HLW8032发送过来的数据。
void hlw8032buffer()
{
for(int i=0;i<BUF_SIZE;i++)
{
energyMeter.rxProcess(buffer[i]);
// Serial.printf("%02x ",buffer[i]);
}
}
好了,前后测试了个吧月才成功,不容易啊