Arduino UNO 智能气象站:多传感器融合与红外遥控交互
项目简介
本项目基于 Arduino UNO 构建一款功能完备的桌面级气象站(AWS, Arduino Weather Station),集成 7 类环境传感器与 DS1302 实时时钟,通过 1602 I2C LCD 与红外遥控器实现多页面人机交互。整机采用激光切割亚克力外壳,体积小巧,适合科教演示、家庭环境监测、微型气象科普实验。
传感器套件与测量参数
| 传感器 | 型号/原理 | 测量范围/精度 | 接口/引脚 | 应用场景 |
|---|---|---|---|---|
| 温湿度 | DHT11 | 0-50℃ ±2℃ / 20-90%RH ±5% | 单总线 D4 | 室内环境基础监测 |
| 高精温度 | LM35 | -55~150℃ ±0.5℃ (线性 10mV/℃) | 模拟 A1 | 高精度温度基准校准 |
| 光照强度 | 光敏电阻 (LDR) + 10kΩ 分压 | 0-100% 相对黑暗度 | 模拟 A3 | 日照时数/遮阳判断 |
| 水/雪位 | 导电式液位探针 | 0-40mm 分辨率 1mm | 模拟 A0 | 雨量桶/积雪深度监测 |
| 实时时钟 | DS1302 | 年/月/日/时/分/秒,掉电走时 | 3线串口 D5/D6/D7 | 数据时间戳、定时采集 |
| 红外接收 | VS1838B / HS0038 | 38kHz 载波,NEC 协议 | 数字 D3 | 遥控切换显示页面 |
人机交互设计
遥控器按键映射
| 按键 | NEC 码值 | 功能 | 显示内容 | 停留时间 |
|---|---|---|---|---|
| 0 | 0xFF6897 | 时间日期页 | YYYY-MM-DD WW HH:MM:SS | 10s |
| 1 | 0xFF30CF | 温湿度页 | Tem: XX.X°C Hum: XX.X% | 10s |
| 2 | 0xFF18E7 | 光照页 | Darkness: XX% | 10s |
| 3 | 0xFF7A85 | 液位页 | Fluid level: XX mm | 10s |
| Cycle | 0xFF9867 | 循环演示 | 依次切换上述 4 页 | 4s/页 |
主界面动画
上电后 LCD 逐字符滚动显示 "Arduino Weather Station",字符间隔 50ms,形成打字机效果,随后进入待机态等待遥控指令。
硬件实现细节
外壳设计与加工
- Autocad 绘制 4mm 亚克力板展开图,含传感器探头避让孔、LCD 窗口、IR 透光窗、USB/电源口。
- 激光切割机切割,氯仿/丙酮粘接组装,边缘打磨倒角。
- 内部采用立柱支撑 PCB,震动环境下防止短路。
电源管理
- 主供电:Micro-USB 5V 直供 UNO,或 7-12V DC 插座经板载稳压。
- 备用电源:18650 锂电池 + TP4056 充电模块 + 5V 升压,续航约 48h。
- DS1302 自带 CR2032 纽扣电池座,掉电走时 >10 年。
关键电路注意事项
- DHT11 数据线需 4.7kΩ 上拉至 5V,建议就近放置 0.1μF 去耦电容。
- LM35 输出直接 A1,内部基准 5V 时分辨率 4.88mV/LSB,对应 0.488℃/LSB,代码中乘以 0.488 即得℃值。
- 液位探针并联 10kΩ 下拉,防止悬空读数飘移;探针间距 2mm,浸入深度线性对应电压。
- IR 接收头 VCC/GND/OUT 三线,OUT 接 D3,库内部启用中断解码。
核心代码结构
库依赖
#include
#include
#include
#include
#include
关键全局对象
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;
DS1302 rtc(RST_PIN, SDA_PIN, SCL_PIN);
IRrecv irrecv(IR_PIN);
decode_results results;
主循环逻辑
void loop() {
// 启动动画(仅首次运行)
if (firstBoot) { typewriterAnimation(); firstBoot = false; }
// 红外解码轮询
if (irrecv.decode(&results)) {
handleRemoteCommand(results.value);
irrecv.resume();
}
}
void handleRemoteCommand(unsigned long code) {
lcd.clear();
switch (code) {
case 0xFF6897: showTime(); delay(10000); break;
case 0xFF30CF: showTempHum(); delay(10000); break;
case 0xFF18E7: showLight(); delay(10000); break;
case 0xFF7A85: showLevel(); delay(10000); break;
case 0xFF9867: cyclePages(); break; // 内部含 4s*4 页延时
}
lcd.clear(); // 返回主界面等待下一指令
}
校准与维护指南
- DHT11 校准:对标精密温湿度计,软件偏移量补偿(通常温度 -1~+1℃,湿度 -5~+5%)。
- LM35 线性度验证:冰水混合物 (0℃) 与沸水 (100℃) 两点校准,计算斜率/截距修正系数。
- 液位传感器标定:注入已知高度水柱,记录 ADC 值,建立查找表或分段线性拟合。
- RTC 时间设定:代码中
Time t(2024,1,1,12,0,0,1); rtc.time(t);烧录一次后注释掉,依靠备用电池走时。 - 定期维护:雨后清空液位管、擦拭 LDR 窗口、检查电池电压、验证 IR 遥控距离 (>5m)。
扩展与进阶
- 数据上传:接入 ESP8266/ESP32 通过 Wi-Fi/MQTT 上报至 ThingsBoard/InfluxDB+Grafana。
- 传感器增强:增加 BMP280 气压、MH-Z19 CO2、风速风向传感器、紫外线指数传感器。
- 边缘分析:引入简单趋势预测(如未来 3h 降水概率)、露点计算、体感温度指数。
- 多节点组网:LoRa/zigbee 组建微型气象监测网,实现区域微气象插值渲染。
- 太阳能供电:MPPT 充控 + 磷酸铁锂电池,实现全户外无人值守运行。
制造工艺
- 高级气象站 v2.0:BME280 实时监测温度/气压/湿度/海拔 (Windows 10 IoT Core)
- 基于 Edge Impulse 的 TinyML 语言检测器:Arduino Nano 33 BLE Sense 实战
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- Arduino驱动的六发鸡尾酒自动调配站 – 打造你的专属智能调酒机
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- 声控氛围灯:Arduino Nano + 麦克风模块 + WS2812B 灯珠
- 高性能 Arduino 气象气球数据记录器
- 自制 10 美元便携 Arduino 气象站 - Nano + DHT22 + BMP180 + LCD
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- Arduino + ThingSpeak 实时气象监测站
- Arduino Nano 多传感器气象站:BMP280 + DHT11 + GUVA-S12SD + DS3231 + OLED