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