minuteur sans tout bloquer

Bonjour,

J'aimerais faire un décomptage en même temps que d'autres choses
Mais le problème et que le décomptage bloc tout
ci joint le code pour le minuteur

#include <LiquidCrystal.h>

 

int minutes = 0; 
int seconds = 5; 
 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 

void loop() {
 lcd.begin(16, 2);
 
 while (minutes > 0 || seconds >= 0) {
 
 lcd.setCursor(4, 2);
 

 (minutes < 10) ? lcd.print("0") : NULL;
 lcd.print(minutes);
 lcd.print(":");
 (seconds < 10) ? lcd.print("0") : NULL;
 lcd.print(seconds);
 lcd.display();
 stepDown();
 delay(1000);
 }
}
 
void stepDown() {
 if (seconds > 0) {
 seconds -= 1;
 } else {
 if (minutes > 0) {
 seconds = 59;
 minutes -= 1;
 } else {
 trigger();
 }
 }
 }

 
void trigger() {
 lcd.clear(); 
 lcd.setCursor(5, 1); 
 
 lcd.println("FINI");
 delay(1000);
 
 lcd.display();
}

Faut-il utiliser millis() ?
comment faire pour le faire décompter sans tout bloquer ?

merci d'avance

Oui il faut utiliser millis()

lire les tutos d'eskimon et en particulier celui qui concerne "introduire le temps"

et ce type de code c'est très moche(minutes < 10) ? lcd.print("0") : NULL;un bon vieux if est beaucoup plus propreif (minutes < 10)  lcd.print("0");

Un LCD c'est assez lent, donc il est aussi bien de ne penser à mettre à jour que les chiffres qui ont changé

Salut

Ton code ne compilera pas sans fonction setup().

void setup() {
  lcd.begin(16, 2);
}

lcd.begin est bien entendu à retirer de loop()

Les lignes lcd.display() sont inutiles. C'est déjà fait dans lcd.begin().

  // lcd.println("FINI");
  lcd.print("FINI");    // print et non pas println

  // delay(1000);       // inutile
  // lcd.display();      // inutile

Ensuite tu peux t'inspirer de l'exemple BlinkWithoutDelay pour utiliser millis().

@+

merci beaucoup,

Sinon , a la fin de mon programme j'aimerais tout stopper et juste afficher sur le lcd "FINI" et le (totaltouches) une variable.
Comment faire ?

const int Pushbutton = 4; //bouton-poussoir connecté à la broche D4
const int laser = 3; //LED connectée à la broche D7
int value = 0;     // Variable pour lire l'état du bouton-poussoir

long minutes = 0;
long secondes = 0;










int sensorPin = A0;
int sensorPin1 = A1;
int sensorPin2 = A2;
int sensorPin3 = A3;
int sensorPin4 = A4;
int sensorPin5 = A5;
int sensorPin6 = A6;
int sensorPin7 = A7;

int sensorValue = 0;
int a = 30;
int totaltouches = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


void setup() {
  Serial.begin (9600);


  pinMode (laser, OUTPUT);
  pinMode (Pushbutton, INPUT);

  pinMode(sensorPin, INPUT);
  pinMode(sensorPin1, INPUT);
  pinMode(sensorPin2, INPUT);
  pinMode(sensorPin3, INPUT);
  pinMode(sensorPin4, INPUT);
  pinMode(sensorPin5, INPUT);
  pinMode(sensorPin6, INPUT);
  pinMode(sensorPin7, INPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(2, OUTPUT); /////vibreur




  lcd.begin(16, 2);

  lcd.print("tirs restants");
  lcd.setCursor(0, 1);
  lcd.print(a);




  lcd.setCursor(11, 1);
  lcd.print("00");
}




void loop() {



  secondes = millis() / 1000; //convect millisecondes en secondes
  minutes = secondes / 60; //convertir secondes en minutes
  secondes = secondes - (minutes * 60);

  lcd.setCursor(14, 1);
  lcd.print(secondes);
  lcd.setCursor(11, 1);
  lcd.print(minutes);
  lcd.setCursor(13, 1);
  lcd.print(":");

  int totaltemps;


  String stringOne = " nb touche: ";
  String stringThree = stringOne + totaltouches;

  totaltemps = minutes * 60 + secondes;
  if (totaltemps == 60)
  {
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print("***** Fini *****");
    lcd.setCursor(0, 1);
    lcd.print(stringThree);
  }







  ///////////BOOUTON//////////////

  value = digitalRead(Pushbutton); //Lire l'état du bouton-poussoir
  if (value == LOW) //Si le bouton est appuyé
  {
    delay(10); //10 milliseconds anti-rebond
    if (value == LOW) //vérifier encore so le bouton est toujours appuyé
    {
      digitalWrite(laser, HIGH); //LED est allumée
      delay(400); //pause de 5 Second



      a = a - 1;
      lcd.setCursor(0, 1);
      lcd.print("        ");
      lcd.setCursor(0, 1);
      lcd.print(a);



      digitalWrite(laser, LOW); //LED est éteinte

    }
  }


  //////

  if (a == 0) {
    lcd.clear();
    lcd.print("**  recharge  **");
    digitalWrite(6, HIGH);
    digitalWrite(5, HIGH);
    delay(400);
    digitalWrite(6, LOW);
    delay(400);
    digitalWrite(6, HIGH);
    delay(400);
    digitalWrite(6, LOW);
    delay(400);
    digitalWrite(6, HIGH);
    delay(400);
    digitalWrite(5, HIGH);
    delay(400);
    digitalWrite(6, LOW);
    delay(400);
    digitalWrite(5, HIGH);
    delay(400);
    digitalWrite(6, LOW);
    delay(400);
    digitalWrite(5, HIGH);
    delay(400);
    digitalWrite(6, LOW);
    delay(400);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    lcd.clear();
    a = 20;
    lcd.print("tirs restants");
    lcd.setCursor(0, 1);
    lcd.print(a);

  }


  ////////////compteur/////////////







  if (analogRead(sensorPin) >= 90 || analogRead(sensorPin1) >= 90 || analogRead(sensorPin2) >= 90 || analogRead(sensorPin3) >= 90 || analogRead(sensorPin4) >= 90 || analogRead(sensorPin5) >= 90 || analogRead(sensorPin6) >= 90 )
  {
    delay(20);

    value = HIGH;
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(2, HIGH);
    totaltouches = totaltouches + 1;







    lcd.setCursor(0, 0);
    lcd.print("on vous a tuer !");
    lcd.setCursor(0, 1);
    lcd.print(" 7");
    delay(1000);
    digitalWrite(2, LOW);

    lcd.print("                 ");


    lcd.setCursor(0, 0);
    lcd.print("on vous a tuer !");
    lcd.setCursor(0, 1);
    lcd.print(" 6");
    delay(1000);
    digitalWrite(2, HIGH);

    lcd.print("                 ");




    lcd.setCursor(0, 0);
    lcd.print("on vous a tuer !");
    lcd.setCursor(0, 1);
    lcd.print(" 5");
    delay(1000);
    digitalWrite(2, LOW);

    lcd.print("                 ");

    lcd.setCursor(0, 0);
    lcd.print("on vous a tuer !");
    lcd.setCursor(0, 1);
    lcd.print(" 4");
    delay(1000);
    digitalWrite(2, HIGH);
    lcd.print("                 ");

    lcd.setCursor(0, 0);
    lcd.print("on vous a tuer !");
    lcd.setCursor(0, 1);
    lcd.print(" 3");
    delay(1000);
    digitalWrite(2, LOW);
    lcd.print("                 ");

    lcd.setCursor(0, 0);
    lcd.print("on vous a tuer !");
    lcd.setCursor(0, 1);
    lcd.print(" 2");
    delay(1000);
    digitalWrite(2, HIGH);
    lcd.print("                 ");

    lcd.setCursor(0, 0);
    lcd.print("on vous a tuer !");
    lcd.setCursor(0, 1);
    lcd.print(" 1");
    delay(1000);
    lcd.clear();


    digitalWrite(2, HIGH);

    delay(100);
    digitalWrite(2, LOW);
    delay(100);
    digitalWrite(2, HIGH);
    delay(100);
    digitalWrite(2, LOW);
    delay(100);
    digitalWrite(2, HIGH);
    delay(100);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(2, LOW);

    lcd.print("tirs restants");
    lcd.setCursor(0, 1);
    lcd.print(a);

  }









}

Il y a déjà ce qu'il faut dans ton code, non ?

  String stringOne = " nb touche: ";
  String stringThree = stringOne + totaltouches;

  // puis plus loin :
    lcd.print(stringThree);

A moins de disposer d'un gros micocontrôleur avec beaucoup de RAM, évite la classe String.

    lcd.print(" nb touche: ");
    lcd.print(totaltouches);

Avec un code bourré de delay() dans tous les coins je ne vois pas comment tu peux maîtriser la durée d'exécution de la loop().

Il est impossible que ton test fonctionne :

  if (totaltemps == 60)     // impossible
  if (totaltemps >= 60)     // à la rigueur

Bonjour, merci pour votre réponse
En fait, quand le temps est dépassé (ici 60 secondes), l’écran LCD m'affiche fini mais le laser fonctionne toujours, les photorésistance aussi, tout le reste fonctionne quand même
De plus sur le lcd au lieu d'afficher le nombre de touches , il m'affiche le temps qui continue
Comment arrêter tout cela ?

Là on déborde largement du sujet initial.
Essaie de placer des Serial.println() pour afficher des informations sur le déroulement de ton programme.

Comme cela est fait au début de la loop :

  Serial.println(totaltemps);

@+