这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 【RaspberryPi5开发板方案创意赛】基于树莓派5的智能家居系统-过程贴-

共1条 1/1 1 跳转至

【RaspberryPi5开发板方案创意赛】基于树莓派5的智能家居系统-过程贴-开关传感器添加

工程师
2025-12-28 16:55:37     打赏

上期已成功添加温湿度传感器模块


这期我们添加开关传感器,用于远程控制台灯亮灭


主控这里选择的是ESP32-C3开发板

优点是成本10元左右,再搭配电容触摸传感器板,成本一两块钱

总体下来不到20

接下来展示硬件组成

20251228165005.jpg

硬件组成如上如所示

下面来看代码

#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);
}

烧录时候的效果如图

esp-switch-burn.PNG

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

开关关闭状态

switch-off.PNG

开关打开状态

sswitch-on.PNG

至此远程开关传感器添加完毕

下期添加台灯传感器


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]