💡 划重点
- 主控采用 ESP32,利用自带 Wi‑Fi 搭建本地 Web 服务器,无需依赖云平台即可在手机或电脑上查看气象数据。
- 感知层使用 BME280 一体化传感器,同时采集温度、湿度和气压,数据刷新快、精度满足阳台/花园场景。
- 执行层引入微型风扇,通过 PWM 调速实现高温自动通风,辅助植物越夏;板载 LED 提供心跳指示,便于判断系统运行状态。
- 全部物料成本控制在 70 元以内,接线简洁,适合新手复现。
需求洞察
目标用户是喜欢在阳台或小花园种菜、养花的家庭园艺爱好者。这类用户经常面临几个烦恼:夏季阳台温度过高,人不在家时植物容易闷热受损;浇水时机只凭手摸盆土,缺乏客观湿度参照;希望随时了解小环境的气压变化趋势,但又不想搭建复杂的云服务器。市面上的智能气象站往往依赖厂商 App,广告多、隐私堪忧,且价格动辄上百元。
因此,一个本地 Web 气象站方案正好击中这些痛点:它只用 70 元就能实现温湿气压的多维感知,在局域网内即可通过浏览器查看实时数据,避免数据上传第三方平台的顾虑。高温时还能自动开启风扇降温,保护植物。整体结构小巧,特别适合阳台这类轻度户外环境。
方案设计
系统划分为四个逻辑层,各层协同工作:
- 感知层:由 BME280 模块负责环境感知,通过 I²C 总线将温度、湿度、气压数据传送给主控。该传感器测量范围宽(温度 -40~+85°C,湿度 0~100%RH,气压 300~1100hPa),功耗低,符合阳台长时间运行需求。
- 控制层:ESP32 作为核心控制器,双核处理器既能快速读取传感器数据,又能承载异步 Web 服务。程序内维护一个简易 HTTP 服务器,将最新数据嵌入 HTML 页面,客户端请求时直接返回。同时根据温度阈值控制风扇转速——温度越高,PWM 占空比越大,实现无级散热。
- 执行层:包括一只 5V 小型无刷风扇和一颗板载 LED。风扇通过场效应管或 NPN 三极管驱动,避免 ESP32 引脚直接带载损坏;LED 接在 GPIO2,1 秒闪烁一次作为心跳指示,方便现场判断程序是否跑死。
- 联网与日志层:ESP32 连接 Wi‑Fi 后,在串口打印本机 IP 地址。Web 页面内置自动刷新 meta 标签,每 5 秒更新数据。若未来需长期记录,可在代码中扩展 SPIFFS 或 SD 卡存储,当前方案以满足即时查看为主。
物料清单
| 名称 | 数量 | 用途 | 估算单价(元) | 小计(元) |
|---|---|---|---|---|
| ESP32 开发板 (CH340) | 1 | 主控,Wi-Fi,Web 服务器 | 19.90 | 19.90 |
| BME280 模块 (3.3V) | 1 | 温、湿、气压三合一传感器 | 8.50 | 8.50 |
| 5V 微型无刷风扇 | 1 | 高温通风执行器 | 12.00 | 12.00 |
| NPN 三极管 (S8050) | 1 | 驱动风扇,PWM 调速 | 0.20 | 0.20 |
| 1kΩ 电阻 | 2 | 三极管基极限流、LED 限流 | 0.10 | 0.20 |
| 红色 LED 3mm | 1 | 心跳指示 | 0.20 | 0.20 |
| 330Ω 电阻 | 1 | LED 限流 | 0.10 | 0.10 |
| 面包板 + 跳线 | 1套 | 电路搭建 | 8.00 | 8.00 |
| Micro USB 数据线 | 1 | 供电及烧录 | 3.00 | 3.00 |
| 塑料外壳(可选) | 1 | 防护,可 3D 打印 | 5.00 | 5.00 |
| 合计 | 57.10 |
合计约 57 元,预留余量,完全满足 70 元预算。若不使用外壳,成本还可更低。
接线与结构
按题目预设的 GPIO 进行连接,并根据需要补充驱动电路:
- BME280 传感器:VCC → 3.3V, GND → GND, SDA → GPIO21, SCL → GPIO22。I²C 地址默认 0x76(模块上若存在可选焊接点,建议保持 0x76)。
- 风扇驱动:ESP32 的 GPIO25 输出 PWM 信号,经 1kΩ 电阻接入 S8050 三极管基极。三极管发射极接地,集电极接风扇负极;风扇正极接 5V 电源(可通过开发板 5V 引脚取电)。风扇两端并联续流二极管(如 1N4148)防止反电动势干扰。注意:ESP32 的 GPIO 直接驱动风扇会导致引脚损坏,因此必须增加三极管开关电路。
- 心跳 LED:GPIO2 → 330Ω 电阻 → LED 阳极 → 阴极 → GND。ESP32 多数开发板的 GPIO2 连接板载 LED,若希望直接使用板载灯,可移除外部 LED,但考虑柔性和教学意义,仍用外部 LED 示意。若使用板载 LED,则电阻可省略,只接 GPIO2 低电平点亮,代码需相应调整极性。
结构上,传感器应安装在通风但不被阳光直射的位置,避免辐射热造成温度虚高。风扇朝向植物冠层,当温度超过 30℃ 时启动慢转,35℃ 时全速。主控与面包板可装入塑料壳体,预留传感器和风扇开口。
核心代码
以下基于 Arduino 框架,使用 Adafruit BME280 库和 WiFi 库。完整代码骨架确保可直接编译运行。
#include <WiFi.h>
#include <WebServer.h>
#include <Adafruit_BME280.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
WebServer server(80);
Adafruit_BME280 bme;
const int fanPWM = 25;
const int ledPin = 2;
float temp, hum, pres;
unsigned long lastBeat = 0;
bool ledState = false;
void handleRoot() {
String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>阳台气象站</title>";
html += "<meta http-equiv='refresh' content='5'></head><body>";
html += "<h2>小型气象站实时数据</h2>";
html += "<p>温度: " + String(temp, 1) + " °C</p>";
html += "<p>湿度: " + String(hum, 1) + " %</p>";
html += "<p>气压: " + String(pres, 1) + " hPa</p>";
html += "<p>风扇功率: " + String(map(fanSpeed, 0, 255, 0, 100)) + " %</p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
int fanSpeed = 0;
void controlFan(float temperature) {
if (temperature < 28.0) fanSpeed = 0;
else if (temperature >= 35.0) fanSpeed = 255;
else fanSpeed = map(temperature, 28, 35, 60, 255);
analogWrite(fanPWM, fanSpeed);
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(fanPWM, OUTPUT);
analogWrite(fanPWM, 0);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nIP地址: " + WiFi.localIP().toString());
if (!bme.begin(0x76)) {
Serial.println("BME280错误,请检查接线");
while (1) delay(10);
}
server.on("/", handleRoot);
server.begin();
Serial.println("Web服务器已启动");
}
void loop() {
server.handleClient();
if (millis() - lastBeat >= 1000) {
lastBeat = millis();
ledState = !ledState;
}
temp = bme.readTemperature();
hum = bme.readHumidity();
pres = bme.readPressure() / 100.0F;
controlFan(temp);
}
需要提前在 Arduino IDE 中安装 Adafruit BME280 Library 和依赖的 Adafruit Unified Sensor。修改 SSID 和密码后即可上传。打开串口监视器可以获得 IP,在浏览器输入该 IP 即显示气象面板。
调试步骤
- 供电前检查:用万用表确认 3.3V 和 5V 通路无短路,尤其三极管引脚顺序正确。
- I²C 扫描:先上传一个 I²C 扫描程序到 ESP32,确认 0x76 地址存在。若找不到设备,检查 SDA/SCL 连接、模块供电,必要时交换 SDA、SCL。
- 串口监控:上传完整程序后,观察串口输出,确认 WiFi 连接成功并打印 IP。如果 BME280 初始化失败,会打印错误并停止,检查连接线。
- 传感器数据验证:手靠近 BME280 哈气,湿度应立即上升;捂住传感器,温度上升,以此判断数据是否真实。
- 风扇调速测试:用电吹风机向 BME280 微吹热风(注意距离,避免损坏),当温度升至 28℃ 左右,风扇应该开始低速转动;超过 35℃ 应全速。若风扇不转,用万用表测量三极管基极有无 PWM 电平变化;检查风扇电源线和续流二极管方向。
- Web 页面验证:手机或电脑连接同一 Wi‑Fi,浏览器输入 ESP32 的 IP 地址,页面应自动刷新并显示正确数值。若无法打开,请检查防火墙和路由器 AP 隔离设置。
- 长期稳定性:将设备在阳台放置 24 小时,观察温湿度曲线是否合理,风扇是否在高温时段自动工作。必要时用标准温度计校准 BME280 偏移值。
设计图
小型气象站上报网页结构flow
1
BME280 传感器 (温度/湿度/气压)
→
2
ESP32 主控 (I²C 读取、Wi-Fi 联网)
→
3
数据判断 (温度 > 阈值?)
→
4
执行层 (风扇 PWM 调速)
→
5
LED 心跳指示 (1s 闪烁)
→
6
本地 Web 服务器 (HTTP 响应)
→
7
浏览器终端显示 (自动刷新页面)