No puedo salir de bucle WHILE

Hola! Llevo muchos días con este problema debido a que estoy haciendo una aplicación IOT por medio de Adafruit y el módulo Wi-Fi ESP8266. Lo que pasa es que logré encender LEDS por medio de dicha página y también apagarlos, hasta ahí todo bien.

El problema empezó cuando quise hacer un blink con un ciclo While que evaluara si el pin D4 (el cual no está conectado a nada físicamente pero tiene comunicación desde Adafruit) tuviese una lectura en HIGH entonces encendiera y apagara el LED1, pero cuando lo cambio a LOW este no hace caso y sigue infinitamente.

Estuve leyendo algunos foros y creí que mi problema era por el delay así que lo cambié por Millis(), pero el problema siguió; ahora solo lo puse a imprimir un mensaje mientras estuviera en HIGH y lo hace infinitamente, nunca para. En este punto no sé qué estoy haciendo mal y por eso pido ayuda.

//Google Assistant Home Automation
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define Relay1            D1
#define Relay2            D2
#define Relay3            D3
#define Relay4            D4

#define WLAN_SSID       "Claro_619969"             // Your SSID
#define WLAN_PASS       "*****"        // Your password

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "io.adafruit.com" //Adafruit Server
#define AIO_SERVERPORT  1883                   
#define AIO_USERNAME  "*****"
#define AIO_KEY       "*****"
 
 /************************Variables de tiempo********************************/
 unsigned long tiempoActual = 0;
 unsigned long tiempoAnterior = 0;
 unsigned long tiempo = 0;
 boolean estado = false;

//WIFI CLIENT
WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Subscribe Light1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/Relay1"); // Feeds name should be same everywhere
Adafruit_MQTT_Subscribe Light2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/Relay2");
Adafruit_MQTT_Subscribe Light3 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/Relay3");
Adafruit_MQTT_Subscribe Light4 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/Relay4");

void MQTT_connect();

void setup() {
  Serial.begin(115200);

  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, INPUT);
  
  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: "); 
  Serial.println(WiFi.localIP());
 
  mqtt.subscribe(&Light1);
  mqtt.subscribe(&Light3);
  mqtt.subscribe(&Light2);
  mqtt.subscribe(&Light4);
}

void loop() {
 
  MQTT_connect();
  

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(20000))) {
    if (subscription == &Light1) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light1.lastread);
      int Light1_State = atoi((char *)Light1.lastread);
      digitalWrite(Relay1, Light1_State);
      Serial.println("Buena prueba 1");
      
    }
    if (subscription == &Light2) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light2.lastread);
      int Light2_State = atoi((char *)Light2.lastread);
      digitalWrite(Relay2, Light2_State);
      Serial.println("Buena prueba 2");
    }
    if (subscription == &Light3) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light3.lastread);
      int Light3_State = atoi((char *)Light3.lastread);
      digitalWrite(Relay3, Light3_State);
      Serial.println("Buena prueba 3");
    }
    if (subscription == &Light4) {
      Serial.print(F("Got: "));
      String got = (char *)Light4.lastread;
      Serial.println(got);
      int Light4_State = atoi((char *)Light4.lastread);

      int pulsador = digitalRead(D4);
      while(pulsador == 1){
        Serial.println("Hola");
        pulsador = digitalRead(D4)
        }
      }
    }
  }

void MQTT_connect() {
  int8_t ret;

  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  
  while ((ret = mqtt.connect()) != 0) {
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000); 
    retries--;
    if (retries == 0) {
      while (1);
    }
  }
  Serial.println("MQTT Connected!");
}

Muchas gracias.

PD: La parte del código que estoy modificando es " if (subscription == &Light4) {..."

Seguramente deberás cambiar esto

por
while ((subscription == mqtt.readSubscription(20000))) {

Recuerda que, a diferencia de otros lenguajes, en c++ "=" siempre cambia el valor de la variable que pones del lado izquierdo.

Para comparar si dos valores son iguales debes usar "==", que es lo que creo que quieres hacer

Se lo quité y dejó de funcionar todo lo demás, como si hubiera perdido la conexión con Adafruit :'/

Entonces hay que asegurarse de que el pulsador en D4 está correctamente conectado. ¿Tiene una resistencia de pulldown?

Comparte el circuito pls

¿Qué quitaste?
Debías agregar un signo "=", de quitar nada.

Saludos

A D4 no hay nada conectado físicamente, solo estoy usando ese pin para hacer un cambio de estado desde Adafruit y se ejecuten unas operaciones. Todo funciona bien, incluso puedo apagar y encender todos los LEDS a la vez usando ese pin; el problema empieza apenas uso la sentencia While...

Lo siento, me equivoqué. Lo que realmente quería decir es que se lo puse y dejó de funcionar todo el código como si hubiese perdido comunicación con Adafruit. Cuando le quité el "=" que había añadido, nuevamente empezó a funcionar todo correctamente

Tu pin D4 obviamente esta siempre en 0 por eso el

while(pulsador == 1){

no se cumple nunca. Dices que lo pulsaste pero algo no va, porque nunca se pone en LOW.

Ese es el problema. Cuando hago la lectura fuera del While no ocurre ningún problema, pero apenas entra pierdo totalmente el control

Creo que no miras el contexto. El estado del pulsador se leerá cuando estes dentro de la condición

A mi estas cosas no me gustan mucho

 int pulsador = digitalRead(D4);

definir dentro del mismo código. Porque no lo pones en todo caso al comienzo del loop como variable local.

void loop () {
    int pulsador;
// y mas abajo 
      pulsador = digitalRead(D4);
      while(pulsador == 1){
        Serial.println("Hola");
        pulsador = digitalRead(D4);
        }
      }

A tu código le falta el ; revisa.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.