Necesito ayuda para la conexión a ubidots

Hola, estoy creando un proyecto IoT para mi universidad y tengo el siguiente código:

#include <DHTesp.h>
#include <Wire.h>
#include <BH1750.h>
// Definición de pines
const int sensorPin = 25;       // Pin analógico para el sensor de humedad del suelo
const int bombaPin = 23;        // Pin de salida para controlar la bomba de agua
const int COSensor = 27;        // Pin analógico para el sensor de monóxido de carbono (CO)
const int lightThreshold = 1000;// Umbral de luz para encender/apagar la luz
const int lightPin = 13;        // Pin de salida para controlar la luz integrada
DHTesp dht;  // Instancia del sensor DHT11
BH1750 lightMeter;  // Instancia del sensor de luz BH1750
///////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(9600);  // Iniciar comunicación serial
  Wire.begin();  // Iniciar comunicación I2C para el sensor de luz
  lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);  // Inicializar el sensor de luz
  pinMode(bombaPin, OUTPUT);  // Configurar el pin de la bomba como salida
  dht.setup(5, DHTesp::DHT11);  // Inicializar el sensor DHT11 en el pin 5
  delay(20000);  // Esperar 20 segundos antes de comenzar las mediciones
}

/////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  // Medir la humedad del suelo
  int moisture = analogRead(sensorPin);
  float moisturePercent = map(moisture, 0, 4095, 0, 100);
  // Medir temperatura y humedad ambiental
  float dht11_temperatura = dht.getTemperature();
  float dht11_humedad = dht.getHumidity();
  // Mostrar resultados en el monitor serie
  Serial.print("Temperatura ambiental: ");
  Serial.println(dht11_temperatura);
  Serial.print("Humedad ambiental: ");
  Serial.println(dht11_humedad);
  // Controlar la bomba de agua en función de la humedad del suelo
  if (moisturePercent > 70) {
    digitalWrite(bombaPin, HIGH);  // Encender la bomba
  } else {
    digitalWrite(bombaPin, LOW);  // Apagar la bomba
  }
  // Medir el nivel de monóxido de carbono (CO)
  int coLevel = analogRead(COSensor);
  // Mostrar nivel de CO en el monitor serie
  if (coLevel < 115) {
    Serial.print("Nivel de CO normal ");
    Serial.println(coLevel);
  } else if (coLevel < 1260) {
    Serial.print("Nivel de CO moderadamente alto ");
    Serial.println(coLevel);
  } else {
    Serial.print("Nivel de CO peligroso! ");
    Serial.println(coLevel);
  }
  // Mostrar nivel de resequedad del suelo
  Serial.print("Resequedad del suelo: ");
  Serial.print(moisturePercent);
  Serial.println("%");
  // Medir nivel de luz ambiente
  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Lux: ");
  Serial.println(lux);
  Serial.println("\f");  // Imprimir un carácter de formateo en el monitor serie
  delay(5000);  // Esperar 5 segundos antes de tomar la siguiente lectura
}

Con este código todo funciona perfectamente y puedo visualizar en la serial de Arduino IDE los datos arrojados por los sensores, entonces procedo a realizar la conexión con Ubidots y el sensor de resequedad del suelo para controlar la bomba de agua(moisturePercent) y el de Monóxido de carbono (coLevel) me dejan de reflejar datos tanto en la serial como en la plataforma de ubidots, son los únicos 2 sensores que al agregarle para poder enviar datos al código dejan de funcionar por asi decirlo. Adjunto el codigo que tengo para la conexión con Ubidots, esperando me ayuden a encontrar alguna solución, de antemano muchas gracias.

#include "UbidotsEsp32Mqtt.h"

#include <DHTesp.h>

#include <Wire.h>

#include <BH1750.h>

/****************************************

 * Define Constants

 ****************************************/

const char *UBIDOTS_TOKEN = "XXXXX";  // Put here your Ubidots TOKEN

const char *WIFI_SSID = "XXXXX";      // Put here your Wi-Fi SSID

const char *WIFI_PASS = "XXXXXX";      // Put here your Wi-Fi password

const char *DEVICE_LABEL = "esp32";   // Put here your Device label to which data  will be published

const char *VARIABLE_LABEL = "temperatura-ambiental"; // Put here your Variable label to which data  will be published

const char *VARIABLE_LABEL2 = "humedad-ambiental"; // Put here your Variable label to which data  will be published

const char *VARIABLE_LABEL3 = "nivelco"; // Put here your Variable label to which data  will be published

const char *VARIABLE_LABEL4 = "suelo"; // Put here your Variable label to which data  will be published

const char *VARIABLE_LABEL5 = "luminosidad"; // Put here your Variable label to which data  will be published

const int PUBLISH_FREQUENCY = 10000; // Update rate in milliseconds

unsigned long timer=0;

// Definición de pines

const int sensorPin = 25;       // Pin analógico para el sensor de humedad del suelo

const int bombaPin = 23;        // Pin de salida para controlar la bomba de agua

const int COSensor = 27;        // Pin analógico para el sensor de monóxido de carbono (CO)

const int lightThreshold = 1000;// Umbral de luz para encender/apagar la luz

const int lightPin = 13;        // Pin de salida para controlar la luz integrada

Ubidots ubidots(UBIDOTS_TOKEN);

DHTesp dht;  // Instancia del sensor DHT11

BH1750 lightMeter;  // Instancia del sensor de luz BH1750

///////////////////////////////////////////////////////////////////////////////////////////////

void setupUbidots() {

  // ubidots.setDebug(true);  // uncomment this to make debug messages available

  ubidots.connectToWifi(WIFI_SSID, WIFI_PASS);

  ubidots.setup();

  ubidots.reconnect();

}

void setup() {

  Serial.begin(9600);  // Iniciar comunicación serial

 

  Wire.begin();  // Iniciar comunicación I2C para el sensor de luz

  lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);  // Inicializar el sensor de luz

  pinMode(lightPin, OUTPUT);  // Configurar el pin de luz como salida

 

  pinMode(bombaPin, OUTPUT);  // Configurar el pin de la bomba como salida

  dht.setup(5, DHTesp::DHT11);  // Inicializar el sensor DHT11 en el pin 5

  delay(20000);  // Esperar 20 segundos antes de comenzar las mediciones

  setupUbidots(); // Llamar a la función de configuración de Ubidots

 

  timer = millis();

}

void publishToUbidots(float temperature, float humidity, int coLevel, float moisturePercent, uint16_t lux) {

  if (!ubidots.connected()) {

    ubidots.reconnect();

  }

 

  if (millis() - timer > PUBLISH_FREQUENCY) {

    ubidots.add(VARIABLE_LABEL, temperature);

    ubidots.add(VARIABLE_LABEL2, humidity);

    ubidots.add(VARIABLE_LABEL3, coLevel);

    ubidots.add(VARIABLE_LABEL4, moisturePercent);

    ubidots.add(VARIABLE_LABEL5, lux);

   

    ubidots.publish(DEVICE_LABEL);

    timer = millis();

  }

  ubidots.loop();

}

/////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {

  // Medir la humedad del suelo

  int moisture = analogRead(sensorPin);

  float moisturePercent = map(moisture, 0, 4095, 0, 100);

 

  // Medir temperatura y humedad ambiental

  float dht11_temperatura = dht.getTemperature();

  float dht11_humedad = dht.getHumidity();

 

  // Mostrar resultados en el monitor serie

  Serial.print("Temperatura ambiental: ");

  Serial.println(dht11_temperatura);

  Serial.print("Humedad ambiental: ");

  Serial.println(dht11_humedad);

  // Controlar la bomba de agua en función de la humedad del suelo

  if (moisturePercent > 70) {

    digitalWrite(bombaPin, HIGH);  // Encender la bomba

  } else {

    digitalWrite(bombaPin, LOW);  // Apagar la bomba

  }

  // Medir el nivel de monóxido de carbono (CO)

  int coLevel = analogRead(COSensor);

  // Mostrar nivel de CO en el monitor serie

  if (coLevel < 115) {

    Serial.print("Nivel de CO normal ");

    Serial.println(coLevel);

  } else if (coLevel < 1260) {

    Serial.print("Nivel de CO moderadamente alto ");

    Serial.println(coLevel);

  } else {

    Serial.print("Nivel de CO peligroso! ");

    Serial.println(coLevel);

  }

 

  // Mostrar nivel de resequedad del suelo

  Serial.print("Resequedad del suelo: ");

  Serial.print(moisturePercent);

  Serial.println("%");

  // Medir nivel de luz ambiente

  uint16_t lux = lightMeter.readLightLevel();

  Serial.print("Lux: ");

  Serial.println(lux);

  // Controlar la luz en función del nivel de luz ambiente

  if (lux < lightThreshold) {

    digitalWrite(lightPin, HIGH);   // Encender la luz

  } else {

    digitalWrite(lightPin, LOW);    // Apagar la luz

  }

  Serial.println("\f");  // Imprimir un carácter de formateo en el monitor serie

  delay(5000);  // Esperar 5 segundos antes de tomar la siguiente lectura

  publishToUbidots(dht11_temperatura, dht11_humedad, coLevel, moisturePercent, lux);

}

Saludos @Wilx espero que se encuentre muy bien.

He intentado reproducir el error al que usted se refiere, sin embargo no he tenido exito en ello.

A continuacion pongo mi configuracion:

  • mcu: esp32
  • sensor: DS18B20
  • IDE: Platformio
  • version ibreria Pub/Sub: knolleary-PubSubClient 2.8

Estoy usando un esp32 con un sensor de temperatura DS18B20, inclusive estoy usando los mismo pines que para usted presentan problemas (el 23 y el 27), aun asi, los datos se imprimen correctamente en la consola serial asi como tambien son enviados a mi cuenta de Ubidots:

Peek 2023-09-25 10-12

Ante esto solo se me ocure:

  1. Usar versiones anterior del firmware del esp32, como lo puede ser la version 2.8 o 3.0.2.
  2. Verificar que las librerias que se estan usando para leer datos de los distintos sensores no tengan conflictos (que no esten cambiando configuraciones de los pines o intentando acceder al mismo recurso, por ejemplo)
  3. Cambiar los pines en los cuales se estan leyendo los datos.

Las recomendaciones estan basadas en el hecho de que la libreria para MQTT para el esp32 desarrollada por Ubidots es en realidad agnostica con respecto a los pines y en general al hardware, es decir, esta unicamente usa la librearia Pub/Sub, sin inicializar o modificar el estado del hardware del microcontrolador.

A continuacion una muestra del codigo que utilice:

#include <Arduino.h>
#include "UbidotsEsp32Mqtt.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <cstdlib>

// GPIO where the DS18B20 is connected to
const int oneWireBus = 23;     

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

const char *UBIDOTS_TOKEN = "";  // Put here your Ubidots TOKEN
const char *WIFI_SSID = "";      // Put here your Wi-Fi SSID
const char *WIFI_PASS = "";      // Put here your Wi-Fi password
const char *DEVICE_LABEL = "test_device_library_mqtt";   // Put here your Device label to which data  will be published
const char *VARIABLE_LABEL = "temperature"; // Put here your Variable label to which data  will be published

const int PUBLISH_FREQUENCY = 5000; // Update rate in milliseconds
unsigned long timer;
Ubidots ubidots(UBIDOTS_TOKEN);

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();
}


void setup() {
  // Start the Serial Monitor
  Serial.begin(115200);
  // Start the DS18B20 sensor
  // ubidots.setDebug(true);  // uncomment this to make debug messages available
  ubidots.connectToWifi(WIFI_SSID, WIFI_PASS);
  ubidots.setCallback(callback);
  ubidots.setup();
  ubidots.reconnect();

  timer = millis();
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  float temperatureF = sensors.getTempFByIndex(0);
  Serial.print(temperatureC);
  Serial.println("ºC");
  Serial.print(temperatureF);
  Serial.println("ºF");
  if (!ubidots.connected())
  {
    ubidots.reconnect();
  }
  if (abs(static_cast<long>((unsigned long) millis() - timer)) > PUBLISH_FREQUENCY)
  {
    ubidots.add(VARIABLE_LABEL, temperatureC); // Insert your variable Labels and the value to be sent
    ubidots.publish(DEVICE_LABEL);
    timer = millis();
  }
  ubidots.loop();

}

Saludos cordiales