紧凑型气象站:Arduino Nano + ESP8266 双核方案 (BMP280 + OLED/Nokia 双屏)
项目概述
本项目将两套独立气象监测系统集成在一个外壳内:
- 本地气压趋势站:Arduino Nano + BMP280 气压计 + Nokia 5110 LCD,显示实时气压、温度,并对比 1 小时前、3 小时前气压差值 (hPa),辅助短时天气预判。代码采用 EEPROM 环形缓冲区存储历史数据,配合看门狗低功耗睡眠,实现分钟级采集。
- 联网天气预报站:NodeMCU (ESP8266) + 0.96" OLED,通过 WiFi 连接 OpenWeatherMap API 获取 3 天预报,显示天气图标、温度、湿度、风速等信息。需自行申请 API Key 并在代码中配置。
两套系统共用 5V 供电,互不干扰,适合桌面摆放或户外防水箱部署。
所需组件与物料
- Arduino Nano R3 × 1
- BMP280 气压传感器模块 (I2C 接口) × 1
- Nokia 5110 LCD (PCD8544 驱动) × 1
- NodeMCU 1.0 (ESP-12E 模组) × 1
- 0.96" SSD1306 OLED (128×64, I2C) × 1
- 焊接工具、杜邦线、外壳、5V 电源模块
硬件接线指南
Arduino Nano 侧 (本地气压站)
| 模块 | 引脚 | Arduino Nano | 备注 |
|---|---|---|---|
| BMP280 | VCC | 5V | 板载 3.3V LDO |
| GND | GND | ||
| SDA | A4 | I2C 数据 | |
| SCL | A5 | I2C 时钟 | |
| Nokia 5110 | RST | D12 | 复位 |
| CE | D11 | 片选 | |
| DC | D10 | 数据/命令 | |
| DIN | D9 | SPI 数据 | |
| CLK | D8 | SPI 时钟 | |
| VCC | 3.3V | 屏幕供电 3.3V | |
| LIGHT | 3.3V | 背光常亮 | |
| GND | GND |
NodeMCU 侧 (联网预报站)
| 模块 | 引脚 | NodeMCU (GPIO) | 备注 |
|---|---|---|---|
| SSD1306 OLED | VCC | 3V3 | |
| GND | GND | ||
| SDA | D2 (GPIO4) | I2C 数据 | |
| SCL | D1 (GPIO5) | I2C 时钟 |
软件架构详解
本地气压站 (Arduino Nano)
核心库
Wire.h(I2C)EEPROM.h(环形缓冲)avr/sleep.h(低功耗睡眠)
关键算法
- BMP280 原始读数补偿:读取出厂校准系数 (ac1~ac6, b1, b2, mb, mc, md),按数据表公式计算真实温度 (0.1℃ 分辨率) 与气压 (Pa)。
- 滑动平均滤波:
temp_mittel = (temp_mittel*(mitteln-1) + temp)/mitteln,mitteln=5抑制噪声。 - 海拔修正:
druck_offset变量补偿绝对气压至相对气压 (标准海拔),需根据安装地点海拔手动设定 (hPa)。 - EEPROM 环形缓冲:1024 字节 EEPROM 存 256 条记录 (每条 4 字节 long 型气压×100),写指针
eepromAdresse循环覆盖。读取 1 小时前 (60 条) 与 3 小时前 (180 条) 差值。 - 看门狗睡眠:
pwrDown(54)配置 WDT 1 秒唤醒,睡眠 54 秒 + 采集约 6 秒 = 60 秒周期,大幅降低功耗。 - Nokia 5110 驱动:软件 SPI 驱动 PCD8544,内置 5×7 ASCII 字库,逐行刷新显示气压、差值、温度。
联网预报站 (ESP8266)
核心库 (需在 Arduino IDE 板管理器安装 ESP8266 支持)
ESP8266WiFi.hESP8266HTTPClient.hArduinoJson.h(解析 JSON)Adafruit_GFX.h+Adafruit_SSD1306.h(OLED 驱动)WiFiManager.h(可选,自动配网)
关键流程
- 连接 WiFi (或 WiFiManager 自动配网)。
- HTTP GET 请求
https://api.openweathermap.org/data/2.5/forecast?q={city}&appid={API_KEY}&units=metric&lang=zh_cn。 - 解析 JSON,提取未来 3 天每 3 小时预报数据 (温度、湿度、天气代码、风速)。
- 映射天气代码至内置图标 (晴/云/雨/雪/雾等),OLED 分页滚动显示。
- 定时器每 30 分钟更新一次,失败重试机制。
OpenWeatherMap API Key 获取步骤
- 访问 openweathermap.org/api 注册免费账号。
- 进入 "My API Keys" 生成 Key。
- 在 ESP8266 代码中替换
const char* API_KEY = "YOUR_KEY";。 - 修改城市代码或坐标:
const char* CITY = "Beijing,CN";。
详细安装指南 (ESP8266 侧)
参考官方详细教程:ESP8266 Weather Station Getting Started Guide,涵盖板管理器 URL、库安装、字体转换、图标提取等完整步骤。
原理图与结构
原理图展示两套系统共用 5V 降压模块 (如 LM2596 或 USB 供电),Nano 侧通过 ICSP 接口烧录引导程序,NodeMCU 通过 Micro-USB 烧录。建议在外壳预留 BMP280 通风孔,OLED 与 Nokia 屏幕分别开窗显示。
扩展建议
- 加入 SHT30/BME280 同时测温湿度,替代 BMP280 单一气压。
- ESP8266 增加 MQTT 上报本地气压数据至 Home Assistant / ThingsBoard。
- Nano 侧增加 LoRa 模块实现无网关远程传输。
- 外壳加装太阳能板 + 18650 充电管理模块 (TP4056) 实现户外离网运行。
制造工艺
- 卡祖笛:从非洲米里通到现代塑料玩具——历史、制造与未来
- Giftduino:面向极客与教育者的终极 Arduino 礼物盒
- BME280 环境数据实时显示于 Nextion 触摸屏——Visuino 图形化开发
- 高性能 Arduino 气象气球数据记录器
- 自制 10 美元便携 Arduino 气象站 - Nano + DHT22 + BMP180 + LCD
- eDOT:基于 Arduino 的精密时钟与气象站,内置红外遥控
- Arduino + ThingSpeak 实时气象监测站
- 实时物联网压力监测:MKR GSM 1400 + Arduino Cloud + Google Sheets
- 打造可靠的 Arduino 气象站:DHT 传感器 + LCD + RTC
- Arduino 驱动乐高街机游戏盒 — 内置 5 款游戏、电池供电、LCD 显示
- 精密气压计:Arduino UNO & Nano 双表盘气压监测仪
- 告别跳线:BreadShield让Arduino直连面包板