arduino控制IM1281B电量计能模块

小声比比

入手了一块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 = "";//字符串清空
}

实际效果

在这里插入图片描述

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值