小声比比
入手了一块IM1281B电量计能模块,无奈网上和各个店铺只有51和32的示例代码,直接使用串口通讯,将这鬼东西得到的数据进行存储进数组中,但是数组的数据无法单个处理,这是什么情况?
无奈之下搞了几周才终于搞明白了,现在写个博客,方便以后的开发者们。
接线方式
引脚 | 功能说明 |
---|---|
V+ | 供电正极(可引主控板5v) |
V- | 供电负极(可引主控板Gnd) |
RX | 串口通讯(接主控板TX) |
TX | 串口通讯(接主控板RX) |
PF | 脉冲输出引脚,检测电能精度(不需要可悬空) |
VL | 用电器火线接口 |
VN | 用电器零线接口 |
温馨提示:鬼东西只能测交流电,不能直流电,不然就gg。。。我就搞了两天直流电,直接拔光了前额的头发。
通讯方式
采用UART通讯方式,在使用arduino当做主控板的时候,采用软串口进行通讯控制,使用其他控制主板,只需要更改串口就行。
代码
代码已加注释,可以自行查看了,鬼东西折磨人,已经不想说话了。。。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
unsigned char USART_TX_BUF[8]={0x01,0x03,0x00,0x48,0x00,0x08,0xC4,0x1A};
String str1="";
String str2="";
String a="";//电压的第1个参数
String b="";//电压的第2个参数
String c="";//电压的第3个参数
String d="";//电压的第4个参数
long int cmd=0;//字符串转换为整形数据的过程变量
float voltage;//电压变量
void setup() {
mySerial.begin(4800);
Serial.begin(9600);
}
void loop() {
int num = 0;
mySerial.write(USART_TX_BUF,8);
delay(500);
for(int i=0; i<=20; i++)
{
str2 = String(mySerial.read(),HEX);//将数据以16进制的形式存储进字符串str2
str1 += str2;
str1 += " ";
if(i==3)
{
a = str2;
}
if(i==4)
{
b = str2;
}
if(i==5)
{
c = str2;
}
if(i==6)
{
d = str2;
}
}
if(str1.charAt(0)=='1')//由于开始几次会得到乱码,首字符为1的时候才进行数据处理
{
// Serial.println(str1);
str2=a+b+c+d;
char charBuf[str2.length() + 1];//String转char*,char*转long,long转10进制数
str2.toCharArray(charBuf, str2.length() + 1) ;
cmd = strtoul(charBuf, NULL, 16);
voltage = cmd *0.0001;
Serial.print("当前电压为:");Serial.print(voltage);Serial.println("V");
}
str1 = "";//字符串清空
}