Arduino UNO 迷你气象站
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
| ||||
|
关于这个项目
这是我的第一代基于 Arduino 的带有 Wi-Fi 连接的迷你气象站,能够使用 ThingSpeak 平台在线公开发布数据。
气象站使用不同的传感器收集与天气和环境相关的以下数据:
- 温度
- 湿度
- 大气压
- 光照强度
- 紫外线指数
- 粉尘浓度
目标是使用开放式硬件制作一个小巧而简单的气象站。
让我们开始玩吧!
电子元件 图> 图> 图> 图> 图> 图> 图>
您不需要特定工具来组装此项目。所有组件都可以在您最喜欢的电子商务商店在线找到。
该电路由USB口供电(连接电脑或普通手机充电器),但也可以外接直流电源或电池连接到Arduino电源插孔。
气象站电路案例不在本项目范围内。
连接部件 图>
根据原理图连接所有组件。您需要一些跨接线将每个传感器连接到面包板。您可以使用 protoshield(用于更紧凑的电路)、普通面包板,或设计您自己的 Arduino 扩展板。
将 USB 数据线插入 Arduino Uno 板并继续下一步。
代码
假设您已经安装了最新的 Arduino IDE,请下载并安装以下库:
- DHT22 库
- Adafruit BMP085 库
有关如何将库添加到 Arduino IDE 的说明,请查看以下 Arduino 指南。
下载 Arduino 代码 (weatherBox.ino
) 包含在代码部分。替换 XXXXX
通过您的 WiFi 路由器 SSID,YYYYY
通过路由器密码和ZZZZZ
通过您的 ThingSpeak 频道写入 API 密钥(请参阅下一步如何获取)。
将 Arduino 板连接到您的计算机 USB 端口并上传代码。
ThingSpeak 配置 图> 图> 图>
- 创建一个 ThingSpeak 帐户
- 创建一个新频道
指定气象站的名称和描述。分配以下频道并保存频道:
- 通道 1 =光
- 通道 2 =湿度
- 通道 3 =温度(来自 DHT22)
- 通道 4 =紫外线指数
- 通道 5 =粉尘浓度
- 通道 6 =压力
- 通道 7 =温度(来自 BMP085)
复制 API 写入密钥。它在 Arduino 代码的上一步中使用。当电台打开时,传感器值将定期上传到频道。您可以配置每个变量的公共和私有可视化。
公共频道示例:https://thingspeak.com/channels/35540
使用安卓应用
您将能够在任何浏览器中可视化气象站数据。但您也可以在基于 Android 的智能手机上查看它,并随时将其可视化。
- 在您的 Android 设备上从 Google Play 商店下载并安装 ThingsView 应用
- 在应用中,插入您的频道 ID 号,然后点击添加。您将在 ThingSpeak 频道配置中找到 ID
- 每个变量的当前值将显示在图表中
玩得开心!
代码
- weatherBox.ino
weatherBox.inoArduino
#include#include #include #include #include #include #define SSID "XXXXX " //用你的路由器SSID替换XXXX#define PASS "YYYYY" //用你的路由器密码替换YYYYY#define IP "184.106.153.149" // thingspeak.com IP#define DHT22_PIN 2String GET ="GET /update?key=ZZZZZ&field1="; //用你的ThingSpeak频道写keySoftwareSerial monitor(10, 11)替换ZZZZZ; //串行通信到ESP8266模块(RX, TX)dht DHT;Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified(10085);//VariablesintluminancePin =A0;int uvPin =A1;intdustPin =8;unsigned long duration;unsigned long starttime; sampletime_ms =30000;unsigned long delay_time =60000;unsigned long lowpulseoccupancy =0;float ratio =0;float浓度 =0;//setupvoid setup(){ //开始串行通信Serial.begin(9600);监视器开始(9600); Serial.println("正在初始化..."); //配置 Arduino 引脚 pinMode(dustPin, INPUT); //初始化压力传感器Serial.println("正在检测BMP085压力传感器..."); if(!bmp.begin()) { Serial.println("未检测到 BMP085 传感器。验证您的连接或 I2C 地址!");同时(1); } Serial.println("检测到BMP085!"); //与wifi模块通信monitor.flush(); monitor.println("AT");延迟(2000); if(monitor.find("OK")){ Serial.println("与ESP8266模块通信:OK"); } else { Serial.println("ESP8266 模块错误"); } //连接wifi路由器connectWiFi(); Serial.print("Sampling("); Serial.print(sampletime_ms/1000); Serial.println("s)..."); //初始化定时器 starttime =millis();}void loop(){ //测量灰尘颗粒持续时间 =pulseIn(dustPin, LOW);低脉冲占用率 =低脉冲占用率 + 持续时间; //30 秒循环 if ((millis() - starttime)>=sampletime_ms) { ratio =lowpulseoccupancy/(sampletime_ms*10.0); // 百分比 (de 0 a 100%) 浓度 =1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // 从数据表 lowpulseoccupancy =0; //读取其他传感器字符缓冲区[10]; //光传感器浮动亮度=模拟读取(亮度Pin); //UV 传感器 float uv =analogRead(uvPin);紫外线 =紫外线 * 0.0049; //将值转换为伏特 uv =uv * 307; //转换为mW/m² uv =uv/200; //计算紫外线指数 //温湿度 int chk =DHT.read22(DHT22_PIN);浮动湿度 =DHT.湿度;浮动温度 =DHT.温度; //压力和温度1sensors_event_t事件; bmp.getEvent(&event);浮动压力 =0;浮动温度1 =0;如果(事件.压力){压力=事件.压力; bmp.getTemperature(&温度1); } //将传感器值转换为字符串 StringluminanceStr =dtostrf(luminance, 4, 1, buffer);亮度Str.replace(" ",""); String uvStr =dtostrf(uv, 4, 1, 缓冲); uvStr.replace(" ","");字符串湿度Str =dtostrf(湿度, 4, 1, 缓冲);湿度Str.replace(" ",""); String temperatureStr =dtostrf(温度, 4, 1, 缓冲);温度Str.replace(" ",""); StringdustStr =dtostrf(浓度, 4, 1, 缓冲);灰尘Str.replace(" ",""); String pressureStr =dtostrf(pressure, 4, 1, buffer); pressureStr.replace(" ","");字符串温度1Str =dtostrf(温度1, 4, 1, 缓冲);温度1Str.replace("",""); //将数据发送到 ThingSpeak updateSensors(luminanceStr, heightStr, temperatureStr, uvStr,dustStr, pressureStr, temperature1Str); //等待下一个采样周期 Serial.print("Wait"); Serial.print(delay_time/1000); Serial.println("s 为下一次采样"); Serial.println();延迟(延迟时间); //初始化新循环Serial.println(); Serial.print("Sampling("); Serial.print(sampletime_ms/1000); Serial.println("s)...");开始时间 =毫秒(); }}//发送数据到ThingSpeakvoid updateSensors(StringluminanceStr, String modifiedStr, String temperatureStr, String uvStr, String DustStr, String pressureStr, String temperature1Str) { String cmd ="AT+CIPSTART=\"TCP\",\""; cmd +=IP; cmd +="\",80"; monitor.println(cmd);延迟(2000); cmd =获取; cmd +=亮度Str; cmd +="&field2="; cmd +=湿度Str; cmd +="&field3="; cmd +=温度Str; cmd +="&field4="; cmd +=uvStr; cmd +="&field5="; cmd +=灰尘Str; cmd +="&field6="; cmd +=pressureStr; cmd +="&field7="; cmd +=温度1Str; cmd +="\r\n";延迟(1000); int strsize =cmd.length(); monitor.println("AT+CIPSEND=" + String(strsize));延迟(2000);监控打印(cmd); if(monitor.find("OK")){ Serial.println("传输成功完成"); }else{ Serial.println("传输失败!"); }}void sendDebug(String cmd){ Serial.print("SEND:"); Serial.println(cmd); monitor.println(cmd);} boolean connectWiFi(){ Serial.println("正在连接无线网络..."); String cmd ="AT+CWMODE=1"; monitor.println(cmd);延迟(2000);监控.flush(); //清除缓冲区 cmd="AT+CWJAP=\""; cmd+=SSID; cmd+="\",\""; cmd+=PASS; cmd+="\""; monitor.println(cmd);延迟(5000); if(monitor.find("OK")){ Serial.println("连接成功!");返回真; }else{ Serial.println("连接失败!");返回假; } Serial.println();}
Github
https://github.com/adafruit/DHT-sensor-libraryhttps://github.com/adafruit/DHT-sensor-libraryGithub
https://github.com/adafruit/Adafruit-BMP085-Libraryhttps://github.com/adafruit/Adafruit-BMP085-Library制造工艺