极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20126|回复: 9

家庭移动环境监测和能耗监测, 433M无线数据传送乐联

[复制链接]
发表于 2013-8-29 18:03:39 | 显示全部楼层 |阅读模式
本帖最后由 gpwang2000 于 2013-8-29 18:14 编辑

    乐联的家庭能耗活动搞得如火如荼, 利用手里现成的模块搭了一套系统,在群里得到廋网虫、小叶子、老顽童等的帮助。

    移动端包括BMP085 + DSM501A + LCD5110 + 电量模块 + ArduinoNano + 433M发射,无线网关包括433M超再生接收 + ArduinoUno + ENC28J60,无线数据传输以最常见价格最低廉的433M收发模块为基础,利用VirtualWire库实现了无线数据的单向传送,一次最大可传80个字节,另外为了方便系统串口调试, 与电量模块的通信使用了软件串口。

无线网关部分程序, 主要完成数据接收并上传到乐为物联
  1. #include <VirtualWire.h>
  2. #include <EtherCard.h>

  3. #define INTEGER(x) (long) x
  4. #define DECIMAL(x) (long)(abs(x)*100L+0.5) % 100

  5. #define DATA_COUNT 9

  6. // ethernet interface mac address
  7. static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
  8. uint8_t Ethernet::buffer[700];

  9. // lewei50
  10. //char lwSite[] PROGMEM = "192.168.1.148";
  11. char lwSite[] PROGMEM = "www.lewei50.com";
  12. char lwUrl[] PROGMEM = "/api/V1/gateway/UpdateSensors/01";
  13. char lwKey[] PROGMEM = "userkey: xxxxxxxxxxxxxxxxxxxxxxxxxx";
  14. char *lwSensor[DATA_COUNT]={"T", "P", "PM10", "PM25", "V", "KWH", "W", "A", "PF"};

  15. union DATA{
  16.   float value[DATA_COUNT];
  17.   struct{
  18.     float Temperature;  //温度
  19.     float Pressure;         //气压
  20.     float Pm10;             //1um粒子
  21.     float Pm25;             //2.5um粒子
  22.     float Voltage;           //电压
  23.     float Kwh;                //电量
  24.     float Watt;               //功率
  25.     float Amp;               //电流
  26.     float Pf;                   //功率因素
  27.   }item;
  28. }data;

  29. uint8_t lwSend = 0;
  30. uint8_t lwCount = 0;
  31. uint32_t sendTime;

  32. // called when the client request is complete
  33. static void my_result_cb (byte status, word off, word len) {
  34.   Serial.print("<<< reply ");
  35.   Serial.print(millis() - sendTime);
  36.   Serial.println(" ms");
  37.   Serial.println((const char*) Ethernet::buffer + off);
  38. }

  39. void setup() {
  40.   Serial.begin(9600);

  41.   // 初始化接收模块,速率为1200bps
  42.   vw_setup(1200);         
  43.   vw_rx_start();     

  44.   //初始化以太网卡
  45.   Serial.println("ethercard");
  46.   while(ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) {
  47.     Serial.println( "Failed");
  48.     delay(2000);
  49.   }
  50.   
  51.   //初始化IP地址
  52.   Serial.println("dhcp");
  53.   while (!ether.dhcpSetup()) {
  54.     Serial.println("failed");
  55.     delay(2000);
  56.   }  
  57.   ether.printIp("My IP: ", ether.myip);
  58.   ether.printIp("GW IP: ", ether.gwip);
  59.   ether.printIp("DNS IP: ", ether.dnsip);

  60.   //网址预处理
  61.   ether.dnsLookup(lwSite);
  62. }

  63. void loop() {

  64.   uint8_t buf[VW_MAX_MESSAGE_LEN];
  65.   uint8_t buflen = VW_MAX_MESSAGE_LEN;
  66.   char str[50];

  67.   ether.packetLoop(ether.packetReceive());

  68.   //无线数据接收
  69.   if (vw_get_message(buf, &buflen)) {
  70.     if (buflen != sizeof(data)){
  71.           Serial.println("recv error");
  72.           return;
  73.     }
  74.    
  75.     //处理收到的数据
  76.     float *p = (float *)buf;
  77.     for (int i=0; i<DATA_COUNT; i++){
  78.            //记录传输间隔内的最大值
  79.        if (p[i] > data.value[i]) data.value[i] = p[i];
  80.     }
  81.         lwSend = 1;
  82.   }

  83.   //数据分批发送至乐联网,每个数据约5分钟传一次
  84.   if (lwSend == 1){
  85.     sprintf(str,"[{"Name":"%s","Value":"%ld.%ld"}]", lwSensor[lwCount], INTEGER(data.value[lwCount]),DECIMAL((data.value[lwCount])));
  86.     Serial.println(str);
  87.     ether.dnsLookup(lwSite);
  88.     ether.printIp("Server: ", ether.hisip);
  89.     sendTime = millis();
  90.     ether.httpPost (lwUrl, lwSite, lwKey, str, my_result_cb);
  91.     data.value[lwCount] = 0;   
  92.     if (++lwCount >= DATA_COUNT) lwCount = 0;
  93.     lwSend = 0;
  94.   }
  95. }
复制代码


移动采集部分程序, 主要收集各个模块的数据从433M一并发送,约30秒发送一次
  1. #include <Wire.h>
  2. #include <ModbusMaster.h>
  3. #include <Adafruit_BMP085.h>
  4. #include <SoftwareSerial.h>
  5. #include <VirtualWire.h>
  6. #include <lcd5110.h>
  7. #include <dsm501a.h>
  8. #include <AcMeter.h>

  9. #define INTEGER(x) (long) x
  10. #define DECIMAL(x) (long)(abs(x)*100L+0.5) % 100

  11. #define DATA_COUNT 9

  12. Adafruit_BMP085 bmp;
  13. DSM501A dsm(A2, A3);
  14. ACMETER meter;

  15. union{
  16.   float value[DATA_COUNT];
  17.   struct{
  18.     float Temperature;  //温度
  19.     float Pressure;         //气压
  20.     float Pm10;             //1um粒子
  21.     float Pm25;             //2.5um粒子
  22.     float Voltage;           //电压
  23.     float Kwh;                //电量
  24.     float Watt;               //功率
  25.     float Amp;               //电流
  26.     float Pf;                   //功率因素
  27.   }item;
  28. }data;

  29. void setup()
  30. {
  31.   //初始化串口
  32.   Serial.begin(9600);
  33.   
  34.   // 初始化发送模块,速率为1200bps
  35.   Serial.println("vm");
  36.   vw_setup(1200);         

  37.   // 初始化5110液晶模块
  38.   Serial.println("lcd5110");
  39.   LCD_init();        

  40.   //初始化bmp085模块
  41.   Serial.println("bmp085");
  42.   while(!bmp.begin()){
  43.     Serial.println("Fialed!");
  44.     delay(2000);
  45.   }

  46.   // 启动粉尘检测
  47.   Serial.println("dsm start");
  48.   dsm.begin();      
  49. }

  50. void loop()
  51. {
  52.   uint8_t i, result;

  53.   //dsm.loop == 1, 处于粉尘采样阶段
  54.   if (dsm.loop() == 1) return;
  55.   //提取粉尘数据
  56.   data.item.Pm10 = dsm.pm10;
  57.   data.item.Pm25 = dsm.pm25;

  58.   //提取bmp085温度和气压数据
  59.   data.item.Temperature = bmp.readTemperature();
  60.   data.item.Pressure = bmp.readPressure();

  61.   //提取电量信息
  62.   if (meter.read() == 0){
  63.     data.item.Voltage = meter.Voltage;
  64.     data.item.Amp = meter.Amp;
  65.     data.item.Watt = meter.Watt;
  66.     data.item.Pf = meter.Pf;
  67.     data.item.Kwh = meter.Kwh;
  68.   }

  69.   //LCD显示数据
  70.   char str[30];
  71.   LCD_clear();//清屏
  72.   sprintf(str, "TIME: %ld", millis());
  73.   LCD_write_english_string(0,0,str);
  74.   sprintf(str, "PM10: %ld.%ld", INTEGER(data.item.Pm10), DECIMAL(data.item.Pm10));
  75.   LCD_write_english_string(0,1,str);
  76.   sprintf(str, "PM25: %ld.%ld", INTEGER(data.item.Pm25), DECIMAL(data.item.Pm25));
  77.   LCD_write_english_string(0,2,str);
  78.   sprintf(str, "TEMP: %ld.%ld", INTEGER(data.item.Temperature), DECIMAL(data.item.Temperature));
  79.   LCD_write_english_string(0,3,str);
  80.   sprintf(str, "PRES: %ld", INTEGER(data.item.Pressure));
  81.   LCD_write_english_string(0,4,str);
  82.   sprintf(str, "VOLT: %ld", INTEGER(data.item.Voltage), DECIMAL(data.item.Voltage));
  83.   LCD_write_english_string(0,5,str);

  84.   //数据发送至无线网关
  85.   vw_send((uint8_t *)&data, sizeof(data));
  86.   vw_wait_tx(); // Wait until the whole message is gone
  87.   
  88.   //再次启动粉尘检测
  89.   Serial.println("dsm start");
  90.   dsm.begin();
  91. }
复制代码


硬件连接情况


以下是一些参考库
乐联电量:http://www.lewei50.com/event/detail/1
BMP085:https://github.com/adafruit/Adafruit-BMP085-Library
虚拟串口:http://www.arduino.cc/en/Reference/SoftwareSerial
MODBUS:http://playground.arduino.cc/Code/ModbusMaster
ViturlWire:http://www.geeetech.com/wiki/index.php/433Mhz_RF_link_kit
28J60:https://github.com/jcw/ethercard
LCD5110:http://www.geek-workshop.com/thread-713-2-1.html
DSM501A:http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1747

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2013-8-29 19:33:31 | 显示全部楼层
本帖最后由 gpwang2000 于 2013-8-29 19:40 编辑

自己坐沙发,继续发图,

移动端照片, 用了个酸奶盒安装所有模块
正面

背面

屏幕显示


无线网关照片, 目前还未装箱

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-8-29 19:44:52 | 显示全部楼层
学习了啊,楼主很强大啊
回复 支持 反对

使用道具 举报

发表于 2013-9-22 00:08:40 | 显示全部楼层
好勁呀, DIY,
回复 支持 反对

使用道具 举报

发表于 2013-12-4 00:45:06 来自手机 | 显示全部楼层
dsm501的库 可以发我吗 我一直没找到
回复 支持 反对

使用道具 举报

发表于 2013-12-6 15:32:44 | 显示全部楼层
楼主 数据怎么从union里取出来呐?这段看不明白!
回复 支持 反对

使用道具 举报

发表于 2013-12-8 22:03:17 | 显示全部楼层
几天没玩arduino,好东西很多啊!
回复 支持 反对

使用道具 举报

发表于 2013-12-8 22:05:09 | 显示全部楼层
连线表格做得很清楚。
回复 支持 反对

使用道具 举报

发表于 2014-8-3 00:29:19 | 显示全部楼层
程序学习了,谢谢
回复 支持 反对

使用道具 举报

发表于 2014-9-27 00:08:50 | 显示全部楼层
用什么供电的呢,电池可以用多久?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 17:25 , Processed in 0.040820 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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