Skip to content

ESPHome DIY 智能设备:ESP32-C6/H2 开发入门

家里传感器不够用?市售产品又贵又不透明。ESPHome 是 Home Assistant 官方推荐的 DIY 方案——用 YAML 写配置,一键编译,OTA 无线推送。我用了两年,从 LED 灯条做到温湿度站,踩过的坑比读过的文档多。

硬件选型:为什么是 ESP32-C6

型号 芯片 WiFi BLE Thread 价格 推荐场景
ESP32-C6 Wi-Fi 6 + BLE 5 + Thread ✅ ✅ ✅ ¥25-35 全能首选
ESP32-H2 BLE 5 + Thread ❌ ✅ ✅ ¥25-30 纯 Thread 设备
ESP32-S3 WiFi + BLE 5 ❌ ✅ ❌ ¥35-45 需要 AI/摄像头
ESP8266 WiFi only ✅ ❌ ❌ ¥10 老旧项目维护

决策原则:新项目一律 ESP32-C6。WiFi 6 在 2.4G 拥堵环境下表现更好,Thread 支持让设备未来可接入 Matter 网络。

环境搭建

# 安装 ESPHome CLI(需 Python 3.9+)
pip install esphome

# 验证
esphome --version
# ESPHome 2024.12.0

# 创建项目目录
mkdir -p ~/esphome/led-strip
cd ~/esphome/led-strip

# 初始化项目(生成 base.yaml)
esphome wizard led-strip.yaml

向导会让你选芯片型号和串口。选 ESP32-C6,串口选 /dev/ttyUSB0(Linux)或 COM3(Windows)。

项目一:WS2812B LED 灯条控制

最简单的入门项目——用 ESP32-C6 控制 RGB LED 灯条,接入 HA 后可以用颜色+亮度做任何自动化。

# led-strip.yaml
esphome:
  name: living-room-led
  platformio_options:
    board_build.esp-idf.memory_type: qio_opi
    upload_speed: 921600

esp32:
  board: esp32-c6-devkitc-1
  framework:
    type: esp-idf
    version: 5.1.0

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Living-Room-Fallback"
    password: "fallback123"

# OTA 无线更新(必须设密码)
ota:
  password: !secret ota_password

# HA 集成
homeassistant:
  turn_on:
    action: light.turn_on
  turn_off:
    action: light.turn_off

# LED 灯条定义
light:
  - platform: neopixel
    name: "Living Room LED"
    id: led_strip
    pin: GPIO8          # C6 的 GPIO8 是常用的数据引脚
    num_leds: 60        # 灯珠数量
    rgb_order: GRB      # WS2812B 是 GRB 顺序
    chipset: WS2812B
    effect:
      - pulse:
      - scan:
      - rainbow:

# 状态反馈(可选)
status_led:
  pin: GPIO25

# 传感器用于监测电流/电压(进阶)
sensor:
  - platform: adc
    pin: GPIO3
    name: "LED Power Voltage"
    update_interval: 30s
    filters:
      - multiply: 3.0   # 分压比 1:3
# 编译并上传
esphome run led-strip.yaml

# 或只编译不上传
esphome compile led-strip.yaml

# 上传成功后,HA 会自动发现设备
# Settings → Devices → Living Room LED

引脚选择注意:ESP32-C6 的 GPIO8 是最稳定的 WS2812B 数据引脚。GPIO0 和 GPIO25 是 boot/flash 按钮,别用。GPIO3 是 ADC 输入,可用于电压监测但精度有限(12-bit,±50mV 误差)。

项目二:SHT30 温湿度站

SHT30 是 Sensirion 的 I2C 温湿度传感器,精度 ±0.3°C,适合家用。

# sht30-temp.yaml
esphome:
  name: bedroom-sensor

esp32:
  board: esp32-c6-devkitc-1
  framework:
    type: esp-idf

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

ota:
  password: !secret ota_password

# I2C 总线定义
i2c:
  sda: GPIO5
  scl: GPIO6
  scan: true            # 启动时扫描 I2C 设备
  frequency: 50kHz      # SHT30 支持最高 400kHz,50kHz 更稳定

# 温湿度传感器
sensor:
  - platform: sht3xd
    address: 0x44       # SHT30 默认 I2C 地址,0x44 或 0x45
    temperature:
      name: "Bedroom Temperature"
      id: temp_bedroom
      filters:
        - median: 5     # 中值滤波,去除瞬时跳变
        - throttle_average: 60s
    humidity:
      name: "Bedroom Humidity"
      id: hum_bedroom
      filters:
        - median: 5
        - throttle_average: 60s
    update_interval: 30s

  # 关联计算:体感温度
  - platform: template
    name: "Bedroom Feels Like"
    lambda: |-
      float t = id(temp_bedroom).state;
      float h = id(hum_bedroom).state;
      if (t > 27 && h > 60) return (t * 1.05);  // 简单体感估算
      return t;
    update_interval: 30s
    unit_of_measurement: "°C"

# 警告:温度超 30°C 或湿度超 70%
binary_sensor:
  - platform: template
    name: "Bedroom Overheat"
    lambda: |-
      return id(temp_bedroom).state > 30.0;
    on_press:
      - homeassistant.service:
          service: notify.mobile_app
          data:
            message: "卧室温度超过 30°C!"
    on_release:
      - homeassistant.service:
          service: notify.mobile_app
          data:
            message: "卧室温度恢复正常"

I2C 地址冲突排查:如果传感器读不到,先扫描 I2C 总线:

# 编译时加 -v 参数看日志
esphome run -v led-strip.yaml 2>&1 | grep -i i2c
# 或进 HA 开发者工具看 I2C 扫描结果
常见地址:SHT30=0x44/0x45,BME280=0x76/0x77,AHT20=0x38。同一 I2C 总线上两个设备地址相同会冲突,用不同总线(ESP32 支持 II2C1/II2C2)解决。

项目三:RCWL-0516 毫米波人体感应

RCWL-0516 是 3V-5V 供电的毫米波雷达传感器,比 PIR 热释电更灵敏,能检测静止人体。

# motion-sensor.yaml
esphome:
  name: hallway-motion

esp32:
  board: esp32-c6-devkitc-1
  framework:
    type: arduino

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

ota:
  password: !secret ota_password

# 毫米波传感器(DIGITAL 输出,3.3V 兼容)
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO7
      mode:
        input: true
        pullup: true    # 内部上拉,RCWL-0516 输出开漏
      inverted: false   # 检测到有人输出 HIGH
    name: "Hallway Motion"
    device_class: motion
    filters:
      - delayed_on: 50ms    # 防抖
      - delayed_off: 2s     # 2秒内无新触发不重复上报
    on_multi_click:
      - timing:
          - ON for at most 1s
          - OFF for at least 2s
        then:
          - homeassistant.service:
              service: notify.mobile_app
              data:
                message: "走廊有人移动"
                title: "移动侦测"
    on_state:
      then:
        - light.toggle: hallway_led

light:
  - platform: binary
    name: "Hallway Status Light"
    id: hallway_led
    output: gpio_output
    icon: "mdi:lightbulb"

output:
  - platform: gpio
    id: gpio_output
    pin: GPIO9

RCWL-0516 vs PIR 对比: - PIR 检测的是红外辐射变化,要求人体移动,静止后会误报 - RCWL-0516 检测微动(呼吸、心跳),能发现静止人体,但范围更远(7 米 vs PIR 的 5 米) - RCWL-0516 功耗 2-5mA,PIR 约 50uA。电池供电场景还是 PIR 更合适

常见问题排查

问题一:编译时报 Unknown component 'neopixel'

根因:ESP-IDF 框架不支持 neopixel 库。

修复:改用 platform: esp-idf 并加上 lib_deps:

esphome:
  platformio_options:
    lib_deps:
      - fastled/[email protected]

问题二:OTA 更新后设备失联

根因:新固件 WiFi 配置错误,或 OTA 密码不匹配。

修复:

# 查看最后成功上线的 IP
# HA → Settings → Devices → 找设备 → 点"在线"状态
# 然后串行重刷
esphome run --device /dev/ttyUSB0 led-strip.yaml

问题三:传感器读数跳变大

根因:I2C 噪声或采样间隔太短。

修复:

sensor:
  - platform: sht3xd
    temperature:
      filters:
        - median: 5          # 5 次中值滤波
        - throttle: 10s      # 至少 10 秒更新一次
        - debounce: 2s       # 2 秒去抖

总结

ESPHome 的核心优势是配置即代码——YAML 文件可以版本管理、review、回滚。三个项目覆盖了光、环境、感知三类基础设备,够入门了。

我的判断:ESP32-C6 是 2025-2026 年最值得买的开发板,WiFi 6 + Thread 双模,¥30 以内,配合 ESPHome 几乎零成本做出商用级传感器。唯一麻烦的是初次编译上传要接 USB,之后全部 OTA,日常维护很省心。

延伸阅读