想要一直眨眼直到我在nodemcu中按OFF

时间:2019-03-09 17:28:42

标签: c arduino embedded nodemcu adafruit

我正在用Adafruit io测试IOT的nodeMCU。我做了一个简单的眨眼,但是眨眼却不起作用。我想循环眨眼,这样当我通过MQTT OFF命令时它将停止工作。

#include <Adafruit_MQTT.h>            //Adafruit MQTT Libraries
#include <Adafruit_MQTT_Client.h>     //
#include <ESP8266WiFi.h>              //ESP8266 Wi-Fi libraries

#define relayPin 16

void setup():

void setup() 
{pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);  
  Serial.begin(9600);
  delay(10);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }

  mqtt.subscribe(&onoffbutton); // Setup MQTT subscription for onoff feed.
}

这是循环

 void loop() 
    {
       MQTT_connect();
       Adafruit_MQTT_Subscribe *subscription;
        while ((subscription = mqtt.readSubscription(5000))) 
      {
        if (subscription == &onoffbutton) {
          Serial.print(F("Got: "));
          Serial.println((char *)onoffbutton.lastread);
          String response = (char*)onoffbutton.lastread; //converts the received ON or OFF to string to compare in the if-else statement
          Serial.println(response);
          if (response == "ON")
          {
            digitalWrite(relayPin, LOW);
            delay(100);
            digitalWrite(relayPin, HIGH);
            delay(100);
          }
          else if(response == "OFF")
          {
            digitalWrite(relayPin, HIGH);
          }
        }
      }
    }

1 个答案:

答案 0 :(得分:0)

没有足够的信息来获得真正的答案,因此,这只是关于调试的说明,您应该已经完成​​调试并在问题中进行了描述。

您需要确定所有这些代码中哪些不起作用。

从最简单的闪烁实现开始(故意缓慢):

void setup() 
{
  pinMode(relayPin, OUTPUT);
}

void loop() 
{
  digitalWrite(relayPin, HIGH); 
  delay(1000);                
  digitalWrite(relayPin, LOW); 
  delay(1000);                
}

如果这不起作用,那么您至少已打折了所有MQTT东西。

如果它确实起作用,那么如果响应既不是“ ON”也不是“ OFF”,则您拥有的代码将不会执行任何操作,因为您的代码需要一个或另一个,而实际上您只对“ OFF”感兴趣,因此请更改为(再次故意变慢):

      if( response == "OFF" )
      {
        Serial.println( "Asserting OFF" );
        digitalWrite(relayPin, HIGH);
      }
      else
      {
        Serial.println( "BLINKING" );
        digitalWrite(relayPin, LOW);
        delay(1000);
        digitalWrite(relayPin, HIGH);
        delay(1000);
      }

现在,如果该指示灯闪烁但您无法将其关闭,则“ OFF”不是您正在得到的响应,或者它可能是瞬态的并且没有被无限期维护,在这种情况下,您需要一个静态变量来锁存响应。观察串行输出,以查看代码在每次loop()迭代中所采用的路径。