|
|
本帖最后由 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 代码
- #include <Wire.h>
- #include<SoftwareSerial.h>
- unsigned char Tx_Buffer[8];
- unsigned char Rx_Buffer[40];
- unsigned char read_enable, receive_finished, reveive_number;
- float Voltage_data, Current_data, Power_data, Energy_data, Pf_data, CO2_data;
- float Voltage,Current,Power,Energy,Pf,CO2;
- SoftwareSerial softSerial(10, 11);
- void setup() {
- Serial.begin(115200);
- softSerial.begin(4800);
- softSerial.listen();
- }
- void loop() {
- write_data();
- delay(100);
- read_data();
- delay(100);
- Analysis_data();
- delay(100);
- float Voltage= Voltage_data/10000;
- float Current= Current_data/10000;
- float Power= Power_data/10000;
- float Energy= Energy_data/10000;
- float Pf= Pf_data/1000;
- float CO2= CO2_data/10000;
- Serial.println("{"method": "update","gatewayNo": "01","userkey": "*****************************"}&^!");
- delay(20000);
- //向乐联注册
-
- Serial.print("{"method": "upload","data":[{"Name":"DY","Value":"");
- Serial.print(Voltage);
- Serial.print(""},{"Name":"DL","Value":"");
- Serial.print(Current);
- Serial.print(""},{"Name":"GL","Value":"");
- Serial.print(Power);
- Serial.print(""},{"Name":"YDL","Value":"");
- Serial.print(Energy);
- Serial.print(""},{"Name":"GLYS","Value":"");
- Serial.print(Pf);
- Serial.print(""},{"Name":"WD","Value":"");
- Serial.print(CO2);
- Serial.println(""}]}&^!");
- delay(30000);
- }
- unsigned int calccrc(unsigned char crcbuf, unsigned int crc)
- {
- unsigned char i;
- unsigned char chk;
- crc = crc ^ crcbuf;
- for (i = 0; i < 8; i++)
- {
- chk = ( unsigned char)(crc & 1);
- crc = crc >> 1;
- crc = crc & 0x7fff;
- if (chk == 1)
- crc = crc ^ 0xa001;
- crc = crc & 0xffff;
- }
- return crc;
- }
- unsigned int chkcrc(unsigned char *buf, unsigned char len)
- {
- unsigned char hi, lo;
- unsigned int i;
- unsigned int crc;
- crc = 0xFFFF;
- for (i = 0; i < len; i++)
- {
- crc = calccrc(*buf, crc);
- buf++;
- }
- hi = ( unsigned char)(crc % 256);
- lo = ( unsigned char)(crc / 256);
- crc = (((unsigned int)(hi)) << 8) | lo;
- return crc;
- }
- void write_data(void)
- {
- union crcdata
- {
- unsigned int word16;
- unsigned char byte[2];
- } crcnow;
- read_enable = 1;
- if (read_enable == 1)
- {
- read_enable = 0;
- Tx_Buffer[0] = 0x01;
- Tx_Buffer[1] = 0x03;
- Tx_Buffer[2] = 0x00;
- Tx_Buffer[3] = 0x48;
- Tx_Buffer[4] = 0x00;
- Tx_Buffer[5] = 0x06;
- crcnow.word16 = chkcrc(Tx_Buffer, 6);
- Tx_Buffer[6] = crcnow.byte[1];
- Tx_Buffer[7] = crcnow.byte[0];
- softSerial.write(Tx_Buffer, 8) ;
- }
- }
- void read_data()
- {
-
- if ( softSerial.available() > 0 )
- {
- softSerial.readBytes(Rx_Buffer,34) ;
- delay(10);
-
- }
- }
- void Analysis_data(void)
- {
- unsigned char i;
- union crcdata
- {
- unsigned int word16;
- unsigned char byte[2];
- } crcnow;
- receive_finished=1;
- if (receive_finished == 1)
- {
- receive_finished = 0;
- unsigned char reveive_numbe = 34;
- if (Rx_Buffer[0] == 0x01);
- {
- crcnow.word16 = chkcrc(Rx_Buffer, reveive_numbe - 2);
- if ((crcnow.byte[0] == Rx_Buffer[reveive_numbe - 1]) && (crcnow.byte[1] == Rx_Buffer[reveive_numbe - 2]))
- {
- Voltage_data = (((unsigned long)(Rx_Buffer[3])) << 24) | (((unsigned long)(Rx_Buffer[4])) << 16) | (((unsigned long)(Rx_Buffer[5])) << 8) | Rx_Buffer[6];
- Current_data = (((unsigned long)(Rx_Buffer[7])) << 24) | (((unsigned long)(Rx_Buffer[8])) << 16) | (((unsigned long)(Rx_Buffer[9])) << 8) | Rx_Buffer[10];
- Power_data = (((unsigned long)(Rx_Buffer[11])) << 24) | (((unsigned long)(Rx_Buffer[12])) << 16) | (((unsigned long)(Rx_Buffer[13])) << 8) | Rx_Buffer[14];
- Energy_data = (((unsigned long)(Rx_Buffer[15])) << 24) | (((unsigned long)(Rx_Buffer[16])) << 16) | (((unsigned long)(Rx_Buffer[17])) << 8) | Rx_Buffer[18];
- Pf_data = (((unsigned long)(Rx_Buffer[19])) << 24) | (((unsigned long)(Rx_Buffer[20])) << 16) | (((unsigned long)(Rx_Buffer[21])) << 8) | Rx_Buffer[22];
- CO2_data = (((unsigned long)(Rx_Buffer[23])) << 24) | (((unsigned long)(Rx_Buffer[24])) << 16) | (((unsigned long)(Rx_Buffer[25])) << 8) | Rx_Buffer[26];
-
- }
- }
- }
- }
复制代码 esp8266 透传代码
- #include <ESP8266WiFi.h>
- const char *ssid = "wifi ssid";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
- const char *password = "password";//你要连接的wifi密码
- const char *host = "42.121.128.216";//修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
- WiFiClient client;
- const int tcpPort = 9960;//修改为你建立的Server服务端的端口号
- void setup()
- {
- Serial.begin(115200);
- delay(10);
-
- Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
-
- {
- delay(500);
- Serial.print(".");
- }//如果没有连通向串口发送.....
- Serial.println("");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址
- }
- void loop()
- {
- while (!client.connected())//几个非连接的异常处理
- {
- if (!client.connect(host, tcpPort))
- {
- Serial.println("connection....");
- //client.stop();
- delay(500);
- }
- }
- while (client.available())//无线读取到的数据转发到到串口
- {
- uint8_t c = client.read();
- Serial.write(c);
- }
-
-
- if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
- {
- size_t counti = Serial.available();
- uint8_t sbuf[counti];
- Serial.readBytes(sbuf, counti);
- client.write(sbuf, counti);
-
- }
- }
复制代码 |
|