Arduino Nano 迷你气象站:温湿度气压三合一,ST7735 彩屏显示
组件与物料清单
| 组件 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| DHT11 温湿度模块 | 1 |
| BMP280 气压传感器模块 | 1 |
| 1.44 英寸 ST7735 TFT 彩屏 (128x128) | 1 |
| 3D 打印外壳 | 1 |
| USB 转 Mini USB 线 | 1 |
所需工具
- 电烙铁、焊锡丝
- 3D 打印机
- 双面胶
软件与服务
- Arduino IDE
- Autodesk Fusion 360(外壳建模)
项目介绍
引言
实时采集物理环境数据充满乐趣。本项目集成温度、湿度、大气压三大核心气象参数,并在 1.44" TFT 彩屏上实时显示,体积小巧可放入口袋。
工作原理与选型说明
- BMP280:测量温度(±0.5°C)与大气压,I2C 接口,地址 0x76/0x77。
- DHT11:仅用于测量相对湿度(温度精度 ±2°C,不如 BMP280,故仅取湿度)。
- 为何不直接用 BME280?成本考量:BMP280 + DHT11 组合更经济。
- Arduino Nano**:体积小、价格低、引脚兼容 UNO,性价比优于 UNO。
- ST7735 1.44" TFT**:SPI 接口,分辨率 128x128,色彩丰富,不占用过多 Nano 资源。
- 供电利用 Nano ICSP 接口的 5V/GND 与板载引脚并联,无需额外电源模块。
电路与编程要点

关键库:SPI.h、Wire.h、Adafruit_GFX.h、Adafruit_ST7735.h、Adafruit_BMP280.h、DHT.h。
Wire.h支持 BMP280 与 ST7735 的 I2C 通信(部分 ST7735 模块支持 I2C)。SPI.h提供 ST7735 高速 SPI 通信。- 初始化时设置屏幕方向、字体颜色、分隔线、标题栏(TEMPERATURE/HUMIDITY/PRESSURE)。
- 主循环每秒读取一次传感器,格式化显示:温度(黄、°C)、湿度(洋红、%)、气压(橙、hPa)。
结构组装与测试
- 原型采用跳线模块化连接,便于调试维修。
- 外壳为 Fusion 360 设计并 3D 打印,预留通风孔保证传感器暴露于环境中并散热。
- 通过 USB 供电(电脑或 5V 手机充电器),室内长时间运行测试,数据与在线气象数据对比误差在可接受范围。




结论
项目成本低、制作简单、实用性强,是一个随身携带的迷你气象站,极适合电子爱好者入门练手。
完整代码
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_BMP280.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
#define TFT_RST 8
#define TFT_CS 10
#define TFT_DC 9
#define BMP280_I2C_ADDRESS 0x76
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
Adafruit_BMP280 bmp280;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
dht.begin();
tft.initR(INITR_144GREENTAB);
tft.fillScreen(ST77XX_BLACK);
tft.drawFastHLine(0, 15, tft.width(), ST77XX_CYAN);
tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK);
tft.setTextSize(1);
tft.setCursor(25, 5);
tft.print("WEATHER BUDDY");
if (!bmp280.begin(BMP280_I2C_ADDRESS)) {
tft.setTextColor(ST77XX_RED, ST77XX_CYAN);
tft.setTextSize(2);
tft.setCursor(5, 76); tft.print("Connection");
tft.setCursor(35, 100); tft.print("Error");
while (1);
}
tft.drawFastHLine(0, 55, tft.width(), ST77XX_CYAN);
tft.drawFastHLine(0, 95, tft.width(), ST77XX_CYAN);
tft.setTextColor(ST77XX_RED, ST77XX_BLACK); tft.setCursor(30, 20); tft.print("TEMPERATURE");
tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK); tft.setCursor(40, 60); tft.print("HUMIDITY");
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK); tft.setCursor(40, 100); tft.print("PRESSURE");
tft.setTextSize(2);
}
void loop() {
char buf[8];
float temp = bmp280.readTemperature();
float hum = dht.readHumidity();
float pres = bmp280.readPressure(); // Pa
// 温度
if (temp < 0) sprintf(buf, "-%02u.%02u", (int)abs(temp), (int)(abs(temp)*100)%100);
else sprintf(buf, " %02u.%02u", (int)temp, (int)(temp*100)%100);
tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);
tft.setCursor(11, 34); tft.print(buf);
tft.drawCircle(89, 34, 2, ST77XX_YELLOW); // 度符号
tft.setCursor(95, 34); tft.print("C");
// 湿度
sprintf(buf, "%02u ", (int)hum);
tft.setTextColor(ST77XX_MAGENTA, ST77XX_BLACK);
tft.setCursor(45, 74); tft.print(buf);
tft.setCursor(75, 74); tft.print("%");
// 气压 (Pa -> hPa)
sprintf(buf, "%04u.%02u", (int)(pres/100), (int)((uint32_t)pres % 100));
tft.setTextColor(ST77XX_ORANGE, ST77XX_BLACK);
tft.setCursor(3, 112); tft.print(buf);
tft.setCursor(91, 112); tft.print("hPa");
delay(1000);
}
3D 打印外壳文件
STL 文件已包含在项目文件中,可直接导入切片软件打印。
参考资料
- Google.com
- Arduino.cc
- Mytectutor.com
制造工艺
- 树莓派 2 搭建户外气象站:接入 ADS‑WS1 串口气象站
- 树莓派自制气象站:每日邮件推送温湿雨数据
- 树莓派 3 配合 PubNub 实现远程气象监测
- 高级气象站 v2.0:BME280 实时监测温度/气压/湿度/海拔 (Windows 10 IoT Core)
- DIY Photoshop 硬件控制台:Arduino Nano RP2040 实现快捷键外设
- 用 Arduino Pro Mini 与 DS1302 RTC 打造精准七段数码管时钟
- 自制 10 美元便携 Arduino 气象站 - Nano + DHT22 + BMP180 + LCD
- eDOT:基于 Arduino 的精密时钟与气象站,内置红外遥控
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- Arduino + ThingSpeak 实时气象监测站
- Arduino Nano 多传感器气象站:BMP280 + DHT11 + GUVA-S12SD + DS3231 + OLED
- DIY Arduino USB 触控板 —— 将废旧笔记本触控板改造为现代输入设备