🎯 本文目标
- ✅ 了解常见温湿度传感器型号及区别
- ✅ 完成传感器与 ESP32 的硬件接线
- ✅ 编写 ESPHome YAML 配置
- ✅ 烧录固件并在 Home Assistant 中查看数据
- ✅ 学会数据校准和滤波技巧
🛒 硬件准备
| 硬件 | 型号推荐 | 参考价格 | 说明 |
|---|---|---|---|
| 开发板 | ESP32-DevKitC | ¥15-25 | 推荐 ESP32-WROOM-32 |
| 温湿度传感器 | AHT20 / DHT22 | ¥5-10 | AHT20 更精准 |
| 杜邦线 | 母对母 | ¥3 | 3-4根 |
| USB数据线 | Type-C / Micro-USB | ¥5 | 注意要数据线不是充电线 |
🔍 传感器型号对比
| 型号 | 协议 | 精度(温度) | 精度(湿度) | 价格 | 推荐度 |
|---|---|---|---|---|---|
| AHT20 | I2C | ±0.3°C | ±2% | ¥5 | ⭐⭐⭐⭐⭐ |
| DHT22 | 单总线 | ±0.5°C | ±2% | ¥8 | ⭐⭐⭐⭐ |
| DHT11 | 单总线 | ±2°C | ±5% | ¥3 | ⭐⭐ |
| SHT30 | I2C | ±0.2°C | ±2% | ¥15 | ⭐⭐⭐⭐⭐ |
| BME280 | I2C | ±1°C | ±3% | ¥12 | ⭐⭐⭐⭐ |
💡 新手推荐:AHT20,便宜、精准、I2C 接口只需要4根线。
🔌 硬件接线
AHT20 接线(I2C 协议)
AHT20 传感器 ESP32 开发板
┌─────────┐ ┌──────────┐
│ VCC │──────────│ 3.3V │ (红线)
│ GND │──────────│ GND │ (黑线)
│ SDA │──────────│ GPIO21 │ (蓝线)
│ SCL │──────────│ GPIO22 │ (黄线)
└─────────┘ └──────────┘
⚠️ 注意 :AHT20 供电用 3.3V,不要接 5V!
DHT22 接线(单总线协议)
DHT22 传感器 ESP32 开发板
┌─────────┐ ┌──────────┐
│ VCC │──────────│ 3.3V │ (红线)
│ DATA │──────────│ GPIO4 │ (绿线)
│ NC │ │ │ (空脚不接)
│ GND │──────────│ GND │ (黑线)
└─────────┘ └──────────┘
⚠️ DATA 和 VCC 之间需要接一个 10KΩ 上拉电阻
(有些 DHT22 模块已内置,可以先不接试试)
📝 ESPHome YAML 配置
方案一:AHT20 传感器(推荐)
yaml
# aht20-sensor.yaml
esphome:
name: bedroom-sensor
friendly_name: "卧室环境传感器"
esp32:
board: esp32dev
# WiFi 配置
wifi:
ssid: "你的WiFi名称"
password: "你的WiFi密码"
# 连接失败时启动热点
ap:
ssid: "Bedroom-Sensor"
password: "12345678"
# 启用日志
logger:
# Home Assistant API
api:
encryption:
key: "自动生成的密钥"
# OTA 无线更新
ota:
- platform: esphome
# I2C 总线配置(AHT20 需要)
i2c:
sda: GPIO21
scl: GPIO22
scan: true # 启动时扫描 I2C 设备
# 传感器配置
sensor:
# AHT20 温湿度传感器
- platform: aht10 # AHT20 兼容 aht10 平台
variant: AHT20
temperature:
name: "卧室温度"
unit_of_measurement: "°C"
accuracy_decimals: 1
filters:
- offset: -0.5 # 校准偏移(根据实际调整)
humidity:
name: "卧室湿度"
unit_of_measurement: "%"
accuracy_decimals: 0
update_interval: 30s # 每30秒更新一次
# ESP32 内部温度(可选,用于监控设备状态)
- platform: internal_temperature
name: "ESP32 芯片温度"
update_interval: 60s
# WiFi 信号强度(可选)
- platform: wifi_signal
name: "WiFi 信号强度"
update_interval: 60s
方案二:DHT22 传感器
yaml
# dht22-sensor.yaml
esphome:
name: living-room-sensor
friendly_name: "客厅环境传感器"
esp32:
board: esp32dev
wifi:
ssid: "你的WiFi名称"
password: "你的WiFi密码"
ap:
ssid: "LivingRoom-Sensor"
password: "12345678"
logger:
api:
encryption:
key: "自动生成的密钥"
ota:
- platform: esphome
# DHT22 传感器配置
sensor:
- platform: dht
pin: GPIO4
model: DHT22
temperature:
name: "客厅温度"
accuracy_decimals: 1
filters:
- sliding_window_moving_average:
window_size: 5
send_every: 3
humidity:
name: "客厅湿度"
accuracy_decimals: 0
filters:
- sliding_window_moving_average:
window_size: 5
send_every: 3
update_interval: 10s # DHT22 最小间隔 2 秒
🔧 配置详解
update_interval(更新间隔)
yaml
update_interval: 30s # 每30秒读取一次(推荐)
update_interval: 60s # 每1分钟(省电)
update_interval: 10s # 每10秒(实时性高)
update_interval: 5min # 每5分钟(极省电)
💡 一般场景 30s-60s 就够了,温度变化不会那么快。
filters(数据滤波)
yaml
filters:
# 方式一:偏移校准(传感器读数偏高/偏低时用)
- offset: -1.2 # 温度偏移 -1.2°C
# 方式二:滑动平均(消除毛刺波动)
- sliding_window_moving_average:
window_size: 5 # 取最近5次读数
send_every: 3 # 每3次发送一次
# 方式三:指数移动平均(更平滑)
- exponential_moving_average:
alpha: 0.1
send_every: 3
# 方式四:限制范围(过滤异常值)
- filter_out: nan
- clamp:
min_value: -20
max_value: 60
📱 烧录与查看
第一步:首次烧录(USB)
- 在 ESPHome Dashboard 点击 Install
- 选择 "Plug into this computer"(USB 直连)
- 选择对应的 COM 端口
- 等待编译和烧录完成(首次约2-3分钟)
第二步:查看日志
烧录完成后,点击 Logs 查看实时输出:
[I][app:029]: Running through setup()...
[C][wifi:037]: Setting up WiFi...
[I][wifi:263]: WiFi Connected!
IP Address: 192.168.1.105
[I][aht10:040]: AHT20 found at address 0x38
[I][sensor:094]: '卧室温度': Sending state 24.3 °C
[I][sensor:094]: '卧室湿度': Sending state 58 %
第三步:Home Assistant 自动发现
- 打开 Home Assistant → 设置 → 设备与服务
- 你会看到 "已发现新设备" 的提示
- 点击 配置 → 输入 API 密钥 → 完成
- 在 概览 页面就能看到温度和湿度卡片了!
🌡️ 添加温度预警
在 YAML 中添加自动化,温度超标自动报警:
yaml
# 在 sensor 下方添加
binary_sensor:
- platform: template
name: "卧室高温预警"
lambda: |-
if (id(bedroom_temp).state > 30.0) {
return true;
} else {
return false;
}
sensor:
- platform: aht10
variant: AHT20
temperature:
name: "卧室温度"
id: bedroom_temp # 添加 id 供上方引用
humidity:
name: "卧室湿度"
update_interval: 30s
🛠️ 常见问题排查
问题1:I2C 设备找不到
[E][aht10:015]: Communication with AHT20 failed!
排查步骤:
- 检查接线是否牢固
- 确认 SDA/SCL 引脚对应正确(GPIO21/22)
- 在
i2c:下添加scan: true,查看扫描到的地址 - 尝试换一根杜邦线
问题2:温度数据不准
解决:
- 传感器远离 ESP32 芯片(芯片发热会影响读数)
- 使用
offset滤波器校准 - 传感器不要放在阳光直射处
问题3:DHT22 读取失败
[W][dht:048]: Requesting data from DHT failed!
解决:
- 确认上拉电阻已接好(10KΩ)
update_interval不要低于 2s- 换一个 GPIO 引脚试试
📊 进阶:多传感器配置
一块 ESP32 可以同时接多个传感器:
yaml
i2c:
sda: GPIO21
scl: GPIO22
sensor:
# 卧室传感器
- platform: aht10
variant: AHT20
temperature:
name: "卧室温度"
humidity:
name: "卧室湿度"
address: 0x38 # AHT20 默认地址
# 阳台传感器(BME280)
- platform: bme280_i2c
temperature:
name: "阳台温度"
humidity:
name: "阳台湿度"
pressure:
name: "大气压力"
address: 0x76 # BME280 默认地址
update_interval: 60s
✅ 本文总结
| 步骤 | 操作 |
|---|---|
| 1. 选传感器 | AHT20(新手首选) |
| 2. 接线 | 4根线:VCC/GND/SDA/SCL |
| 3. 写 YAML | platform: aht10, variant: AHT20 |
| 4. 烧录 | ESPHome Dashboard → Install |
| 5. 查看 | Home Assistant 自动发现 |
| 6. 校准 | filters → offset 微调 |
📢 下一篇预告
ESPHome入门04 --- LED灯带:用 WS2812B 灯带打造炫酷的 RGB 氛围灯!