我正在用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);
}
}
}
}
答案 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()
迭代中所采用的路径。