Por que no puedo encender un led y mover un servo

ESTOY USANDO UNA PLACA ESP32 Y NO PUEDO ENCENDER UN LED DESDE UBIDOTS MEDIANTE UN DASHBOARD DE SWITCH , TAMPOCO PUEDO MOVER UN SERVOMOTOR CON EL DASHBOARD DE SLIDER, LO QUE PASA ES QUE ESTOY REFLEJANDO OTROS DATOS DE DOS SENSORES MAS QUE ES UN SENSOR ULTRASONICO Y UN POTENCIOMETRO, POR LA CUAL AL MANDAR LOS DATOS DE LOS SENSORES SI SE REFLEJAN EN UBIDOTS PERO AL MOMENTO DE YO QUEERER MANDAR DATOS DESDE UBIDOTS PARA PODER ENCENDER EL LED NO ME FUNCIONA , YA VERIFIQUE LAS VARIABLES Y COINCIDEN DE LOS DOS LADOS
ESTE ES EL CODIGO QUE ESTOY USANDO
#include “UbidotsEsp32Mqtt.h”
#include “wifiM.h”
#include <ESP32Servo.h>
#include <ESP32PWM.h>
#include <Ticker.h>
#include “UltrasonicSensor.h”
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>

const char *UBIDOTS_TOKEN = “BBUS-hkg4Dov3yEitAflT9IrHH6iqe2tARy”;
const char *DEVICE_LABEL = “espEu”;
const char *VARIABLE_LABEL = “pin_poten”;
const char *VARIABLE_LABEL_LED = “led”;
const char *VARIABLE_LABEL_SERVO = “servo”;
const char *VARIABLE_LABEL_DISTANCE = “pin_distancia”;
const int PUBLISH_FREQUENCY = 5000;

unsigned long timer = 0;
const uint8_t analogPin = 35;
const uint8_t ledPin = 12;
const uint8_t servoPin = 4;
const int buttonPin = 32;

int ledState = LOW;
int potValue = 0;
int servoValue = 0;
float distanceValue = 0;
int lcdState = 0;

int newButtonState = 0;
int oldButtonState = 0;

Ubidots ubidots(UBIDOTS_TOKEN);
UltrasonicSensor ultrasonico(5, 18);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myServo;

Ticker tickLimite, tickDistancia, tickPantalla;

void actualizaDistancia() {
distanceValue = ultrasonico.getDistance();
}

void actualizaLimite() {
int lim = analogRead(analogPin);
potValue = map(lim, 0, 4095, 0, 1023);
}

void enviarDatos() {
ubidots.add(VARIABLE_LABEL, potValue);
ubidots.add(VARIABLE_LABEL_DISTANCE, distanceValue);
ubidots.publish(DEVICE_LABEL);

Serial.println(“LED:” + String(ledState));
Serial.println("Potenciometro: " + String(potValue));
Serial.println(“Servo:” + String(servoValue));
Serial.println(“Distancia:” + String(distanceValue));
}

void actualizaPantalla() {
lcd.clear();
switch (lcdState) {
case 0:
lcd.setCursor(0, 0);
lcd.print(“led:”);
lcd.setCursor(0, 1);
lcd.print(ledState == HIGH ? “ON” : “OFF”);
break;
case 1:
lcd.setCursor(0, 0);
lcd.print(“Servo:”);
lcd.setCursor(0, 1);
lcd.print(servoValue);
break;
case 2:
lcd.setCursor(0, 0);
lcd.print(“Distancia:”);
lcd.setCursor(0, 1);
lcd.print(distanceValue);
break;
case 3:
lcd.setCursor(0, 0);
lcd.print(“Potenciometro:”);
lcd.setCursor(0, 1);
lcd.print(potValue);
break;
case 4:
lcd.setCursor(0, 0);
lcd.print(“IP:”);
lcd.print(WiFi.localIP());
lcd.setCursor(0, 1);
lcd.print(“Red:”);
lcd.print(WiFi.SSID());
break;
case 5:
lcd.setCursor(0, 0);
lcd.print(“Nombre: EULOGIO”);
lcd.setCursor(0, 1);
lcd.print(“MEDINA”);
break;
}
}

void callback(char *topic, byte *payload, unsigned int length) {
Serial.print(“Mensaje recibido [”);
Serial.print(topic);
Serial.print("] ");
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);

String expectedTopicLed = String(“/v1.6/devices/”) + String(DEVICE_LABEL) + “/” + String(VARIABLE_LABEL_LED) + “/lv”;
String expectedTopicServo = String(“/v1.6/devices/”) + String(DEVICE_LABEL) + “/” + String(VARIABLE_LABEL_SERVO) + “/lv”;

if (String(topic).equals(expectedTopicLed)) {
int mess = message.toInt();
ledState = (mess == 1) ? HIGH : LOW;
digitalWrite(ledPin, ledState);
} else if (String(topic).equals(expectedTopicServo)) {
int serValue = message.toInt();
if (serValue >= 0 && serValue <= 180) {
myServo.write(serValue);
servoValue = serValue;
}
}
}

void setup() {
lcd.init();
lcd.backlight();
lcd.clear();

pinMode(ledPin, OUTPUT);
pinMode(buttonPin,INPUT);
myServo.attach(servoPin);
myServo.write(servoValue);

conectaWifi_Gabriel();
ubidots.setCallback(callback);
ubidots.setup();
ubidots.reconnect();

String topicLed = “/v1.6/devices/” + String(DEVICE_LABEL) + “/” + VARIABLE_LABEL_LED + “/lv”;
ubidots.subscribe(topicLed.c_str());

String topicServo = “/v1.6/devices/” + String(DEVICE_LABEL) + “/” + VARIABLE_LABEL_SERVO + “/lv”;
ubidots.subscribe(topicServo.c_str());

timer = millis();

tickLimite.attach(0.8, actualizaLimite);
tickDistancia.attach(0.8, actualizaDistancia);
tickPantalla.attach(0.5, actualizaPantalla);
}

void loop() {
newButtonState = digitalRead(buttonPin);

if (newButtonState != oldButtonState) {
Serial.print(“Boton presionado”);
oldButtonState = newButtonState;
if (newButtonState == LOW) {
Serial.print("Boton ");
lcdState++;
if (lcdState > 5) {
lcdState = 0;
Serial.print(lcdState);
Serial.print(lcdState +“opcion de boton”);
}
}
delay(200);
}

if (!ubidots.connected()) {
ubidots.reconnect();
}

if (millis() - timer >= PUBLISH_FREQUENCY) {
enviarDatos();
timer = millis();
}

ubidots.loop();
}

Hola @medina,

Espero te encuentres muy bien.

Intuyo que el error puede estar ocasionado por la “E” mayúscula que estas poniendo en la constante DEVICE_LABEL:

image

Básicamente cuando utilizas el topic de publish, es decir, para enviar datos desde tu ESP32 a Ubidots, no importa si utilizas un Device label con mayúsculas o minúsculas, debido a que cuando los datos llegan, Ubidots se encarga de convertir todo el Device label en minúsculas, ya que es nuestro formato estándar.

Mira que el API Label del dispositivo en tu cuenta queda como espeu en lugar de espEu:

image

Tal y como lo mencionas, el problema viene al tratar de recibir datos en tu dispositivo desde Ubidots. En este caso, se utiliza el topic de subscripción, sin embargo, este debe de contener el Device label del dispositivo creado en tu cuenta, por lo que al intentar leer un Device label como espEu, no es posible encontrarlo y por ende, no puedes leer datos.

En conclusión, lo único que debes hacer es cambiar tu DEVICE_LABEL por espeu.

Me comentas si es de tu ayuda.

Alejandro