Arduino esp8266继电器实时读取继电器状态
我制作了一个简单的脚本,通过本地web服务器控制中继。它工作,但我只想读取“真实”继电器状态,如果它是开或关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
#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