Cronometro y sensores temperatura Moto Carreras

Hola a todos.

Aprovecho para presentarme. Soy nuevo con Arduino, aunque siempre me asaltó la curiosidad de estos sistemas poderosamente, nunca he había lanzado por un simple motivo; no se lo que se dice programar (chapucear código sí, pero programar.....)

Pero por diversas circunstancias me surgío la idea de un proyecto que quería desarrollar y me lancé con Arduino por fin. Voy aprendiendo paso a paso y tirando mucho de Google y foros para progresar.....pero he llegado a un punto que tras intentarlo varios días, definitivamente puedo decir que estoy "atascado". Para muchos resultará una nimiedad o una solución fácil mi problema, pero yo no consigo implementarlo bien.

Sin mas dilación os expongo:

Estoy intentando hacer una pantalla para mi moto de carreras (carreras de resistencia) que me muestre lo siguiente; sensor de temperatura de escape, sensor de temperatura del cilindro y cronómetro regresivo con un pulsador para volver a lanzar el cronómetro.

Compré un Arduino Uno, una pantalla tft ILI9341, sensores thermocouple, módulos MAX6675 y unos convertidores bidireccionales de 5v a 3 v para la pantalla. Programé y adapté todo mi código a mis necesidades y hasta aquí todo bien. Pero ahora vienen mis problemas;

Consigo hacer funcionar la pantalla y los sensores y coloco las posiciones donde quiero que vaya todo mostrado, hasta aquí bien, pero con el cronómetro tengo problemas. No consigo hacerlo funcionar con cierta exactitud.

Al principio utilicé un comando delay 1000 para que fuese descontando segundos, pero en realidad descuenta mal. En un minuto de cronómetro, realmente transcurren 1 minuto 12 segundos reales. Buscando por foros algo similar, veo que utilizan el comando de milis() pero no se ni implementarlo bien, ni que funcione el código. Por otro lado tampoco sé como implementar el pulsador para que una vez conmutado lance la secuencia del cronómetro nuevamente. (esté la cuenta atras finalizada o nó)

Este es mi código "limpio" a falta de integrar el comando de descuento y el botón de comienzo de cronómetro

#include <gfxfont.h>

#include "Fonts/FreeSans9pt7b.h"
#include <TFT_ILI9341.h>


#include <max6675.h>


#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <SPI.h>



#define TFT_DC 9
#define TFT_CS 10



//termocouple 1 - escape
int soPin = 5;
int cs1Pin = 6;
int sckPin = 7;
//termocouple 2 - cilindro
int cs2Pin = 4;


Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

MAX6675 thermocouple1(sckPin, cs1Pin, soPin);
MAX6675 thermocouple2(sckPin, cs2Pin, soPin);

int S = 59; // cuenta segundos
int M = 59; // cuenta minutos
int H = 00; // cuenta horas






void setup() {
  
  tft.fillScreen (ILI9341_BLACK);
  tft.setTextColor (ILI9341_WHITE, ILI9341_BLACK);
  tft.setFont (&FreeSans9pt7b);

  tft.setCursor (40,50);
  tft.print ("escape (C)");
  tft.setCursor (200,50);
  tft.print ("cilindro (C)");
 
  tft.drawLine (160,30,160,110, ILI9341_WHITE);  //linea vertical pantalla
  tft.drawLine (0,110,320,110, ILI9341_WHITE);  //linea horizontal superior pantalla
  tft.drawLine (0,30,320,30, ILI9341_WHITE);     //linea horizontal inferior pantalla
 
  tft.setCursor (100,130);
  tft.print ("tiempo STINT");

  tft.setTextColor (ILI9341_WHITE, ILI9341_BLACK);  //punteros cronometro
  tft.setFont ();
  tft.setTextSize (4);
  tft.setCursor(93, 180);
  tft.print (":");
  tft.setCursor(203, 180);
  tft.print (":");


 

}


void loop(void) {



                                      //sensor ESCAPE:
                                      
 if((thermocouple1.readCelsius())<30){

  tft.setTextColor (ILI9341_GREEN, ILI9341_BLACK);
  tft.setTextSize (4);
  tft.setCursor (10,70);
  tft.print(thermocouple1.readCelsius());
  
 }
else{
 tft.setTextColor (ILI9341_RED, ILI9341_BLACK);
  tft.setTextSize (4);
  tft.setCursor (10,70);
  tft.print(thermocouple1.readCelsius());
  
}

                                          //sensor CILINDRO:
                                          
  if((thermocouple2.readCelsius())<30){

  tft.setTextColor (ILI9341_GREEN, ILI9341_BLACK);
  tft.setTextSize (4);
  tft.setCursor (190,70);
  tft.print(thermocouple2.readCelsius());

 }
else{
 tft.setTextColor (ILI9341_RED, ILI9341_BLACK);
  tft.setTextSize (4);
  tft.setCursor (190,70);
  tft.print(thermocouple2.readCelsius());
  
}
 



  //////cronometro//////

  
  S--;

 tft.setTextColor (ILI9341_WHITE, ILI9341_BLACK);
 tft.setTextSize (7);
 if(S<0)
 {
   M--;
   S=59;
 }
 if(M<0)
 {
   H--;
   M=59;
 }
 if(H<0) { H=00; M=00; S=00; } 
 
 if(M>9)
 {
   tft.setCursor(120,170);
   tft.print(M);
 }
 else
 {
   tft.setCursor(120,170);
   tft.print("0"); 
   tft.setCursor(160,170);
   tft.print(M);
 }
  
 if(S>9)
 {
   tft.setCursor(230,170);
   tft.print(S);
 }
 else
 {
   tft.setCursor(230,170);
   tft.print("0"); 
   tft.setCursor(270,170);
   tft.print(S);
 }
  
 if(H>9)
 {
   tft.setCursor(10,170);
   tft.print (H);
 }
 else
 {
   tft.setCursor(10,170);
   tft.print("0"); 
   tft.setCursor(50,170);
   tft.print(H);
 }
}

Alguna sugerencia??. Toda ayuda es bien recibida. Gracias de antemano a todos :wink:

Hola @setenta9, bienvenido al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear
Tu consulta es de software y para nosotros no es un proyecto sino solo eso, una consulta de Software.
Movido a dicha sección.

Ve a Documentación => Indice de temas tutoriales => millis()
Tienes muchos tutoriales que explican como funciona.

Hola surbyte.

Gracias por la aclaración y mis disculpas por mi torpeza.

Me lanzo a por ello. Gracias mil