一直想做个低成本的全屋温湿度监测,正好手边有几块 ESP32 开发板。花了一个周末折腾,最终跑通了,记录一下完整过程。
最终效果:
- 每 30 秒上报一次温湿度数据
- Home Assistant 实时显示,历史图表
- 温度超过 28°C 自动触发通知
材料清单
| 物料 | 数量 | 参考价 |
|---|---|---|
| ESP32 开发板(ESP-WROOM-32) | 1 | ¥18 |
| DHT22 温湿度传感器 | 1 | ¥12 |
| 杜邦线若干 | — | ¥3 |
| Micro USB 数据线 | 1 | 已有 |
总成本约 ¥33,比买成品传感器便宜很多,可玩性也更高。
接线方式
DHT22 的接线非常简单:
DHT22 引脚 ESP32 引脚
VCC → 3.3V
GND → GND
DATA → GPIO 4(可自定义)
DATA 引脚和 VCC 之间需要接一个 10kΩ 上拉电阻,不接的话数据不稳定,读取会频繁失败。
固件编写(ESPHome)
不用自己写 C 代码,用 ESPHome 配置文件驱动,几十行 YAML 就能搞定。
安装 ESPHome(需要 Python):
pip install esphome
创建配置文件 bedroom-sensor.yaml:
esphome:
name: bedroom-sensor
friendly_name: 卧室传感器
esp32:
board: esp32dev
framework:
type: arduino
# WiFi 配置
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap: # 连不上 WiFi 时开热点
ssid: "Sensor Fallback"
password: "12345678"
# 开启 Home Assistant API
api:
encryption:
key: !secret api_encryption_key
# OTA 更新
ota:
password: !secret ota_password
# MQTT(可选,如果不用 HA 原生 API 就用 MQTT)
mqtt:
broker: 192.168.1.100 # HA 所在的 IP
username: !secret mqtt_username
password: !secret mqtt_password
# DHT22 传感器
sensor:
- platform: dht
pin: GPIO4
model: DHT22
temperature:
name: "卧室温度"
accuracy_decimals: 1
humidity:
name: "卧室湿度"
accuracy_decimals: 1
update_interval: 30s # 30秒更新一次
敏感信息放在 secrets.yaml 里:
wifi_ssid: "你的WiFi名称"
wifi_password: "你的WiFi密码"
api_encryption_key: "生成一个32位随机字符串"
ota_password: "ota密码"
mqtt_username: "mqtt用户名"
mqtt_password: "mqtt密码"
编译并烧录:
esphome run bedroom-sensor.yaml
第一次需要用 USB 连接烧录,之后可以 OTA 无线更新。
Home Assistant 配置
方式一:ESPHome 原生集成(推荐)
如果 HA 已安装 ESPHome 插件,设备会自动发现,直接在 HA 界面点击”添加”就完成了。实体名称、图标都会自动配置。
方式二:MQTT 手动配置
在 configuration.yaml 中添加:
mqtt:
sensor:
- name: "卧室温度"
state_topic: "bedroom-sensor/sensor/bedroom_temperature/state"
unit_of_measurement: "°C"
device_class: temperature
- name: "卧室湿度"
state_topic: "bedroom-sensor/sensor/bedroom_humidity/state"
unit_of_measurement: "%"
device_class: humidity
自动化:温度超标通知
在 HA 的自动化编辑器中创建:
alias: 卧室温度过高通知
trigger:
- platform: numeric_state
entity_id: sensor.bedroom_temperature
above: 28
for:
minutes: 5 # 持续5分钟才触发,避免误报
action:
- service: notify.mobile_app
data:
title: "温度提醒"
message: "卧室温度 {{ states('sensor.bedroom_temperature') }}°C,注意散热"
踩坑记录
坑 1:读取数据失败 / 全是 NaN
原因:DATA 引脚没有接上拉电阻。加上 10kΩ 电阻后立即解决。
坑 2:WiFi 连接不稳定,频繁掉线
原因:供电电流不足。通过 USB 充电头供电时,ESP32 WiFi 发射功耗较大,劣质充电头撑不住。换了原装手机充电头后稳定了。
坑 3:ESPHome 编译很慢
第一次编译需要下载依赖,可能要 10-15 分钟。后续增量编译很快。可以在 HA 的 ESPHome 插件里直接编译,不用本地安装 Python。
坑 4:OTA 更新失败
确认设备和电脑在同一个局域网段,并且防火墙没有阻断 UDP 3232 端口。
后续计划
- 加个 OLED 屏,本地显示当前温湿度
- 接入 CO₂ 传感器(SCD40)
- 多个房间部署,统一在 HA Dashboard 展示
成本低、可玩性高,适合入门 IoT 折腾。ESP32 的资料很多,遇到问题基本都能在 ESPHome 文档或 HA 社区找到答案。