采集
SHT41 上传温湿度,BH1750 上传光照值。板载光敏 IO34 本项目暂时不用,实际光照数据来自外接 BH1750。
01 / Overview
这页不是广告页,主要给客户和学习者看懂三件事:硬件怎么接、OneNET 物模型怎么对应、源码里每个控制点在哪里。
SHT41 上传温湿度,BH1750 上传光照值。板载光敏 IO34 本项目暂时不用,实际光照数据来自外接 BH1750。
OneNET 下发 switch_light 和 fan_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 黄屏 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
switch_light 是灯板开关,不是光照传感器;light_level 才是 BH1750 上传的光照值。
| 标识符 | 类型 | 读写 | 用途 |
|---|---|---|---|
temperature | float | 只读 | SHT41 温度 |
humidity | float | 只读 | SHT41 湿度 |
light_level | int32 | 只读 | BH1750 光照 lux |
switch_light | bool | 读写 | 灯板开关 |
fan_switch | bool | 读写 | TT 马达开关 |
auto_mode | bool | 读写 | 自动模式 |
temperature_limit | float | 读写 | 风扇温度阈值 |
human_detected | bool | 只读 | 预留人体感应,当前未接 PIR |
alarm_status | bool | 只读 | 预留报警状态 |
05 / Code
程序用 #include "secrets.h" 读取私密配置。网站和下载包只放 secrets.example.h,客户自己复制改名后填写。
true 不是直接输出高电平,而是让 PCF8574 对应口输出低电平,使继电器吸合。
PCF8574 是信号控制,不是给负载供电。灯板和 TT 马达的电流走继电器触点。
#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 马达转
#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
switch_light、fan_switch、auto_mode 或 temperature_limit。
08 / Troubleshooting
先查 IO27/IO22 是否接对、GND 是否共地、SHT41/BH1750/PCF8574 是否同一组 I2C,总线地址是否冲突。
确认继电器模块是低电平触发,PCF8574 P0/P1 只接 IN1/IN2,继电器板 VCC/GND 单独供电且共地。
检查 WiFi、产品 ID、设备名、设备密钥是否填入自己的 secrets.h,不要复制别人密钥。
确认物模型标识符拼写完全一致,尤其是 switch_light、fan_switch、auto_mode。
说明程序在尝试上传,但 OneNET 可能没有正常返回成功,重点看 MQTT 连接和属性 JSON。
公开网页、B站简介、源码 ZIP 不要包含 secrets.h,只提供 secrets.example.h。
09 / Downloads
包含 main.ino、platformio.ini、README.md、secrets.example.h。不包含真实 secrets.h、编译缓存和串口日志。