上期已成功添加温湿度传感器模块
这期我们添加开关传感器,用于远程控制台灯亮灭
主控这里选择的是ESP32-C3开发板
优点是成本10元左右,再搭配电容触摸传感器板,成本一两块钱
总体下来不到20
接下来展示硬件组成

硬件组成如上如所示
下面来看代码
#include <WiFi.h> // 替换Ethernet为ESP32 WiFi库
#include <ArduinoHA.h> // ArduinoHA 2.1.0(与例程兼容)
// -------------------------- 硬件配置 --------------------------
#define TOUCH_PIN 4 // 触摸板连接的GPIO4
#define LED_PIN 9 // LED指示灯引脚(可选,用于可视化开关状态)
#define TOUCH_ACTIVE_LEVEL HIGH // 触摸时输出高电平
#define DEBOUNCE_TIME 200 // 触摸防抖时间(ms)
// WiFi配置
#define SECRET_SSID "wifi"
#define SECRET_PASS "password"
// MQTT配置(Home Assistant的MQTT服务器信息)
#define BROKER_ADDR "192.168.1.100" // 如192.168.1.100
#define BROKER_PORT 1883 // MQTT默认端口
#define MQTT_USER "user" // HA的MQTT认证用户名
#define MQTT_PASS "password" // HA的MQTT认证密码
// -------------------------- 设备初始化 --------------------------
WiFiClient client; // 替换EthernetClient为WiFiClient
// 设备MAC地址(例程风格:手动定义)
byte mac[] = {0x00, 0x10, 0xFA, 0x6E, 0x38, 0x4A};
HADevice device(mac, sizeof(mac));// 与例程一致:传入mac和长度(兼容不同版本)
HAMqtt mqtt(client, device);
// 触摸开关(与例程一致:唯一ID为"led",也可改为"touch_switch")
HASwitch touchSwitch("led");
// 触摸检测变量
unsigned long lastTouchTime = 0;
bool lastPinState = LOW;
bool switchState = false; // 本地开关状态
/* -------------------------------------------------------------------------- */
// 开关命令回调(完全沿用例程的签名:bool state + HASwitch* sender)
void onSwitchCommand(bool state, HASwitch* sender)
{
switchState = state;
digitalWrite(LED_PIN, (state ? HIGH : LOW)); // 控制LED(与例程一致)
sender->setState(state); // 上报状态到Home Assistant(与例程一致)
Serial.print("开关状态更新: ");
Serial.println(state ? "开启" : "关闭");
}
/* -------------------------------------------------------------------------- */
// 触摸检测函数(数字电平读取 + 防抖)
bool isTouchDetected()
{
bool currentPinState = digitalRead(TOUCH_PIN);
bool touchDetected = false;
// 防抖逻辑:电平稳定为有效状态且超过防抖时间
if (currentPinState == TOUCH_ACTIVE_LEVEL && lastPinState == TOUCH_ACTIVE_LEVEL) {
if (millis() - lastTouchTime > DEBOUNCE_TIME) {
lastTouchTime = millis();
touchDetected = true;
}
} else {
lastTouchTime = millis(); // 电平不稳定,重置时间
}
lastPinState = currentPinState;
return touchDetected;
}
/* -------------------------------------------------------------------------- */
void setup() {
// 初始化串口(调试用)
Serial.begin(115200);
while (!Serial) delay(10);
// 初始化引脚(与例程一致:LED为输出)
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// 初始化触摸引脚为输入(可选INPUT_PULLDOWN,防止悬空)
pinMode(TOUCH_PIN, INPUT);
// 连接WiFi(替换例程的Ethernet.begin())
Serial.print("连接WiFi: ");
Serial.println(SECRET_SSID);
WiFi.begin(SECRET_SSID, SECRET_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi连接成功!");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
// 设备配置(完全沿用例程的风格)
device.setName("Arduino");
device.setSoftwareVersion("1.0.0");
// 开关配置(与例程一致:设置图标、名称、注册回调)
touchSwitch.setIcon("mdi:lightbulb"); // 沿用例程的灯泡图标
touchSwitch.setName("My Switch"); // 沿用例程的名称(可改为"触摸开关")
touchSwitch.onCommand(onSwitchCommand); // 与例程一致的回调注册方式
// 连接MQTT服务器(例程基础上增加用户名密码,可选)
mqtt.begin(BROKER_ADDR, BROKER_PORT, MQTT_USER, MQTT_PASS);
// 初始化开关状态(与例程一致)
touchSwitch.setState(switchState);
Serial.println("设备初始化完成!");
}
/* -------------------------------------------------------------------------- */
void loop() {
// 网络维护(替换例程的Ethernet.maintain(),ESP32 WiFi无需额外维护)
// 处理MQTT通信(与例程一致:必须循环调用)
mqtt.loop();
// 触摸检测:触发开关状态翻转(对应例程中"按钮控制"的注释逻辑)
if (isTouchDetected()) {
switchState = !switchState; // 翻转状态
touchSwitch.setState(switchState); // 上报状态(与例程的注释逻辑一致)
digitalWrite(LED_PIN, switchState ? HIGH : LOW); // 同步LED
delay(300); // 防重复触发
}
delay(20);
}烧录时候的效果如图

接下来,打开home assistant网页即可查看到传感器
开关关闭状态

开关打开状态

至此远程开关传感器添加完毕
下期添加台灯传感器
我要赚赏金
