ESP32 CYD · OneNET MQTT

ESP32 2.8寸黄屏 + OneNET MQTT 智能家居联网测试

使用 ESP32-2432S028R 黄屏,通过 WiFi 接入新版 OneNET,读取 SHT41 温湿度、BH1750 光照,并通过 PCF8574 扩展 IO 控制继电器、灯板和 TT 马达。

IO27/IO22CN1 I2C
0x44/0x23/0x20三路 I2C 设备
P0 / P1继电器控制
低电平继电器吸合
ESP32黄屏OneNET智能家居最终联调状态
最终联调状态:黄屏显示联网和上传状态,OneNET 后台可控制灯板和 TT 马达。

01 / Overview

项目概览

这页不是广告页,主要给客户和学习者看懂三件事:硬件怎么接、OneNET 物模型怎么对应、源码里每个控制点在哪里。

采集

SHT41 上传温湿度,BH1750 上传光照值。板载光敏 IO34 本项目暂时不用,实际光照数据来自外接 BH1750。

控制

OneNET 下发 switch_lightfan_switch,ESP32 通过 PCF8574 P0/P1 控制继电器。

显示

黄屏显示 WiFi、MQTT、上传次数、Last ok、温湿度、光照、开关状态和自动模式状态。

02 / Hardware

硬件组成

模块用途说明
ESP32-2432S028R 2.8寸黄屏主控和显示负责联网、MQTT、传感器读取、屏幕 UI。
SHT41 温湿度传感器温湿度采集I2C 地址通常为 0x44
BH1750 光照传感器光照采集I2C 地址通常为 0x23
PCF8574 I2C 扩展 IO继电器控制I2C 地址为 0x20,P0/P1 分别控制灯板和 TT 马达。
4路 5V 继电器模块隔离控制负载本项目使用低电平触发,IN1/IN2 已用,IN3/IN4 暂时不用。
灯板、TT 马达被控负载用灯板模拟照明,用 TT 马达模拟风扇。
面包板电源、面包板、杜邦线实验连接所有电源必须共地,负载电源不要从 PCF8574 直接取。

03 / Wiring

接线关系

核心是三路 I2C 设备共用 ESP32 黄屏 CN1 的 SDA/SCL,PCF8574 只控制继电器 IN 口,不直接给灯板和马达供电。

ESP32黄屏OneNET智能家居整体接线标注图
整体接线俯拍:SHT41、BH1750、PCF8574 共用 I2C,继电器控制灯板和 TT 马达。
PCF8574 到继电器 IN1 IN2 近景标注
PCF8574 P0 接继电器 IN1,P1 接继电器 IN2。
灯板和TT马达继电器端子近景
负载电流走继电器触点,PCF8574 不直接带负载。

接线速查

ESP32 黄屏 CN1 I2C:
SDA = IO27
SCL = IO22

I2C 总线设备:
SHT41   地址 0x44
BH1750  地址 0x23
PCF8574 地址 0x20

控制输出:
switch_light -> PCF8574 P0 -> 继电器 IN1 -> 灯板
fan_switch   -> PCF8574 P1 -> 继电器 IN2 -> TT马达

未使用:
继电器 IN3、IN4 暂时未使用
PCF8574 P2-P7 暂时未使用

04 / OneNET Model

OneNET 物模型

switch_light 是灯板开关,不是光照传感器;light_level 才是 BH1750 上传的光照值。

标识符类型读写用途
temperaturefloat只读SHT41 温度
humidityfloat只读SHT41 湿度
light_levelint32只读BH1750 光照 lux
switch_lightbool读写灯板开关
fan_switchbool读写TT 马达开关
auto_modebool读写自动模式
temperature_limitfloat读写风扇温度阈值
human_detectedbool只读预留人体感应,当前未接 PIR
alarm_statusbool只读预留报警状态
OneNET后台属性总览最终状态
OneNET 属性总览:能看到上传值和开关状态。打开原图查看细节
OneNET后台光照历史曲线
光照历史曲线:对应 light_level,不是 switch_light打开原图查看细节

05 / Code

程序源码讲解

配置保密

程序用 #include "secrets.h" 读取私密配置。网站和下载包只放 secrets.example.h,客户自己复制改名后填写。

低电平触发

true 不是直接输出高电平,而是让 PCF8574 对应口输出低电平,使继电器吸合。

不要混淆

PCF8574 是信号控制,不是给负载供电。灯板和 TT 马达的电流走继电器触点。

I2C 和 PCF8574 定义

#include "secrets.h"

static const int I2C_SDA_PIN = 27;
static const int I2C_SCL_PIN = 22;

static const uint8_t PCF8574_ADDR = 0x20;
static const uint8_t PCF_LIGHT_BIT = 0;
static const uint8_t PCF_FAN_BIT = 1;
static const bool PCF_RELAY_ACTIVE_LOW = true;

继电器控制逻辑

setPcf8574Output(PCF_LIGHT_BIT, switchLight);
setPcf8574Output(PCF_FAN_BIT, fanSwitch);

// switchLight = true:
// P0 输出低电平 -> IN1 吸合 -> 灯板亮

// fanSwitch = true:
// P1 输出低电平 -> IN2 吸合 -> TT 马达转

公开版 secrets 示例

#define WIFI_SSID           "YOUR_WIFI_SSID"
#define WIFI_PASSWORD       "YOUR_WIFI_PASSWORD"
#define ONENET_PRODUCT_ID   "YOUR_PRODUCT_ID"
#define ONENET_DEVICE_NAME  "YOUR_DEVICE_NAME"
#define ONENET_DEVICE_KEY   "YOUR_DEVICE_KEY"

自动模式判断

光照小于 100 lux:自动开灯
光照大于 150 lux:自动关灯

温度大于 temperature_limit:自动开风扇
温度小于 temperature_limit - 0.5:自动关风扇

0.5 摄氏度回差用于避免继电器反复抖动。

06 / Cloud Control

云端控制流程

1. ESP32 上电联网:连接 WiFi,建立 OneNET MQTT 连接,订阅属性设置 Topic。
2. 传感器读取:SHT41 获取温湿度,BH1750 获取光照,PCF8574 保持继电器输出状态。
3. 属性上报:周期性上传温度、湿度、光照、灯板、风扇、自动模式和阈值。
4. 后台下发:OneNET 后台修改 switch_lightfan_switchauto_modetemperature_limit
5. 本地执行:ESP32 解析下发 JSON,更新屏幕和 PCF8574 输出,并回复设置成功。
OneNET手动打开灯板实物成功
OneNET 手动打开灯板。
OneNET手动打开TT马达实物成功
OneNET 手动打开 TT 马达。

07 / Auto Mode

自动模式逻辑

自动模式打开后,灯板由光照阈值控制,TT 马达由温度阈值控制。风扇用了 0.5℃ 回差,避免临界点来回跳。

OneNET开启自动模式后台下发成功
OneNET 后台下发自动模式。打开原图查看细节
OneNET设置温度阈值24后台下发成功
设置温度阈值,例如 24℃。打开原图查看细节

08 / Troubleshooting

注意事项和排错

I2C 扫不到

先查 IO27/IO22 是否接对、GND 是否共地、SHT41/BH1750/PCF8574 是否同一组 I2C,总线地址是否冲突。

继电器不吸合

确认继电器模块是低电平触发,PCF8574 P0/P1 只接 IN1/IN2,继电器板 VCC/GND 单独供电且共地。

OneNET 不在线

检查 WiFi、产品 ID、设备名、设备密钥是否填入自己的 secrets.h,不要复制别人密钥。

后台能看不能控

确认物模型标识符拼写完全一致,尤其是 switch_lightfan_switchauto_mode

Upload 有数但 Last ok 异常

说明程序在尝试上传,但 OneNET 可能没有正常返回成功,重点看 MQTT 连接和属性 JSON。

真实密钥不能公开

公开网页、B站简介、源码 ZIP 不要包含 secrets.h,只提供 secrets.example.h

09 / Downloads

源码下载

公开版源码 ZIP

包含 main.inoplatformio.iniREADME.mdsecrets.example.h。不包含真实 secrets.h、编译缓存和串口日志。

下载源码 ZIP