problem double affichage

bonjour voila je suis en train de faire un projet et j'ai besoin de deux écran lcd un qui affiche l'heure et l'autre défile un message. Le problem c'est que l'heure s'actualise que quand le message a fait son déroulement et je ne veux pas çà il me faut donc un multitache mais je ne sais pas comment faire.

voici mon code actuellement:

#include <DS3231.h>
#include <LiquidCrystal.h>

DS3231 rtc(SDA, SCL);
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
LiquidCrystal lcd2(36, 34, 32, 30, 28, 26);
void setup() {
rtc.begin();
lcd.begin(16,2);

lcd2.begin(16, 2);
// Print a message to the LCD.
lcd2.print("bonjour");

}
void loop() {
tim();
mes();

}

void tim () {

lcd.setCursor(0,0);
lcd.print("Time: ");
lcd.print(rtc.getTimeStr());

lcd.setCursor(0,1);
lcd.print("Date: ");
lcd.print(rtc.getDateStr());
rtc.setTime(24, 0, 0); // Set the time to 12:00:00 (24hr format)
rtc.setDate(8, 10, 2019);

}

void mes () {

{// scroll 13 positions (string length) to the left
// to move it offscreen left:
for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
// scroll one position left:
lcd2.scrollDisplayLeft();
// wait a bit:
delay(150);
}

// scroll 29 positions (string length + display length) to the right
// to move it offscreen right:
for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
// scroll one position right:
lcd2.scrollDisplayRight();
// wait a bit:
delay(150);
}

// scroll 16 positions (display length + string length) to the left
// to move it back to center:
for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
// scroll one position left:
lcd2.scrollDisplayLeft();
// wait a bit:
delay(150);
}

// delay at the end of the full loop:
delay(1000);
}
}

Tu affiches les secondes aussi ? Dans ce cas, ton code ne peut pas fonctionner car tu fais des delay dans la fonction de scroll qui sont supérieurs à une seconde.

Il faut que tu crées deux fonctions d'affichage simples, une qui affiche l'heure et une qui affiche un texte. Tu crées ensuite deux chronos, un qui compte jusqu'à une seconde et l'autre qui s'occupe de la temporisation de l'affichage du scroll, c'est a dire 150 ms dans ton cas.

Pour cela, tu utilises des variables globales déclarées en unsigned long

unsigned long chronoHeure;
unsigned long chronoScroll;

Tu les initialises avec millis à la fin du setup. Millis () renvoie le nombre de millisecondes écoulées depuis le début du programme

chronoHeure=millis () ;
chronoScroll=millis () ;

Puis tu vérifies dans la loop si les temps sont écoulés : 1000 ms dans un cas et 150 dans l'autre.

if (millis () - chronoHeure > 1000ul) {
 chronoHeure=millis () ;
 // ici lancer l'affichage de l'heure
}

Et pareil pour le scroll, mais il faut que tu fasses une fonction supplémentaire qui sélectionne les caractères à afficher.

if (millis () - chronoScroll> 150ul) {
 chronoScroll=millis () ;
  // Sélectionner les caractères à afficher
 // ici lancer l'affichage des caractères choisis
}

Sinon tu dois pouvoir utiliser des bibliothèques qui s'occuperont de la chronologie à ta place. Bricoleau en propose dans la section tutos.

dans un premier temps, avant de mettre en pratique tous les bons conseils de lesept, il fat modifier ta fonction mes() pour vurer les boucles for.
Le problème c'est qu'une boucle for est bloquante : tant qu'elle n'est pas terminée, ton arduino ne fait rien d'autre

il,faudrait faire un compteur qui s'incrémente à chaque passage, puis est remis à zéro quand il dépasse, comme l'index de la boucle for, mais qui du coup ne soit pas bloquant