Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino esp8266继电器实时读取继电器状态_Arduino_Esp8266_Arduino Ide_Arduino Esp8266_Relay - Fatal编程技术网

Arduino esp8266继电器实时读取继电器状态

Arduino esp8266继电器实时读取继电器状态,arduino,esp8266,arduino-ide,arduino-esp8266,relay,Arduino,Esp8266,Arduino Ide,Arduino Esp8266,Relay,我制作了一个简单的脚本,通过本地web服务器控制中继。它工作,但我只想读取“真实”继电器状态,如果它是开或关 #include <ESP8266WiFi.h> const char* ssid = "myssid"; const char* password = "mypwd"; #define RELAY 0 WiFiServer server(80); void setup() { Serial.begin(115200); pinMode(RELAY,O

我制作了一个简单的脚本,通过本地web服务器控制中继。它工作,但我只想读取“真实”继电器状态,如果它是开或关

#include <ESP8266WiFi.h>

const char* ssid = "myssid";
const char* password = "mypwd";

#define RELAY 0

WiFiServer server(80);

void setup() {
    Serial.begin(115200);
    pinMode(RELAY,OUTPUT);
    digitalWrite(RELAY, LOW);
    server.begin();
}

void loop() {
    WiFiClient client = server.available();
    if (!client) return;
    while(!client.available()) delay(1);
    String request = client.readStringUntil('\r');
    int value = LOW;
    if (request.indexOf("/RELAY=ON") != -1){
      Serial.println("RELAY=ON");
      digitalWrite(RELAY,LOW);
      value = LOW;
    }
    if (request.indexOf("/RELAY=OFF") != -1){
      Serial.println("RELAY=OFF");
      digitalWrite(RELAY,HIGH);
      value = HIGH;
    }
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("");
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.println("<head><title>Test RELAY</title></head>");
    client.print("Relay is now: ");
    if(value == HIGH)
      client.print("OFF");
    else
      client.print("ON");
    client.println("<br><br>");
    client.println("Turn <a href=\"/RELAY=OFF\">OFF</a> RELAY<br>");
    client.println("Turn <a href=\"/RELAY=ON\">ON</a> RELAY<br>");
    client.println("</html>");
    delay(1);
}
这是正确的,然后我点击“打开继电器”,我看到:

Relay is now: ON

Turn OFF RELAY
Turn ON RELAY
此时,继电器真的打开了,但我关闭浏览器,从手机进入网页。它说:

Relay is now: OFF

Turn OFF RELAY
Turn ON RELAY

这是不正确的,因为继电器已打开。。。我如何读取实际值?我也尝试过digitalRead(中继),但它总是返回0。

这是一个愚蠢的错误,我花了一段时间才发现它。原因是
int值=低在循环方法中。解决这一问题的最佳方法是将其作为全局var放在顶部。这样,它就不会在每次请求时都被预先设置为LOW

#include <ESP8266WiFi.h>

const char* ssid = "myssid";
const char* password = "mypwd";
int value = LOW;
... // Rest of the code
#包括
const char*ssid=“myssid”;
const char*password=“mypwd”;
int值=低;
... // 代码的其余部分
并从循环方法中删除
int-value
的声明。 作为旁注,我建议您使用
server.on(route,httpMethod,arduinoMethod)


处理请求,而不是将其放入循环方法中。这样,它的性能更好,代码更清晰10倍。

通过我的脚本,使用ESP8255WiFi.h库,我能够使用引脚控制4个继电器:GPIO 0、TX、GPIO 2和RX。我试图使用您的建议“server.on()”来处理请求,因此我不得不使用ESP8266WebServer.h库。但是我不能使用TX和RX引脚。。。还有别的办法吗?我在用ESP8266-01。@FrancescoMineo嗯,你为什么不能用别针?你用的是什么样的板子?是D1吗?
#include <ESP8266WiFi.h>

const char* ssid = "myssid";
const char* password = "mypwd";
int value = LOW;
... // Rest of the code