精准降雨预测:基于 Arduino、Python 与 Keras 的端到端气象站系统
元件与材料
| 元件 | 数量 |
|---|---|
| 小型塑料盒(带可拆盖,建议 11×7×5 cm) | 1 |
| 3×AAA 电池盒 | 1 |
| 3×AAA 镍氢充电电池 | 1 |
| 6V 小型太阳能板 | 1 |
| Arduino Pro Mini 328P 5V/16MHz | 1 |
| 1N4004 二极管(防反充) | 1 |
| NPN 三极管 + 1kΩ 电阻(外设供电开关) | 各 1 |
| 雨滴传感器 | 1 |
| HC-12 串口通信模块(节点端) | 1 |
| HC-12 USB 串口模块(基站端) | 1 |
| BME280 大气传感器(温湿度、气压) | 1 |
| BH1750 光照传感器 | 1 |
| PCB、排针排母、KF301-2P 接线端子、导线、焊锡、胶水 | 1 套 |
| 3.3V 稳压模块 | 1 |
必备工具
- FT232RL USB 转串口下载器
- 电烙铁、电钻、细齿锯、螺丝刀、剥线钳
- Arduino IDE
- Linux 服务器/开发板(基站,长期运行)
系统总览
本项目构建一套**完全离网、超低功耗**的气象站,每 10 分钟采集一次温湿度、气压、光照、雨量、电池电压,经 HC-12 无线传回基站存入 MongoDB。随后使用 Python (Pandas + Keras) 对历史数据清洗、特征工程、训练神经网络,最终实现**未来 6 小时是否降雨的二分类预测**,准确率约 80%(600 天样本)。
核心优势
- 离网运行:太阳能 + 休眠电流 < 50 μA,免维护数月
- 分离式架构:节点仅采集传输,算力下沉基站,降低节点成本与功耗
- 可扩展:可部署多节点融合提升精度
- 全栈自建:无需第三方气象/ML API,数据隐私可控
硬件制作要点
- 外壳开孔:4 个孔位分别引出太阳能板线、BME280、BH1750、雨量传感器引线
- PCB 布局:焊接 Arduino 母座、HC-12、3.3V LDO、二极管、三极管开关电路、两个 KF301-2P(太阳能/电池)、三组传感器母座
- 关键细节:必须拆除 Arduino Pro Mini 板载 LED(或剪断一脚),否则休眠电流将达 mA 级别
- 供电逻辑:太阳能经二极管→电池;三极管控制外设供电(D6 高电平导通);电池电压 > 4.2V 时改用普通
delay代替深度睡眠,防止过充
Arduino 固件逻辑
// 核心循环(每 10 分钟)
void loop() {
updateSensors(); // 读取 6 路传感器
transmitData(); // HC-12 发送 "H1:78|T1:12|PS1:1022|L1:500|R1:0|V1:4010|"
customSleep(75); // 75 × 8s = 600s 深度睡眠
}
// 电压自适应睡眠
void customSleep(long cycles) {
if (sensors.voltage > 4200) { delay(cycles * 8000); return; }
digitalWrite(peripheralsPin, LOW); // 断外设电
for (int i=0; i
完整代码含 LowPower、SoftwareSerial、Adafruit_BME280、BH1750 库调用,详见 GitHub。
基站软件栈
- Anaconda 环境:Python 3.6.2 +
pip install -r requirements.txt(含 Keras, Pandas, PyMongo, scikit-learn) - MongoDB:存储时序数据,建议在
date字段建索引 - 串口监听:
python serial_listener.py解析 HC-12 数据入库 - 特征工程:将 10 分钟原始点聚合为 6 小时窗口,计算每传感器的 min/max/mean/percentiles/趋势计数,构建 ~100 维特征
- 标签生成:
has_rain = (rain_avg > 0.1) ? 1 : 0 - 滞后特征:引入前 8 个窗口(48 小时)的历史特征作为输入,经实验效果最优
- 归一化:
StandardScaler缩放至零均值单位方差 - 模型结构:Keras Sequential,Input(特征维) → Dense(1/2) → Dropout(0.05) → Dense(1/2) → Dropout → Dense(1, sigmoid)
- 训练:
optimizer='rmsprop', loss='mae', epochs=50, batch=1 - 预测与通知:
python predict.py --from-addr ... --to-addr ...发送邮件预警
进阶:接入 Dark Sky 官方数据
若使用专业气象站历史数据(含风速、风向、紫外线等),准确率可从 80% 提升至 90%+。项目提供 darksky.py 下载脚本与 --data-source darksky 训练参数。
未来改进方向
- 硬件:增加风速/风向、UV、气体传感器;多节点布设
- 算法:网格搜索超参数(
--grid-search)、尝试 LSTM/Transformer、融合外部气象源 - 工程:容器化部署、自动化重训练、Web 仪表盘可视化
制造工艺
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- DIY Photoshop 硬件控制台:Arduino Nano RP2040 实现快捷键外设
- 基于 Arduino 与 Python 的可靠 RFID 考勤系统
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
- 基于Arduino UNO的精准频率与占空比测量
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- Arduino 声纳实时测距与 Processing 可视化
- Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
- u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
- Python 重命名文件与目录:os.rename() 分步指南