本帖最后由 156******** 于 2017-7-21 11:21 编辑
作品实物图镇楼!!!
简介
气象数据与人们的生活息息相关,古人通过观察云朵预测天气变化,从而调整生产劳作。随着物联网时代的到来,现代人能通过各种仪器更加便捷地记录天气数据,并利用历史数据预测天气的变化。本文介绍的是一种微型气象站,分为室内机和室外机两个部分。室内机和室外机分别通过Wifi和GPRS与OneNET服务器进行连接,室外机采集空气质量数据(PM2.5、PM10等)、空气温湿度、光照强度、雨水变化等数据,通过OneNET存储并转发给室内机。室内机在定时上传室内空气温湿度之外,还将室外的实时数据显示在OLED屏上,便于用户及时了解室外天气变化。
功能
室内机:
①通过网络自动获取并显示时间;
②显示实时天气数据和未来3天气象预报(通过IP地址自动获取所在城市);
③显示室内空气温湿度;
④显示室外机数据(包括PM2.5、雨水情况、空气温湿度);
⑤支持Airkiss一键配网技术;
⑥WiFi信息记录功能,断电重启后无需再次配置;
⑦支持OTA升级方式;
⑧自带七彩呼吸灯,通过按键或者网页调节颜色。
室外机:
①采集空气质量数据(PM2.5、PM10等)、空气温湿度、光照强度、雨水变化等数据;
②LCD显示并上传至OneNET平台;
③内置锂电池,自带太阳能充电装置;
系统介绍
硬件组成: 室内机采用ESP8266作为主控芯片 + DHT22温湿度传感器 + RGBLED + 1.3吋OLED显示屏 + 按键等组成。
室外机利用麒麟开发板作为主控板 + 攀藤G5空气质量传感器 + GY-302光照传感器 + 雨滴传感器 + LCD显示屏等组成。
软件框架:
部分核心代码(室内机):- #include <ESP8266WiFi.h>
- #include <WiFiClient.h>
- #include <ESP8266WebServer.h>
- #include <time.h>
- #include <Ticker.h>
- #include <EEPROM.h>
- #include "SH1106Wire.h"
- #include "OLEDDisplayUi.h"
- #include "Wire.h"
- #include "DHT.h"
- #include "onenet.h"
- #include "WeatherClient.h"
- #include "WeatherStationFonts.h"
- #include "WeatherStationImages.h"
- #define DHTPIN 2 // what digital pin we're connected to
- #define DHTTYPE DHT22
- #define keyPin 12
- #define KEY digitalRead(keyPin)
- #define WeatherClient_API "Your API" //知心天气申请API
- const char* devID = "8888888"; //OneNET申请设备账号信息
- const char* apiKey = "Your apikey";
- const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";
- //RGB value
- unsigned char redVal = 20;
- unsigned char greenVal = 50;
- unsigned char blueVal = 90;
- char colorSign = 1;
- //WIFI
- char ssid[15];
- char password[15];
- // Setup
- const int UPDATE_INTERVAL_SECS = 10 * 3; // Update every 10 minutes
- // Display Settings
- const int I2C_DISPLAY_ADDRESS = 0x3c;
- const int SDA_PIN = 5;
- const int SDC_PIN = 4;
- SH1106Wire display(I2C_DISPLAY_ADDRESS, SDA_PIN, SDC_PIN);
- OLEDDisplayUi ui( &display );
- WeatherClient WeatherClient(WeatherClient_API);
- DHT dht(DHTPIN, DHTTYPE);
- Ticker timer;
- Ticker ledTimer;
- Ticker keyTimer;
- ESP8266WebServer server(80);
- ONENET_CLASS ONENET;
- // flag changed in the ticker function every 5 minutes
- bool readyForUpdate = false;
- bool readyForWeatherUpdate = false;
- char Tem[5]; //温度存储
- char Hum[5]; //湿度存储
- String outTem = "nan";
- String outHum = "nan";
- String PM2_5 = "nan";
- char Rain = 3;
- void setup() {
- // initialize dispaly
- display.init();
- display.clear();
- display.drawXbm(16, 1, OneNet_Logo_width, OneNet_Logo_height, OneNet_Logo_bits);//显示OneNet logo
- display.display();
- pinMode(keyPin,INPUT_PULLUP); //按键初始化
- EEPROM.begin(50); //EEPROM初始化
- RGBLedInit(); //RGBled初始化
- Serial.begin(115200); //串口初始化
- dht.begin(); //初始化DHT22
-
- delay(2000);
- if(0==KEY) //开机按键长按检测
- {
- delay(100);
- if(0==KEY)
- webota(); //OTA升级
- }
- if(EEPROM.read(0) != 0x01) //判断是否存储了WiFi信息
- {
- smartConfig(); //智能配网
- } else
- {
- WiFi.disconnect();
- WiFi.mode(WIFI_STA); //设置模块为STA模式
- readwifiInfo(); //读取EEPROM内的WiFi信息
- WiFi.begin(ssid, password); //连接WiFi
- Serial.println("\nConnecting to WiFi");
- }
-
- if(!drawWaitWiFi()) //WiFi连接失败
- {
- drawWaitAirkiss(); //进入智能配网模式
- }
- drawWaitTime(); //获取NTP时间
- updateData(&display); //更新天气、温湿度等数据
- ONENET.OneNet_DevLink(devID,apiKey); //连接注册到OneNet服务器
- timer.attach(20, setReadyForUpdate); //数据更新定时器配置
- ledTimer.attach_ms(40, setLedUpdate); //呼吸灯定时器配置
- attachInterrupt(keyPin,keyInterrupt,FALLING); //外部中断初始化(按键)
- displayUIInit(); //初始化UI
- }
- void loop() {
- if (readyForWeatherUpdate && ui.getUiState()->frameState == FIXED) {
- readyForWeatherUpdate=false;
- if(WiFi.status() == WL_CONNECTED)
- {
- WeatherClient.UpdateWeatherInfo(); //更新实时天气数据
- WeatherClient.UpdateWeatherForecast(); //更新天气预报数据
- ONENET.OneNet_HeartBeat(); //向OneNet发送心跳包
- if(ONENET.OneNet_GetStatus() == 0 && WiFi.status() == WL_CONNECTED)//断线重新登陆
- {
- ONENET.OneNet_DevLink(devID,apiKey);
- }
- }
-
- Serial.println(WeatherClient.GetWeatherInfo());
- } else if(readyForUpdate && ui.getUiState()->frameState == FIXED)
- {
- readyForUpdate=false;
- updateDHTdate(); //更新室内温湿度数据
- uploadtoOneNet(); //上传数据至OneNet平台
- }
- receiveOneNetdate(); //接收平台下发的信息
- int remainingTimeBudget = ui.update();
- if (remainingTimeBudget > 0) {
- // You can do some work here
- // Don't do stuff if you are below your
- // time budget.
- delay(remainingTimeBudget);
- }
- }
- void updateDHTdate() //室内温湿度数据更新
- {
- float Temperature = dht.readTemperature();
- if( !isnan(Temperature))
- {
- dtostrf(Temperature,2,1,Tem);
- }
-
- float Humidity = dht.readHumidity();
- if( !isnan(Humidity))
- {
- dtostrf(Humidity,2,1,Hum);
- }
- }
- void uploadtoOneNet() //上传数据至OneNet平台
- {
- String updataInfo = String("") +
- ",;temp,"+ Tem + ";hum," + Hum + ";red," + redVal + ";green," + greenVal + ";blue," + blueVal + ";";
- ONENET.OneNet_SendData(updataInfo);
- }
- void receiveOneNetdate()
- {
- String date = ONENET.OneNet_GetData();
- if(date != "")
- {
- if(date.substring(0,2) == ",;") //接收来自室外机的数据
- {
- outTem = date.substring(14,18);
- outHum = date.substring(28,32);
- char count = date.indexOf(';',44);
- PM2_5 = date.substring(43,count);
- count = date.lastIndexOf(';');
- Rain = date.substring(count-1,count).toInt();
- }
- else if(date.substring(0,4) == "RVal")
- {
- redVal = date.substring(4).toInt();
- uploadtoOneNet(); //上传数据至OneNet平台
- } else if(date.substring(0,4) == "GVal")
- {
- greenVal = date.substring(4).toInt();
- uploadtoOneNet();
- } else if(date.substring(0,4) == "BVal")
- {
- blueVal = date.substring(4).toInt();
- uploadtoOneNet();
- }
-
- }
- }
- void setReadyForUpdate() { //20s定时器中断
- static int num = 0;
- readyForUpdate = true;
- if(num++ > UPDATE_INTERVAL_SECS) //10min
- {
- num=0;
- readyForWeatherUpdate = true;
- }
- }
复制代码
应用截图:
资料区:
演示视频链接: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,室外机代码是在麒麟座综合代码的基础上进行修改与拓展而来。经过了十几天的测试,星立方的稳定性方面表现非常不错,时钟的精确度、天气的实时更新、室内温湿度的采集与上传均能达到要求。并且在持续运行过程中从未发生过死机现象,在经历过断电断网之后能够自动恢复稳定运行状态。此外,星立方也是本人目前为止最为满意的一件物联网作品,在此衷心感谢中移物联网提供的麒麟座开发板,及其工程师在本作品设计过程中的耐心解答。
|