IM1281B电能计量模块 ARDUINO 代码-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4140|回复: 4

IM1281B电能计量模块 ARDUINO 代码

[复制链接]
发表于 2021-8-7 21:54 | 显示全部楼层 |阅读模式
  1. //unsigned char是无符号字节型,char类型变量的大小通常为1个字节(1字节=8个位),且属于整型
  2. // 声明一个无符号的char类型数组,它拥有38个元素
  3. unsigned char USART_RX_BUF[37] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  4. //读数据寄存器(功能码 03H):读 48H 开始的 8 个寄存器值
  5. //查询消息帧包括设备地址、功能代码、数据信息码、校验码
  6. unsigned char USART_TX_BUF[8] = {0x01, 0x03, 0x00, 0x48, 0x00, 0x08, 0xC4, 0x1A};
  7. //                               0x01设备地址
  8. //                                     0x03读取命令,功能码
  9. //                                           0x00, 0x48读取的开始地址
  10. //                                                             0x08寄存器数
  11. //                                                                   0xC4, 0x1A校验码
  12. float Dian_Ya, Dian_Liu, Gong_Lv, Dian_Neng, Pf_data, Er_Yang_Hua_Tan, Wen_Du, Pin_Lv;

  13. void setup() {
  14.   Serial3.begin(9600);
  15.   Serial.begin(9600);
  16. }

  17. void loop() {
  18.   Shua_Xin_IM1281B_Shu_Ju(1000);//刷新IM1281B数据
  19.   Huo_Qu_IM1281B_Shu_Ju(1000);//获取IM1281B数据
  20. }


  21. /*  刷新IM1281B_数据 */
  22. unsigned long Shang_Ci_Shua_Xin_IM1281B_Shu_Ju_Shi_Jian ;
  23. void Shua_Xin_IM1281B_Shu_Ju( int Jian_Ge_Shi_Jian ) {
  24.   if ( millis() - Shang_Ci_Shua_Xin_IM1281B_Shu_Ju_Shi_Jian >= Jian_Ge_Shi_Jian) {
  25.     Shang_Ci_Shua_Xin_IM1281B_Shu_Ju_Shi_Jian = millis();


  26.     /*
  27.       Serial.write()
  28.       写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用print()代替。
  29.       写二进制数据到串口,数据是一个字节一个字节地发送的
  30.       语法:
  31.       Serial.write(val) Serial.write(str) Serial.write(buf, len)

  32.       参数:
  33.       val: 作为单个字节发送的数据
  34.       str: 由一系列字节组成的字符串
  35.       buf: 同一系列字节组成的数组
  36.       len: 要发送的数组的长度

  37.       返回:
  38.       byte
  39.       write()会返回发送的字节数,所以读取该返回值是可选的。
  40.     */



  41.     // 1、刷新数据
  42.     Serial3.write(USART_TX_BUF, 8);//写二进制数据到串口(数组,数组的长度)

  43.   }
  44. }


  45. /*  获取IM1281B_数据 */
  46. unsigned long Shang_Ci_Huo_Qu_IM1281B_Shu_Ju_Shi_Jian ;
  47. void Huo_Qu_IM1281B_Shu_Ju( int Jian_Ge_Shi_Jian ) {
  48.   if ( millis() - Shang_Ci_Huo_Qu_IM1281B_Shu_Ju_Shi_Jian >= Jian_Ge_Shi_Jian) {
  49.     Shang_Ci_Huo_Qu_IM1281B_Shu_Ju_Shi_Jian = millis();

  50.     // 2、获取数据


  51.     int num = 0;
  52.     for (int i = 0; i <= 36; i++)  {
  53.       USART_RX_BUF[i] = Serial3.read();
  54.       //      Serial.print(USART_RX_BUF[i], HEX);
  55.       //      Serial.print(" ");
  56.     }

  57.     Serial.println();

  58.     if (USART_RX_BUF[0] == 1) { //由于开始几次会得到乱码,首字符为1的时候才进行数据处理
  59.       // 3、解析数据                                  <<位左移 |位或
  60.       Dian_Ya = (((unsigned long)(USART_RX_BUF[3])) << 24)  | (((unsigned long)(USART_RX_BUF[4])) << 16) | (((unsigned long)(USART_RX_BUF[5])) << 8) | USART_RX_BUF[6];
  61.       Dian_Liu = (((unsigned long)(USART_RX_BUF[7])) << 24) | (((unsigned long)(USART_RX_BUF[8])) << 16) | (((unsigned long)(USART_RX_BUF[9])) << 8) | USART_RX_BUF[10];
  62.       Gong_Lv = (((unsigned long)(USART_RX_BUF[11])) << 24) | (((unsigned long)(USART_RX_BUF[12])) << 16) | (((unsigned long)(USART_RX_BUF[13])) << 8) | USART_RX_BUF[14];
  63.       Dian_Neng = (((unsigned long)(USART_RX_BUF[15])) << 24) | (((unsigned long)(USART_RX_BUF[16])) << 16) | (((unsigned long)(USART_RX_BUF[17])) << 8) | USART_RX_BUF[18];
  64.       Pf_data = (((unsigned long)(USART_RX_BUF[19])) << 24) | (((unsigned long)(USART_RX_BUF[20])) << 16) | (((unsigned long)(USART_RX_BUF[21])) << 8) | USART_RX_BUF[22];
  65.       Er_Yang_Hua_Tan = (((unsigned long)(USART_RX_BUF[23])) << 24) | (((unsigned long)(USART_RX_BUF[24])) << 16) | (((unsigned long)(USART_RX_BUF[25])) << 8) | USART_RX_BUF[26];
  66.       Wen_Du = (((unsigned long)(USART_RX_BUF[27])) << 24) | (((unsigned long)(USART_RX_BUF[28])) << 16) | (((unsigned long)(USART_RX_BUF[29])) << 8) | USART_RX_BUF[30];
  67.       Pin_Lv = (((unsigned long)(USART_RX_BUF[31])) << 24) | (((unsigned long)(USART_RX_BUF[32])) << 16) | (((unsigned long)(USART_RX_BUF[33])) << 8) | USART_RX_BUF[34];

  68.       // 4、打印数据
  69.       //      Serial.println("电压:" + String(Dian_Ya ) + "V");
  70.       //      Serial.println("电流:" + String(Dian_Liu ) + "A");
  71.       //      Serial.println("有功功率:" + String(Gong_Lv ) + "W");
  72.       //      Serial.println("有功电能:" + String(Dian_Neng ) + "W");
  73.       //      Serial.println("功率因数:" + String(Pf_data ));                       //功率因数是指交流电路有功功率对视在功率的比值。用户电器设备在一定电压和功率下,该值越高效益越好,发电设备越能充分利用。
  74.       //      Serial.println("二氧化碳排量:" + String(Er_Yang_Hua_Tan ) + "KG");
  75.       //
  76.       //      Serial.println();
  77.       //      Serial.println();

  78. //      Serial.println("电压:" + String(Dian_Ya * 0.0001) + "V");
  79. //      Serial.println("电流:" + String(Dian_Liu * 0.0001) + "A");
  80. //      Serial.println("有功功率:" + String(Gong_Lv * 0.0001) + "W");
  81. //      Serial.println("有功电能:" + String(Dian_Neng * 0.0001) + "W");
  82. //      Serial.println("功率因数:" + String(Pf_data * 0.001));                       //功率因数是指交流电路有功功率对视在功率的比值。用户电器设备在一定电压和功率下,该值越高效益越好,发电设备越能充分利用。
  83. //      Serial.println("二氧化碳排量:" + String(Er_Yang_Hua_Tan * 0.0001) + "KG");
  84. //      Serial.println();
  85. //      Serial.println();



  86. //      Serial.print(Dian_Ya * 0.0001); Serial.print(",");          // 第一个值
  87. //      Serial.print(Dian_Liu * 0.0001); Serial.print(",");          // 第二个值
  88.       Serial.print(Gong_Lv * 0.0001); Serial.print(",");
  89.       Serial.println();                              // 所有数据发送完后要加这一句

  90.       Dian_Ya = 0;
  91.       Dian_Liu = 0;
  92.       Gong_Lv = 0;
  93.       Dian_Neng = 0;
  94.       Pf_data = 0;
  95.       Er_Yang_Hua_Tan = 0;
  96.     }
  97.   }
  98. }
复制代码


发表于 2021-8-17 09:14 | 显示全部楼层
正想着有没有电力计量表的相关内容。楼主加油。
发表于 2021-8-18 14:40 | 显示全部楼层
大佬,为什么我的出来是乱码
 楼主| 发表于 2021-8-18 17:32 | 显示全部楼层
15970727784 发表于 2021-8-18 14:40
大佬,为什么我的出来是乱码

有可能波特率不对吧
发表于 2021-8-18 23:58 | 显示全部楼层
大佬,可以留个联系方式吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 04:38 , Processed in 0.103466 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表