Galpón Automatizado para la Cría de Conejos

Hola a Todos los participantes de este excelente Foro.

Estoy comenzando un proyecto el cual se tratará de un programador de procesos de control para un galpón para cría de Conejos, he realizado algunos proyectos pequeños con Arduino, pero nada comparado con esté.

Antes que nada, quiero decirles que soy Venezolano y estoy en Venezuela, he trabajado toda mi vida como Técnico en reparación de computadoras y también soy Jubilado Universitario en el área de Diseño Gráfico y Diagramador de Textos , hace 35 años asistí a múltiples cursos de programación (Foxpro, Basic, Pascal, Etc.) de los cuales ya no recuerdo mucho, debido a eso no puedo escribir códigos nuevos pero si puedo entender algunos existentes, lo que hago generalmente es buscar algún código parecido e intentar adaptarlo a mis necesidades, y pienso hacer lo mismo acá, con la ayuda Dios mediante de ustedes, , ahora en mi país es prácticamente imposible comprar cualquier tipo de materiales (el problema no es ubicarlos si no la capacidad para poder adquirirlos), la mayoría de los mismos los he tenido durante mucho tiempo, se tratan de algunos arduinos y periféricos como también repuestos usados de electrodomésticos.

Mi idea principal es crear un sistema que me permita controlar procesos básicos para un pequeño galpón 4m x 4m que tengo en casa el cual dedicaré a la cría de Conejos, para tal fin poseo de jaulas de gallos de tres niveles cuyas medidas son de 74cm x 74cm x 180cm y los tres niveles son de 60cm, por ser un espacio tan reducido se debe implementar un sistema que me ayude a controlar y mejorar las condiciones ambientales, para así tener una maximización de los resultados.

Ya he comenzado a desarrollar el Código, pero debido a mi falta de conocimientos me impiden avanzar, así que en este hilo comenzaremos paso a paso.

Procesos que se deben controlar automáticamente:

Control de temperatura
Control de humedad
Control de concentración de amoniaco
Control de presencia de gases
Control de agua para Limpieza de pisos jaulas (mediante aspersores con bomba periférica)
Control de agua para beber
Control de Humidificadores y Aspersores (emergencia)
Control de calefactor
Control de Luces Diurnas y Nocturnas
Control de apertura de puertas
Aviso mediante mensajes SMS
Página web de datos
Vigilancia con cámara Dvr * Este proceso no se controlará por el momento con Arduino

**Nota: se pueden agregar algún otro proceso en el futuro

Dispositivos a usar en este proyecto:
Dth11 -Temperatura y Humedad
MQ2 -Gases
MQ137 * -Amoniaco
KY-018 * -No tengo el modulo pero si tengo la resistencia fotovoltaica
DS3231 RTC * -Fecha y Hora
Ethernet Shield -Red Ethernet
Arduino Mega
Módulo 4 Relay
Relay Estado Solido 100A
Módulo Sim800l
Fuente de PC
Teclado 4x3
Pantalla 4x20 I2C
Válvulas Selenoides de agua -Repuestos usados de lavarropas viejas
Selenoide de pasador -Para cerrar o abrir acceso al galpón
Interruptor de palanca de 2 y tres posiciones
Potenciómetros
Resistencias eléctrica 220V -Repuesto usado de Secadora de ropas vieja
Lámparas Leds Rojas y Blancas

  • No los poseo, estoy tratando de conseguirlos

Otras cosas que poseo por si se llegara a necesitar

Arduino Uno
Arduino Nano
Puente H Bts7960 de 43A
Cnc shield con sus módulos

Está por demás decirles que estoy muy agradecido de su ayuda y los exhorto a que puedan intervenir en cualquier momento con proposiciones varias o materiales alternos (si es posible Usados).
Comenzare por colocar un diagrama de flujo inicial de los procesos (el cual puede estar sujeto a cambios) para dar una idea de lo que pretendo hacer.

Saludos desde Venezuela

Diagrama de flujo para el galpón para cría de conejos.

Comenzamos a hacer mediciones con dos sensor Dht11

//FECHA 20/11/2020
//NOMBRE DEL PROYECTO: AutoRabbitFarm
//VERSIÓN: 1.0 (Para Arduino MEGA)
//AUTOR: Lindberg Figueroa
//USO: Este sketch es un Galpon autónomo avanzado cria de Conejos.
//Fuente: podeis visitar el tema en arduino.cc aqui https://forum.arduino.cc/index.php?topic=714895.msg4802664#msg4802664

//Licencia:
//Este sketch es Libre para mejorar y compartir! Se prohibe su uso con fines comerciales sin autorizacion de los autores. */

#include <DHT.h>      //carga las librerias DTH (Humedad y Temperatura)
#include <Wire.h>     //se carga la librería de la comunicación I2C, la cual usa el reloj, la pantalla LCD, el sensor de presión y el sensor de luz  
#include <LCD.h>      //incluimos también dos librerias para poder trabajar con la pantalla LCD
#include <LiquidCrystal_I2C.h> // Incluimos la libreria del LCD
#define DHTPIN 44 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 44
#define DHT2PIN 45 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 45
#define DHTTYPE DHT11 //Se selecciona el DHT11(hay otros DHT)

DHT dht(DHTPIN, DHTTYPE);   //se inician los sensores
DHT dht2(DHT2PIN, DHTTYPE); //se inician los sensores
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Seteamos la direccion I2C
byte customChar[8] = {B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 }; //creamos un array para poder escribir ºC en la pantalla LCD
float t = 0;        //definimos la variable  temperatura 1
float h = 0;        //definimos la variable  humedad 1
float t2 = 0;       //definimos la variable  temperatura 2
float h2 = 0;       //definimos la variable  humedad 2
float hmin = 20;    //definimos la variable  humedad minima
float hmax = 60;    //definimos la variable  humedad maxima
float tmin = 20;    //definimos la variable  temperatura minima
float tmax = 28;    //definimos la variable  temperatura máxima

int hact;
int hant;
int tact;
int tant;
void setup() {
  Serial.begin(9600);           //Se inicia la comunicación serial
  Serial.println("Sistema Iniciado...");    //se imprime en el minitor serial sistema iniciado
  delay (1000);

  lcd.begin(20, 4);      //iniciamos la pantalla LCD, el 20,4 indica que tenemos 20 columnas y 4 filas en nuestra pantalla
  lcd.backlight();      //activamos la retroiluminación del LCD
  lcd.createChar(0, customChar); //registramos el caracter especial
  dht.begin();          //Se inicia el sensor de humedad1 y temperatura1
  dht2.begin();         //Se inicia el sensor de humedad2 y temperatura2

  ///// primera Pantalla /////
  lcd.clear(); //se elimina lo que hubiese escrito en la LCD
  lcd.setCursor(0, 0); //primera linea de nuestra pantalla
  lcd.print("CONTROL MICROCLIMA");  // Aqi va el mensaje
  lcd.setCursor(0, 1); //segunda linea de nuestra pantalla
  lcd.print("CRIADERO DE CONEJOS");  // Aqi va el mensaje
  lcd.setCursor(0, 2); //tercera linea de nuestra pantalla
  lcd.print("SIS. AUTOMATIZADO");  // Aqi va el mensaje
  lcd.setCursor(0, 3); //cuarta linea de nuestra pantalla
  lcd.print("Lindberg Figueroa");  // Aqi va el mensaje
  delay(500);
  lcd.clear();

}
void loop() {
  h = dht.readHumidity();                           //se guarda el valor de la humedad en la variable h
  t = dht.readTemperature();                        //se guarda la temperatura en la variable t
  h2 = dht2.readHumidity();                         //se guarda el valor de la humedad en la variable h2
  t2  = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  hact = h;                                         //lecturas actuales del sensor
  tact = t;

  if (tact != tant || hact != hant)     //si la lectura actual no coincide con la anterior,
  Serial.print("Temperatura1: ");       //indica un cambio de temperatura o un cambio en la humedad
  Serial.print(String ((int)t));        //imprimimos la temperatura1 en numeros enteros
  Serial.print(" C");                   //
  Serial.print("Temperatura2: ");       //indica un cambio de temperatura2 o un cambio en la humedad
  Serial.print(String ((int)t2));       //imprimimos la temperatura en numeros enteros
  Serial.print(" C");
  Serial.print(" Humedad1: ");          //indica un cambio de la humedad1
  Serial.print(String ((int)h));        //imprimimos la humedad en numeros enteros
  Serial.println(" %");                 //
  Serial.print(" Humedad2: ");          //indica un cambio de la humedad2
  Serial.print(String ((int)h2));       //imprimimos la humedad en numeros enteros
  Serial.println(" %");                 //

  tant = tact;
  hant = hact;                        //Se actualiza la lectura anterior

  lcd.clear();
  lcd.setCursor(0, 0);                                //situamos el cursor en la columna 0 y linea 0
  lcd.print("MONOTORIZAR CRIADERO");
  lcd.setCursor(0, 2);                                //situamos el cursor en la columna 0 y linea 3 
  lcd.print("Temp1 ");
  lcd.setCursor(6, 2);                                //situamos el cursor en la columna 6 y linea 3
  lcd.print((int)t);                                  //imprimimos la temperatura1 en numeros enteros
  lcd.write(byte(0));                                 //escribimos el caracter especial º en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
  lcd.print("C");                                     //escribimos el caracter especial C en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
  lcd.setCursor(10, 2);                               //situamos el cursor en la columna 10 y linea 3
  lcd.print("Temp2 ");
  lcd.setCursor(16, 2);                               //situamos el cursor en la columna 16 y linea 3
  lcd.print((int)t2);                                 //imprimimos la temperatura2 en numeros enteros
  lcd.write(byte(0));                                 //escribimos el caracter especial º en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
  lcd.print("C");                                     //escribimos el caracter especial C en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
  lcd.setCursor(0, 3);                                //situamos el cursor en la columna 0 y linea 4
  lcd.print("Hum1 ");
  lcd.setCursor(6, 3);                                //situamos el cursor en la columna 6 y linea 4
  lcd.print((int)h);                                 //imprimimos la humedad1 en numeros enteros
  lcd.print("%");                                    //escribimos el caracter especial % en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
  lcd.setCursor(10, 3);                              //situamos el cursor en la columna 10 y linea 4
  lcd.print("Hum2 ");
  lcd.setCursor(16, 3);                              //situamos el cursor en la columna 16 y linea 4 
  lcd.print((int)h2);                                 //imprimimos la humedad2 en numeros enteros
  lcd.print("%");                                     //escribimos el caracter especial % en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
  delay(500);


}

tratare de hacer un sumatoria de los sensores Dht11 para calcular el promedio

Saludos desde Cumaná / Venezuela

#include <DHT.h>      //carga las librerias DTH (Humedad y Temperatura)
#include <Wire.h>     //se carga la librería de la comunicación I2C, la cual usa el reloj, la pantalla LCD, el sensor de presión y el sensor de luz  
#include <LCD.h>      //incluimos también dos librerias para poder trabajar con la pantalla LCD
#include <LiquidCrystal_I2C.h> // Incluimos la libreria del LCD
#define DHTPIN 44 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 44
#define DHT2PIN 45 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 45
#define DHTTYPE DHT11 //Se selecciona el DHT11(hay otros DHT)

DHT dht(DHTPIN, DHTTYPE);   //se inician los sensores
DHT dht2(DHT2PIN, DHTTYPE); //se inician los sensores
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Seteamos la direccion I2C
byte customChar[8] = {B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 }; //creamos un array para poder escribir ºC en la pantalla LCD
bool Extractor_activado = false;
bool Calefactor_activado = false;
bool Aspersor_activado = false;
bool Ventilador_activado = false;
bool Alarma_activado = false;
float t = 0;        //definimos la variable  temperatura 1
float h = 0;        //definimos la variable  humedad 1
float t2 = 0;       //definimos la variable  temperatura 2
float h2 = 0;       //definimos la variable  humedad 2
float hmin = 20;    //definimos la variable  humedad minima
float hmax = 60;    //definimos la variable  humedad maxima
float tmin = 20;    //definimos la variable  temperatura minima
float tmax = 30;    //definimos la variable  temperatura máxima
float tmax2 = 32;    //definimos la variable  temperatura máxima
float promediot = 0;
float promedioh = 0;

int hact;
int hant;
int tact;
int tant;
int hact2;
int hant2;
int tact2;
int tant2;
int ptact;
int ptant;
int phact;
int phant;
int relePin1 = 32;        //pin de activacion del rele
int relePin2 = 33;        //pin de activacion del rele
int relePin3 = 34;        //pin de activacion del rele
int relePin4 = 35;        //pin de activacion del rele
int relePin5 = 40;

void setup() {
  Serial.begin(9600);           //Se inicia la comunicación serial
  Serial.println("Sistema Iniciado...");    //se imprime en el minitor serial sistema iniciado
  lcd.begin(20, 4); //iniciamos la pantalla LCD, el 20,4 indica que tenemos 20 columnas y 4 filas en nuestra pantalla
  lcd.backlight(); //activamos la retroiluminación del LCD
  lcd.createChar(0, customChar); //registramos el caracter especial
  dht.begin(); //Se inicia el sensor de humedad y temperatura
  dht2.begin(); //Se inicia el sensor de humedad y temperatura
  pinMode(relePin1, OUTPUT);                           //rele de Ventilador
  pinMode(relePin2, OUTPUT);                          //rele de Extractor
  pinMode(relePin3, OUTPUT);                          //rele de Aspersor
  pinMode(relePin4, OUTPUT);                          //rele de Alarma
  pinMode(relePin5, OUTPUT);                          //rele Estado Solido 100A Calefactor

  ///// primera Pantalla /////
  lcd.clear(); //se elimina lo que hubiese escrito en la LCD
  lcd.setCursor(0, 0); //primera linea de nuestra pantalla
  lcd.print("CONTROL MICROCLIMA");  // Aqi va el mensaje
  lcd.setCursor(0, 1); //segunda linea de nuestra pantalla
  lcd.print("CRIADERO DE CONEJOS");  // Aqi va el mensaje
  lcd.setCursor(0, 2); //tercera linea de nuestra pantalla
  lcd.print("SIS. AUTOMATIZADO");  // Aqi va el mensaje
  lcd.setCursor(0, 3); //cuarta linea de nuestra pantalla
  lcd.print("Lindberg Figueroa");  // Aqi va el mensaje
  delay(1000);
  lcd.clear();

}
void loop() {
  h = dht.readHumidity();                           //se guarda el valor de la humedad en la variable h
  t = dht.readTemperature();                        //se guarda la temperatura en la variable t
  h2 = dht2.readHumidity();                         //se guarda el valor de la humedad en la variable h2
  t2  = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  hact = h;                                         //lecturas actuales del sensor
  tact = t;
  hact2 = h2;                                         //lecturas actuales del sensor
  tact2 = t2;
  ptact = promediot;
  phact = promedioh;
  promediot = (tact + tact2) / 2;
  promedioh = (hact + hact2) / 2;

  if (tact != tant || hact != hant) {    //manda la lectura actual si no coincide con la anterior,
    Serial.print("Temp1: ");       //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(String ((int)t));        //imprimimos la temperatura1 en numeros enteros
    Serial.print(" C");
    Serial.print(" Hum1: ");          //indica un cambio de la humedad1
    Serial.print(String ((int)h));        //imprimimos la humedad en numeros enteros
    Serial.println(" %");                 //
    tant = tact;
    hant = hact;
  }

  if (tact2 != tant2 || hact2 != hant2) {    //manda la lectura actual si no coincide con la anterior,
    Serial.print("Temp2: ");                //indica un cambio de temperatura2 o un cambio en la humedad
    Serial.print(String ((int)t2));       //imprimimos la temperatura en numeros enteros
    Serial.print(" C");
    Serial.print(" Hum2: ");              //indica un cambio de la humedad2
    Serial.print(String ((int)h2));       //imprimimos la humedad en numeros enteros
    Serial.println(" %");                 //
    tant2 = tact2;
    hant2 = hact2;
  }

  if (ptact != ptant) {          //manda la lectura actual si no coincide con la anterior,
    Serial.print("promt: ");
    Serial.print(String ((int)promediot));
    Serial.write(byte(0));
    Serial.print(" C");
    Serial.print("promh: ");
    Serial.print(String ((int)promedioh));
    Serial.print(" %");
    ptant = ptact;
    phant = phact;
  }

  if (ptact != ptant) {    //manda la lectura actual si no coincide con la anterior
    lcd.clear();
    lcd.setCursor(0, 0);                                //situamos el cursor en la columna 0 y linea 0
    lcd.print("MONOTORIZAR CRIADERO");
    lcd.setCursor(0, 1);                                //situamos el cursor en la columna 0 y linea 3
    lcd.print("promedio Temp ");
    lcd.print((int)promediot);
    lcd.write(byte(0));                                 //escribimos el caracter especial ºC en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
    lcd.print("C");
    lcd.setCursor(0, 2);                                //situamos el cursor en la columna 0 y linea 3
    lcd.print("promedio Hum ");
    lcd.print((int)promedioh);
    lcd.print("%");                                     //escribimos el caracter especial % en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
    ptant = ptact;
    phant = phact;
  }
  delay(500);

  ///// control de temperatura alta////////
  if (promediot >= tmax) {                       // si la temperatura es mayor a 30 grados Cº se activará el ventilador
    digitalWrite(relePin1, HIGH);                    //se enciende el Ventilador
    Ventilador_activado = true;
    delay(500);
  } else if (promediot < tmax && promediot >= tmax2) {               //OJO OJO OJO no funciona no se como hacer esta secuencia
    digitalWrite(relePin2, HIGH);                    //se enciende el Extractor
    Extractor_activado = true;

  } else {
    digitalWrite(relePin1, LOW);                    //se apaga el Ventilador
    Ventilador_activado = false;
  }
  ///// control de temperatura baja////////
  if (t <= tmin || t2 <= tmin) {                       // si la temperatura es mayor a 28 grados Cº se activará el Extractor
    digitalWrite(relePin5, HIGH);                    //se enciende el Calefactor
    Calefactor_activado = true;
    digitalWrite(relePin1, LOW);                    //se apaga el Ventilador
    Ventilador_activado = false;
    digitalWrite(relePin2, LOW);                    //se apaga el Extractor
    Extractor_activado = false;
    delay(500);
  }
  else {
    digitalWrite(relePin1, LOW);                    //se enciende el Ventilador
    Calefactor_activado = false;
  }
}

Modifique un poco para poder agregar las sentencias condicionales asociadas al modulo Dht11 y tambien agregue un modulo de 4 relé como tambien un relé de estado Solido de 100A, solo puedo activas el primer condicionante que me activa el ventilador, pero no los demas, no se si se ponen dentro del mismo if o debo abrir un if nuevo, he estado un poco atorado en esto, no logro activar los reles distintos periféricos dependiendo de la temperatura,

trate de colocar varios Dht11 y sacar un promedio con ellos, para así poder colocarlos en varios lugares para obtener una mejor lectura de las condiciones de temperatura y humedad.
lo dejare por hoy, Tratare de estudiar un poco mañana.

Nota: No se si puedo seguir cargando el código a penas lo modifique, ruego consejo del administrador

Problema 1: mi pantalla estaba funcionando y se le fueron los caracteres quedo encendida pero sin mostrar nada

Saludos desde Cumaná / Venezuela

Hola a todos, esta etapa es la de control de periféricos dependiendo de la temperatura máxima, mis conocimientos no me permiten mejorar esto, No pude hacerlo con else if, y debido a eso cree varias temperaturas máximas para que me activara el modulo 4 relé en cada situacion, pero lo veo muy burdo, es una forma de hacerlo pero creo que debo mejorarlo mucho mas.
como se habrán dado cuenta estoy haciendo que mis periféricos respondan a un promedio con temperaturas máximas , y esto me lleva a una pregunta, ¿si un sensor Dht11 fallara y la temperatura se elevara a 50 ºC (no es loco pensar esto en donde vivo) el promedio de mis dos sensores será 25ºC, hay alguna forma de solucionar esto?

///// control de temperatura alta////////

    if (promediot >= tmax) {                          // si la temperatura es mayor a 30 grados ºC se activará el ventilador
      digitalWrite(relePin1, HIGH);                    //se enciende el Ventilador
      Ventilador_activado = true;
      delay(500);
    } else {
      digitalWrite(relePin1, LOW);                    //se apaga el Ventilador
      Ventilador_activado = false;
    }
    if (promediot >= tmax2)  {                       // si la temperatura es mayor a 32 grados Cº se activará el extractor
      digitalWrite(relePin2, HIGH);                    //se enciende el Extractor
      Extractor_activado = true;
    } else {
      digitalWrite(relePin2, LOW);                    //se apaga el Ventilador
      Extractor_activado = false;
    }
    if (promediot >= tmax3) {                       // si la temperatura es mayor a 34 grados Cº se activará el Aspersor
      digitalWrite(relePin3, HIGH);                    //se enciende el Ventilador
      Aspersor_activado = true;
      delay(500);
    } else {
      digitalWrite(relePin3, LOW);                    //se apaga el Ventilador
      Aspersor_activado = false;
    }
    if (promediot >= tmax4) {                       // si la temperatura es mayor a 36 grados Cº se activará el ventilador
      digitalWrite(relePin4, HIGH);                    //se enciende la Alarma
      Alarma_activado = true;
      delay(500);
    } else {
      digitalWrite(relePin4, LOW);                    //se apaga la Alarma
      Alarma_activado = false;
    }

 ///// control de temperatura baja////////

    if (t >= tmin || t2 >= tmin) {                     // si la temperatura es mayor a 28 grados Cº se activará el Extractor
      digitalWrite(relePin5, HIGH);                    //se enciende el Calefactor
      Calefactor_activado = true;
      digitalWrite(relePin1, LOW);                    //se apaga el Ventilador
      Ventilador_activado = false;
      digitalWrite(relePin2, LOW);                    //se apaga el Extractor
      Extractor_activado = false;
      digitalWrite(relePin3, LOW);                    //se apaga el Aspersor
      Aspersor_activado = false;
      delay(500);
    }
    else {
      digitalWrite(relePin1, LOW);                    //se enciende el Ventilador
      Calefactor_activado = false;
    }
}

temperaturas máximas

float t = 0;        //definimos la variable  temperatura 1
float h = 0;        //definimos la variable  humedad 1
float t2 = 0;       //definimos la variable  temperatura 2
float h2 = 0;       //definimos la variable  humedad 2
float hmin = 10;    //definimos la variable  humedad minima
float hmax = 60;    //definimos la variable  humedad maxima
float hmax2 = 80;    //definimos la variable  humedad maxima
float tmin = 20;    //definimos la variable  temperatura minima
float tmax = 30;    //definimos la variable  temperatura máxima
float tmax2 = 32;    //definimos la variable  temperatura máxima
float tmax3 = 34;    //definimos la variable  temperatura máxima
float tmax4 = 36;    //definimos la variable  temperatura máxima
float promediot = 0;
float promedioh = 0;

Promedio

h = dht.readHumidity();                           //se guarda el valor de la humedad en la variable h
    t = dht.readTemperature();                        //se guarda la temperatura en la variable t
    h2 = dht2.readHumidity();                         //se guarda el valor de la humedad en la variable h2
    t2  = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
    hact = h;                                         //lecturas actuales del sensor
    tact = t;
    hact2 = h2;                                         //lecturas actuales del sensor
    tact2 = t2;
    ptact = promediot;
    phact = promedioh;
    promediot = (tact + tact2) / 2;
    promedioh = (hact + hact2) / 2;

Sigo estudiando
Saludos desde Cumaná / Venezuela

Hola a todos, por fin logre hacer funcionar la activación secuencial de dispositivos mediante los cambios de temperatura con histéresis, aprendí esta secuencia de jecrestpo, la cual esta sacada de el Libro incluido en el Arduino Starter Kit, el cual es tratado en el ejemplo 3 , y Gracias a Dios, adapte a mis necesidades, y realmente funciona.

  /////////control de temperatura por estados /////////

  // Estado 0 cuando la temperatura es menor que 28 o si vengo del estado 1 cuando es menor que 29
  if ((promediot < topt) || ((estado == 1) && (promediot < topt + 1))) {
    digitalWrite(relePin1, LOW);                   //Ventilador apagado
    Ventilador_activado = false;
    digitalWrite(relePin2, LOW);                    //Extractor apagado
    Extractor_activado = false;
    digitalWrite(relePin3, LOW);                    //Aspersor apagado
    Aspersor_activado = false;
    digitalWrite(relePin4, LOW);                    //Alarma apagado
    Alarma_activado = false;
    estado = 0;
  }
  //Estado 1 cuando llego a 30 del estado 0, me mantengo hasta 30 o si vengo de estado 2 vuelvo cuando bajo a 29
  else if (((estado == 0) && (promediot >= topt + 2)) || ((estado == 2) && (promediot < topt + 3))) {
    digitalWrite(relePin1, HIGH);                    //Ventilador encendido
    Ventilador_activado = true;
    digitalWrite(relePin2, LOW);                    //Extractor apagado
    Extractor_activado = false;
    digitalWrite(relePin3, LOW);                    //Aspersor apagado
    Aspersor_activado = false;
    digitalWrite(relePin4, LOW);                    //Alarma apagado
    Alarma_activado = false;
    estado = 1;
  }
  //Estado 2 cuando llego a 32 del estado 1, me mantengo hasta 32 y vuelvo cuando bajo a 30
  else if (((estado == 1) && (promediot >= topt + 4)) || ((estado == 3) && (promediot < topt + 5))) {
    digitalWrite(relePin1, HIGH);                    //Ventilador encendido
    Ventilador_activado = true;
    digitalWrite(relePin2, HIGH);                    //Extractor encendido
    Extractor_activado = true;
    digitalWrite(relePin3, LOW);                     //Aspersor apagado
    Aspersor_activado = false;
    digitalWrite(relePin4, LOW);                    //Alarma apagado
    Alarma_activado = false;
    estado = 2;
  }
  //Estado 3 cuando la temperatura es mayor que 34
  else if (((estado == 2) && (promediot >= topt + 6)) || ((estado == 4) && (promediot < topt + 8))) {
    digitalWrite(relePin1, HIGH);                    //Ventilador encendido
    Ventilador_activado = true;
    digitalWrite(relePin2, HIGH);                    //Extractor encendido
    Extractor_activado = true;
    digitalWrite(relePin3, HIGH);                    //Aspersor encendido
    Aspersor_activado = true;
    digitalWrite(relePin4, LOW);                    //Alarma apagado
    Alarma_activado = false;
    estado = 3;
  }
  //Estado 4 cuando la temperatura es mayor que 36
  else if (promediot >= topt + 8) {
    digitalWrite(relePin1, HIGH);                    //Ventilador encendido
    Ventilador_activado = true;
    digitalWrite(relePin2, HIGH);                    //Extractor encendido
    Extractor_activado = true;
    digitalWrite(relePin3, HIGH);                    //Aspersor encendido
    Aspersor_activado = true;
    digitalWrite(relePin4, HIGH);                    //Alarma encendido
    Alarma_activado = true;
    estado = 4;
  }
  delay(1);

Nota: es difícil tratar de recordar lo que se ha olvidado, pero tambien es cierto lo que se dice: Mas vale la tinta mas tenue que la memoria más prodigiosa.

Saludos desde Cumaná / Venezuela.

Saludos a Todos;

ya he agregado varias cosas, agregue un teclado 4x3, como tambien el Sensor MQ2, he subido el código después de corregir algunas fallas, y el resultado del monitor serial es este:

""Temperatura 1: 32ºC Temperatura 2: 33ºC Humedad 1: 12 % Humedad 2: 23 % promediot: 32ºC promedioh:17% Indice de Calor 30.41ºC LPG: 0 ppm CO: 0 ppm Humo: 0 ppm""

abajo está parte de código que me muestra el resultado en el monitor serial "Si y solo Si" hay un cambio en las variables

if (tact2 != tant2 || hact2 != hant2 || icact != icant || tact != tant || hact != hant || ptact != ptant || icact != icant) {    //manda la lectura actual si no coincide con la anterior,
    Serial.println(); //esta linea me organiza las nuevas lecturas en una nueva linea en el monitor serial
    // Mostrar en monitor serial la temperatura
    Serial.print("Temperatura 1: "); Serial.print(String ((int)tact)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temperatura 2: "); Serial.print(String ((int)tact2)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    // Mostrar en monitor serial la humedad relativa
    Serial.print(" Humedad 1: "); Serial.print(String ((int)hact)); Serial.print(" %");     //indica un cambio de la humedad1
    Serial.print(" Humedad 2: "); Serial.print(String ((int)hact2)); Serial.print(" %");    //indica un cambio de la humedad1
    // Mostrar en monitor serial el promedio de temperatura y humedad
    Serial.print(" promediot: "); Serial.print(String ((int)promediot)); Serial.write(byte(0)); Serial.print("ºC"); Serial.print(" promedioh: "); Serial.print(String ((int)promedioh));
    Serial.print(" %");
    Serial.print(" Indice de Calor: "); Serial.print(indicecalorp); Serial.print("ºC");          // Mostrar en monitor serial el indice de caloren ºC

    Serial.print(" LPG: "); Serial.print(iPPM_LPG); Serial.print(" ppm");  Serial.print(" CO: "); Serial.print(iPPM_CO); Serial.print(" ppm");    
    Serial.print(" Smoke: "); Serial.print(iPPM_Smoke); Serial.print(" ppm"); 

    icant = icact;
    tant2 = tact2;
    hant2 = hact2;
    tant = tact;
    hant = hact;
    ptant = ptact;
    phant = phact;
    icant = icact;

me falta la condicionante de que muestre el resultado si solo hay cambios en el Sensor MQ2, los demás están perfectos

todo esta funcionando bastante bien, podemos notar alguna diferencia entre los dos Dht11, ya que lo tenia uno dentro de la nevera y al sacarlo se comenzó a nivelar la temperatura y después la humedad, por eso la diferencia, pero cuando esta en la nevera a 10ºC y subo el otro a 40ºC en el promedio resulta que hay una temperatura idónea el cual es erróneo, o el cuarto esta muy frio o muy caliente

Pregunta: ¿existe alguna función para corregir esto, o coloco otro sensor y le digo que el promedio lo obtenga solamente de los mas similares?

me falta todavía muchas cosas, comenzare ahora a configurar la Tarjeta Ethernet Shield, y para después comenzar con la tarjeta Sim800L, para el envió de mensajes

Se le agradece si tienen algún consejo, sobre la Ethernet Shield y la Sim800L, ya que según lo leído al parecer es algo difícil.

Saludos desde Cumaná

Hola a Todos, buen día, el proyecto ha avanzado mucho, pero tambien ha presentado alguno problemas como es el de la pantalla 20x4 sin caracteres y uno nuevo por lo cual me gustaría pedir ayuda al respecto cuando enciendo el Arduino mega el programa funciona perfecto (salvo por la pantalla), el caso es que cuando abro el Puerto Serial todo se reinicia, queda tal cual que cuando enciendo el Arduino por primera vez, he revisado por internet y dicen que hay que colocar alguna resistencia otros que es un condensador,

Que debo hacer para eliminar el reinicio del Arduino cuando abro el puerto Serial?

Saludos desde Cumaná / Venezuela

Cualquiera de las 2 opciones es válida.
Te dejo un par de links, aunque seguro los has visto. El 2do. tiene otra alternativa más.

pikimorgan.blogspot.com

forum.arduino.cc

Saludos desde Venezuela

Buen día a todos, amigos estoy mas enredado que un kilo de estopa, como los suponía, me encuentro metido en un dilema el cual espero solucionar Dios mediante con la ayuda des ustedes.

tengo 4 sensores de temperatura Dht11, los cuales tomaran la temperatura en el galpón en distintos sitios y mediante una formula aritmética yo les saque un promedio de los 4 sensores, Pongo una imagen de ejemplo:

como se ve en esta imagen hay sensores a varias temperaturas, y aunque el sensor2 esta bajo el promedio de los otros tres se sigue contabilizando para el nuevo promedio.

mi problema radica en que en la zona donde vivo se pueden alcanzar muy pero muy altas temperaturas y si en un galpón cerrado fallara algún sensor el promedio me estaría dando lecturas erróneas, ya que la temperatura estará mucho mas elevada de lo que el promedio me indica y debido a eso no se activarían los dispositivos para bajar dicha temperatura.
yo creo que los sensor debería estar dando una lectura temperatura ± el 10%, (tal vez un poco más) para que sea tomado en el promedio total de lo contrario quedara deshabilitado hasta que su temperatura entre nuevamente en el rango del promedio.

como ustedes se imaginaran el primer promedio consta de t1+t2+t3+t4/4 hasta aquí bien, pero cuando debo deshabilitar el sensor que esta fallando o que no forme parte de promedio debo aplicar t1+t2+t3/3 después de esto debo aplicar un nuevo promedio con tres cantidades solamente para luego volver a verificar si todo se cumple. UFF estoy realmente atascado

#include <DHT.h>

#define DHTPIN 44 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 44
#define DHT2PIN 45 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 45
#define DHT3PIN 46 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 46
#define DHT4PIN 47 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 47
#define DHTTYPE DHT11 //Se selecciona el DHT11(hay otros DHT)

DHT dht(DHTPIN, DHTTYPE);   //se inician los sensores
DHT dht2(DHT2PIN, DHTTYPE); //se inician los sensores
DHT dht3(DHT3PIN, DHTTYPE); //se inician los sensores
DHT dht4(DHT4PIN, DHTTYPE); //se inician los sensores

//////Definimos las Variables: Temperatura 1y2 Max y Min, Humedad 1y2 Max y Min, Indice de calos 1y2, Promedio h y t/////
float t = 0, h = 0, t2 = 0, h2 = 0, t3 = 0, t4 = 0, h3 = 0, h4 = 0, hmin = 20, hmax = 60, tmin = 20, tmax = 28;
float indicecalor = 0, indicecalor2 = 0, indicecalor3 = 0, indicecalor4 = 0, indicecalorp = 0, promediot = 0 , promedioh = 0;
const float topt = 28;
int hact, hant, hact2, hant2, hact3, hant3, hact4, hant4, tact, tant, tact2, tant2, tact3, tant3, tact4, tant4, ptact, ptant, phact, phant, icact, icant, ptinf, ptsup, promantt, promanth;


void setup() {
  Serial.begin(9600); //Se inicia la comunicación serial

  dht.begin(); //Se inicia el sensor de humedad y temperatura
  dht2.begin(); //Se inicia el sensor de humedad y temperatura
  dht3.begin(); //Se inicia el sensor de humedad y temperatura
  dht4.begin(); //Se inicia el sensor de humedad y temperatura

}

void loop() {
  //////// sensores de Temperatura y humedad/////
  h = dht.readHumidity();                          //se guarda el valor de la humedad en la variable h
  t = dht.readTemperature();                       //se guarda la temperatura en la variable t
  h2 = dht2.readHumidity();                        //se guarda el valor de la humedad en la variable h2
  t2 = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  h3 = dht3.readHumidity();                        //se guarda el valor de la humedad en la variable h3
  t3 = dht3.readTemperature();                     //se guarda la temperatura en la variable t3
  h4 = dht4.readHumidity();                        //se guarda el valor de la humedad en la variable h4
  t4 = dht4.readTemperature();                     //se guarda la temperatura en la variable t4

  hact = h, hact2 = h2, hact3 = h3, hact4 = h4, tact = t, tact2 = t2, tact3 = t3, tact4 = t4;

  promantt = (t + t2 + t3 + t4) / 4;
  promanth = (h + h2 + h3 + h4) / 4;
  
  promediot = promantt;
  promedioh = promanth;

  ptact = promediot;
  phact = promedioh;

  ptinf = promantt - (promantt * 0.1);        //para calcular el promedio - 10%
  ptsup = promantt + (promantt * 0.1);        //para calcular el promedio + 10%

  icact = indicecalor;
  indicecalor = dht.computeHeatIndex(t, h, false);
  indicecalor2 = dht2.computeHeatIndex(t2, h2, false);
  indicecalor2 = dht3.computeHeatIndex(t3, h3, false);
  indicecalor2 = dht4.computeHeatIndex(t4, h4, false);
  indicecalorp = (indicecalor + indicecalor2 + indicecalor3 + indicecalor4 ) / 4;

  if (t <= ptinf && t >= ptsup || t2 <= ptinf && t2 >= ptsup || t3 <= ptinf && t3 >= ptsup || t4 <= ptinf || t4 >= ptsup) {
    if (ptact != ptant) {
      ptant = t + t2 + t3 + t4 / 4;
    }
  } else if (t >= ptinf && t <= ptsup || t2 <= ptinf && t2 >= ptsup || t3 <= ptinf && t3 >= ptsup || t4 <= ptinf && t4 >= ptsup) {
    if (ptact != ptant) {
      ptant = t2 + t3 + t4 / 3;
    }
  } else if (t <= ptinf && t >= ptsup || t2 >= ptinf && t2 <= ptsup || t3 <= ptinf && t3 >= ptsup || t4 <= ptinf && t4 >= ptsup) {
    if (ptact != ptant) {
      ptant = t + t3 + t4 / 3;
    }

  } else if (t <= ptinf && t >= ptsup || t2 <= ptinf && t2 >= ptsup || t3 >= ptinf && t3 <= ptsup || t4 <= ptinf && t4 >= ptsup) {
    if (ptact != ptant) {
      ptant = t + t2 + t4 / 3;
    }

  } else if (t <= ptinf && t >= ptsup || t2 <= ptinf && t2 >= ptsup || t3 <= ptinf && t3 >= ptsup || t4 >= ptinf && t4 <= ptsup) {
    if (ptant != ptant) {
      promediot = t + t2 + t3  / 3;
    }
  ptant = ptact;
  }
  delay(500);

//////////////se muestra en el monitor serial si el valor de alguna variable cambia///////

  if (tact2 != tant2 || hact2 != hant2 || icact != icant || tact != tant || hact != hant || ptact != ptant || icact != icant) {  
    
    Serial.println(); //esta linea me organiza las nuevas lecturas en una nueva linea en el monitor serial
    // Mostrar en monitor serial la temperatura
    Serial.print(" Temp1: "); Serial.print(String ((int)tact)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp2: "); Serial.print(String ((int)tact2)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp3: "); Serial.print(String ((int)tact3)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp4: "); Serial.print(String ((int)tact4)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad

    // Mostrar en monitor serial la humedad relativa
    Serial.print(" Hum1: "); Serial.print(String ((int)hact)); Serial.print(" %");     //indica un cambio de la humedad1
    Serial.print(" Hum2: "); Serial.print(String ((int)hact2)); Serial.print(" %");    //indica un cambio de la humedad1
    Serial.print(" Hum3: "); Serial.print(String ((int)hact3)); Serial.print(" %");    //indica un cambio de la humedad1
    Serial.print(" Hum4: "); Serial.print(String ((int)hact4)); Serial.print(" %");    //indica un cambio de la humedad1

    // Mostrar en monitor serial el promedio de temperatura y humedad
    Serial.print(" promt: "); Serial.print(String ((int)ptact)); Serial.write(byte(0)); Serial.print("ºC"); Serial.print(" promh: "); Serial.print(String ((int)phact));
    Serial.print(" %");
    Serial.print(" Ind Calor: "); Serial.print(String ((int)icact)); Serial.print("ºC");          // Mostrar en monitor serial el indice de caloren ºC

    icant = icact,  icant = icact, tant = tact, hant = hact, tant2 = tact2, hant2 = hact2, tant3 = tact3, hant3 = hact3, tant4 = tact4, hant4 = hact4, ptant = ptact, phant = phact;

  }
  delay(500);
}

He estado escribiendo un código para eso pero no logro hacerlo funcionar, pero lo he cambiado tantas veces que ya estoy muy atascado, dicho código lo tomare como ejemplo para mi proyecto principal, me gustaría si está en sus posibilidades me ayudaran en eso. Talvez no a realizarme el programa (no es lo que quiero) pero si una perspectiva de enfoque diferente.

Saludos desde Cumaná / Venezuela

Hola @lindbergf se me ocurre que para el promedio podrias usar una variable acumulador y otra para guardar el divisor. Por otro lado agregar una variable para cada sensor que te indique si lo incluíste o no en el promedio para su uso posterior.

Algo así (para mayor claridad renombré a "t" como "t1")

acumulador = 0;
divisor = 0;
if(t1 >= ptinf && t1 <= ptsup) {
  if (ptant != ptant) {
    acumulador += t1;
    divisor++;
    t1_valido = true;
  }
} else t1_valido = false;

if (t2 >= ptinf && t2 <= ptsup) {
  if(ptant != ptant) {
    acumulador += t2;
    divisor++;
    t2_valido = true;
  }
} else t2_valido = false;

// repites para los otros 2 sensores

// aca no me queda claro si usas ptant o promediot
// pongo promedio a secas

promedio = acumulador/divisor;

// sigue tu código

Luego, cuando lo necesites puedes ver el estado de tx_valido para ver como lo tratas.

Es una idea, obviamente falta declarar e inicializar las variables, seguramente se puede mejorar, por ej.

acumulador = 0;
divisor = 0;
t1_valido = t1 >= ptinf & t1 <= ptsup;
if(t1_valido){
  if(ptant != ptant) {
    acumulador += t1;
    divisor++;
  }
} 
...

Espero haber interpretado tu problema y que te ayude mi idea.

Edito: Tendrías que evaluar usar arrays, te simplificaría bastante el código que es bastante repetitivo.

Saludos desde Buenos Aires. :wink:

Reviendo tu código, ¿no estás calculando mal los promedios?
Porque veo que incluyes los sensores que leen por encima/debajo de los limites superior/inferior y excluyes los que están en rango.
¿No debería ser al revés?
¿O no estoy interpretando bien tu necesidad de calcularlo así?...
De ser esto último, modifica las comparaciones en el código que te propongo porque así como está promedia los que están dentro del rango.

Hola gatul, gracias por tomarte la molestia en responder, tienes razón esa parte del código estaba mal, pero es que me estresó demasiado esto y empecé a hacer bobadas.
aquí mi código:

#include <DHT.h>

#define DHTPIN 44 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 44
#define DHT2PIN 45 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 45
#define DHT3PIN 46 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 46
#define DHT4PIN 47 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 47
#define DHTTYPE DHT11 //Se selecciona el DHT11(hay otros DHT)

DHT dht(DHTPIN, DHTTYPE);   //se inician los sensores
DHT dht2(DHT2PIN, DHTTYPE); //se inician los sensores
DHT dht3(DHT3PIN, DHTTYPE); //se inician los sensores
DHT dht4(DHT4PIN, DHTTYPE); //se inician los sensores

//////Definimos las Variables: Temperatura 1y2 Max y Min, Humedad 1y2 Max y Min, Indice de calos 1y2, Promedio h y t/////
float t1 = 0, h1 = 0, t2 = 0, h2 = 0, t3 = 0, t4 = 0, h3 = 0, h4 = 0, hmin = 20, hmax = 60, tmin = 20, tmax = 28;
float indicecalor = 0, indicecalor2 = 0, indicecalor3 = 0, indicecalor4 = 0, indicecalorp = 0, promediot = 0 , promedioh = 0;
const float topt = 28;
int hact1, hant1, hact2, hant2, hact3, hant3, hact4, hant4, tact1, tant1, tact2, tant2, tact3, tant3, tact4, tant4, ptact, ptant, phact, phant, icact, icant, ptinf, ptsup;

void setup() {
  Serial.begin(9600); //Se inicia la comunicación serial

  dht.begin(); //Se inicia el sensor de humedad y temperatura
  dht2.begin(); //Se inicia el sensor de humedad y temperatura
  dht3.begin(); //Se inicia el sensor de humedad y temperatura
  dht4.begin(); //Se inicia el sensor de humedad y temperatura

}
void loop() {
  //////// sensores de Temperatura y humedad/////
  h1 = dht.readHumidity();                          //se guarda el valor de la humedad en la variable h
  t1 = dht.readTemperature();                       //se guarda la temperatura en la variable t
  h2 = dht2.readHumidity();                        //se guarda el valor de la humedad en la variable h2
  t2 = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  h3 = dht3.readHumidity();                        //se guarda el valor de la humedad en la variable h3
  t3 = dht3.readTemperature();                     //se guarda la temperatura en la variable t3
  h4 = dht4.readHumidity();                        //se guarda el valor de la humedad en la variable h4
  t4 = dht4.readTemperature();                     //se guarda la temperatura en la variable t4

  hact1 = h1, hact2 = h2, hact3 = h3, hact4 = h4, tact1 = t1, tact2 = t2, tact3 = t3, tact4 = t4;

  promediot = (t1 + t2 + t3 + t4) / 4;      /////////////////// esto es parte de mi problema, OJO OJO OJO OJO//////////     
  promedioh = (h1 + h2 + h3 + h4) / 4;      /////////////////// 

  ptact = promediot;
  phact = promedioh;

  ptinf = promediot - (promediot * 0.1);        //para calcular el promedio - 10%
  ptsup = promedioh + (promediot * 0.1);        //para calcular el promedio + 10%

  icact = indicecalor;
  indicecalor = dht.computeHeatIndex(t1, h1, false);
  indicecalor2 = dht2.computeHeatIndex(t2, h2, false);
  indicecalor2 = dht3.computeHeatIndex(t3, h3, false);
  indicecalor2 = dht4.computeHeatIndex(t4, h4, false);
  indicecalorp = (indicecalor + indicecalor2 + indicecalor3 + indicecalor4 ) / 4;

 
  if (t1 >= ptinf && t1 <= ptsup || t2 >= ptinf && t2 <= ptsup || t3 >= ptinf && t3 <= ptsup || t4 >= ptinf || t4 <= ptsup) {
    if (ptact != ptant) {
      ptant = t1 + t2 + t3 + t4 / 4;
    }
  } else if (t1 >= ptinf && t1 <= ptsup || t2 >= ptinf && t2 <= ptsup || t3 >= ptinf && t3 <= ptsup || t4 >= ptinf && t4 <= ptsup) {
    if (ptact != ptant) {
      ptant = t2 + t3 + t4 / 3;
    }
  } else if (t1 >= ptinf && t1 <= ptsup || t2 <= ptinf && t2 >= ptsup || t3 >= ptinf && t3 <= ptsup || t4 >= ptinf && t4 <= ptsup) {
    if (ptact != ptant) {
      ptant = t1 + t3 + t4 / 3;
    }

  } else if (t1 >= ptinf && t1 <= ptsup || t2 >= ptinf && t2 <= ptsup || t3 >= ptinf && t3 <= ptsup || t4 >= ptinf && t4 <= ptsup) {
    if (ptact != ptant) {
      ptant = t1 + t2 + t4 / 3;
    }

  } else if (t1 >= ptinf && t1 <= ptsup || t2 >= ptinf && t2 <= ptsup || t3 >= ptinf && t3 <= ptsup || t4 <= ptinf && t4 >= ptsup) {
    if (ptant != ptant) {
      promediot = t1 + t2 + t3  / 3;
    }
    ptant = ptact;  //Promedio antiguo es igual a promedio actual
  }

  //////////////se muestra en el monitor serial si el valor de alguna variable cambia///////

  if (tact2 != tant2 || hact2 != hant2 || icact != icant || tact1 != tant1 || hact1 != hant1 || ptact != ptant || icact != icant) {

    Serial.println(); //esta linea me organiza las nuevas lecturas en una nueva linea en el monitor serial
    // Mostrar en monitor serial la temperatura
    Serial.print(" Temp1: "); Serial.print(String ((int)tact1)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp2: "); Serial.print(String ((int)tact2)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp3: "); Serial.print(String ((int)tact3)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp4: "); Serial.print(String ((int)tact4)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad

    // Mostrar en monitor serial la humedad relativa
    Serial.print(" Hum1: "); Serial.print(String ((int)hact1)); Serial.print(" %");     //indica un cambio de la humedad1
    Serial.print(" Hum2: "); Serial.print(String ((int)hact2)); Serial.print(" %");    //indica un cambio de la humedad1
    Serial.print(" Hum3: "); Serial.print(String ((int)hact3)); Serial.print(" %");    //indica un cambio de la humedad1
    Serial.print(" Hum4: "); Serial.print(String ((int)hact4)); Serial.print(" %");    //indica un cambio de la humedad1

    // Mostrar en monitor serial el promedio de temperatura y humedad
    Serial.print(" promt: "); Serial.print(String ((int)ptact)); Serial.write(byte(0)); Serial.print("ºC"); Serial.print(" promh: "); Serial.print(String ((int)phact));
    Serial.print(" %");
    Serial.print(" Ind Calor: "); Serial.print(String ((int)icact)); Serial.print("ºC");          // Mostrar en monitor serial el indice de caloren ºC

    icant = icact,  icant = icact, tant1 = tact1, hant1 = hact1, tant2 = tact2, hant2 = hact2, tant3 = tact3, hant3 = hact3, tant4 = tact4, hant4 = hact4, ptant = ptact, phant = phact;

  }
  delay(500);
}

anexo imagen de mi prueba actual, Sensor 2 en refrigerador, y los otros restantes en mi cuarto sin sistema de enfriamiento es una pequeña muestra de lo que puede pasar.

Saludos desde Cumaná / Venezuela

Si, eso me quedó claro con tu otro post y estamos en la misma. Haciendo lo mismo obtienes los mismo resultados, es ley.

¿Vuelvo a decir lo que dije arriba o miras si el código que te propuse se puede adaptar a lo que necesitas?
Bah... Adaptar ya está adaptado, faltan agregar líneas que se repiten para los otros 2 sensores. Y algún retoque. No mucho más

GRACIAS gatul, te mereces un par de cervezas (si pudiera comprarlas claro, jajaja), estoy tratando de aplicar tu enfoque de las dos maneras que mencionaste pero me resulta difícil (pido disculpas por no entender), aplico tus dos algoritmos y le coloco las variables unas son de tipo bool y las otras int y no logro hacer que funcione le pongo de arriba para abajo y nada, bueno lo dejare por hoy, mañana me pondré nuevamente en eso, de no solucionarlo seguiré con los siguientes módulos y dejare este pendiente, te estoy muy agradecido

Saludos desde Cumaná / Venezuela

En cuanto pueda veo te armo algo más completo.

En cuanto a las cervezas... Bueno, la intención es lo que vale, dicen (igual vendrían muy bien. Jejé)

Saludos

Hola a todos, he continuado gran parte del mi programa pero aun estoy trancado con lo de los sensores de temperatura, y ese problema no me deja avanzar, quiero darle nuevamente las gracias a gatul por su ayuda, pero aun así no logro entender lo que debo hacer (será que ya estoy algo viejo), pido disculpas nuevamente, no tengo los conocimientos necesarios como para poder solucionar el problema planteado, coloco nuevamente el código a ver si alguien da con el error.

/*
Sketch para calcular la temperatura promedio total de cuatro sensores Dht11 siempre y cuando todos esten +o- en un promedio
de lo contrario el sensor que no cumpla con esa condición no se contabilizara para el promedio
*/
#include <DHT.h>
#define DHTPIN 44 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 44
#define DHT2PIN 45 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 45
#define DHT3PIN 46 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 46
#define DHT4PIN 47 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 47
#define DHTTYPE DHT11 //Se selecciona el DHT11(hay otros DHT)
DHT dht(DHTPIN, DHTTYPE);   //se inician los sensores
DHT dht2(DHT2PIN, DHTTYPE); //se inician los sensores
DHT dht3(DHT3PIN, DHTTYPE); //se inician los sensores
DHT dht4(DHT4PIN, DHTTYPE); //se inician los sensores

//////Definimos las Variables: Temperatura 1,2,3 y 4 Max y Min, Humedad 1,2,3 y 4 Max y Min, Indice de calos 1,2,3,4 Promedio h y t/////
float t1 = 0, h1 = 0, t2 = 0, h2 = 0, t3 = 0, t4 = 0, h3 = 0, h4 = 0, hmin = 20, hmax = 60, tmin = 20, tmax = 28;
float indicecalor = 0, indicecalor2 = 0, indicecalor3 = 0, indicecalor4 = 0, indicecalorp = 0, promediot = 0 , promedioh = 0;
const float topt = 28;      //Temperatura Optima
int hact1, hant1, hact2, hant2, hact3, hant3, hact4, hant4, tact1, tant1, tact2, tant2, tact3, tant3, tact4, tant4, ptact, ptant, phact, phant, icact, icant, ptinf, ptsup;

bool t1_valido = true;
bool t2_valido = true;
bool t3_valido = true;
bool t4_valido = true;

float acumulador = 0;
float divisor = 0;

void setup() {
  Serial.begin(9600); //Se inicia la comunicación serial

  dht.begin(); //Se inicia el sensor de humedad y temperatura
  dht2.begin(); //Se inicia el sensor de humedad y temperatura
  dht3.begin(); //Se inicia el sensor de humedad y temperatura
  dht4.begin(); //Se inicia el sensor de humedad y temperatura

}
void loop() {
  //////// sensores de Temperatura y humedad/////
  h1 = dht.readHumidity();                          //se guarda el valor de la humedad en la variable h
  t1 = dht.readTemperature();                       //se guarda la temperatura en la variable t
  h2 = dht2.readHumidity();                        //se guarda el valor de la humedad en la variable h2
  t2 = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  h3 = dht3.readHumidity();                        //se guarda el valor de la humedad en la variable h3
  t3 = dht3.readTemperature();                     //se guarda la temperatura en la variable t3
  h4 = dht4.readHumidity();                        //se guarda el valor de la humedad en la variable h4
  t4 = dht4.readTemperature();                     //se guarda la temperatura en la variable t4

  hact1 = h1, hact2 = h2, hact3 = h3, hact4 = h4, tact1 = t1, tact2 = t2, tact3 = t3, tact4 = t4;

  promediot = (t1 + t2 + t3 + t4) / 4;     /////////////////// esto es parte de mi problema, OJO OJO OJO OJO//////////
  promedioh = (h1 + h2 + h3 + h4) / 4;      ///////////////////

  ptact = promediot ;                //promedio de temperatura actual
  phact = promedioh;                 //promedio de humedad actual

  ptinf = promediot - (promediot * 0.1);        //para calcular el promedio - 10%
  ptsup = promediot + (promediot * 0.1);        //para calcular el promedio + 10%

  icact = indicecalor;
  indicecalor = dht.computeHeatIndex(t1, h1, false);
  indicecalor2 = dht2.computeHeatIndex(t2, h2, false);
  indicecalor2 = dht3.computeHeatIndex(t3, h3, false);
  indicecalor2 = dht4.computeHeatIndex(t4, h4, false);
  indicecalorp = (indicecalor + indicecalor2 + indicecalor3 + indicecalor4 ) / 4;           ///Promedio para indice de Calor

  t1_valido = t1 >= ptinf & t1 <= ptsup;                //solo es valido t1 si cumple con la condicion
  if (t1_valido) {
    if (ptant != ptant) {
      acumulador += t1;
      divisor++;
      t1_valido = true;
    }
    else t1_valido = false;
  }
  t2_valido = t2 >= ptinf & t2 <= ptsup;                //solo es valido t2 si cumple con la condicion
  if (t2_valido) {
    if (ptant != ptant) {
      acumulador += t2;
      divisor++;
      t2_valido = true;
    }
    else t2_valido = false;
  }
  t3_valido = t3 >= ptinf & t3 <= ptsup;                //solo es valido t3 si cumple con la condicion
  if (t3_valido) {
    if (ptant != ptact) {
      acumulador += t3;
      divisor++;
      t3_valido = true;
    }
    else t3_valido = false;
  }
  t4_valido = t4 >= ptinf & t4 <= ptsup;                //solo es valido t4 si cumple con la condicion
  if (t4_valido) {
    if (ptant != ptact) {
      acumulador += t4;
      divisor++;
      t4_valido = true;
    }
    else t4_valido = false;
  }
  
 ptant = acumulador / divisor;
  
 ptant = ptact;               //Cambia Promedio temperatura antiguo x promedio temperatura actual

  //////////////se muestra en el monitor serial si el valor de alguna variable cambia///////
  if (tact2 != tant2 || hact2 != hant2 || icact != icant || tact1 != tant1 || hact1 != hant1 || ptact != ptant || icact != icant) {

    Serial.println(); //esta linea me organiza las nuevas lecturas en una nueva linea en el monitor serial
    // Mostrar en monitor serial la temperatura
    Serial.print(" Temp1: "); Serial.print(String ((int)tact1)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp2: "); Serial.print(String ((int)tact2)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp3: "); Serial.print(String ((int)tact3)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" Temp4: "); Serial.print(String ((int)tact4)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad

    // Mostrar en monitor serial la humedad relativa
    Serial.print(" Hum1: "); Serial.print(String ((int)hact1)); Serial.print(" %");     //indica un cambio de la humedad1
    Serial.print(" Hum2: "); Serial.print(String ((int)hact2)); Serial.print(" %");    //indica un cambio de la humedad1
    Serial.print(" Hum3: "); Serial.print(String ((int)hact3)); Serial.print(" %");    //indica un cambio de la humedad1
    Serial.print(" Hum4: "); Serial.print(String ((int)hact4)); Serial.print(" %");    //indica un cambio de la humedad1

    // Mostrar en monitor serial el promedio de temperatura y humedad
    Serial.print(" promt: "); Serial.print(String ((int)ptact)); Serial.write(byte(0)); Serial.print("ºC"); Serial.print(" promh: "); Serial.print(String ((int)phact));
    Serial.print(" %");
    Serial.print(" Ind Calor: "); Serial.print(String ((int)icact)); Serial.print("ºC");          // Mostrar en monitor serial el indice de caloren ºC

    icant = icact,  icant = icact, tant1 = tact1, hant1 = hact1, tant2 = tact2, hant2 = hact2, tant3 = tact3, hant3 = hact3, tant4 = tact4, hant4 = hact4, ptant = ptact, phant = phact;

  }
  // delay(500);
}

Coloco nuevamente una imagen con mis cuatro sensores funcionando, pero el sensor 2 no debería formar parte del promedio ya que esta fallando.

Saludos desde Cumaná / Venezuela

Hola a todos, me puse a jugar con Fritzing, tratando de ver como quedaría mi proyecto y me parece muy complicado, a ver que opinan ustedes,

Todavía con el problema de los Dht11, Espero su ayuda.

Saludos desde Cumaná / Venezuela