Millis por Delay..Estufa de cultivo para laboratorio..( SOLUCIONADO )

Hola, soy nuevo en el foro y en este mundo (maravilloso) de Arduino, por lo que no tengo demasiado manejo de todos los comandos y admiro la destreza y facilidad que poseen la mayoría de los que conforman este foro. Mejor de describiría como un editor de partes de códigos, adaptándolas a mis necesidades.
Estoy diseñando una estufa para cultivo de bacterias en laboratorio y tengo casi listo el programa, el mismo posee dos pulsadores para subir y bajar la humedad, dos pulsadores para subir y bajar la temperatura, otro pulsador es para hacer una iluminación interior temporizada, y un ultimo pulsador para ejecutar una desinfección interna de la estufa por UV. También posee una pantalla 16x2 i2c donde aparecen permanentemente la temp real y la humedad real. Su sensor es en este caso un dht11 que mide temp y humedad.
Tengo todo montado en protoboard para realizar las pruebas… Ahora les comento mi problema…
La pantalla muestra como dije, todo el tiempo, temp real y humedad real… pero deseo que al pulsar cualquiera de los pulsadores que suben o bajan la temperatura, cambie el mensaje en la pantalla por unos segundos a temp real y temp objetivo por ej…
En el codigo que realicé originalmente utilicé delay y sí me indicaba después de presionar (por ej) subir temp, temp real y temp objetivo, pero me frena el pulsado del pulsador hasta que la pantalla no vuelva a la pantalla orignal… logico que suceda esto con delay… por eso pido si me pueden ayudar ya que no me doy cuenta como sustituir el delay (que esta ahora comentado para que funcionen bien los pulsadores).

Desde ya muchas gracias por su tiempo, es valiosa su ayuda.

/////////////////////////////// sensor de temperatura y humedad

/////////////////////////////// display LCD 16x2

/////////////////////////////// declaracion de pines de pulsadroes

int Ilum = A0;               // declaramos pin entrada para el pulsador que activará la iluminación temporizada
int Desinf = A1;             // declaramos pin entrada para el pulsador que activará la desinfección temporizada
const int Tup = 3;           // declaramos pin entrada para el pulsador subir la temperatura
const int Tdwn = 4;          // declaramos pin entrada para el pulsador bajar la temperatura
const int Hup = 5;           // declaramos pin entrada para el pulsador subir la humedad
const int Hdwn = 6;          // declaramos pin entrada para el pulsador bajar la humedad

int TemButtonCounter = 30;        // contador de veces que se incrementa o decrementa la temperatura
int HumButtonCounter = 40;        // contador de veces que se incrementa o decrementa la humedad

bool TupState = 0;           // estado actual del boton de incremento de temperatura
bool TdwnState = 0;          // estado actual del boton de decremento de temperatura
bool HupState = 0;           // estado actual del boton de incremento de la humedad
bool HdwnState = 0;          // estado actual del boton de decremento de la humedad
bool lastTupState = 0;       // ultimo estado de la temperatura (si se incremento o decremento)
bool lastTdwnState = 0;      // ultimo estado de la temperatura (si se incremento o decremento)
bool lastHupState = 0;       // ultimo estado de la humedad (si se incremento o decremento)
bool lastHdwnState = 0;      // ultimo estado de la humedad (si se incremento o decremento)

int Iluminacion = 13;        // declaramos la salida que accionará la iluminación
int Desinfeccion = 12;       // declaramos la salida que accionara la desinfeccion UV

/////////////////////////////// Definimos el tiempo de duración de la desinfección UV e iluminación

int timer1;
unsigned long tiempo;
unsigned long tiempos [2];
int espera [2] {10000, 10000, };
boolean ejecutando [2] = { false, false, };

void setup() 
{

dht.begin();                 // Comenzamos el sensor DHT

lcd.begin (16,2);            // Inicializar el display con 16 caraceres 2 lineas
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);

/////////////////////////////// configuración de entradas

pinMode (Ilum, INPUT);       // declaramos como entrada el pulsador para comenzar la iluminación 
pinMode (Desinf, INPUT);     // declaramos como entrada el pulsador para comenzar la desinfección
pinMode (Tup, INPUT);        // declaramos como entrada el pulsador para subir la temperatura
pinMode (Tdwn, INPUT);       // declaramos como entrada el pulsador para bajar la temperatura
pinMode (Hup, INPUT);        // declaramos como entrada el pulsador para subir la humedad
pinMode (Hdwn, INPUT);       // declaramos como entrada el pulsador para bajar la humedad

/////////////////////////////// configuracion de salidas

pinMode(Iluminacion, OUTPUT);          // salida control iluminación
pinMode(Desinfeccion, OUTPUT);         // salida control desinfección
pinMode(11, OUTPUT);                   // salida control inversor polaridad para frio/calor celda peltier
pinMode(10, OUTPUT);                   // salida control inversor polaridad para frio/calor celda peltier
pinMode(8, OUTPUT);                    // salida control humidificador
pinMode(7, OUTPUT);                    // salida control ventiladores
pinMode(9, OUTPUT);                    // salida asignada al buzzer alarmas


timer1 = 10000;                    // tiempo preestablecido para la iluminación temporizada

}

void loop() 
{

 float h = dht.readHumidity();               // Leemos la humedad relativa
 float t = dht.readTemperature();            // Leemos la temperatura en grados centígrados (por defecto)
 
  
if (isnan(h) || isnan(t))                    // Comprobamos si ha habido algún error en la lectura
{
    lcd.home();                              // posiciona el cursor en la primera fila, primera columna
    lcd.print("ERROR DEL SENSOR !!!");       // muestra en la pantalla el mensaje "error del sensor"
    lcd.setCursor (0, 1);                    // salta el cursor a la fila de abajo primera columna
    lcd.print("REPARE URGENTE !!!  ");       // muestra en la pantalla el mensaje " repare urgente"
    return;                                  // retorna al progarma si no se da la condicion preguntada en el if..
} 



////////////////////////////////// programa que compara el estado de los botones y los suma o resta segun el caso

TupState = digitalRead(Tup);

if (TupState != lastTupState) {
if (TupState == 1) {
TemButtonCounter ++;
tone (9, 800, 80);

lcd.clear();
lcd.home();
lcd.print("Temp Real: ");
lcd.print(t);
lcd.print("\337C ");
lcd.setCursor(0,1);
lcd.print("Temp Obj: ");
lcd.print(TemButtonCounter);
lcd.print("\337C ");
lcd.clear();
//delay (1500);            //este es uno de los 4 delay que quiero eliminar para dar agilidad al programa

}
}

lastTupState = TupState;            // guarda el estado actual como ultimo estado para la proxima vez que se ejecute el lazo
  
TdwnState = digitalRead (Tdwn);
if (TdwnState != lastTdwnState) {
  if (TdwnState == 1) {
    TemButtonCounter --;

tone (9, 600, 80);
lcd.clear();
lcd.home();
lcd.print("Temp Real: ");
lcd.print(t);
lcd.print("\337C ");
lcd.setCursor(0,1);
lcd.print("Temp Obj: ");
lcd.print(TemButtonCounter);
lcd.print("\337C ");
//delay(1500);

lcd.clear();
}
}

lastTdwnState = TdwnState;           // guarda el estado actual como ultimo estado para la proxima vez que se ejecute el lazo



///////////////////////////////////// pantalla principal con valores reales instantaneos 

lcd.home();
lcd.print("Temp. real: ");         // mostramos la temperatura real en el display
lcd.print(t);                      // temperatura
lcd.print("\337C ");               // simbolo de °C
lcd.setCursor ( 0, 1 );            // ubicamos el cursor en la linea 2
lcd.print("Hum. real: ");          // mostramos la humedad real en el display
lcd.print(h);                      // humedad
lcd.print("% ");                   // simbolo de % 

///////////////////////////////// toma de deciciones
 
}

Recorté partes del codigo porque me exedía en la cantidad de caracteres. Tal vez pueda subirlo por partes, o como adjunto.

esquema estufa.pdf (27.6 KB)

Proyecto_estufa_laboratorio_4.ino (11.1 KB)

Ve a Documentación => Indice de temas tutoriales => millis

Gracias, releeré todo de nuevo.
He logrado avances, haciendo 3 subrutinas con las pantallas. Quedó mas prolijo el sketch.
Gracias.!

Hola. he seguido las indicaciones y me pareció muy bueno, sobre todo el dato que la placa tiene un reloj que corre independiente del programa, y eso ayuda a interpretar como funciona millis. A pesar de ello continúo con problemas. Adjunté el codigo completo con reformas que lo depuran un poco, y con los cambios que realicé logré ver en el visor la temp objetivo y humedad objetivo mientras estoy pulsando los pulsadores, luego retorna a la pantalla principal, el nuevo problema es que la pantalla principal no actualiza, queda fija tal como esté en el momento de soltar el pulsador.
Perdón por las molestias causadas. Gracias de nuevo.

Proyecto_estufa_laboratorio_3_reformando.ino (12 KB)

No tengo ningún LCD para probar ni veo donde puede estar el fallo revisando un poco por encima, te recomiendo que uses el monitor serial para ver si alguno de tus if no se están cumpliendo como deben, yo si no es muy complejo me imprimo números o puedes poner directamente "Se cumple x condición", también te puede ir bien imprimir alguna de tus variables cada x tiempo.

Yo con esta foto lo hago: https://photos.app.goo.gl/Fg6W51CdDTQe8nNd8
Es como una fórmula matemática, si lo usas tal cual funciona. Cuando lo intento pensar ese mayor no me sale, ponía ==. A ver si te ayuda, ya nos cuentas

Buenas a todos!! Agradezco los aportes de Jiuso, probaré insertando ahora esa fórmula y condicionando que el tiempo sea ==... También valoro el dato de krnlpanic, nunca se me hubiese ocurrido que podría "monitorear" justamente los pasos del sketch.. Será de ahora en más una condición a ejercitar en todos mis programas, es una buena medida.
Próximamente probaré y comentaré el resultado de las reformas de ambos.
Muchas gracias por su tiempo!!

He realizado los ajustes anteriormente sugeridos y no obtuve mejoras, eso sí. está muy buena la idea de agregar mensajes por el monitor serial del Ide en cada evento que se espera producir… sigo pensando que es muy buena idea…
Al fin logré que me funcione, no como quería, pero si me logra conformar…
Generé 3 pantallas que se alternarán entre si cada 4 segundos, también asigné que muestre la pantalla referente al pulsador presionado y la correspondiente suma o resta que ejecutan. Y de esta manera al mantener presionado el pulsador tengo en pantalla lo que me interesa que es la temp real y objetivo, o la humedad real y objetivo, según corresponda al pulsador.

  • Seguramente se puede depurar y mejorar, yo como dije en mi presentación soy autodidacta y trato de comprender practicando.
  • También recomiendo leer [Documentación => Indice de temas tutoriales => millis] que alcanza y sobra para comenzar a comprender millis() que es tan distinto su funcionamiento al primitivo delay()…
  • Me quedó el concepto de que el tiempo transcurre y millis() es una especie de llamada a verlo, es como ver el reloj para realizar una actividad a cierto horario…

Muchas Gracias por su tiempo.!!

Proyecto_estufa_laboratorio_5_funciona.ino (21.7 KB)