首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >esp8266中继实时读取中继状态

esp8266中继实时读取中继状态
EN

Stack Overflow用户
提问于 2018-12-30 18:46:42
回答 1查看 1.1K关注 0票数 1

我创建了一个简单的脚本来通过本地web服务器控制中继。它可以工作,但我只想读取“真正的”中继状态,无论它是开还是关。

代码语言:javascript
复制
#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);
}

使用此代码,当我启动esp时,中继状态默认为off。然后,我用我的台式pc在esp的本地ip地址访问网页,我看到的是:

代码语言:javascript
复制
Relay is now: OFF

Turn OFF RELAY
Turn ON RELAY

这是正确的,然后我点击“打开中继”,我看到:

代码语言:javascript
复制
Relay is now: ON

Turn OFF RELAY
Turn ON RELAY

此时,中继真的开始了,但我关闭了浏览器,并通过手机访问网页。它说:

代码语言:javascript
复制
Relay is now: OFF

Turn OFF RELAY
Turn ON RELAY

这是不正确的,因为中继是开着的.我如何才能读取真正的值呢?我也尝试过digitalRead(中继),但它总是返回0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-30 19:28:23

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

代码语言:javascript
复制
#include <ESP8266WiFi.h>

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

并从循环方法中删除int value的声明。顺便说一句,我建议您使用server.on(route, httpMethod, arduinoMethod);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53976996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档