Ubidots Community

Problema con suscripción de topics

hola tengo un problema lo que sucede es que estoy suscribiéndome a 5 topics como se puede ver, pero cuando estoy en el tablero de ubidots si apago el botón control1 se apaga, pero cuando prendo el boton control2 se vuelve a prender el boton control 1 y así en los demás, como puedo hacer que cuando apague el boton control1 se quede apagado hasta que lo vuelva a accionar, sin que se active denuevo con los otros botones .

#include "UbidotsESPMQTT.h"
#include <ESP8266WiFi.h>

#define WIFINAME "CESAR" //Your SSID
#define WIFIPASS "1796#2019#" // Your Wifi Pass
#define TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // Ubidots TOKEN


Ubidots client(TOKEN);
int control1 = 0;
int control2 = 2;
int control3 = 14;
int control4 = 12;
int control5 = D7;

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }

  Serial.println();
  if ((char)payload[0] == '1') {
    digitalWrite(control1, HIGH);
  }
  else {
    digitalWrite(control1, LOW);
  }
  if ((char)payload[0] == '1') {
    digitalWrite(control2, HIGH);
  }
  else {
    digitalWrite(control2, LOW);
  }
  if ((char)payload[0] == '1') {
    digitalWrite(control3, HIGH);
  }
  else {
    digitalWrite(control3, LOW);
  }
  if ((char)payload[0] == '1') {
    digitalWrite(control4, HIGH);
  }
  else {
    digitalWrite(control4, LOW);
  }
  if ((char)payload[0] == '1') {
    digitalWrite(control5, HIGH);
  }
  else {
    digitalWrite(control5, LOW);
  }
}


void setup() {
  Serial.begin(115200);
  client.setDebug(true);  // Pass a true or false bool value to activate debug messages
  client.wifiConnection(WIFINAME, WIFIPASS);
  client.begin(callback);
  client.ubidotsSubscribe("esp8266-1", "control1");  // Insert the dataSource and Variable's Labels
  client.ubidotsSubscribe("esp8266-1", "control2");  // Insert the dataSource and Variable's Labels
  client.ubidotsSubscribe("esp8266-1", "control3");  // Insert the dataSource and Variable's Labels
  client.ubidotsSubscribe("esp8266-1", "control4");  // Insert the dataSource and Variable's Labels
  client.ubidotsSubscribe("esp8266-1", "control5");  // Insert the dataSource and Variable's Labels
  pinMode(control1, OUTPUT);
  pinMode(control2, OUTPUT);
  pinMode(control3, OUTPUT);
  pinMode(control4, OUTPUT);
  pinMode(control5, OUTPUT);

}

void loop() {
  if (!client.connected()) {
    client.reconnect();
    client.ubidotsSubscribe("esp8266-1", "control1");  // Insert the dataSource and Variable's Labels
    client.ubidotsSubscribe("esp8266-1", "control2");  // Insert the dataSource and Variable's Labels
    client.ubidotsSubscribe("esp8266-1", "control3");  // Insert the dataSource and Variable's Labels
    client.ubidotsSubscribe("esp8266-1", "control4");  // Insert the dataSource and Variable's Labels
    client.ubidotsSubscribe("esp8266-1", "control5");  // Insert the dataSource and Variable's Labels
  }
  client.loop();


}

Buenos días @cesxd .

¡Espero estés muy bien!

Según veo en el código sólo te estás suscribiendo a los tópicos, es decir, recibirás los datos en tu ESP8266 pero no modificarás los valores de las variables, ya que no estás realizando publicaciones.

De igual forma, revisando los botones mencionados en el tablero, veo que están funcionando normalmente, es decir, que cada uno funciona de manera independiente. Si apagas el botón 1, este permanecerá apagado hasta que lo vuelvas a oprimir ¿Serías tan amable de confirmarme si el tablero se encuentra funcionando como debería?

Quedo atento a tus comentarios.

Saludos,

– Leonardo

Buenas tardes @cesxd

Disculpa, viendo una vez más tu pregunta veo que también puedas hacer referencia al como prender solo un botón físico al darle click a un botón en el tablero. Verás, cuando presionas el botón 1 en el tablero en Ubidots, este generará un “1” a un topico específico, este valor y topico serán leídos en la función callback, por lo que necesitas comparar dentro de esta función cada uno de los topicos de las variables asociadas a los botones en Ubidots.

Necesitarás añadir una comparación previo a comparar si el valor de la variable es “1” o “0”. Por ejemplo, dentro de la función callback:

if( String(topic) == "/v1.6/devices/{DEVICE_LABEL}/{VARIABLE_LABEL}/lv"){
   if ((char)payload[0] == '1') {
      digitalWrite(control1, HIGH);
    }
   else {
      digitalWrite(control1, LOW);
    }

}

Donde el {DEVICE_LABEL} es la etiqueta del dispositivo y {VARIABLE_LABEL} es la etiqueta de la variable. Cabe añadir que esta comparación debe ser agregada para cada uno de los botones, cambiando la etiqueta de la variable según sea el caso. Para más información puedes consultar la API pública.