Décompte sur écran LCD I2C

Bonjour,

Je me permet d'écrire ce sujet car je n'ai pas trouvé la solution à mon problème sur le forum.

Je suis en train de créer un projet de feux rouges, avec écrans qui indiquent le temps restant à attendre.
Pour ce faire, j'utilise deux écrans LCD avec interface I2C.

Cependant, le problème est que je n'arrive pas à réaliser de décompte...
Le but serait que l'écran affiche "10, 9, 8,... secondes restantes."

Voici mon code :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd_1(0x26,16,2); 
LiquidCrystal_I2C lcd_2(0x27,16,2); 

int counter;

void setup() 
{
 Serial.begin(9600);
 lcd_1.init(); 
 lcd_2.init();
 int temps = millis();
}
void loop()
{
  lcd_1.init(); 
  lcd_1.cursor_on();
  lcd_1.blink_on();
  lcd_1.backlight();
  lcd_1.setCursor(0,0);
  lcd_1.print("10");
  lcd_1.println(" secondes");
  lcd_1.setCursor(0,1);
  lcd_1.print("restantes");
  delay(1000);  
  lcd_1.cursor_off();
  lcd_1.blink_off();
 
 lcd_2.init(); 
 lcd_2.cursor_on();
 lcd_2.blink_on();
 lcd_2.backlight();
 lcd_2.setCursor(0,0);
 lcd_2.print(" secondes");
 lcd_2.setCursor(0,1);
 lcd_2.print("restantes");
 delay(1000);  
 lcd_2.cursor_off();
 lcd_2.blink_off();
 delay(5000);
}

Voilà,
J'espère que quelqu'un saura ce qu'il faut faire... C'est assez important, je dois réaliser ce travail dans le cadre de mes études.

Merci à tous ! :wink:

 lcd_1.print("10");

Avec cette ligne tu écris 10, mais si tu veux changer la valeur, tu dois utiliser une variable pas une valeur fixe.

J'ai réécris ton code en utilisant ta variable 'counter' :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd_1(0x26, 16, 2);
LiquidCrystal_I2C lcd_2(0x27, 16, 2);

int counter;
unsigned long temps = 0;

void setup()
{
  Serial.begin(9600);
  lcd_1.init();
  lcd_1.cursor_on();
  lcd_1.blink_on();
  lcd_1.backlight();
  lcd_2.init();
  lcd_2.cursor_on();
  lcd_2.blink_on();
  lcd_2.backlight();
  temps = millis();
  counter = 10;
}
void loop()
{
  lcd_1.setCursor(0, 0);
  lcd_1.print(counter);
  lcd_1.print(" secondes");
  lcd_1.setCursor(0, 1);
  lcd_1.print("restantes");

  delay(1000);
  --counter ;
  if (counter < 0) counter = 10;
}

J'ai aussi enlevé le second affichage, car je ne sais pas ce que tu veux en faire. Tu peux ajouter ce que tu veux pour lui.
Le décompte reprend à 10 quand il passe à 0 : si tu veux qu'il reste à 0, change juste ceci :

  if (counter < 0) counter = 0;

Enfin, tu crées une variable 'temps' que tu initialises avec millis, mais tu ne l'utilises pas. Si tu veux que ton code fasse autre chose (bouton, capteur, etc) tu en auras besoin, donc je l'ai laissée pour la suite. Mais sinon, tu peux l'enlever.

Merci beaucoup pour ton aide !

En fait j'avais mis "10" parce que je ne trouvais pas comment on faisait pour enlever 1 toutes les secondes...

Le deuxième affichage servira à faire la même chose mais je ne sais pas si je dois mettre le même code...
En gros j'aurais mon feu rouge qui sera allumé, mon écran écrira le temps d'attende restant, puis le feu sera vert et là le deuxième écran pour le feu en face interviendra...

Du coup je suppose que je dois faire comme ça :

void setup()
{
  Serial.begin(9600);
  lcd_1.init();
  lcd_1.cursor_on();
  lcd_1.blink_on();
  lcd_1.backlight();
  lcd_2.init();
  lcd_2.cursor_on();
  lcd_2.blink_on();
  lcd_2.backlight();
  temps = millis();
  counter = 10;
}
void loop()
{
  lcd_1.setCursor(0, 0);
  lcd_1.print(counter);
  lcd_1.print(" secondes");
  lcd_1.setCursor(0, 1);
  lcd_1.print("restantes");

  delay(1000);
  --counter ;
  if (counter < 0) counter = 10;
  
  lcd_2.setCursor(0, 0);
  lcd_2.print(counter);
  lcd_2.print(" secondes");
  lcd_2.setCursor(0, 1);
  lcd_2.print("restantes");

  delay(1000);
  --counter ;
  if (counter < 0) counter = 10;

}

Mais à mon avis il va y avoir un problème à ce niveau... Le décompte ne fonctionnera plus :neutral_face:

Il te faut deux variables, une pour chaque décompte.
Lorsque le premier décompte est terminé, tu lances le second, lorsque le second est terminé tu relances le premier, etc. Il te faudra donc des 'if'

Ok, merci bien !
Je vais travailler sur ce code... Je reviendrai vers vous au besoin.

Encore un tout grand merci, vous m'aidez bcp !

Il te faudra donc des 'if'

Ce n'est pas mieux utiliser deux 'for' dans ce cas?

for (counter=10; counter < 0; counter--)

lesept:
Il te faut deux variables, une pour chaque décompte.
Lorsque le premier décompte est terminé, tu lances le second, lorsque le second est terminé tu relances le premier, etc. Il te faudra donc des 'if'

lesept:

 lcd_1.print("10");

Avec cette ligne tu écris 10, mais si tu veux changer la valeur, tu dois utiliser une variable pas une valeur fixe.

J'ai réécris ton code en utilisant ta variable 'counter' :

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd_1(0x26, 16, 2);
LiquidCrystal_I2C lcd_2(0x27, 16, 2);

int counter;
unsigned long temps = 0;

void setup()
{
  Serial.begin(9600);
  lcd_1.init();
  lcd_1.cursor_on();
  lcd_1.blink_on();
  lcd_1.backlight();
  lcd_2.init();
  lcd_2.cursor_on();
  lcd_2.blink_on();
  lcd_2.backlight();
  temps = millis();
  counter = 10;
}
void loop()
{
  lcd_1.setCursor(0, 0);
  lcd_1.print(counter);
  lcd_1.print(" secondes");
  lcd_1.setCursor(0, 1);
  lcd_1.print("restantes");

delay(1000);
  --counter ;
  if (counter < 0) counter = 10;
}



J'ai aussi enlevé le second affichage, car je ne sais pas ce que tu veux en faire. Tu peux ajouter ce que tu veux pour lui.
Le décompte reprend à 10 quand il passe à 0 : si tu veux qu'il reste à 0, change juste ceci :


if (counter < 0) counter = 0;



Enfin, tu crées une variable 'temps' que tu initialises avec millis, mais tu ne l'utilises pas. Si tu veux que ton code fasse autre chose (bouton, capteur, etc) tu en auras besoin, donc je l'ai laissée pour la suite. Mais sinon, tu peux l'enlever.

J'ai enfin essayé ton code, malheureusement je ne sais pas pourquoi mais il ne fonctionne pas... Pourtant, pas d'erreur de compilation ou de téléversement.

J'ai enfin essayé ton code, malheureusement je ne sais pas pourquoi mais il ne fonctionne pas...

Que veux-tu dire par là ? Que se passe-t-il et en quoi est-ce différent de ce que tu veux ?

C'est un code simplifié qui devrait afficher le décompte sur un seul afficheur.

Je veux dire par là que rien ne s'affiche sur l'écran. :frowning:

Bonjour,

Tu es sur que tu regardes sur le bon lcd?

Essaies d'inverser les deux lcd

LiquidCrystal_I2C lcd_1(0x27, 16, 2);
LiquidCrystal_I2C lcd_2(0x26, 16, 2);

Et j'ai ce code là auquel je dois intégrer mes 2 écrans LCD i2C...

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd_1(0x26,16,2); 
LiquidCrystal_I2C lcd_2(0x27,16,2); 
int counter;

 const int R1=7;
 const int J1=8;
 const int V1=9;
 const int R2=6; 
 const int J2=5;
 const int V2=4;

void setup() 
{
 pinMode(R1,OUTPUT);
 pinMode(J1,OUTPUT);
 pinMode(V1,OUTPUT);
 pinMode(R2,OUTPUT);
 pinMode(J2,OUTPUT);
 pinMode(V2,OUTPUT);
 lcd_1.init(); 
 lcd_2.init();
 Serial.begin(9600);
 lcd_1.cursor_on();
 lcd_1.blink_on();
 lcd_1.backlight();
 lcd_2.cursor_on();
 lcd_2.blink_on();
 lcd_2.backlight();
}

void loop() 
{
 digitalWrite(R2,LOW);
 digitalWrite(J2,LOW);
 digitalWrite(J1,LOW);
 digitalWrite(V1,LOW);
 digitalWrite(R1,HIGH);
 digitalWrite(V2,HIGH);
 delay(6000);               
 digitalWrite(R1,HIGH);
 delay(500);
 digitalWrite(J2,HIGH);
 digitalWrite(R2,LOW);
 digitalWrite(V1,LOW);        
 digitalWrite(V2,LOW);
 digitalWrite(J1,LOW);
 delay(2000);    
 digitalWrite(R2,HIGH);         
 digitalWrite(V1,HIGH);
 digitalWrite(R1,LOW);
 digitalWrite(J1,LOW);
 digitalWrite(J2,LOW);
 digitalWrite(V2,LOW);
 delay(6000);      
 digitalWrite(R2,HIGH);
 digitalWrite(V1,HIGH);
 delay(500);
 digitalWrite(V1,LOW);
 digitalWrite(J1,HIGH);      
 digitalWrite(J2,LOW);
 digitalWrite(R1,LOW);
 digitalWrite(V2,LOW);
 delay(2000);              
}

kamill:
Bonjour,

Tu es sur que tu regardes sur le bon lcd?

Essaies d'inverser les deux lcd

LiquidCrystal_I2C lcd_1(0x27, 16, 2);

LiquidCrystal_I2C lcd_2(0x26, 16, 2);

J'ai les deux LCD de branchés et j'ai essayé de faire comme tu as dit mais toujours rien ne s'affiche.

Voilà,
J'ai retravaillé le code mais la je suis bloqué au niveau du décompte...

Quelqu'un sait ce que je dois écrire pour que "counter" diminue toutes les secondes dans mon code ?

Le code :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd_1(0x26,16,2); 
LiquidCrystal_I2C lcd_2(0x27,16,2); 
int counter;

 const int R1=7;
 const int J1=8;
 const int V1=9;
 const int R2=6; 
 const int J2=5;
 const int V2=4;

void setup() 
{
 pinMode(R1,OUTPUT);
 pinMode(J1,OUTPUT);
 pinMode(V1,OUTPUT);
 pinMode(R2,OUTPUT);
 pinMode(J2,OUTPUT);
 pinMode(V2,OUTPUT);
 lcd_1.init(); 
 lcd_2.init();
 Serial.begin(9600);
 lcd_1.cursor_on();
 lcd_1.blink_on();
 lcd_1.backlight();
 lcd_2.cursor_on();
 lcd_2.blink_on();
 lcd_2.backlight();
}

void loop() 
{
 if(R1=HIGH)
 {
  lcd_1.setCursor(0,0);
  lcd_1.print("Wait")
  lcd_1.setCursor(0,1);
  lcd_1.print(counter);
  lcd_1.println("sec.");
 }
 else
 {
  lcd_2.setCursor(0,0);
  lcd_2.print("Wait")
  lcd_2.setCursor(0,1);
  lcd_2.print(counter);
  lcd_2.println("sec.");
 }
 digitalWrite(R2,LOW);
 digitalWrite(J2,LOW);
 digitalWrite(J1,LOW);
 digitalWrite(V1,LOW);
 digitalWrite(R1,HIGH);
 digitalWrite(V2,HIGH);
 delay(6000);               
 digitalWrite(R1,HIGH);
 delay(500);
 digitalWrite(J2,HIGH);
 digitalWrite(R2,LOW);
 digitalWrite(V1,LOW);        
 digitalWrite(V2,LOW);
 digitalWrite(J1,LOW);
 delay(2000);    
 digitalWrite(R2,HIGH);         
 digitalWrite(V1,HIGH);
 digitalWrite(R1,LOW);
 digitalWrite(J1,LOW);
 digitalWrite(J2,LOW);
 digitalWrite(V2,LOW);
 delay(6000);      
 digitalWrite(R2,HIGH);
 digitalWrite(V1,HIGH);
 delay(500);
 digitalWrite(V1,LOW);
 digitalWrite(J1,HIGH);      
 digitalWrite(J2,LOW);
 digitalWrite(R1,LOW);
 digitalWrite(V2,LOW);
 delay(2000);              
}

AlexB_channel:
J'ai les deux LCD de branchés et j'ai essayé de faire comme tu as dit mais toujours rien ne s'affiche.

Pas la peine d'essayer d'aller plus loin si rien ne s'affiche.
Essayes le lancer un scanner I2C pour voir si tes deux lcd sont bien reconnus.

Merci, j'ai essayé le scanner, il m'indique qu'il n'y a pas d'écran I2C... pourtant les cablâges me parraissent bons.

C'est quoi comme carte arduino?

...et quelles références d'écran (achetés où? photos? datasheet?)

kamill:
C'est quoi comme carte arduino?

lesept:
...et quelles références d'écran (achetés où? photos? datasheet?)

C'est une arduino Nano, écran acheté sur Amazon.fr (dans le kit ELEGOO) et adaptateurs I2C je ne sais pas d'où viennent-ils...

Mais pour le scanner maintenant il me dit qu'il y a les écrans 0x26 et 0x27 donc c'est bon.
Par contre le code ne veut pas se compiler alors que j'ai choisi le bon type de carte...

Il m'indique "erreur de compilation pour la carte Arduino Nano".

Bon je laisse de côté ça pour aujourd'hui, j'y retravaillerai demain matin.

Dans l'attente de votre réponse,
Un tout grand merci d'avance

Cordialement,
Alex'B channel.

hello
if(R1=HIGH) =>R1 est la désignation numérique d'une pinoche de sortie tu ne peux pas lui donner une valeur.par contre, tu peux lire une sortie et tester sa valeur

if((digitalRead(R1))==HIGH)

lcd_1.print("Wait") => manque un ;
lcd_2.print("Wait") => idem
lcd_1.println("sec."); => pas de ln avec le lcd
lcd_2.println("sec."); => idem
j'ai testé avec un seul lcd en 3E. je te laisse remettre tes lignes en service ( elles sont commentées //).

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd_1(0x26,16,2);
LiquidCrystal_I2C lcd_1(0x3E,16,2);
LiquidCrystal_I2C lcd_2(0x27,16,2);
int counter=0;

 const int R1=7;
 const int J1=8;
 const int V1=9;
 const int R2=6;
 const int J2=5;
 const int V2=4;

void setup()
{
 pinMode(R1,OUTPUT);
 pinMode(J1,OUTPUT);
 pinMode(V1,OUTPUT);
 pinMode(R2,OUTPUT);
 pinMode(J2,OUTPUT);
 pinMode(V2,OUTPUT);
 //lcd_1.init();
 //lcd_2.init();
 lcd_1.begin();
 lcd_2.begin();
 //Serial.begin(9600);
 Serial.begin(115200);
 lcd_1.cursor_on();
 lcd_1.blink_on();
 lcd_1.backlight();
 lcd_2.cursor_on();
 lcd_2.blink_on();
 lcd_2.backlight();
}

void loop()
{
counter++;
 if((digitalRead(R1))==HIGH)
 {
  lcd_1.setCursor(0,0);
  lcd_1.print("Wait");
  lcd_1.setCursor(0,1);
  lcd_1.print(counter);
  lcd_1.print("sec.");
 }
 else
 {
  lcd_2.setCursor(0,0);
  lcd_2.print("Wait");
  lcd_2.setCursor(0,1);
  lcd_2.print(counter);
  lcd_2.print("sec.");
 }
 digitalWrite(R2,LOW);
 digitalWrite(J2,LOW);
 digitalWrite(J1,LOW);
 digitalWrite(V1,LOW);
 digitalWrite(R1,HIGH);
 digitalWrite(V2,HIGH);
 delay(6000);               
 digitalWrite(R1,HIGH);
 delay(500);
 digitalWrite(J2,HIGH);
 digitalWrite(R2,LOW);
 digitalWrite(V1,LOW);       
 digitalWrite(V2,LOW);
 digitalWrite(J1,LOW);
 delay(2000);   
 digitalWrite(R2,HIGH);         
 digitalWrite(V1,HIGH);
 digitalWrite(R1,LOW);
 digitalWrite(J1,LOW);
 digitalWrite(J2,LOW);
 digitalWrite(V2,LOW);
 delay(6000);     
 digitalWrite(R2,HIGH);
 digitalWrite(V1,HIGH);
 delay(500);
 digitalWrite(V1,LOW);
 digitalWrite(J1,HIGH);     
 digitalWrite(J2,LOW);
 digitalWrite(R1,LOW);
 digitalWrite(V2,LOW);
 delay(2000);             
}