【问题标题】:Want to make the blink forever until I press OFF in nodemcu想要永远闪烁,直到我在 nodemcu 中按下 OFF
【发布时间】:2019-03-09 17:28:42
【问题描述】:

我正在测试一个带有 Adafruit io 的 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() 
{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);
          }
        }
      }
    }

【问题讨论】:

  • ESP 芯片本身的哪个引脚是“relayPin”以及它连接到什么?你有什么证据表明你的程序实际上已经被加载了? LED 是在程序控制下还是完全自行闪烁的东西,比如我在附近某个地方的随机 ESP8266 模块中的车载电池充电器。
  • relayPin 是 16。我想永远闪烁,直到我按下 OFF。但是每次都需要单独输入。
  • 第 16 针是什么?那是连接LED的地方吗?或许可以找到一张你的电路板的图片,并用相关引脚和相关 LED 的指示对其进行注释。如果 LED 不在板上,请显示支持它的电路。
  • 您的问题标题表明您无法停止闪烁,而正文表明它根本不闪烁。你的问题是什么?代码的行为是什么?这与您预期的行为有何不同?
  • 好的,那里有很多东西需要打折。如果loop() 只包含“ON”块中的四行,它会闪烁吗?如果不是,那么您的问题已经严重过度复杂化,我们回到:未初始化,错误引脚,硬件故障,无电源。输出真的是继电器吗?负载端有电吗,你开的是什么负载?这真的是硬件问题而不是软件问题吗?如果真的是机械,你真的能开那么快吗?

标签: c arduino embedded nodemcu adafruit


【解决方案1】:

没有足够的信息来提供真正的答案,所以这是关于你应该已经完成​​并在你的问题中描述的调试的说明。

您需要找出所有代码中的哪些部分不起作用。

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

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() 迭代中采用的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多