Control de temperatura con cronometro programable

Buenas y santas!

Querida comunidad, paso a contarles mi proyecto... quizas puedan ayudarme. Estoy armando un pequeño proyecto (aunque para mi represente el Everest) con Arduino. El proyecto debe hacer lo siguiente. Debo poder programar una temperatura y un temporizador y mientras que el tiempo este corriendo la temperatura debe mantenerse estable (según lo programado) hasta la conclusión de la tarea.

Para realizar este proyecto tengo un termómetro DS 1820, un arduino Mega, una pantalla táctil con su shield, un modulo de 4 relays ( para controlar las lamparas de cuarzo) un buzzer (para que suene cuando el temporizador ha concluido) y un RTC ( para que el control del tiempo sea lo mas preciso posible).

Mi pregunta es la siguiente. He podido desarrollar la interface gráfica y puedo controlar absolutamente todas las pantallas, los botones responden sin chistar, la temperatura me la muestra sin inconvenientes y el timer también... pero de alguna manera, me resta los minutos cada 3 a 7 segundos, produciendo de esta manera un gran inconveniente. Los segundos no me los muestra, se descuentan como se les antoja, y para colmo de males, he leído absolutamente todos los tutoriales del sitio y las consultas del foro en español e ingles y sigo sin en contra la vuelta.

la temperatura y el temporizador los almaceno como un int y los minutos y segundos también los defino como un int (quizas ahí este mi error) pero no logro comprenderlo...

Es de suma importancia que el reloj funcione de manera correcta ya que es la variable mas importante del proceso. El fin de este proyecto es poder armar un horno para el secado de pintura de tanques de motos, de esta manera, con temperaturas de 60 grados de manera sostenida, puedo acortar el tiempo de secado de 3 días (curado completo) a solamente 20 minutos, lo que me permite terminar hasta 2 tanques por dia.

Agradezco su ayuda y sugerencias. Si creen que deba poner parte del código para que comprendan que es lo que hago háganmelo saber... ya que este es mi segundo poste y no se bien como se hace.

GRACIAS!!!!

Hola, pues si, yo pienso que sin el codigo y sin saber que rtc concretamente estas usado no creo que nadie sepa dar con la tecla de que ocurrirá exactamente.

Por lo que cuentas arrastras delay() en tu código que te estan jugando una mala pasada como en la gran mayoría de las consultas de este foro.

De todos modos es una suposición asi que por favor lee las normas y postea tu código usando etiquetas.

Si supera 9k solo adjúntalo.

Mil disculpas por no haber adjuntado el código del temporizador ni explicar que RTC estoy utilizando... el RTC es un TinyRTC, de los que traen una fila de pines y del otro lado la posibilidad de agregar otra fila... no se que código es, pero si se que es al que la temperatura lo hace fallar por que el oscilador es menos preciso...

por otro lado, les paso el código del programa...

Gracias surbyte y Mikms por la ayuda!

Horno.ino (16.8 KB)

Arranco el código y me encuentro con qué? delay(5000)

if (currentPage == '0') {
    delay(5000);
    currentPage = '1';
    myGLCD.clrScr();
    drawHomeScreen();
  }

Hay un par de 1000 mseg y luego esto

//EMPEZAR button
      if ((x >= 220) && (x <= 310) && (y >= 200) && (y <= 230)) {
        drawFrame(220, 200, 310, 230);
        Timer();
        if (prgTime == 0){
          myGLCD.clrScr();
          delay(600);
          myGLCD.setColor(0, 153, 76);
          myGLCD.setFont(BigFont);
          myGLCD.print("TAREA CONCLUIDA", CENTER, 120);
          delay(5000);
          myGLCD.clrScr();
          delay(600);
          currentPage = '1';
          drawHomeScreen(); 
        }
      }

Y te preguntas porqué esta lento? pues porque cada vez que se encuentra con un delay() se detiene el flujo del programa.
Te diré lo que le digo a todos

NO USEN DELAY!!! salvo con blink o consas tontas que hacen secuencias que no incluyen sensores que luego determinen el control del programa.

Ve a Documentación => Indice de temas tutoriales => Millis() y también lee máquina de estados.

Luego veremos como resolverlo.

Surbyte, olvide de decirte algo... el delay ese, es el que debería dejar la pagina 0 (logo de mi empresa) en la pantalla cuando prende el arduino... pero no puedo hacer que me lea la imagen de la SD por lo tanto, silencie las condiciones par que haga eso... es mas, creo que las borre...

Con respecto al otro delay, es para que me muestre la pantalla en negro con la leyenda "TAREA CONCLUIDA" y vuelva a la pantalla de programación... si no hago esto, el tft con la librería que estoy usando medio que se queda loca... y me deja algunos pixels exitados con el color de la pantalla anterior, es por eso que los uso... de hecho no esta para nada lenta la interfase... va bastante rápido...

Gracias por la sugerencia, lo voy a revisar...

@ArduMyth muchas gracias por el dato de esa librería... dataso!!! voy a ir por ahi, parece mas sencillo y mas rápido que ponerme a programar uno con la función millis..

Por otro lado, intente usarla pero resulta que lo que me pasaba era que solo con entrar a la pantalla y querer ver los datos el cronometro corría loco... me mostraba una infinidad de datos que jamas quise ver y no podia controlarlos... por el solo hecho de haberlo insertado corria...

De mas esta decir que mi experiencia con la programación no es buena, pero quise intentarlo... la mayor parte de mi código lo gui sacando de ejemplos y rompiéndomela la cabeza para poder encontrar la mejor (para no decir la menos peor) manera de hacerlo.

Gracias a todos por los consejos... en cuanto avance con esto les mando novedades!!! Gracias!