TensorFlow 驱动的物联网气象站:精准预测降雨强度
元件与材料
| 元件 | 数量 | 备注 |
|---|---|---|
| DFRobot 气象站套件(风速/风向/雨量桶) | 1 | 含传感器转换板,串口输出 37 字节/秒 |
| NodeMCU ESP8266 (ESP-12E) | 1 | Wi-Fi 传输,适用阳台近距离 |
| DFRobot SIM808 GPS/GPRS/GSM Shield | 1 | 配合 Arduino Uno,GPRS 远距离传输 |
| Arduino Uno | 1 | SIM808 主控 |
| Raspberry Pi 3B+ / 4 | 1 | 运行 PHP Web 服务 + Google Sheets API |
| 可焊接迷你面包板 | 2 |
工具与软件
- 热熔胶枪(户外防水封装)
- Arduino IDE、TensorFlow/Keras、Python 数据科学栈
- Visual Studio 2017(可选,调试 PHP)
项目动机
2020 年以来,我所在地区频发短时强降水,导致温室作物严重减产。研究表明,暴雨对作物产量的损害可媲美极端干旱(最高 34% 减产)。现有预警系统缺乏**微尺度、实时、长周期**的本地气象数据支撑。本项目旨在构建低成本、可远程部署的气象站,结合深度学习预测降雨强度,为农业决策提供数据支撑。
系统架构
- 数据采集端:双模通信(Wi-Fi / GPRS)气象站,每 5 分钟上报一次 8 维气象要素
- 云端聚合:Raspberry Pi 运行 PHP 应用,通过 Google Sheets API 追加存储,形成长期数据集
- 建模预测:Python + TensorFlow/Keras 训练 ANN 分类模型,输出 5 级降雨强度(无/小/中/大/暴雨)
气象站数据格式
c000s000g000t086r000p000h53b10020
// 解析:
c000: 风向(°) s000: 平均风速(0.1 mph)
g000: 最大风速 t086: 温度(℉)
r000: 1小时雨量 p000: 24小时雨量
h53: 湿度(%) b10020: 气压(0.1 hPa)
关键实施步骤
1. Google Sheets API 授权
- Google Cloud Console 创建项目 → 启用 Sheets API → 创建服务账号 + OAuth 客户端 ID
- 下载
credentials.json,首次运行 PHP 生成token.json
2. PHP Web 服务(部署于 Pi)
接收 HTTP GET 请求(参数:wd, a_ws, m_ws, 1_rf, 24_rf, tem, hum, b_pr),验证后追加至指定 Spreadsheet。核心流程:getClient() → append($spreadsheetId, 'A1:H1', $values)。
3. NodeMCU (ESP8266) 采集上报
- SoftwareSerial(D6, D5) 读取气象站串口
- 解析 37 字节帧,单位换算(mph→m/s, ℉→℃, in→mm, hPa)
- 每 300 秒 HTTP GET 至 Pi 服务
4. SIM808 (Arduino Uno) 远程上报
- AT 指令初始化 SIM808,DHCP 接入
cmnetAPN - 建立 TCP 连接至 Pi:80,发送原始 HTTP/1.0 GET 请求
- 同上传感器解析逻辑,仅通信层差异
5. 数据集构建(3 个月+,32k+ 样本)
导出 CSV,字段:风向、平均/最大风速、1h/24h 雨量、温度、湿度、气压。
6. 特征工程与建模 (TensorFlow/Keras)
# 风向向量化
wd_rad = WD * pi/180
WX = Av_WS * cos(wd_rad); WY = Av_WS * sin(wd_rad)
maxWX = Mx_WS * cos(wd_rad); maxWY = Mx_WS * sin(wd_rad)
# 其余归一化
scaled_Tem = Tem/25; scaled_Hum = Hum/70; scaled_bPR = b_PR/1013; scaled_24h_RF = 24h_RF/24
# 标签:按近似降雨率分 5 类
approx_rate = (1h_RF + scaled_24h_RF) * 100
0: 0mm/h 1: <2.5 2: 2.5-7.6 3: 7.6-50 4: >50
# 模型
Input(7) → Dense(16, relu) → Dense(32, relu) → Dense(64, relu) → Dense(128, relu) → Dense(5, softmax)
optimizer=adam, loss=sparse_categorical_crossentropy, epochs=19
实验结果
- 训练集准确率:0.83~0.85
- 测试集准确率:0.72~0.73(受限于样本量与过拟合)
- 实测预测示例:
[0,0,0.32,0.32,0.70,0.81,0.99] → 无雨;[0,0,0.45,0,0.88,0.96,1.00] → 暴雨
接线参考
| NodeMCU | 气象站 |
|---|---|
| VV (5V) | 5V |
| D5 | RX |
| D6 | TX |
| G | GND |
| Arduino Uno + SIM808 | 气象站 |
|---|---|
| D0/D1 | SIM808 RX/TX |
| D12 | SIM808 PWR |
| 5V | 5V |
| D5/D6 | 气象站 RX/TX |
| GND | GND |
结论与展望
- 已稳定运行 3 个月+,数据持续积累中,模型精度将随样本增长提升
- 可部署多节点形成“气象站群”,协同提升局地预报精度
- 未来接入风速/风向、土壤湿度、作物生长模型,面向精准农业决策
- 完整代码、数据集、训练脚本开源于 GitHub
制造工艺
- 树莓派太阳能气象站DIY指南
- 树莓派 2 搭建户外气象站:接入 ADS‑WS1 串口气象站
- 树莓派自制气象站:每日邮件推送温湿雨数据
- IoT 入门教程:树莓派流式传输温度数据
- 树莓派 3 配合 PubNub 实现远程气象监测
- 气象站接入 CWOP 实战指南:公民天气观测计划
- Java ME 8 在树莓派上构建物联网:第 1 部分——GPIO 传感器集成
- 树莓派 3 接 DHT11 传感器上传数据到 ThingsIo.ai 云平台
- 树莓派 2 (Windows 10 IoT Core) 采集 Adafruit 10DOF IMU 数据上传 Azure Event Hubs
- 高级气象站 v2.0:BME280 实时监测温度/气压/湿度/海拔 (Windows 10 IoT Core)
- 树莓派 3 Model B+ 安装 Windows 10 IoT Core 完整步骤指南
- 树莓派 4B+ 上构建并行 C++17 SYCL 代码:hipSYCL 与 GCC/Clang 工具链实战