老7
发布于 2026-09-21 / 0 阅读
0
0

ESP32学习笔记(二)

从零搭建一个Home Assistant信息屏

目标:把正点原子的ESP32S3-BOX3变成HomeAssistant的一个温湿度显示节点

1. 正点原子ESPS32S3-BOX3

ESP32S3-BOX3是一块基于ESP32 S3、带2.4寸 SPI接口LCD的开发板,还带摄像头、扬声器、麦克风、三轴加速度计等等扩展功能,当然少不了ESP32看家的BT+2.4G WIFI。可以用一根USB线连接电脑,实现供电+烧录固件。拿来练手挺合适,只是屏幕太小,显示不了太多东西。

详细配置及开发文档请见:
[https://wiki.alientek.com/docs/category/dnesp32s3-box3开发板]

2. ESPHome和HomeAssistant

ESPHome 是一个专为智能家居打造的开源固件框架和配置系统。它的核心使命是简化开发流程,让用户无需编写复杂的 C++ 代码,仅通过简单的 YAML 配置文件,就能将常见的微控制器(如 ESP32、ESP8266 等)转化为功能强大的智能家居设备。

关于如何在HomeAssistant中安装ESPHome插件,问问AI便知。实际上,这个插件(Device Builder)是个开发编译环境,用它来生成可执行代码并烧录到ESP32的板子中。

安装完成后HomeAssistant的web页面左侧边栏会出现ESPHome Builder。

Home Assistant ESPHome Builder

当通过插件成功编译并烧录了第一个 ESPHome 设备,且设备连接到与 Home Assistant 相同的局域网后,Home Assistant 会自动发现该设备,并提示添加“ESPHome 集成”。只需点击确认,输入 YAML 配置中的 API 加密密钥(API Key)即可完成无缝接入。如果没有提示,也可手动添加这个集成。

3. 在ESPHome中创建设备

3.1 创建空设备

点击右下角的“创建设备”,在弹出窗口中点“高级设备选项”->“空配置”。如果确切知道自己手里的硬件配置和目标,可以利用wizard等工具加速创建新设备。在这里为了避免过多无关因素的干扰,我们从“空设备”开始创建这个能显示温湿度的信息面板。
alt text
在“创建空配置”窗口中填入设备名称和主机名
alt text
一个空设备“box3-info-panel”键好了。左侧是配置的快速导航,中间是配置的具体内容,右侧显示的是设备配置yaml文件,会随着中间部分的改变自动同步,也可以直接编辑。
alt text
根据开发板的主控芯片修改“核心配置”,完成之后yaml看起来是这样的

esphome:
  name: box3-info-panel
  friendly_name: BOX3信息面板
 
# Replace this with your actual platform if you aren't using ESP32.
esp32:
  board: esp32-s3-devkitc-1
  variant: ESP32S3
  cpu_frequency: 240MHZ
  flash_frequency: 80MHZ
  flash_mode: qio
  flash_size: 16MB
  framework:
    type: esp-idf

api:
  encryption:
    key: "***********************************"

ota:
  - platform: esphome
    allow_partition_access: true

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: BOX3信息面板 Fallback Hotspot
    password: "*********"

captive_portal:

3.2 添加IO扩展芯片

接下来根据开发板的外设添加组件
为了通过I2C扩展IO,板子上用了一颗AW9523B。但组件列表里搜不到AW9523B,可以通过添加“External Components”的方式加入外部驱动代码。
借助AI找到AW9523B的驱动代码:

文件 说明
__init__.py Python 配置解析器,定义组件 schema 和引脚注册
aw9523b.h C++ 头文件,定义类结构和寄存器地址
aw9523b.cpp C++ 实现,包含 I2C 读写、GPIO 控制、ESPHome 2026.x 兼容性修复

利用SSH工具,上传这几个文件到如下ESPHome目录结构中(与YAML配置文件同级),如果有更多第三方的驱动代码,可以用同样的方式放到“components”下面

当前配置目录/
├── box3-info-panel.yaml
└── components/
    └── aw9523b/
        ├── __init__.py
        ├── aw9523b.h
        └── aw9523b.cpp

在“核心配置”里点“添加配置”,选择"External Components",选择Type “local”,Path “components”,点击“添加”。
alt text
YAML文件会出现这几行:

external_components:
  source:
    type: local
    path: components

关于External Components的更多信息,请参考文档

添加I2C组件。点击左侧导航栏里的“添加组件”,在弹出窗口中搜索“i2c”,点击“I2C Bus”添加这个组件。
alt text
根据开发板的硬件调整i2c的管脚设置。yaml会加入这样几行。

i2c:
  - id: bus_a
    scl: GPIO2
    sda: GPIO3

再添加“Generic I2C device component”,并修改YAML中的组件名称、id及地址为:

aw9523b:
  - id: aw9523_hub
    address: "0x59"

3.3 添加LCD背光开关

LCD背光的开启/关闭由AW9523B的P1_0脚控制。添加“GPIO Switch”组件,并修改YAML为:

switch:
  - platform: gpio
    name: LCD EN
    id: lcd_en
    pin:
      aw9523b: aw9523b_hub
      number: 8
      mode: output
      inverted: true
    restore_mode: ALWAYS_ON

3.4 添加温湿度传感器

从 Home Assistant 导入一个小米温湿度传感器的数据。先在HA中找到温湿度计的温度实体,复制“实体标识符”。回到ESPHome,在“添加组件”窗口搜索“homeassistant”,点击列表中的“Home Assistant Sensor”,粘贴到entity_id,点击添加。用同样的方法添加湿度传感器。调整这两个sensor的各项设置,最后得到如下的YAML代码:

sensor:
  - platform: homeassistant
    name: Room Temperature
    id: ha_temp
    entity_id: sensor.miaomiaoc_cn_blt_3_xxxxxxxxxx_t9_temperature_p_3_1001
    unit_of_measurement: °C
    device_class: temperature
    icon: "mdi:thermometer"
  - platform: homeassistant
    name: Room Humidity
    id: ha_hum
    entity_id: sensor.miaomiaoc_cn_blt_3_xxxxxxxxxx_t9_relative_humidity_p_3_1002
    icon: "mdi:water-percent"
    device_class: humidity
    unit_of_measurement: "%"

3.5 添加显示字体

有多种添加显示字体集的方式,可以是本地字体文件、在线字体拉取等等。中文字符集太大,可以使用 glyphs 字段,只保留实际需要用到的字符。ESPHome 编译时会自动裁剪,能把字体体积从几 MB 压到几十 KB,既节省 Flash 空间,又能大幅缩短编译时间。这里设置使用在线拉取“Noto Sans SC@400”,剪裁到特定的一些中英文字符。

font:
  - id: my_font
    file: "gfonts://Noto Sans SC@400"
    size: 32
    glyphs:
      - "0123456789℃%.:°ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 室内温湿度时间年月日分秒天气晴雨风星期一二三四五六"

如果想使用本地字体文件,可以把字体文件放在与本设备yaml配置文件同级的目录fonts里,比如微软的等线体 Deng.ttf。

font:
  - id: my_font
    file: "fonts/Deng.ttf"
    size: 32
    glyphs:
      - "0123456789℃%.:°ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 室内温湿度时间年月日分秒天气晴雨风星期一二三四五六"

3.6 添加颜色

添加组件“Color”三次。

color:
  - id: color_white
    hex: FFFFFF
  - id: color_green
    hex: 1ADD1A
  - id: color_blue
    hex: 4E79A7

3.7 添加LCD控制器的驱动

这块开发板的LCD是mipi接口,驱动芯片用了一颗ST7789V,通过SPI与ESP32 S3主控通讯。
首先添加组件“SPI Bus”,设置正确的Clock、MISO和MOSI管脚。

spi:
  - id: spi_1
    clk_pin: GPIO15
    miso_pin: GPIO17
    mosi_pin: GPIO16

然后添加组件“MIPI SPI Display Driver”。根据实际的硬件选择驱动型号,这块LCD用的是ST7789V。给控制信号(CS、DC等)设置正确的ESP32引脚。在“Dimension”里设置LCD高、宽像素点。
最后还要添加一段lamba代码才能把温湿度按指定的方式显示在LCD上。

display:
  - platform: mipi_spi
    id: box3_display
    model: ST7789V
    spi_id: spi_1
    update_interval: 1s
    cs_pin: GPIO47
    dc_pin: GPIO48
    dimensions:
      height: 320
      width: 240
      offset_height: 0
      offset_width: 0
      pad_height: 0
      pad_width: 0
    lambda: |-
      // 清空屏幕背景
      it.fill(id(color_blue));
      // 显示 HA 传感器数据
      if (id(ha_temp).has_state()) {
        it.printf(10, 90, id(my_font), id(color_green), "温度: %.1f℃", id(ha_temp).state);
      }
      if (id(ha_hum).has_state()) {
        it.printf(10, 130, id(my_font), id(color_green), "湿度: %.0f%%", id(ha_hum).state);
      }
    invert_colors: true
    rotation: "90"

3.8 编译及烧录

到此一个能显示温湿度的信息屏就设置完成了。第一次烧录固件需要通过USB,以后都可以通过WIFI OTA更新。用USB连接开发板到本地电脑(不需要连到运行HA的服务器上),点击“安装”按钮,在弹窗中选择“插入此电脑”。

alt text

耐心等待编译完成。

alt text

点击右下角“打开USB闪存器”,选择通信端口以后点击“连接”,开始烧录。

alt text

一个简单的信息屏完成了。

alt text


评论