Go Down

Topic: Galpón Automatizado para la Cría de Conejos (Read 1 time) previous topic - next topic

gatul

#15
Nov 30, 2020, 10:56 pm Last Edit: Nov 30, 2020, 10:58 pm by gatul
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

lindbergf

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

gatul

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

lindbergf

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.

Code: [Select]
/*
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


lindbergf

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


gatul

#20
Dec 11, 2020, 10:30 pm Last Edit: Dec 12, 2020, 06:58 am by gatul Reason: Ampliación de contenido
Code: [Select]
if (t1_valido) {
    if (ptant != ptant){ // *** esto siempre es falso!
// traducción: si ptant es distinto a ptant entonces...
// falso, salta al else. ¿Se entiende?
      acumulador += t1;
      divisor++;
      t1_valido = true; // *** esto es redundante
// t1_valido ya es verdadero, por eso llegó hasta aquí
    }
    else t1_valido = false;
  }

Y lo mismo haces para t2
Además si llegas ese if estaría haciendo que valides incorrectamente a t2 que sabes que es no válida y te está provocando el error de calculo del promedio útil.
No puedes usar ahí los promedios, t2 (o la que sea) ya es válida, o no, porque ya verificaste si está dentro del rango correcto.

Aquí algo está mal

Code: [Select]
ptant = acumulador / divisor; // *** ¿no debería ser ptact?
  
 ptant = ptact;

Tienes que corregir varias cosas, una el gasto de memoria innecesario declarando variables que luego no usas o que ya existen con otro nombre y que no se alteran. Ej. t1 y tact1, usa t1 y listo!

lindbergf

Hola gatul, gracias por dedicarme un poco de tu tiempo, quisiera comentarte lo siguiente, siguiendo todas tus recomendaciones trate de enfocarme en lo que me interesa y por eso borre todo el resto del código, quedándome solo con las variables de temperatura y promedio,  después de ajustar todo corrí el código y me presento un promedio estático al inicio y posteriormente le baje la temperatura al sensor 2 para ver si mantenía ese promedio obviando el sensor fuera de rango y si lo mantuvo (anexo1), pero para asegurarme, aumente la temperatura de los otros tres sensores para que me modificara el promedio y no paso nada (anexo2), se queda siempre en el promedio que lee al principio del ciclo, pero lo que me extraña es que tanto el promedio superior como el promedio inferior si se modifican,  según mi poco entender de esto, no logro que me cambie la lectura inicial del promedio después de aplicarle las condicionantes, o me falta alguna variable que me pueda modificar esa variable para ser leída nuevamente, es algo que no puedo visualizar, te anexo dos imágenes y el código recortado.

Saludos desde Cumaná / venezuela


Code: [Select]
#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,4;  Promedio total, promedio superior e inferior /////
float t1 = 0, t2 = 0, t3 = 0, t4 = 0;
int tant1, tant2, tant3, tant4;
int ptinf = 0;
int ptsup = 0;
bool t1_valido = true;
bool t2_valido = true;
bool t3_valido = true;
bool t4_valido = true;
float acumulador = 0;
float divisor = 0;
float promediot = 0;
float ptact = 0;
float ptant = 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/////
  t1 = dht.readTemperature();                      //se guarda la temperatura en la variable t1
  t2 = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  t3 = dht3.readTemperature();                     //se guarda la temperatura en la variable t3
  t4 = dht4.readTemperature();                     //se guarda la temperatura en la variable t4
  promediot = (t1 + t2 + t3 + t4) / 4;     /////////////////// esto es parte de mi problema, COMO SE MODIFICA ESTO PARA QUE TENGA LOS NUEVOS VALORES//////////
  ptinf = promediot - promediot * 0.05;        //para calcular el promedio - 10%
  ptsup = promediot + promediot * 0.05;        //para calcular el promedio + 10%

  t1_valido = t1 >= ptinf & t1 <= ptsup;                //solo es valido t1 si cumple con la condicion
  if (t1_valido) {
    if (ptant != ptant) {
      acumulador += t1;
      divisor++;
    }
    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++;
    }
    else t2_valido = false;
  }
  t3_valido = t3 >= ptinf & t3 <= ptsup;                //solo es valido t3 si cumple con la condicion
  if (t3_valido) {
    if (ptant != ptant) {
      acumulador += t3;
      divisor++;
    }
    else t3_valido = false;
  }
  t4_valido = t4 >= ptinf & t4 <= ptsup;                //solo es valido t4 si cumple con la condicion
  if (t4_valido) {
    if (ptant != ptant) {
      acumulador += t4;
      divisor++;
    }
    else t4_valido = false;
  }
  ptact = acumulador / divisor;
  //////////////se muestra en el monitor serial si el valor de alguna variable cambia///////
  if (t2 != tant2 || t1 != tant1 || ptact != ptant || t3 != tant3 || t4 != tant4) {    //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(" Temp1: "); Serial.print(tant1); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" // Temp2: "); Serial.print(tant2); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" // Temp3: "); Serial.print(tant3); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" // Temp4: "); Serial.print(tant4); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" // ptsup: "); Serial.print(ptsup); Serial.write(byte(0)); Serial.print("ºC");
    Serial.print(" // ptinf: "); Serial.print(ptinf); Serial.write(byte(0)); Serial.print("ºC");
    Serial.print(" // promt: "); Serial.print(ptact); Serial.write(byte(0)); Serial.print("ºC");
    tant1 = t1, tant2 = t2, tant3 = t3, tant4 = t4, ptant = ptact;
  }
}

,





gatul

#22
Dec 13, 2020, 10:46 am Last Edit: Dec 13, 2020, 10:48 am by gatul
Fijate si así hace lo que buscas (cambié algunos nombres de variables para ser más claro, al menos para mi)
Code: [Select]
/*
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 DHT1PIN 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 dht1(DHT1PIN, 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, t2, t3, t4;
float h1, h2, h3, h4;
float ic1, ic2, ic3, ic4;
//float hmin = 20.0, hmax = 60.0;
//float tmin = 20.0, tmax = 28.0;
float t1ant, t2ant, t3ant, t4ant;
float h1ant, h2ant, h3ant, h4ant;
float ic1ant, ic2ant, ic3ant, ic4ant;
float ptinf, ptsup, phinf, phsup, picinf, picsup;
float promTreal, promHreal , promICreal;
float promTutil, promHutil, promICutil;
float promTant, promHant, promICant;
//const float topt = 28.0;      //Temperatura Optima

bool t1_ok = false;
bool t2_ok = false;
bool t3_ok = false;
bool t4_ok = false;
bool h1_ok = false;
bool h2_ok = false;
bool h3_ok = false;
bool h4_ok = false;
bool ic1_ok = false;
bool ic2_ok = false;
bool ic3_ok = false;
bool ic4_ok = false;

float act = 0;
float divt = 0;
float ach = 0;
float divh = 0;
float acic = 0;
float divic = 0;

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

  dht1.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/////
  t1 = dht1.readTemperature();                       //se guarda la temperatura en la variable t
  t2 = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  t3 = dht3.readTemperature();                     //se guarda la temperatura en la variable t3
  t4 = dht4.readTemperature();                     //se guarda la temperatura en la variable t4
  h1 = dht1.readHumidity();                          //se guarda el valor de la humedad en la variable h
  h2 = dht2.readHumidity();                        //se guarda el valor de la humedad en la variable h2
  h3 = dht3.readHumidity();                        //se guarda el valor de la humedad en la variable h3
  h4 = dht4.readHumidity();                      //se guarda el valor de la humedad en la variable h4
  ic1 = dht1.computeHeatIndex(t1, h1, false);
  ic2 = dht2.computeHeatIndex(t2, h2, false);
  ic3 = dht3.computeHeatIndex(t3, h3, false);
  ic4 = dht4.computeHeatIndex(t4, h4, false);

  promTreal = (t1 + t2 + t3 + t4) / 4;     /////////////////// esto es parte de mi problema, OJO OJO OJO OJO//////////
  promHreal = (h1 + h2 + h3 + h4) / 4;      ///////////////////
  promICreal = (ic1 + ic2 + ic3 + ic4 ) / 4;           ///Promedio para indice de Calor

  ptinf = promTreal * 0.9;        //para calcular el promedio - 10%
  ptsup = promTreal * 1.1;        //para calcular el promedio + 10%
  phinf = promHreal * 0.9;
  phsup = promHreal * 1.1;
  picinf = promICreal * 0.9;
  picsup = promICreal * 1.1;
  
  t1_ok = (t1 >= ptinf) & (t1 <= ptsup);                //solo es ok t1 si cumple con la condicion
  t2_ok = (t2 >= ptinf) & (t2 <= ptsup);                //solo es ok t2 si cumple con la condicion
  t3_ok = (t3 >= ptinf) & (t3 <= ptsup);                //solo es ok t3 si cumple con la condicion
  t4_ok = (t4 >= ptinf) & (t4 <= ptsup);                //solo es ok t4 si cumple con la condicion
  h1_ok = (h1 >= phinf) & (h1 <= phsup);                //solo es ok t1 si cumple con la condicion
  h2_ok = (h2 >= phinf) & (h2 <= phsup);                //solo es ok t2 si cumple con la condicion
  h3_ok = (h3 >= phinf) & (h3 <= phsup);                //solo es ok t3 si cumple con la condicion
  h4_ok = (h4 >= phinf) & (h4 <= phsup);                //solo es ok t4 si cumple con la condicion
  ic1_ok = (ic1 >= picinf) & (ic1 <= picsup);                //solo es ok t1 si cumple con la condicion
  ic2_ok = (ic2 >= picinf) & (ic2 <= picsup);                //solo es ok t2 si cumple con la condicion
  ic3_ok = (ic3 >= picinf) & (ic3 <= picsup);                //solo es ok t3 si cumple con la condicion
  ic4_ok = (ic4 >= picinf) & (ic4 <= picsup);                //solo es ok t4 si cumple con la condicion

  if (t1_ok && h1_ok && ic1_ok) {
    act += t1;
    divt++;
    ach += h1;
    divh++;
    acic += ic1;
    divic++;
  }
  if (t2_ok && h2_ok && ic2_ok) {
    act += t2;
    divt++;
    ach += h2;
    divh++;
    acic += ic2;
    divic++;
  }
  if (t3_ok && h3_ok && ic3_ok) {
    act += t3;
    divt++;
    ach += h3;
    divh++;
    acic += ic3;
    divic++;
  }
  if (t4_ok && h4_ok && ic4_ok) {
    act += t4;
    divt++;
    ach += h4;
    divh++;
    acic += ic4;
    divic++;
  }
  
  promTutil = act / divt;
  promHutil = ach / divh;
  promICutil = acic / divic;
  
  //////////////se muestra en el monitor serial si el valor de alguna variable cambia///////
//  if (tact2 != t2ant || hact2 != h2ant || icact != icant || tact1 != t1ant || hact1 != h1ant || promTutil != promTant || icact != icant) {
  if((t1 != t1ant) || (t2 != t2ant) || (t3 != t3ant) || (t4 != t4ant)) {
    if((h1 != h1ant) || (h2 != h2ant) || (h3 != h3ant) || (h4 != h4ant)) {
      if((promTutil != promTant) || (promHutil != promHant) || (promICutil != promICant)) {
    
        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)t1)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
        Serial.print(" Temp2: "); Serial.print(String ((int)t2)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
        Serial.print(" Temp3: "); Serial.print(String ((int)t3)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
        Serial.print(" Temp4: "); Serial.print(String ((int)t4)); 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)h1)); Serial.print(" %");     //indica un cambio de la humedad1
        Serial.print(" Hum2: "); Serial.print(String ((int)h2)); Serial.print(" %");    //indica un cambio de la humedad1
        Serial.print(" Hum3: "); Serial.print(String ((int)h3)); Serial.print(" %");    //indica un cambio de la humedad1
        Serial.print(" Hum4: "); Serial.print(String ((int)h4)); 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)promTutil)); Serial.write(byte(0)); Serial.print("ºC"); Serial.print(" promh: "); Serial.print(String ((int)promHutil));
        Serial.print(" %");
        Serial.print(" Ind Calor: "); Serial.print(String ((int)promICutil)); Serial.print("ºC");          // Mostrar en monitor serial el indice de caloren ºC

      }
    }
  }
  
  t1_ok = false;
  t2_ok = false;
  t3_ok = false;
  t4_ok = false;
  h1_ok = false;
  h2_ok = false;
  h3_ok = false;
  h4_ok = false;
  ic1_ok = false;
  ic2_ok = false;
  ic3_ok = false;
  ic4_ok = false;
  t1ant = t1;
  t2ant = t2;
  t3ant = t3;
  t4ant = t4;
  h1ant = h1;
  h2ant = h2;
  h3ant = h3;
  h4ant = h4;
  ic1ant = ic1;
  ic2ant = ic2;
  ic3ant = ic3;
  ic4ant = ic4;
  promTant = promTutil;
  promHant = promHutil;
  promICant = promICutil;

}

Lo compilé perfectamente pero no tengo forma de probarlo, no tengo Mega ni DHT. Espero te sirva.

Edito: Avísame si necesitas que te aclare algo

Saludos

lindbergf

Hola gatul, reduje tu código para centrarme en lo que verdaderamente importa el promedio y temperatura, dicho esto, corrí el código y no me termina de convencer, el calculo del promedio no me parece que funcione bien, cojo tres valores de los sensores y al sacarle el promedio no es el que me muestra en el monitor serial, seguramente  algo que no estamos tomando en cuenta.

he estado estudiando varias cosas y no he podido hallar una función que me permita hacer eso, pero seguiremos estudiando, hasta conseguirlo, no se si yo pudiera hacer una pregunta similar en el foro de ingles a ver si alguien tiene alguna idea de como plantearse este problema.

amigo gatul, te doy mil gracias por tomarte el tiempo para ayudarme, ya soy algo mayor y algunas cosas me cuesta entender.

Saludos desde Venezuela

código reducido
Code: [Select]
/*
  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 DHT1PIN 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 dht1(DHT1PIN, 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, t2, t3, t4;
float t1ant, t2ant, t3ant, t4ant;
float ptinf, ptsup;
float promTreal;
float promTutil;
float promTant;
//const float topt = 28.0;      //Temperatura Optima
bool t1_ok = false;
bool t2_ok = false;
bool t3_ok = false;
bool t4_ok = false;
float act = 0;
float divt = 0;

void setup() {
  Serial.begin(9600); //Se inicia la comunicación serial
  dht1.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/////
  t1 = dht1.readTemperature();                       //se guarda la temperatura en la variable t
  t2 = dht2.readTemperature();                     //se guarda la temperatura en la variable t2
  t3 = dht3.readTemperature();                     //se guarda la temperatura en la variable t3
  t4 = dht4.readTemperature();                     //se guarda la temperatura en la variable t4

  promTreal = (t1 + t2 + t3 + t4) / 4;     /////////////////// esto es parte de mi problema, OJO OJO OJO OJO//////////
  ptinf = promTreal * 0.9;        //para calcular el promedio - 10%
  ptsup = promTreal * 1.1;        //para calcular el promedio + 10%

  t1_ok = (t1 >= ptinf) & (t1 <= ptsup);                //solo es ok t1 si cumple con la condicion
  t2_ok = (t2 >= ptinf) & (t2 <= ptsup);                //solo es ok t2 si cumple con la condicion
  t3_ok = (t3 >= ptinf) & (t3 <= ptsup);                //solo es ok t3 si cumple con la condicion
  t4_ok = (t4 >= ptinf) & (t4 <= ptsup);                //solo es ok t4 si cumple con la condicion

  if (t1_ok) {
    act += t1;
    divt++;
  }
  if (t2_ok) {
    act += t2;
    divt++;
  }
  if (t3_ok) {
    act += t3;
    divt++;
  }
  if (t4_ok) {
    act += t4;
    divt++;
  }
  promTutil = act / divt;
 
  //////////////se muestra en el monitor serial si el valor de alguna variable cambia///////
  if ((t1 != t1ant) || (t2 != t2ant) || (t3 != t3ant) || (t4 != t4ant)) {
    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)t1)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" // Temp2: "); Serial.print(String ((int)t2)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" // Temp3: "); Serial.print(String ((int)t3)); Serial.print("ºC");     //indica un cambio de temperatura o un cambio en la humedad
    Serial.print(" // Temp4: "); Serial.print(String ((int)t4)); Serial.print("ºC");    //indica un cambio de temperatura o un cambio en la humedad
    // Mostrar en monitor serial el promedio de temperatura y humedad
    Serial.print(" // promt: "); Serial.print(String ((int)promTutil)); Serial.write(byte(0));
    Serial.print(" // ptsup: "); Serial.print(String ((int)ptsup)); Serial.write(byte(0)); Serial.print("ºC");
    Serial.print(" // ptinf: "); Serial.print(String ((int)ptinf)); Serial.write(byte(0)); Serial.print("ºC");
  }
  t1_ok = false;
  t2_ok = false;
  t3_ok = false;
  t4_ok = false;
  t1ant = t1;
  t2ant = t2;
  t3ant = t3;
  t4ant = t4;
  promTant = promTutil;
}


imagen del monitor Serial





gatul

#24
Dec 13, 2020, 10:45 pm Last Edit: Dec 13, 2020, 10:51 pm by gatul
Ah, ahora sí es un desafío.
YA busco dónde me equivoqué porque también tengo las neuronas medio oxidadas a los 58.
Abrazo

Edito: Me olvidé de aclararte que incluí en la validación todos los datos de cada sensor porque considero que si uno falla en alguno de ellos deja de ser confiable todo lo que reporta. Igual, como algo quedó mal ya me pongo a revisarlo.

gatul

Ya encontré el problema, no es de programación, es que estamos planteando algo mal y por eso no calcula el promedio útil.
Si tomo los valores de la primera línea de la captura

Code: [Select]
37 + 6 + 33 + 34 = 110
promTreal = 110 / 4 = 27.5
ptinf = 27.5 * 0.9 = 24.75
ptsup = 27.5 * 1.1 = 30.25

Ningún sensor entra en el rango cuando la desviación de la medida de un sensor es tan grande porque tira muy abajo el promedio.

Incluso con t2= 26°, que no es tan extremo, solo valida t3 y t4 porque t1 queda tambien fuera de los límites.

Se podría ampliar el rango, del 10% llevarlo al 30 ó 40%, o fijar un valor fijo de X° por encima/debajo del promedio,  pero no me resulta confiable, creo que en realidad habría que buscar otra forma.

Tal vez estaba bien la que creo fue tu idea original,  fijar las temperaturas límite manualmente ( me refiero a tmax y tmin).

Lo sigo estudiando...

lindbergf

Hola gatul, jajaja te estaba escribiendo para decirte ya corregí la parte de los promedios estaban mal, pero lo que he notado es que el promedio inicial no varia mucho, me explico si me da un promedio X, al bajar los sensores me debería dar otro promedio X1, pero no lo da, (aunque promedio superior e inferior si se modifican) y me percate que si cierro el monitor serial si y lo abro nuevamente si me da el promedio X1, estamos planteando mal el problema.
 
Code: [Select]
promTreal = (t1 + t2 + t3 + t4) / 4;                    /////////////////// esto es parte de mi problema, OJO OJO OJO OJO//////////
  ptinf = promTreal - (promTreal * 0.1);                  //para calcular el promedio - 10%
  ptsup = promTreal + (promTreal * 0.1);                  //para calcular el promedio + 10%


hay una parte que decimos que:
promTant = promTutil;  
promedio util es el que se muestra en el monitor serial y después lo transformamos a promedio antiguo,  pero no debería haber una variable que haga que el promedio antiguo sea igual al promedio real?
promTreal = promTant;
para poder tomar ese valor y volver a sacar el promedio en un nuevo ciclo?
Neuronas Humeando, Faltan las Cervezas, yo tengo 55 años y mas de 30 sin programar.
Saludos desde Cumaná / Venezuela

gatul

Nooo.
promTreal es el promedio de todos los sensores estén o no dentro de lo esperado.
promTutil es el promedio de los sensores SIN el/los que no estén dentro del rango esperado.
Es lo que entendí que querías lograr desde el principio para no "cocinar" a los conejos por un error de lectura o porque justo un sensor está en una zona más fresca que el resto. ¿Entendí mal?
Fijate que ambos se calculan en cada pasada.
Y promTant solo se guarda porque tu lo usas en el condicional para ver si varió el promedio útil actual respecto al anterior y sacar los datos por serial, no sirve para otra cosa.

gatul

Y ahora que lo pienso nuevamente, algo que no entendí bien desde el principio es:
Si sabes que la temperatura puede ser muy diferente en un sector que en otro (y suena muy lógico en un galpón) ¿Para qué quieres saber la temperatura promedio? ¿Es solo a título informativo?
Porque imagino que, aunque el promedio sea "normal", si un sensor te marca alta temperatura se va a encender la ventilación si o si. ¿O me equivoco?

lindbergf

Sii, entendiste bien, si un sensor deja de funcionar y esta fuera del rango no se tomara su lectura, por eso el promTutil es el que activara las medidas para modificar las condiciones extremas del galpón, ventiladores, extractores, aspersores y Alarma. por eso el promedio util debe estar bien calculado y funcionando, si un sensor baja mucho y los otros tres suben simultáneos se tomara el promedio de los tres que subieron para así aplicar las medidas correctivas.

yo quiero dejar esto bien ajustado pues en la zona donde vivo, ahorita (9 pm) en mi cuarto con ventilador hay un promedio de 35.6 ºC, y no es de extrañar que a pleno mediodía puedan llegar las temperaturas dentro del galpón a mas de 45ºC con una humedad a menos del 10%, eso significaría la muerte para todo lo que se encuentre en ese galpón por sofocación de calor.

Saludos amigo desde Cumaná Venezuela

Go Up