『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1584|回复: 5

[技术探讨] 请求大神给改下代码,增加机械开关控制esp8266

[复制链接]

2

主题

22

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
金钱
268
HASS币
0
发表于 2023-4-7 15:35:01 | 显示全部楼层 |阅读模式
以下为mqtt发送0或1控制开关通断的代码,请大神给修改下能同时使用机械开关控制esp8266(貌似接3V3和IO2引脚实现)。

/*
ESP8266连接MQTT,并订阅发布信息
*/
 
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
const char* ssid = "MyWIFI";               //设置Wi-Fi名
const char* password = "123***";           //设置Wi-Fi密码
 
const char* mqtt_server = "192.168.0.***"; //设置MQTT服务器地址
 
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
int ledPin = 0;     //设置ESP8266的GPIO0号脚为输出控制脚
 
//连接wifi
void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  //等待WiFi连接
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  //wifi连接成功后输出成功信息
  Serial.println("");
  Serial.println("WiFi Connected!");   //显示wifi连接成功
  Serial.println(WiFi.localIP());       //返回wifi分配的IP
  Serial.println(WiFi.macAddress());  //返回设备的MAC地址
  Serial.println(""); 
  randomSeed(micros());
}
 
//回调函数
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived[");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  // 通过接收的信息 '1'或'0'来控制开或关
  if ((char)payload[0] == '1') {
    digitalWrite(ledPin, HIGH);    //接收到'1'GPIO0输出高电平
    Serial.println("HIGH");
  } else {
    digitalWrite(ledPin, LOW);     //接收到'0'GPIO0输出低电平
    Serial.println("LOW");
  }
}
 
void reconnect() {
    String clientId = "ESP-01A-711";            //设备名
    if (client.connect(clientId.c_str())) {         //尝试连接MQTT
      Serial.println("MQTT connect success.");   //显示MQTT连接成功
      client.subscribe("LED_Switch");          //设置主题
      client.publish("LED_Switch", "0");        //向主题发送消息
    } else {
      delay(5000);                         //等待5秒重试
    }
}
 
void setup() {
  pinMode(ledPin, OUTPUT);             //设置GPIO0为输出脚
  digitalWrite(ledPin, LOW);             //GPIO0初始输出低电平
  Serial.begin(115200);
  setup_wifi();                        //连接wifi
  client.setServer(mqtt_server, 1883);     //设置MQTT服务器
  client.setCallback(callback);            //设置回调函数
}
 
void loop() {
  if (!client.connected()) {
    reconnect();              //尝试连接MQTT服务器并接收信息
  }
  client.loop();
}

回复

使用道具 举报

8

主题

119

帖子

1005

积分

论坛DIY达人

积分
1005
金钱
881
HASS币
20
发表于 2023-4-7 16:05:33 | 显示全部楼层
还是用esphome简单一些
回复

使用道具 举报

4

主题

55

帖子

582

积分

高级会员

Rank: 4

积分
582
金钱
527
HASS币
0
发表于 2023-4-7 17:14:55 | 显示全部楼层
本帖最后由 roots 于 2023-4-7 17:20 编辑

#define SW 2

void SwLoop() {
if(digitalRead(SW)){digitalWrite(ledPin, HIGH);
}
else{
digitalWrite(ledPin, LOW);
}
delay(50);
}

setup加
pinMode(SW, INPUT);

loop加
SwLoop();


8266的IO2上电是不可以下拉的,建议加上拉,然后开关到GND

回复

使用道具 举报

2

主题

22

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
金钱
268
HASS币
0
 楼主| 发表于 2023-4-8 10:43:33 | 显示全部楼层
roots 发表于 2023-4-7 17:14
#define SW 2

void SwLoop() {

多谢多谢,我试下
回复

使用道具 举报

0

主题

20

帖子

439

积分

中级会员

Rank: 3Rank: 3

积分
439
金钱
419
HASS币
0
发表于 2023-4-8 13:36:58 | 显示全部楼层
本帖最后由 qiyueyi 于 2023-4-8 14:20 编辑

你自己看着改吧,我这个是自复位开关,接GND,不是接3V3的
// 物理开关连接 IO2 引脚
#define SWITCH_PIN 2
// 定义物理开关状态,默认高电平
bool switchState = HIGH;
// 定义上一次按下物理开关的时间
unsigned long lastClickTime = 0;
void Button()
{
    // 读取物理开关 状态
    bool newSwitchState = digitalRead(SWITCH_PIN);
    // 如果物理开关 状态改变
    if (newSwitchState != switchState)
    {
        // 延迟10毫秒避免状态抖动
        delay(10);
        // 再次读取开关状态
        newSwitchState = digitalRead(SWITCH_PIN);
        // 如果开关状态仍然改变
        if (newSwitchState != switchState)
        {
            // 更新开关状态变量
            switchState = newSwitchState;
            // 如果开关为低电平,即接地(GND)
            if (!switchState)
            {
                // 获取当前时间
                unsigned long clickTime = millis();
                // 如果距离上次单击时间超过300毫秒
                if (clickTime - lastClickTime > 300)
                {
                    // 记录当前单击时间,并打印单击状态
                    lastClickTime = clickTime;
                    // 执行代码
                    digitalWrite(ledPin, !digitalRead(ledPin));
                }
            }
        }
    }
}


void setup()
{
    // 设置引脚为输入上拉模式
    pinMode(SWITCH_PIN, INPUT_PULLUP);
}

void loop()
{
    Button();
}


回复

使用道具 举报

2

主题

22

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
金钱
268
HASS币
0
 楼主| 发表于 2023-4-9 09:13:23 | 显示全部楼层
qiyueyi 发表于 2023-4-8 13:36
你自己看着改吧,我这个是自复位开关,接GND,不是接3V3的

您好,代码可以实现,但是机械开关控制无法同步状态到homeassistant
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-27 22:36 , Processed in 0.090210 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表