Remplacer la fonction delay() dois-je utiliser millis()?

Bonjour, j'ai une arduino Mega 2560 un afficheur lcd et un lecteur RFID-RC522.
Je voudrais lorsque mon radar passe en alarme et que mon groupe ''K1'' est en service lancer une temporisation affiché sur le LCD. Tout fonctionne sauf que avec delay cela bloque mon programme et lorsque je passe mon badge pour arrêter la tempo cela ne fonctionne pas, j'ai fait plusieurs essais avec Millis mais je ne vois pas comment le placer et peut être existe t-il une autre fonction pour ce fonctionnement?

if ((radar_1>900)&&(radar_1<942))
{ 
  if (k==1)
  {  
      tone(buzzer, 4000, 1000);               //BUZZ 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       15");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");
      delay(1000) ;                          //TEMP 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       14");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");
      if (k==1)
      {
      delay(500) ;                           //TEMP 0.5sec
      tone(buzzer, 4000, 1000);              //BUZZ 1sec
      delay(500) ; 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       13");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(1000);
      tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       12");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
            delay(1000) ;                          //TEMP 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       11");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(500) ;                           //TEMP 0.5sec
      tone(buzzer, 4000, 1000);              //BUZZ 1sec
      delay(500) ; 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       10");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(1000);
      tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       9");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
            delay(1000) ;                          //TEMP 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       8");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(500) ;                           //TEMP 0.5sec
      tone(buzzer, 4000, 1000);              //BUZZ 1sec
      delay(500) ; 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       7");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(1000);
      tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       6");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
            delay(1000) ;                          //TEMP 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       5");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(500) ;                           //TEMP 0.5sec
      tone(buzzer, 4000, 1000);              //BUZZ 1sec
      delay(500) ; 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       4");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(1000);
      tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       3");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
            delay(1000) ;                          //TEMP 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       2");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      if (k==1)
      {
      delay(500) ;                           //TEMP 0.5sec
      tone(buzzer, 4000, 1000);              //BUZZ 1sec
      delay(500) ; 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       1");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
      delay(1000);
  tone(buzzer,HIGH); 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" ALARME RADAR 1");
  lcd.setCursor(0, 1);
  lcd.print("BADGE OU CODE");
  delay(1500);
  }
}

Voila ce que j'ai fait en millis :confused: :confused: :(:frowning: mais ça fonctionne pas:

void loop()
{
int present = millis();
//****************************************************RADAR 1 TEMPORISE***************************************************************
radar_1 = analogRead (5);
Serial.println (temps) ;
if ((radar_1>900)&&(radar_1<942))
{ 
  if (k==1)
  {delay (1000);
  {  temps = present;}
  if ( (temps < present )&& (k==1))
  {   tone(buzzer, 4000, 1000);               //BUZZ 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       15");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +1000 < present )&& (k==1)) 
   {   lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       14");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +1500 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);  }            //BUZZ 1sec
   if ( (temps +2000 < present )&& (k==1))  
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       13");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +3000 < present )&& (k==1))  
      {tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       12");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +4000 < present )&& (k==1))  
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       11");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +4500 < present )&& (k==1))  
     { tone(buzzer, 4000, 1000); }             //BUZZ 1sec
   if ( (temps +5000 < present )&& (k==1))   
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       10");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +6000 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       9");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +7000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       8");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +7500 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000); }             //BUZZ 1sec
   if ( (temps +8000 < present )&& (k==1))  
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       7");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +9000 < present )&& (k==1)) 
     { tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       6");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +10000 < present )&& (k==1)) 
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       5");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +10500 < present )&& (k==1)) 
     { tone(buzzer, 4000, 1000);}              //BUZZ 1sec
   if ( (temps +11000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       4");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +12000 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       3");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +13000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       2");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +13500 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);}              //BUZZ 1sec
   if ( (temps +14000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       1");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
  if ( (temps +15000 < present )&& (k==1)) 
 { tone(buzzer,HIGH); 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" ALARME RADAR 1");
  lcd.setCursor(0, 1);
  lcd.print("BADGE OU CODE");
  delay(1500);
  }
}}

Lorsque la condition est remplie vous mémorisez le fait que le message est affiché dans une variable, disons messageAlerte = true; affichez le message et et mémorisez millis().

En début de loop() vous testez messageAlerte et s'il est actif alors vous testez si le temps d'affichage est écoulé. si oui, vous effacez et mettez messageAlerte = false;

ça pourrait ressemble à cela (ici j'efface tout l'écran, vous pouvez gérer comme vous voulez bien sûr)

uint32_t chronoAlerte;
const uint32_t periodeAlerte = 5000ul; // affichage pendant 5 secondes
boolean messageAlerte = false;

void setup()
{
  ...
}

void loop()
{
  // a-t-on un message d'alerte à gérer ?
  if (messageAlerte) {
    // si oui, est-ce le moment de l'effacer ?
    if (millis() - chronoAlerte >= periodeAlerte) {
      lcd.clear();
      messageAlerte = false;
    }
  }


  ...
  ... ici ce que vous faites normalement dans votre programme, mais faut que ça aille vite
  ...


  // à la fin
  if (radar passe en alarme et que mon groupe ''K1'' est en service) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(F("ALERTE ROUGE !"));
      messageAlerte = true;
      chronoAlerte = millis();
  }
}

mais cela dit avec tous les délais que vous avez ailleurs dans le code, vous n'allez pas être super réactif... à mon avis faut tout revoir...c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

J'avais vu votre post mais je n'y arrive pas. Je l'ai modifié en m'inspirant de votre message... Mais je doit mal le mettre en application

int present = millis();
//****************************************************RADAR 1 TEMPORISE***************************************************************
radar_1 = analogRead (5);
Serial.println (present) ;
if (((radar_1>900)&&(radar_1<942))&&(l==0))
{ 
  if (k==1)
  {{  temps = present;
     l=1;
  }
  if ( (temps < present )&& (k==1))
  {   tone(buzzer, 4000, 1000);               //BUZZ 1sec
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       15");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +1000 < present )&& (k==1)) 
   {   lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       14");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +1500 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);  }            //BUZZ 1sec
   if ( (temps +2000 < present )&& (k==1))  
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       13");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +3000 < present )&& (k==1))  
      {tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       12");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +4000 < present )&& (k==1))  
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       11");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +4500 < present )&& (k==1))  
     { tone(buzzer, 4000, 1000); }             //BUZZ 1sec
   if ( (temps +5000 < present )&& (k==1))   
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       10");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +6000 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       9");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +7000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       8");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +7500 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000); }             //BUZZ 1sec
   if ( (temps +8000 < present )&& (k==1))  
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       7");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +9000 < present )&& (k==1)) 
     { tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       6");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +10000 < present )&& (k==1)) 
     { lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       5");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +10500 < present )&& (k==1)) 
     { tone(buzzer, 4000, 1000);}              //BUZZ 1sec
   if ( (temps +11000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       4");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +12000 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       3");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +13000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       2");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
   if ( (temps +13500 < present )&& (k==1)) 
      {tone(buzzer, 4000, 1000);}              //BUZZ 1sec
   if ( (temps +14000 < present )&& (k==1)) 
      {lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("       1");            //AFFICH 
      lcd.setCursor(0, 1);
      lcd.print("BADGE OU CODE");}
  if ( (temps +15000 < present )&& (k==1)) 
 { tone(buzzer,HIGH); 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" ALARME RADAR 1");
  lcd.setCursor(0, 1);
  lcd.print("BADGE OU CODE");
  l=0;
  delay(1500);
  }
}}

déjà ça commence mal avec

int present = millis();

millis() est unsigned long. un int ça peut compter que jusqu'à 32767 donc à la 33ème seconde votre variable present va passer négative...

ensuite il y a des accolades bizarres

  if (k == 1)  
  {{ temps = present;
      l = 1;
    }

que voulez vous vraiment avoir dans le test si k vaut 1?

le code n'est pas complet, je ne sais pas ce qu'est temps donc difficile à commenter

Le code fait plus de 900 Caractères :frowning:

Je voudrais avoir

=>si le radar 1 est dans la plage de tension ''alarme''
=>si le groupe ''k'' est à 1 donc armer (Le k est armer plus bas par un badge autorisé)
=> toute les secondes afficher le décompte sur le lcd si le groupe ''K'' est toujours à 1, et le buzzer
sonne 1 sec toutes les 1,5secondes
=> Si aucun badge n'a était passé pour mettre "k" à 0 au bout de 15 secondes le buzzer retentit
différemment et affichage d'une alarme au lcd

anthonyrob:
Le code fait plus de 900 Caractères :frowning:

vous pouvez en poster 9000 :slight_smile: ou attacher le programme

je pense qu'il vous faut une machine à état pour simplifier la reflexion

Ah oui mince j'ai mal lu :sweat_smile: :sweat_smile:

The message exceeds the maximum allowed length (9000 characters).

Le code fait plus de 9000 cara

Je connais pas une machine à état :slight_smile: :slight_smile:

@antonyrod
Tu n'as pas fais ce qui t'était demandé par Al1fch.

Il ne t'as pas demandé de mettre des messages partout dans le forum mais d'utiliser le lien "Report to moderator" pour faire DÉPLACER le message initial.

Utilise le lien "Report to moderator" pour faire suprimer le doublon qui est dans "Réalisation et produit finis".

Merci.

anthonyrob:
Je connais pas une machine à état :slight_smile: :slight_smile:

cf mon post #2 à la fin, vous avez un lien sur un tuto :slight_smile:

J'ai demandé à ce qu'il soit supprimé :wink:
merci

Pour le code :

vous pouvez en poster 9000 :) ou attacher le programme

donc pour vous vu la taille , le code est à attacher en fichier joint (cliquer sur Attachments and other options, puis avec le bouton Parcourir sélectionner le fichier à envoyer , puis cliquer sur Save.)

J-M-L je comprends pas comment basculer en machine d'état... :-X
Pourtant c'est pas faute de chercher.
Si vous avez possibilité de me faire un exemple avec mon cas...
Désolé :-[ :-[

Mettez votre projet de côté et faites mon tuto en entier - en le réalisant - et comprenez chaque ligne

Une fois que vous avez bien compris le principe, décrivez votre projet sous formes d’états, d’évènements possibles et de transitions

Ok :wink: merci

Qu’est ce qui met le « groupe « K1'' est en service » ?
Qu’est-ce qui le mettra hors service ?
Ce sont des évènements

Apparement vous avez un système de badge - la présentation d’un badge est un événement

Vous avez un radar qui détecte quelque chose - c’est un événement

Vous avez des fonctions liées au temps, donc le temps qui passe et atteint une certaine durée c’est un événement

Quoi d’autre ?

Quel est l’état de départ. Quels sont les évènements qui peuvent se produire alors ? ça change quoi à votre système ? Dans ce nouvel état Quels sont les évènements qui peuvent se produire alors ? ça change quoi à votre système ?
De proche en proche vous allez décrire vos états et les conditions des transitions entre ces états