乐鑫技术交流
直播中

宜家

8年用户 1119经验值
私信 关注
[问答]

ESP8266如何将引脚D1和接地引脚连接到墙壁开关?

我刚刚开始使用 ESP8266 的第一个项目,也很高兴知道我对这类项目没有太多的电子知识。我尝试做的是以下内容。我想将引脚 D1 和接地引脚连接到墙壁开关(通常用于打开或关闭灯)。如果墙壁开关的状态发生变化,我想改变一个 philips hue 灯的状态(意思是:如果灯熄灭,那么如果按下墙壁开关我想打开它,反之亦然)。
ESP8266的代码是:
代码:全选#include
#include

// Wifi Settings
const char* ssid = "xxxxx";
const char* password = "xxxxx";

// Hue Settings

const char hueHubIP[] = "xxxxx"; // Hue Bridge IP
const int hueHubPort = 80;
const char hueUsername[]="xxxxxx";
String light="1";

// Commands

String hue_on="{\"on\":true}";
String hue_off="{\"on\":false}";

boolean state = false; // for monitoring switch state changes
boolean previousState; // ditto
boolean onOffState = false;   // To store actual on/off state of light as reported by Hue bridge
int switchPin = 5; // -- control sense pin, mapped to D1 on NodeMCU

WiFiClient client;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize LED_BUILTIN pin as output

  Serial.begin(9600);
  pinMode(switchPin, INPUT_PULLUP);
  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  previousState = digitalRead(switchPin);
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("State Switch:");
  Serial.println(previousState);
}

void loop() {
  state = digitalRead(switchPin); // for checking for state change

  if (state != previousState) // state change
  {
    previousState == state;
   
    getHue();
    delay(500);
   
    if (onOffState == true)                         // If lights are on, send "Off" command
    {
      Serial.println("");
      Serial.print("Switch lamp off");
      String command =  "{\"on\": false}";
      setHue(command);
      digitalWrite(LED_BUILTIN, LOW);
    }
    else                                            // If lights are off, send "On" command
    {
      Serial.println("");
      Serial.print("Switch lamp on");
      String command =  "{\"on\": true}";
      setHue(command);
      digitalWrite(LED_BUILTIN, HIGH);
    }
  }
}


void setHue(String command)
{
  if (client.connect(hueHubIP, hueHubPort))
  {
    client.print("PUT /api/");
    client.print(hueUsername);
    client.print("/lights/");
    client.print(light);
    client.println("/state HTTP/1.1");
    client.println("keep-alive");
    client.print("Host: ");
    client.println(hueHubIP);
    client.print("Content-Length: ");
    client.println(command.length());
    client.println("Content-Type: text/plain;charset=UTF-8");
    client.println();                             // Blank line before body
    client.println(command);
    client.stop();
  }
}

void getHue()
{
  if (client.connect(hueHubIP, hueHubPort))
  {
    client.print("GET /api/");
    client.print(hueUsername);
    client.print("/lights/");
    client.print(light);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(hueHubIP);
    client.println("Content-type: application/json");
    client.println("keep-alive");
    client.println();
    while (client.connected())
    {
      if (client.available())
      {
        client.findUntil("\"on\":", "\0");
        onOffState = (client.readStringUntil(',') == "true");
        break;
      }
    }
    client.stop();
  }
}


当我测试此设置并将引脚 D1 接地时,D1 的状态似乎不断变为高/低(而电线仍接地)。我不知道为什么会这样。
任何地方都可以帮助我并告诉我我做错了什么吗?我不应该将 D1 连接到地面,而是以其他方式连接吗?还是我的编码错了?

回帖(1)

李霞

2024-4-10 16:37:32
对于将 ESP8266 的引脚 D1 和接地引脚连接到墙壁开关的操作,您需要采取以下步骤:

1. 将墙壁开关与 ESP8266 连接。如果墙壁开关是单极开关,那么您可以将 ESP8266 的 D1 引脚连接到开关的一个开关脚,将 ESP8266 的 GND 引脚连接到开关的另一个开关脚。

2. 如果墙壁开关是双极开关,那么您需要将 ESP8266 的 D1 引脚连接到开关的其中一个开关脚,将 ESP8266 的 GND 引脚连接到开关的另一个开关脚,并将开关的两个开关脚之间连接一根导线,将导线连接到 ESP8266 的 GND 引脚。

3. 在 ESP8266 的代码中,您需要编写一个函数来检测墙壁开关的状态。可以使用一个带有内部上拉电阻的 GPIO 引脚(例如 D1)作为输入引脚,然后在代码中检测这个 GPIO 引脚的状态来判断开关的状态。当开关被按下时,该引脚会变为低电平状态,否则为高电平状态。

4. 实现开关控制灯光的功能。您可以使用 Hue API 来控制 Philips Hue 灯的状态。可以通过向 Hue Bridge 发送 HTTP 请求来打开或关闭灯,并且可以在 ESP8266 的代码中使用 ESP8266WiFi 库和 ESP8266HTTPClient 库来实现这一功能。

总之,这需要一些电子技能和编程技能来完成,但是您可以通过查阅一些基础电子和编程教程来帮助自己理解这个过程。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分