Higrometro casero (Problema)

Buenas! Recien estoy arrancando en este mundillo por ende soy SUMAMENTE NOVATO tanto en programacion como en arduino.
Basicamente estoy creando un proyecto de un higrometro casero para que me mantenga parametros de humedad y temperatura.

Tengo un:

  • arduino uno (no original)
    -Protoboard
    -DHT22
    -Pantalla led
    -Rele de 8 canales
    -Caloventor
    -Humificador
    -Extracotor
    -Intractor

El problema que estoy teniendo es que CREO que el codigo esta bien, pero el funcionamiento del hardware esta mal.

#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Dirección I2C, columnas y filas del LCD

float targetTemperature = 25.0; // Configura la temperatura deseada
float targetHumidity = 60.0;    // Configura la humedad deseada
unsigned long previousMillis = 0;
const long interval = 5000; // Intervalo de 5 segundos

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
  setupRelay();
}

void loop() {
  unsigned long currentMillis = millis();

  // Controlar el tiempo para la lectura y actualización
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    // Controlar dispositivos
    controlDevices(temperature, humidity);

    // Mostrar temperatura y humedad en el LCD
    showTemperatureAndHumidity(temperature, humidity);
  }
}

void setupRelay() {
  pinMode(8, OUTPUT); // Pin IN1 (caloventor)
  pinMode(9, OUTPUT); // Pin IN4 (extractor)
  pinMode(10, OUTPUT); // Pin IN6 (humificador)
  pinMode(11, OUTPUT); // Pin IN8 (intractor)
}

void controlDevices(float temperature, float humidity) {
  Serial.print("Temperature: ");
  Serial.println(temperature);

  Serial.print("Humidity: ");
  Serial.println(humidity);

  if (temperature < targetTemperature) {
    Serial.println("Encendiendo caloventor");
    digitalWrite(8, HIGH); // Enciende caloventor
  } else {
    Serial.println("Apagando caloventor");
    digitalWrite(8, LOW); // Apaga caloventor
  }

  if (temperature > targetTemperature) {
    Serial.println("Encendiendo extractor");
    digitalWrite(9, HIGH); // Enciende extractor
  } else {
    Serial.println("Apagando extractor");
    digitalWrite(9, LOW); // Apaga extractor
  }

  if (humidity < targetHumidity) {
    Serial.println("Encendiendo humificador");
    digitalWrite(10, HIGH); // Enciende humificador
  } else {
    Serial.println("Apagando humificador");
    digitalWrite(10, LOW); // Apaga humificador
  }

  if (humidity > targetHumidity) {
    Serial.println("Encendiendo intractor");
    digitalWrite(11, HIGH); // Enciende intractor
  } else {
    Serial.println("Apagando intractor");
    digitalWrite(11, LOW); // Apaga intractor
  }
}


void showTemperatureAndHumidity(float temp, float hum) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print(hum);
}

El problema que estoy teniendo es mas que nada en los relees que abren y cierran el pase de la electricidad a los tomas donde se enchufan los dispositivos. El dht22 sensa correctamente los parametros pero se encienden los rele que no deberian, es decir
seteo:
Temperatura en 25°C
Humedad en 60%

Cuando la temperatura baja, el caloventor deberia encender y cuando se pasa del parametro establecido deberia encender el extractor. Lo mismo con la humedad si esta por debajo del parametro deberia encender el humificador y si se pasa prender el intractor.
Incluso puse para imprimirlo en el monitor serial y esta correcta la logica.

Pero a la hora de encender los relee encienden los incorrectos (me guio por la luz roja)
, y ya revise las conexiones.

Nose que puede ser alguna idea?


Ese tipo de módulos de relevadores por lo regular se activan con digitalWrite(LOW) y se desactivan con digitalWrite(HIGH).

Te recomiendo que pruebes esto de forma independiente antes de conectar el DHT22.

Por otro lado, lo que debes hacer es configurar rangos de temperatura y de humedad a controlar, por ejemplo

const float minTemp=24;
const float maxTemp=26;

Cambia tu programa para que reaccione cuando la temperatura sea menor a minTemp (calentar) o mayor a maxTemp (dejar de calentar), y algo similar para la humedad.

O los valores que tolere tu aplicación. Mantener exactamente una temperatura requiere de un algoritmo de control más sofisticado (como PID) e incluso así podría ser imposible.

Ante todo muchas gracias por responder! TENIAS TODAS LA RAZON! fue la solucion a mi problema!!

Ese tipo de módulos de relevadores por lo regular se activan con digitalWrite(LOW) y se desactivan con digitalWrite(HIGH). ESTA FUE LA SOLUCION!

Y tomo tu consejo de poner rangos de temperatura. Mi nivel de programacion y arduino son muy basico no estoy como para utilizar un algoritmo como PID

El codigo sin importar que es ultra basico, lo ves bien?

En algun momento me gustaria incorporarle wifi para que yo pueda ver desde mi celular, o incluso poder tener algun panel para que yo suba o baje los parametros sin tener que estar conectandolo a una pc.

Algo asi

Si, a mí me gusta la idea de delegar actividades a funciones especializadas que hagan X ó Y trabajo, y no poner todo el código dentro de loop().

Así te vas adentrando en los detalles poco a poco, y más importante, puedes probar y modificar con mayor facilidad el código. Incluso reutilizarlo.

El uso de millis() es muy eficiente y te permite agregar más funcionalidad sin comprometer los intervalos a los que se ejecuta el control de los dispositivos o la actualización del display.

Sii tal cual como decis, me informe que el uso de millis era mejor que delay, es "no bloqueante".

Mas adelante me gustaria incorporarle tambien un RTC DS3231 para que pueda diferenciar entre el dia y la noche
Me quedo asi:

#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Dirección I2C, columnas y filas del LCD

const float minTemp = 24.0;  // Temperatura mínima
const float maxTemp = 26.0;  // Temperatura máxima
const float minHumidity = 55.0;  // Humedad mínima
const float maxHumidity = 70.0;  // Humedad máxima

unsigned long previousMillis = 0;
const long interval = 5000; // Intervalo de 5 segundos

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
  setupRelay();
}

void loop() {
  unsigned long currentMillis = millis();

  // Controlar el tiempo para la lectura y actualización
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    // Controlar dispositivos
    controlDevices(temperature, humidity);

    // Mostrar temperatura y humedad en el LCD
    showTemperatureAndHumidity(temperature, humidity);
  }
}

void setupRelay() {
  pinMode(8, OUTPUT); // Pin IN1 (caloventor)
  pinMode(9, OUTPUT); // Pin IN4 (extractor)
  pinMode(10, OUTPUT); // Pin IN6 (humificador)
  pinMode(11, OUTPUT); // Pin IN8 (intractor)
}

void controlDevices(float temperature, float humidity) {
  Serial.print("Temperature: ");
  Serial.println(temperature);

  Serial.print("Humidity: ");
  Serial.println(humidity);

  // Controlar caloventor
  if (temperature < minTemp) {
    Serial.println("Encendiendo caloventor");
    digitalWrite(8, LOW);
  } else if (temperature > maxTemp) {
    Serial.println("Apagando caloventor");
    digitalWrite(8, HIGH);
  }

  // Controlar extractor
  if (temperature > maxTemp) {
    Serial.println("Encendiendo extractor");
    digitalWrite(9, LOW);
  } else {
    Serial.println("Apagando extractor");
    digitalWrite(9, HIGH);
  }

  // Controlar humificador
  if (humidity < minHumidity) {
    Serial.println("Encendiendo humificador");
    digitalWrite(10, LOW);
  } else {
    Serial.println("Apagando humificador");
    digitalWrite(10, HIGH);
  }

  // Controlar intractor
  if (humidity > maxHumidity) {
    Serial.println("Encendiendo intractor");
    digitalWrite(11, LOW);
  } else {
    Serial.println("Apagando intractor");
    digitalWrite(11, HIGH);
  }
}

void showTemperatureAndHumidity(float temp, float hum) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print(hum);
}

Buenas dias/tardes/noches a todos.

El problema con el que vengo ahora es que decidi cambiar el sensor DHT22 por el sensor AHT25 de mejor calidad o por lo menos para probar porque el anterior falla.

Tengo duda con las conexiones y con el codigo. Tengo un arduino uno

Conexiones:

El dht 22 me resultaba mas facil ya que conectaba el pin data a un pin digital y listo.
Pero el aht25 tiene SDA y SCL. Y ambos pines A4 y A5 al momento los tengo ocupadas por una pantalla lcd que tiene SDA y SCL. Como hago para conectar 2 dispositivos con comunicacion L2C?

Codigo: Ya instale la biblioteca del aht25 y queria saber si el codigo esta bien? Es el mismo que siempre solo que reemplaze el dht22 por aht25.

#include <AHTxx.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

AHT25 aht25;

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Dirección I2C, columnas y filas del LCD

const float minTemp = 24.0;  // Temperatura mínima
const float maxTemp = 26.0;  // Temperatura máxima
const float minHumidity = 55.0;  // Humedad mínima
const float maxHumidity = 70.0;  // Humedad máxima

unsigned long previousMillis = 0;
const unsigned long interval = 5000; // Intervalo de 5 segundos

void setup() {
  Serial.begin(9600);
  aht25.begin();
  lcd.init();
  lcd.backlight();
  setupRelay();
}

void loop() {
  unsigned long currentMillis = millis();

  // Controlar el tiempo para la lectura y actualización
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    float temperature = aht25.readTemperature();
    float humidity = aht25.readHumidity();

    // Controlar dispositivos
    controlDevices(temperature, humidity);

    // Mostrar temperatura y humedad en el LCD
    showTemperatureAndHumidity(temperature, humidity);
  }
}

void setupRelay() {
  pinMode(8, OUTPUT); // Pin IN1 (caloventor)
  pinMode(9, OUTPUT); // Pin IN4 (extractor)
  pinMode(10, OUTPUT); // Pin IN6 (humificador)
  pinMode(11, OUTPUT); // Pin IN8 (intractor)
}

void controlDevices(float temperature, float humidity) {
  Serial.print("Temperature: ");
  Serial.println(temperature);

  Serial.print("Humidity: ");
  Serial.println(humidity);

  // Controlar caloventor
  if (temperature < minTemp) {
    Serial.println("Encendiendo caloventor");
    digitalWrite(8, LOW);
  } else if (temperature > maxTemp) {
    Serial.println("Apagando caloventor");
    digitalWrite(8, HIGH);
  }

  // Controlar extractor
  if (temperature > maxTemp) {
    Serial.println("Encendiendo extractor");
    digitalWrite(9, LOW);
  } else {
    Serial.println("Apagando extractor");
    digitalWrite(9, HIGH);
  }

  // Controlar humificador
  if (humidity < minHumidity) {
    Serial.println("Encendiendo humificador");
    digitalWrite(10, LOW);
  } else {
    Serial.println("Apagando humificador");
    digitalWrite(10, HIGH);
  }

  // Controlar intractor
  if (humidity > maxHumidity) {
    Serial.println("Encendiendo intractor");
    digitalWrite(11, LOW);
  } else {
    Serial.println("Apagando intractor");
    digitalWrite(11, HIGH);
  }
}

void showTemperatureAndHumidity(float temp, float hum) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print(hum);
}


Buenas tardes a todos!

Estoy teniendo un problema con mi proyecto que no se si es un problema a nivel código (lo + seguro) o a nivel conexiones hardware (dudo).

El problema que estoy teniendo es que al arrancar funciona correctamente y luego de "x" horas/minutos. Me deja de mostrar en el display lcd los parámetros, no se si siguen funcionando los relés como deberían según el código o es solo problema de mostrar los datos. Creo que se tilda el código. Porque el display sigue prendido pero no muestra ningún dato.

#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Dirección I2C, columnas y filas del LCD

const float minTemp = 24.0;  // Temperatura mínima
const float maxTemp = 26.0;  // Temperatura máxima
const float minHumidity = 55.0;  // Humedad mínima
const float maxHumidity = 70.0;  // Humedad máxima

unsigned long previousMillis = 0;
const long interval = 5000; // Intervalo de 5 segundos

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
  setupRelay();
}

void loop() {
  unsigned long currentMillis = millis();

  // Controlar el tiempo para la lectura y actualización
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    // Controlar dispositivos
    controlDevices(temperature, humidity);

    // Mostrar temperatura y humedad en el LCD
    showTemperatureAndHumidity(temperature, humidity);
  }
}

void setupRelay() {
  pinMode(8, OUTPUT); // Pin IN1 (caloventor)
  pinMode(9, OUTPUT); // Pin IN4 (extractor)
  pinMode(10, OUTPUT); // Pin IN6 (humificador)
  pinMode(11, OUTPUT); // Pin IN8 (intractor)
}

void controlDevices(float temperature, float humidity) {
  Serial.print("Temperature: ");
  Serial.println(temperature);

  Serial.print("Humidity: ");
  Serial.println(humidity);

  // Controlar caloventor
  if (temperature < minTemp) {
    Serial.println("Encendiendo caloventor");
    digitalWrite(8, LOW);
  } else if (temperature > maxTemp) {
    Serial.println("Apagando caloventor");
    digitalWrite(8, HIGH);
  }

  // Controlar extractor
  if (temperature > maxTemp) {
    Serial.println("Encendiendo extractor");
    digitalWrite(9, LOW);
  } else {
    Serial.println("Apagando extractor");
    digitalWrite(9, HIGH);
  }

  // Controlar humificador
  if (humidity < minHumidity) {
    Serial.println("Encendiendo humificador");
    digitalWrite(10, LOW);
  } else {
    Serial.println("Apagando humificador");
    digitalWrite(10, HIGH);
  }

  // Controlar intractor
  if (humidity > maxHumidity) {
    Serial.println("Encendiendo intractor");
    digitalWrite(11, LOW);
  } else {
    Serial.println("Apagando intractor");
    digitalWrite(11, HIGH);
  }
}

void showTemperatureAndHumidity(float temp, float hum) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print(hum);
}
const long interval = 5000; // Intervalo de 5 segundos

debería ser

const unsigned long interval = 5000;

Otra cosa no veo en este momento.

Muchas gracias por responder MaximoEsfuerzo, voy a probar cambiando eso. Al momento lo deje varias horas andando y cuando llego me seguia mostrando parametros pero en este caso estaba tildado en "x" parametro de humedad y temperatura y no cambiaba. Al apretar el boton reset volvio a la normalidad y los parametros diferian a lo que mostraba tildado. Puede ser tambien algun problema de tension?

Muchas gracias

No es lo que te indicó @MaximoEsfuerzo aunque es una corrección valida solo que en lugar de que falle en 49 dias lo haría en la mitad por haber elegido solo long. O sea no cambia mucho ni resuelve el problema que mencionas.
Tengo buenas y malas noticias.
El problema que tienes es el sensor de humedad DHT.
Ese sensor ha sido copiado por la industria electronica mundial y lamentablemente hay muchas versiones queno funcionan bien.
La solución que hemos encontrado es que se alimente con un pin del Arduino (si es tu caso) y que le des u power cycle o sea lo apagues y prendas previo a tu lectura.
Sin embargo y acá hablo por mi, yo lo he hecho y he tenido problemas a las semanas.
Y justamente son esas cosas que no sabes cómo resolver.
Qué hacer?
Pues asegurarse que comrpas un DHT22 por ejemplo de buena calidad.
Cómo hacer eso en estos dias? Imposible decirte.
Hay un sensor nuevo de precisión fabricado por Texas Instruments (TI)Te lo recomiendo... no importa cuanto cueste si no te da problemas y ademas es mucho mejor que estos sensores que ya no son de fiar.
El sensor es HDC2022.
Este no es de TI pero tmb es una alternativa AHT21

Ante todo gracias por tomarte el tiempo para responder. Soy nuevo en el mundo Arduino y desconocía que este tipo de sensor podía llegar a fallar. Tal cual de la forma que detallas seria probar con un DHT22 nuevo y cruzar los dedos.
Voy a buscar si el sensor HDC2022 de Texas Instruments llega a mi pais y su valor. Al momento encontré una variante al DHT22, que me lo mencionas abajo pero es el AHT25, podría llegar a servirme?

Otra consulta que tengo es es necesario que conecte algún estabilizador de tensión para proteger el hardware involucrado con el Arduino y el mismo Arduino?

Yo no utilice ninguna resistencia en mi proyecto, creo que no lo necesito?

Gracias!!!

No lo he usado, pero tiene mejor pinta que el DHT, mira sus datos y conexiones AQUI y las librerías las tienes en este SITIO.

Gracias! es lo que me dicen todos parece que el dht22 es una basura. Gracias por compartirme las conexiones y librerías!
Gracias!

El DHT22 no es una basura, la basura es que se ha falsificado y no se comporta bien.
De hecho hay muchos tutoriales al respecto pero con soluciones variadas.
Si haces lo que te dije, simplemete lo alimentas con otro pin del arduino, lo apagas y prende o sea un simple

digitalWrite(pinDH22, LOW);
delay(20);
digitalWrite(pinDH22, HIGH);

ya con eso tienes lo que hace falta para que funcione. Pruebalo!!

Tu ahora lo tienes conectado al pin 2, eso sigue tal cual
Pero agrega por ejemplo el pin 3 para hacer esto.
Lo alimentas con el pin 3 y no con 5V
Colocas tmb el pin de atos al pin 3. Todo como si fuera el VCC que le corresponde al DHT22.


Moderador:
3 hilos no 1, 3 hilos del mismo tema.
Higrometro casero (problema), Higrometro v2, Higrometro v3.
Todos estan unidos ahora
Quedas advertido y la próxima falta será un baneo de 1 dia y luego progresivamente mayor.
cualquier comentario lo haces por privado.
Si respondes al respecto acá, simplemente lo borraré.

1 Like

@Surbyte gracias por responder disculpa lo de los temas no sabia como hilar en un mismo tema el progreso.
Volviendo al poryecto ya descarte el dht22 prosigue con el aht25
Mas que nada por lo que me dijiste

El problema que tengo con aht25 es que utiliza los pines a4 y a5 que actualmente tengo conectado el display led. Que hago?

No hay problema, comparten el bus I2C.

@MaximoEsfuerzo Ah puedo compartir el mismo pin del Arduino? osea conectar 2 cables a un mismo pin? desconocía totalmente.

Gracias!

No a todos, a esos y funcionando como bus I2C si, léete ESTO

Ambos componentes (LCD y sensor) usan comunicación I2C y cada uno tiene su propia dirección.
Justamente la idea de la comunicación I2C es poder conectar varios periféricos (hasta 127) con solo 2 pines de datos.
Obviamente los periféricos a conectar tienen que poder comunicarse por I2C.