查看: 8037|回复: 5

【参赛作品】星立方™微型气象站

[复制链接]

2

主题

16

帖子

78

积分

注册会员

Rank: 2

积分
78
发表于 2017-6-30 10:52:32 | 显示全部楼层 |阅读模式
本帖最后由 156******** 于 2017-7-21 11:21 编辑
作品实物图镇楼!!!

IMG_20170628_180111.jpg

简介
       气象数据与人们的生活息息相关,古人通过观察云朵预测天气变化,从而调整生产劳作。随着物联网时代的到来,现代人能通过各种仪器更加便捷地记录天气数据,并利用历史数据预测天气的变化。本文介绍的是一种微型气象站,分为室内机和室外机两个部分。室内机和室外机分别通过Wifi和GPRS与OneNET服务器进行连接,室外机采集空气质量数据(PM2.5、PM10等)、空气温湿度、光照强度、雨水变化等数据,通过OneNET存储并转发给室内机。室内机在定时上传室内空气温湿度之外,还将室外的实时数据显示在OLED屏上,便于用户及时了解室外天气变化。
系统示意图.png
功能

室内机:
           ①通过网络自动获取并显示时间;
           ②显示实时天气数据和未来3天气象预报(通过IP地址自动获取所在城市);
           ③显示室内空气温湿度;
           ④显示室外机数据(包括PM2.5、雨水情况、空气温湿度);
           ⑤支持Airkiss一键配网技术;
           ⑥WiFi信息记录功能,断电重启后无需再次配置;
           ⑦支持OTA升级方式;
           ⑧自带七彩呼吸灯,通过按键或者网页调节颜色。
室外机:
           ①采集空气质量数据(PM2.5、PM10等)、空气温湿度、光照强度、雨水变化等数据;
           ②LCD显示并上传至OneNET平台;
           ③内置锂电池,自带太阳能充电装置;

系统介绍

硬件组成:
      室内机采用ESP8266作为主控芯片 + DHT22温湿度传感器 + RGBLED + 1.3吋OLED显示屏 + 按键等组成。
室内机硬件系统.png 室内机外壳设计图.png IMG_20170629_124720.jpg

      室外机利用麒麟开发板作为主控板 + 攀藤G5空气质量传感器 + GY-302光照传感器 + 雨滴传感器 + LCD显示屏等组成。
室外机硬件系统.png 室外机外壳设计图.png IMG_20170629_115143.jpg

软件框架:
物联图.png

部分核心代码(室内机):
  1. #include <ESP8266WiFi.h>
  2. #include <WiFiClient.h>
  3. #include <ESP8266WebServer.h>
  4. #include <time.h>
  5. #include <Ticker.h>
  6. #include <EEPROM.h>
  7. #include "SH1106Wire.h"
  8. #include "OLEDDisplayUi.h"
  9. #include "Wire.h"
  10. #include "DHT.h"
  11. #include "onenet.h"

  12. #include "WeatherClient.h"
  13. #include "WeatherStationFonts.h"
  14. #include "WeatherStationImages.h"

  15. #define DHTPIN 2     // what digital pin we're connected to
  16. #define DHTTYPE DHT22

  17. #define keyPin 12
  18. #define KEY digitalRead(keyPin)

  19. #define WeatherClient_API "Your API"              //知心天气申请API

  20. const char* devID     = "8888888";                        //OneNET申请设备账号信息
  21. const char* apiKey    = "Your apikey";

  22. const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";

  23. //RGB value
  24. unsigned char redVal = 20;
  25. unsigned char greenVal = 50;
  26. unsigned char blueVal = 90;
  27. char colorSign = 1;

  28. //WIFI
  29. char ssid[15];  
  30. char password[15];

  31. // Setup
  32. const int UPDATE_INTERVAL_SECS = 10 * 3; // Update every 10 minutes

  33. // Display Settings
  34. const int I2C_DISPLAY_ADDRESS = 0x3c;
  35. const int SDA_PIN = 5;
  36. const int SDC_PIN = 4;

  37. SH1106Wire      display(I2C_DISPLAY_ADDRESS, SDA_PIN, SDC_PIN);
  38. OLEDDisplayUi   ui( &display );
  39. WeatherClient   WeatherClient(WeatherClient_API);
  40. DHT             dht(DHTPIN, DHTTYPE);
  41. Ticker          timer;
  42. Ticker          ledTimer;
  43. Ticker          keyTimer;
  44. ESP8266WebServer server(80);
  45. ONENET_CLASS    ONENET;

  46. // flag changed in the ticker function every 5 minutes
  47. bool readyForUpdate = false;
  48. bool readyForWeatherUpdate = false;
  49. char Tem[5]; //温度存储
  50. char Hum[5]; //湿度存储
  51. String outTem = "nan";
  52. String outHum = "nan";
  53. String PM2_5  = "nan";
  54. char Rain   = 3;

  55. void setup() {
  56.   // initialize dispaly
  57.   display.init();
  58.   display.clear();
  59.   display.drawXbm(16, 1, OneNet_Logo_width, OneNet_Logo_height, OneNet_Logo_bits);//显示OneNet logo
  60.   display.display();  

  61.   pinMode(keyPin,INPUT_PULLUP);               //按键初始化
  62.   EEPROM.begin(50);                          //EEPROM初始化
  63.   RGBLedInit();                               //RGBled初始化
  64.   Serial.begin(115200);                      //串口初始化  
  65.   dht.begin();                                //初始化DHT22
  66.   
  67.   delay(2000);  
  68.   if(0==KEY)                                 //开机按键长按检测
  69.   {
  70.     delay(100);
  71.     if(0==KEY)
  72.        webota();                             //OTA升级
  73.   }

  74.   if(EEPROM.read(0) != 0x01)                //判断是否存储了WiFi信息
  75.   {
  76.     smartConfig();                           //智能配网
  77.   } else
  78.   {
  79.     WiFi.disconnect();                        
  80.     WiFi.mode(WIFI_STA);                       //设置模块为STA模式
  81.     readwifiInfo();                            //读取EEPROM内的WiFi信息
  82.     WiFi.begin(ssid, password);               //连接WiFi
  83.     Serial.println("\nConnecting to WiFi");
  84.   }
  85.   
  86.   if(!drawWaitWiFi())                          //WiFi连接失败
  87.   {
  88.     drawWaitAirkiss();                           //进入智能配网模式   
  89.   }

  90.   drawWaitTime();                                     //获取NTP时间

  91.   updateData(&display);                               //更新天气、温湿度等数据

  92.   ONENET.OneNet_DevLink(devID,apiKey);                //连接注册到OneNet服务器

  93.   timer.attach(20, setReadyForUpdate);                //数据更新定时器配置
  94.   ledTimer.attach_ms(40, setLedUpdate);               //呼吸灯定时器配置
  95.   attachInterrupt(keyPin,keyInterrupt,FALLING);       //外部中断初始化(按键)

  96.   displayUIInit();                                    //初始化UI
  97. }

  98. void loop() {
  99.   if (readyForWeatherUpdate && ui.getUiState()->frameState == FIXED) {
  100.     readyForWeatherUpdate=false;
  101.     if(WiFi.status() == WL_CONNECTED)
  102.     {
  103.       WeatherClient.UpdateWeatherInfo();                 //更新实时天气数据
  104.       WeatherClient.UpdateWeatherForecast();             //更新天气预报数据
  105.       ONENET.OneNet_HeartBeat();                         //向OneNet发送心跳包

  106.       if(ONENET.OneNet_GetStatus() == 0 && WiFi.status() == WL_CONNECTED)//断线重新登陆
  107.       {
  108.         ONENET.OneNet_DevLink(devID,apiKey);
  109.       }
  110.     }
  111.    
  112.     Serial.println(WeatherClient.GetWeatherInfo());
  113.   } else if(readyForUpdate && ui.getUiState()->frameState == FIXED)
  114.   {
  115.     readyForUpdate=false;
  116.     updateDHTdate();                                   //更新室内温湿度数据
  117.     uploadtoOneNet();                                  //上传数据至OneNet平台
  118.   }

  119.   receiveOneNetdate();                                 //接收平台下发的信息

  120.   int remainingTimeBudget = ui.update();

  121.   if (remainingTimeBudget > 0) {
  122.     // You can do some work here
  123.     // Don't do stuff if you are below your
  124.     // time budget.   
  125.     delay(remainingTimeBudget);
  126.   }
  127. }

  128. void updateDHTdate()                                 //室内温湿度数据更新
  129. {   
  130.    float Temperature = dht.readTemperature();     
  131.    if( !isnan(Temperature))
  132.    {
  133.       dtostrf(Temperature,2,1,Tem);  
  134.    }
  135.          
  136.    float Humidity = dht.readHumidity();
  137.    if( !isnan(Humidity))
  138.    {
  139.       dtostrf(Humidity,2,1,Hum);
  140.    }
  141. }

  142. void uploadtoOneNet()                                 //上传数据至OneNet平台
  143. {
  144.   String updataInfo = String("") +
  145.   ",;temp,"+ Tem + ";hum," + Hum + ";red," + redVal + ";green," + greenVal + ";blue," + blueVal + ";";
  146.   ONENET.OneNet_SendData(updataInfo);
  147. }

  148. void receiveOneNetdate()
  149. {
  150.   String date = ONENET.OneNet_GetData();
  151.   if(date != "")
  152.   {
  153.      if(date.substring(0,2) == ",;")                //接收来自室外机的数据
  154.      {
  155.         outTem = date.substring(14,18);
  156.         outHum = date.substring(28,32);
  157.         char count = date.indexOf(';',44);
  158.         PM2_5  = date.substring(43,count);
  159.         count = date.lastIndexOf(';');
  160.         Rain   = date.substring(count-1,count).toInt();
  161.      }
  162.      else if(date.substring(0,4) == "RVal")
  163.      {
  164.         redVal = date.substring(4).toInt();
  165.         uploadtoOneNet();                          //上传数据至OneNet平台
  166.      } else if(date.substring(0,4) == "GVal")
  167.      {
  168.         greenVal = date.substring(4).toInt();
  169.         uploadtoOneNet();
  170.      } else if(date.substring(0,4) == "BVal")
  171.      {
  172.         blueVal = date.substring(4).toInt();
  173.         uploadtoOneNet();
  174.      }

  175.      
  176.   }
  177. }

  178. void setReadyForUpdate() {                            //20s定时器中断
  179.   static int num = 0;
  180.   readyForUpdate = true;
  181.   if(num++ > UPDATE_INTERVAL_SECS)                   //10min
  182.   {
  183.     num=0;
  184.     readyForWeatherUpdate = true;
  185.   }  
  186. }
复制代码

应用截图:
应用截屏.png

资料区:            
      演示视频链接:http://v.youku.com/v_show/id_XMjg1ODA1MTE2NA==.html?spm=a2h3j.8428770.3416059.1
     应用界面链接:https://open.iot.10086.cn/appview/p/27f5181464cb1ed3ba4d38bc4c7bb02f   
     固件码源链接https://pan.baidu.com/s/1c2xmf3U     密码: qd84


作品特色及应用:
      本作品体积小巧,功能丰富,具有便携性、易架设、低功耗等特色,能满足家庭、校园、农田、养殖场、车内环境等诸多场合的气象及空气质量监测需求,既适合于各种移动应用和应急应用场合,也可以作为常规无人值守气象站的应急备份。随着物联网技术的不断普及和人们对生活环境的日益重视,利用微型气象站功能的空间还非常巨大,还将会有更好的发展前景。




后记

      从萌发想法到完成设计,本人花了近两个月的时间,期间查阅了非常多的相关资料,并在作品的制作过程中对功能设计进行了优化和拓展。作品的外壳设计与绘制均由本人独立完成,室内机代码参考了国外的开源项目 Weather Station,主要参考了其UI设计及气象Logo,室外机代码是在麒麟座综合代码的基础上进行修改与拓展而来。经过了十几天的测试,星立方的稳定性方面表现非常不错,时钟的精确度、天气的实时更新、室内温湿度的采集与上传均能达到要求。并且在持续运行过程中从未发生过死机现象,在经历过断电断网之后能够自动恢复稳定运行状态。此外,星立方也是本人目前为止最为满意的一件物联网作品,在此衷心感谢中移物联网提供的麒麟座开发板,及其工程师在本作品设计过程中的耐心解答。



三维设计图(STL格式).rar

40.2 KB, 下载次数: 326

星立方™固件.rar

226.83 KB, 下载次数: 327

回复

举报

81

主题

470

帖子

1761

积分

金牌会员

Rank: 5Rank: 5

积分
1761
发表于 2017-7-20 15:56:37 | 显示全部楼层
156******** 发表于 2017-7-20 15:27
如果你觉得星立方™这个作品不错,麻烦为我投上一票,谢谢!
https://open.iot.10086.cn/bbs/thre ...

已投
1、麒麟座开发板QQ交流群:328700926
该群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~

2

主题

16

帖子

78

积分

注册会员

Rank: 2

积分
78
 楼主| 发表于 2017-7-20 15:27:21 | 显示全部楼层
如果你觉得星立方™这个作品不错,麻烦为我投上一票,谢谢!
https://open.iot.10086.cn/bbs/thread-7740-1-1.html

81

主题

470

帖子

1761

积分

金牌会员

Rank: 5Rank: 5

积分
1761
发表于 2017-6-30 13:53:27 | 显示全部楼层
156******** 发表于 2017-6-30 12:40
因为有了去年的经验,今年才得以做得更好

支持支持
1、麒麟座开发板QQ交流群:328700926
该群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~

2

主题

16

帖子

78

积分

注册会员

Rank: 2

积分
78
 楼主| 发表于 2017-6-30 12:40:26 | 显示全部楼层
cdd 发表于 2017-6-30 11:46
哎哟不错哦,产品看上去都比较成熟了,去年好像也看过你哟

因为有了去年的经验,今年才得以做得更好

81

主题

470

帖子

1761

积分

金牌会员

Rank: 5Rank: 5

积分
1761
发表于 2017-6-30 11:46:46 | 显示全部楼层
哎哟不错哦,产品看上去都比较成熟了,去年好像也看过你哟
1、麒麟座开发板QQ交流群:328700926
该群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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