极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12197|回复: 1

Arduino电量采集 TCP透传方式上传乐联

[复制链接]
发表于 2016-4-12 19:56:07 | 显示全部楼层 |阅读模式
本帖最后由 maker_lin 于 2016-4-13 11:23 编辑

一、主要实现功能

     arduino 通过 软串口 连接方式读取 电量模块 的数据, 并将数据通过ESP8266 采用 TCP透传 方式上传至乐联。

二、主要配件:

   1. ocrobot HEKR物联网开发板(测试使用,稳定运行后会换 arduino mini + ESP8266 ,)
   2. LT-518 电量计量模块
   3. AC220-DC12 电源模块(非必要,手头有闲置,所以用上了)

三、数据查看地址

     http://www.lewei50.com/u/g/9131

四、相关资料说明及成品图片

拿吃完的巧克力盒子凑合先用着


直接挂办公室电箱旁


这个是电量计量模块



模块的一些数据格式要求



电量计量模块相对比较简单,就是发送一组数据向模块请求数据,然后模块会返回一组数据, 格式都差不多,按照资料解析下数据就好。


各部分功能(简易流程)
1.   Arduino            >>>查询数据>>> 电量模块>>>返回数据
      Arduino            >>>读取数据>>> 整理数据格式>>>发送到串口 ESP8266
2.   ESP8266         >>>读取串口数据>>>转发到乐联

ESP8266是使用 arduino的IDE 编写的代码,这个使用方法可以参考http://www.arduino.cn/thread-17895-1-1.html 这篇文章


五、代码部分
arduino 代码

  1. #include <Wire.h>
  2. #include<SoftwareSerial.h>



  3. unsigned char  Tx_Buffer[8];
  4. unsigned char  Rx_Buffer[40];
  5. unsigned char  read_enable, receive_finished, reveive_number;

  6. float  Voltage_data, Current_data, Power_data, Energy_data, Pf_data, CO2_data;
  7. float  Voltage,Current,Power,Energy,Pf,CO2;

  8. SoftwareSerial softSerial(10, 11);


  9. void setup() {

  10.   Serial.begin(115200);         
  11.   softSerial.begin(4800);
  12.   softSerial.listen();
  13. }

  14. void loop() {

  15.   write_data();
  16.   delay(100);
  17.   read_data();
  18.   delay(100);
  19.    Analysis_data();
  20.    delay(100);

  21.     float Voltage= Voltage_data/10000;
  22.     float Current= Current_data/10000;
  23.     float Power= Power_data/10000;
  24.     float Energy= Energy_data/10000;
  25.     float Pf= Pf_data/1000;
  26.     float CO2= CO2_data/10000;

  27.   Serial.println("{"method": "update","gatewayNo": "01","userkey": "*****************************"}&^!");
  28.     delay(20000);
  29.   //向乐联注册
  30.   
  31. Serial.print("{"method": "upload","data":[{"Name":"DY","Value":"");
  32. Serial.print(Voltage);
  33. Serial.print(""},{"Name":"DL","Value":"");
  34. Serial.print(Current);
  35. Serial.print(""},{"Name":"GL","Value":"");
  36. Serial.print(Power);
  37. Serial.print(""},{"Name":"YDL","Value":"");
  38. Serial.print(Energy);
  39. Serial.print(""},{"Name":"GLYS","Value":"");
  40. Serial.print(Pf);
  41. Serial.print(""},{"Name":"WD","Value":"");
  42. Serial.print(CO2);
  43. Serial.println(""}]}&^!");  
  44.   delay(30000);

  45. }

  46. unsigned int calccrc(unsigned char crcbuf, unsigned int crc)
  47. {
  48.   unsigned char i;
  49.   unsigned char chk;
  50.   crc = crc ^ crcbuf;
  51.   for (i = 0; i < 8; i++)
  52.   {
  53.     chk = ( unsigned char)(crc & 1);
  54.     crc = crc >> 1;
  55.     crc = crc & 0x7fff;
  56.     if (chk == 1)
  57.       crc = crc ^ 0xa001;
  58.     crc = crc & 0xffff;
  59.   }
  60.   return crc;
  61. }

  62. unsigned int chkcrc(unsigned char *buf, unsigned char len)
  63. {
  64.   unsigned char hi, lo;
  65.   unsigned int i;
  66.   unsigned int crc;
  67.   crc = 0xFFFF;
  68.   for (i = 0; i < len; i++)
  69.   {
  70.     crc = calccrc(*buf, crc);
  71.     buf++;
  72.   }
  73.   hi = ( unsigned char)(crc % 256);
  74.   lo = ( unsigned char)(crc / 256);
  75.   crc = (((unsigned int)(hi)) << 8) | lo;
  76.   return crc;
  77. }

  78. void write_data(void)
  79. {
  80.   union        crcdata
  81.   {
  82.     unsigned int word16;
  83.     unsigned char  byte[2];
  84.   } crcnow;
  85.   read_enable = 1;
  86.   if (read_enable == 1)
  87.   {
  88.     read_enable = 0;
  89.     Tx_Buffer[0] = 0x01;
  90.     Tx_Buffer[1] = 0x03;
  91.     Tx_Buffer[2] = 0x00;
  92.     Tx_Buffer[3] = 0x48;
  93.     Tx_Buffer[4] = 0x00;
  94.     Tx_Buffer[5] = 0x06;
  95.     crcnow.word16 = chkcrc(Tx_Buffer, 6);
  96.     Tx_Buffer[6] = crcnow.byte[1];  
  97.     Tx_Buffer[7] = crcnow.byte[0];
  98.     softSerial.write(Tx_Buffer, 8) ;            
  99.   }
  100. }

  101. void read_data()
  102. {

  103.   if ( softSerial.available() > 0 )
  104.   {
  105.    softSerial.readBytes(Rx_Buffer,34) ;
  106.     delay(10);
  107.    
  108.   }

  109. }

  110. void Analysis_data(void)
  111. {
  112.   unsigned char i;
  113.   union        crcdata
  114.   {
  115.     unsigned int word16;
  116.     unsigned char  byte[2];
  117.   } crcnow;
  118.   receive_finished=1;
  119.   if (receive_finished == 1)
  120.   {
  121.     receive_finished = 0;
  122.     unsigned char reveive_numbe = 34;
  123.     if (Rx_Buffer[0] == 0x01);
  124.     {
  125.       crcnow.word16 = chkcrc(Rx_Buffer, reveive_numbe - 2);
  126.       if ((crcnow.byte[0] == Rx_Buffer[reveive_numbe - 1]) && (crcnow.byte[1] == Rx_Buffer[reveive_numbe - 2]))
  127.       {
  128.         Voltage_data = (((unsigned long)(Rx_Buffer[3])) << 24) | (((unsigned long)(Rx_Buffer[4])) << 16) | (((unsigned long)(Rx_Buffer[5])) << 8) | Rx_Buffer[6];
  129.         Current_data = (((unsigned long)(Rx_Buffer[7])) << 24) | (((unsigned long)(Rx_Buffer[8])) << 16) | (((unsigned long)(Rx_Buffer[9])) << 8) | Rx_Buffer[10];
  130.         Power_data = (((unsigned long)(Rx_Buffer[11])) << 24) | (((unsigned long)(Rx_Buffer[12])) << 16) | (((unsigned long)(Rx_Buffer[13])) << 8) | Rx_Buffer[14];
  131.         Energy_data = (((unsigned long)(Rx_Buffer[15])) << 24) | (((unsigned long)(Rx_Buffer[16])) << 16) | (((unsigned long)(Rx_Buffer[17])) << 8) | Rx_Buffer[18];
  132.         Pf_data = (((unsigned long)(Rx_Buffer[19])) << 24) | (((unsigned long)(Rx_Buffer[20])) << 16) | (((unsigned long)(Rx_Buffer[21])) << 8) | Rx_Buffer[22];
  133.         CO2_data = (((unsigned long)(Rx_Buffer[23])) << 24) | (((unsigned long)(Rx_Buffer[24])) << 16) | (((unsigned long)(Rx_Buffer[25])) << 8) | Rx_Buffer[26];
  134.    
  135.       }
  136.     }
  137.   }
  138. }

复制代码
esp8266 透传代码

  1. #include <ESP8266WiFi.h>
  2. const char *ssid     = "wifi ssid";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
  3. const char *password = "password";//你要连接的wifi密码
  4. const char *host = "42.121.128.216";//修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
  5. WiFiClient client;
  6. const int tcpPort = 9960;//修改为你建立的Server服务端的端口号


  7. void setup()
  8. {
  9.   Serial.begin(115200);
  10.   delay(10);

  11.   Serial.println();
  12.   Serial.print("Connecting to ");
  13.   Serial.println(ssid);

  14.   WiFi.begin(ssid, password);

  15.   while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
  16.    
  17.   {
  18.     delay(500);
  19.     Serial.print(".");
  20.   }//如果没有连通向串口发送.....

  21.   Serial.println("");
  22.   Serial.println("WiFi connected");
  23.   Serial.println("IP address: ");
  24.   Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址
  25. }


  26. void loop()
  27. {
  28.   while (!client.connected())//几个非连接的异常处理
  29.   {
  30.     if (!client.connect(host, tcpPort))
  31.     {
  32.       Serial.println("connection....");
  33.       //client.stop();
  34.       delay(500);

  35.     }
  36.   }

  37. while (client.available())//无线读取到的数据转发到到串口
  38.     {
  39.         uint8_t c = client.read();
  40.         Serial.write(c);
  41.     }


  42.     if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
  43.     {
  44.         size_t counti = Serial.available();
  45.         uint8_t sbuf[counti];
  46.         Serial.readBytes(sbuf, counti);
  47.         client.write(sbuf, counti);

  48.     }

  49.   }



复制代码
回复

使用道具 举报

发表于 2016-4-12 21:13:26 | 显示全部楼层
赞  用的MODBUS  协议啊,楼主 留个QQ吧,有问题请教
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 03:49 , Processed in 0.045334 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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