Comment faire afficher l'heure sur un écran lcd avec arduino

Bonjour,
Je travail sur un émulateur Tinkercad et je voulais afficher l'heure sur mon écran lcd.
Voici le bout de mon code qui gère l'heure:

  seconde = millis()/1000;
  if(seconde == 60)
  {
    seconde = 00;
    minute++;
  }
  if(minute == 60)
  {
    minute = 00;
    heure++;
  }
  if(heure == 24)
  {
    heure = 00;
  }
  
  if(etatTV == false)
  {
    lcd.print(heure);
    lcd.print(":");
    lcd.print(minute);
    lcd.print(":");
    lcd.print(seconde);
    delay(800);
    lcd.clear();
  }
       

Il est situé dans le void loop().
Mais le problème c'est que lorsque j'arrive a 60 seconde il m'affiche 0 pendant 1 seconde puis 61 après 62 et ainsi de suite.
Je voulais savoir comment faire pour corriger ce problème.

PS: J'aimerai ne pas utiliser delay(1000) car mon projet et de faire l'interface visuelle d'une box tv et donc ca ralentirez la télécommande.
PS2: Voici mon projet, il n'est pas fini mais ca vous permettra de mieux voir.
Circuit design décodeur TV | Tinkercad

Merci d'avance pour votre aide.
Cordialement.

Ne postez pas de snippets (Snippets R Us!)

on a besoin de savoir comment sont définies vos variables par exemple et voir le reste du code

PS/ ne prenez pas l'habitude d'écrire 00 pour 0, la notation d'un entier qui commence par 0 veut dire que vous êtes en base 8 pour le nombre. par exemple 024 ce n'est pas 24 mais 20 (2*8+4) en décimal. Pour 00 ce n'est pas grave, mais il faut le savoir.

c'est pour ca que j'avais mis le projet mais d'accord je vais mettre tout le code

#include <LiquidCrystal.h>
#include <IRremote.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int redLed = 8;
const int RECV_PIN = 10;
const int btn_sec = 13;
const int btn_min_plus = 9;
const int btn_min_moin = 7;
const int btn_heure_plus = 6;
const int btn_heure_moin = 1;

IRrecv irrecv(RECV_PIN);
decode_results results;

bool etatTV = false;
int heure = 00;
int minute = 00;
int seconde = 00;
int volume = 0;

void setup() {
  lcd.begin(16, 2);
  
  pinMode(redLed, OUTPUT);
  
  Serial.begin(9600);
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); 
  Serial.println("Enabled IRin");  
}

void loop() {
  seconde = millis()/1000;
  if(seconde == 60)
  {
    seconde = 00;
    minute++;
  }
  if(minute == 60)
  {
    minute = 00;
    heure++;
  }
  if(heure == 24)
  {
    heure = 00;
  }
  
  if(etatTV == false)
  {
    lcd.print(heure);
    lcd.print(":");
    lcd.print(minute);
    lcd.print(":");
    lcd.print(seconde);
    delay(800);
    lcd.clear();
  }
                  
  if (irrecv.decode(&results)) {//irrecv.decode(&results) returns true if anything is recieved, and stores info in varible results
    unsigned int value = results.value; //Get the value of results as an unsigned int, so we can use switch case
    Serial.println(value);
    switch (value) {
      case 255:
      	lcd.clear();
      	if(etatTV == false)
        {
          digitalWrite(redLed, HIGH);
      	  lcd.print("Demmarage ...");
      	  delay(1000); 
          lcd.clear();
      	  Serial.println("Appareil demarer");
      	  delay(200);
      	  digitalWrite(redLed, LOW);
      	  lcd.print("Bienvenue");
          etatTV = true;
          delay(1000);
          lcd.clear();
      	  break;
        }
      	else
        {
          digitalWrite(redLed, HIGH);
      	  lcd.print("Arret ...");
      	  delay(1000); 
          lcd.clear();
      	  Serial.println("Appareil etein");
      	  delay(200);
      	  digitalWrite(redLed, LOW);
      	  lcd.print("Aurevoir");
          etatTV = false;
          delay(1000);
          lcd.clear();
      	  break;
        }
      
      case 32895:
      	lcd.clear();
      	if(etatTV == true)
        {
          volume = volume+2;
          if(volume > 100)
          {
            volume = 100;
          }
          Serial.println("Augmenter le volume");
          lcd.print("volume est a ");
          lcd.print(volume);
          delay(500);
          lcd.clear();
        }
      	else
      	{
        	
      	}
      	break;
      
      case 36975:
      	lcd.clear();
      	if(etatTV == true)
        {
          volume = volume-2;
          if(volume < 0)
          {
            volume = 0;
          }
          Serial.println("Diminuer le volume");
          lcd.print("volume est a ");
          lcd.print(volume);
          delay(500);
          lcd.clear();
        }
      	else
      	{
        	
      	}
      	break;
    }  
    irrecv.resume(); // Receive the next value
  }
}

Tout le monde ne va pas s'amuser à cliquer les liens et créer un compte tinkercad pour vous aider... si vous voulez des réponses pensez à simplifier la vie des bénévoles qui vous répondent...

vos maths ne sont pas corrects, au bout de 62 secondes, millis vaut 62000 et donc quand vous divisez par 1000 ça fait 62.... --> il faut un modulo 60

et bien sûr votre autre souci c'est qu'il y a plein de délais donc vous risquez de rater des secondes, donc vaut mieux faire les tests avec >= mais dans ce cas le modulo va mettre le bazar...

Si vous réglez cela (je vous laissez réfléchir à comment incrémenter les secondes), vous pouvez grouper les tests

  if (seconde >= 60) {
    seconde = 0;
    if (++minute >= 60) {
      minute = 0;
      if (++heure >= 24) {
        heure = 0;
      }
    }
  }

j'ai essayer en mettant seconde = millis()/1000 % 60; à la place de seconde = millis()/1000 mais maintenant le problème c'est que les minutes n'augmente pas.

  seconde = millis()/1000 % 60;
  if (seconde >= 60) {
    seconde = 0;
    minute++;
    if (minute >= 60) {
      minute = 0;
      heure++;
      if (heure >= 24) {
        heure = 0;
      }
    }
  }

J'ai aussi essayer en faisant

  seconde = millis()/1000 % 60;
  if (seconde >= 60) {
    seconde = 0;
    if (++minute >= 60) {
      minute = 0;
      if (++heure >= 24) {
        heure = 0;
      }
    }
  }

Mais il y a le même problème. Et la je ne voit pas comment faire car si je met 60.5 au lieu de 60 il me dit que ca marche pas.

pas surprenant puisque le modulo retourne une valeur entre 0 et 59. Donc, c'est plutôt le passage à 0 de la seconde qui devrait incrémenter les minutes.

vu les délais de votre code, il vaudrait mieux calculer pour les secondes le ∆t (la différence de temps) entre la dernière consultation et le moment du test. il se peut que vous ayez à ajouter 2 secondes éventuellement

Sinon une solution simple c'est de convertir millis() directement en heure/min/seconde depuis l'allumage de l'Arduino.

Merci beaucoup pour votre aide, j'ai réussi et j'ai fait comme cella:

seconde = millis()/1000 % 60;
  if(etatTV == false)
  {
    lcd.clear(); 
    lcd.print(heure);
    lcd.print(":");
    lcd.print(minute);
    lcd.print(":");
    lcd.print(seconde);
    delay(500);
  }
  
  if (seconde == 59) {
    seconde = 0;
    delay(1000);
    minute++;
    if (minute >= 60) {
      minute = 0;
      heure++;
      if (heure >= 24) {
        heure = 0;
      }
    }
  }

comme ca via des bouton je pourrais modifier les minutes et les heures.

Par contre je trouve pas comment fermer le sujet.

Avec le delay(1000) ça ne va pas être très réactif.
Il vaudrait mieux utiliser millis() pour rythmer l'exécution et par exemple passer dans la routine de traitement du temps toutes les 100 ou 200ms et le reste du temps suivre l'état des boutons.