自制 10 美元便携 Arduino 气象站 - Nano + DHT22 + BMP180 + LCD
元器件清单
| 元器件 | 数量 | 预估价格 | 备注 |
|---|---|---|---|
| Arduino Nano R3 | 1 | $1.89 | 紧凑型主控 |
| DHT22 温湿度传感器 | 1 | $3.00 | 高精度、宽量程 |
| BMP180 气压传感器 | 1 | $2.00 | I2C 接口,可测海拔 |
| 1602 LCD (I2C 接口) | 1 | $3.00 | 白字蓝背光,省引脚 |
| 万用板/焊盘板 | 1 | - | 焊接固定 |
| 排针/排母、导线 | 若干 | - | 连接用 |
工具:电烙铁、尖嘴钳、剥线钳
软件:Arduino IDE
项目背景
应老师邀请参加校园科技展,两天内制作教学演示项目。当地气温 34-40°C,决定制作便携气象站展示电子技术。本站测量温度、湿度、气压、海拔,成本约 $10,适合初学者和教学演示。

传感器选型解析
DHT22 vs DHT11 vs SHT1x
| 特性 | DHT11 | DHT22 (本项目) | SHT1x |
|---|---|---|---|
| 温度范围 | 0-50°C | -40~80°C | 0-50°C |
| 温度精度 | ±2°C | ±0.5°C | ±0.3°C |
| 湿度精度 | ±5% RH | ±2% RH | ±1.8% RH |
| 价格 | 最低 | 中等 | 较高 |
| 适用场景 | 园艺、农业 | 环境监测 | 工业长期安装 |
DHT22 兼顾精度、量程和性价比,最适合本项目。
DHT22 接线
- VCC → 5V 或 3.3V
- GND → GND
- DATA → Arduino D2(需 10kΩ 上拉电阻到 VCC)
BMP180 原理与接线
BMP180 通过 I2C 通信(Nano: SDA→A4, SCL→A5),测量绝对气压。气压随天气和海拔变化:气压下降预示雨天,上升预示晴天。海拔计算公式:alti = 44330 * [1 - (p/p0)^(1/5.255)],其中 p0=1013.25 hPa(海平面标准气压)。
注意事项:
- 需通风但避免强气流直吹
- 远离发热元件,避免温度突变
- 防潮、避光(芯片顶部感光孔需遮挡)
- 本项目模块自带 3.3V 稳压器,直接接 3.3V 供电
电路组装
在万用板上焊接 Nano 排母、DHT22 排母(含 10kΩ 上拉)、BMP180 排母、I2C LCD 排母。所有 I2C 设备共享 A4/A5 总线。预留一个插槽供后续扩展 RTC 时钟模块。

代码实现
需安装库:
- SFE_BMP180 库
- Adafruit DHT 库
- LiquidCrystal_I2C 库(库管理器搜索安装)
#include
#include
#include
#include
SFE_BMP180 pressure;
#define ALTITUDE 20.56 // 你的当地海拔(米)
#define I2C_ADDR 0x27 // LCD I2C 地址,常见 0x27/0x3F
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2); // 1602 LCD
float bmpTemp, dhtTemp;
void setup() {
Serial.begin(9600);
lcd.init(); lcd.backlight();
lcd.print("Weather Station");
delay(2000);
dht.begin();
pressure.begin();
}
void loop() {
char status;
double T, P, p0, alt;
// 读取 BMP180 温度和气压
status = pressure.startTemperature();
if (status) { delay(status);
status = pressure.getTemperature(T);
if (status) {
bmpTemp = T;
status = pressure.startPressure(3); // 最高精度
if (status) { delay(status);
status = pressure.getPressure(P, T);
if (status) {
p0 = pressure.sealevel(P, ALTITUDE);
alt = pressure.altitude(P, p0);
// 显示 BMP180 数据
lcd.clear(); lcd.setCursor(0,0);
lcd.print("BMP Temp: "); lcd.print(T,1); lcd.print(" C");
delay(2000);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("Pressure: "); lcd.print(P,1); lcd.print(" hPa");
delay(2000);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("Altitude: "); lcd.print(alt,0); lcd.print(" m");
delay(2000);
}
}
}
}
// 读取 DHT22 温湿度
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
dhtTemp = t;
lcd.clear(); lcd.setCursor(0,0);
lcd.print("Humidity: "); lcd.print(h,1); lcd.print(" %");
delay(2000);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("DHT Temp: "); lcd.print(t,1); lcd.print(" C");
delay(2000);
// 显示双传感器平均温度
lcd.clear(); lcd.setCursor(0,0);
lcd.print("Avg Temp: "); lcd.print((bmpTemp+dhtTemp)/2,1); lcd.print(" C");
delay(2000);
}
}
原理图

扩展建议
- 添加 DS3231 RTC 模块显示时间
- 接入 ESP8266/ESP32 上传数据到云端 (ThingSpeak/Blynk)
- 3D 打印外壳做成真正便携设备
- 加入光照、紫外线、风速传感器
制造工艺
- 树莓派 2 搭建户外气象站:接入 ADS‑WS1 串口气象站
- 树莓派自制气象站:每日邮件推送温湿雨数据
- 高级气象站 v2.0:BME280 实时监测温度/气压/湿度/海拔 (Windows 10 IoT Core)
- Arduino 自制 DCC 命令站:蓝牙控制模型铁路,免费 App 支持 CV 读写
- Arduino驱动的六发鸡尾酒自动调配站 – 打造你的专属智能调酒机
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 用 Arduino 制作便携电容触控钢琴:分步指南
- DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
- 便携测距仪 DIY 套件:Arduino Nano + HC-SR04 + 18650 电池 + 3D 打印外壳
- Pixel Chaser:Arduino Nano 单键 NeoPixel 追逐小游戏
- 高性能 Arduino 气象气球数据记录器
- eDOT:基于 Arduino 的精密时钟与气象站,内置红外遥控