一直想做个低成本的全屋温湿度监测,正好手边有几块 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 社区找到答案。