Rafraichissement LCD i2c millis();

Bonjour,

Je travail sur un projet de alerteur/compteur de temps qui comprend :

RTC
SD
Ecran LCD en i2c
Shield GSM

Un click sur un switch envoi un SMS, Affiche le compteur en Heures et Minutes, fait clignoter la led du switch…
Un second click arrête le compteur, Affiche le total cumulé, enregistre sur la EEPROM et sur la SD.

J’ai du mal à partir uniquement lorsque qu’il y a plusieurs compteurs en meme temps avec l’affiche du LCD.

Je souhaite qu’il affiche :

le compteur 1 (qui s’incrémente) puis au bout de 5 seconde
le compteur 2 (qui s’incrémente) puis au bout de 5 seconde
le compteur 4 (qui s’incrémente) puis au bout de 5 seconde retour 1

Après moult tentative je tourne en rond ahah
Voici ma fonction en question :

void LCDCF0124()
{
   unsigned long currentMillislcd1 = millis();
   unsigned long currentMillislcd2 = millis();
   unsigned long currentMillislcd4 = millis();
   


if(currentMillislcd1 - previousMillislcd1 >  5000 && currentMillislcd1 - previousMillislcd1 < 10000)
{
 LCDCF01();
} // Fin de millis1
if(currentMillislcd2 - previousMillislcd2 > 10000 && currentMillislcd2 - previousMillislcd2 < 15000)
{
 LCDCF02();
} // Fin de millis2
 else if(currentMillislcd4 - previousMillislcd4 > 15000 && currentMillislcd4 - previousMillislcd4 < 20000)
{
 LCDCF04();
} // Fin de millis4
 else
 {
    previousMillislcd1 = currentMillislcd1;
    previousMillislcd2 = currentMillislcd2; ////////////////////////// A FINIR  !!!!
    previousMillislcd4 = currentMillislcd4;
    
 }
} // Fin LCDCF0124 !

Pas simple millis(); :confused:

hello
et si tu prenais le problème à l'envers

void LCDCF0124()
{
   unsigned long currentMillislcd1 = millis();
   unsigned long currentMillislcd2 = millis();
   unsigned long currentMillislcd4 = millis();

if(currentMillislcd4 - previousMillislcd4 >20000  )
  {
    previousMillislcd1 = currentMillislcd1;
    previousMillislcd2 = currentMillislcd2; ////////////////////////// A FINIR  !!!!
    previousMillislcd4 = currentMillislcd4;
    
  }
  else
    {
      if(currentMillislcd4 - previousMillislcd4 > 15000  )
        {
        LCDCF04();
        } // Fin de millis4
      else
        {
          if(currentMillislcd2 - previousMillislcd2 > 10000 )
            {
            LCDCF02();
            } // Fin de millis2
          else 
            {
              if(currentMillislcd1 - previousMillislcd1 >  5000 )
                {
                LCDCF01();
                } // Fin de millis1
            }
        }
    }
}// Fin LCDCF0124 !

Merci pour ta réponse !!

Ca fonctionne ! Mais il faut que je trouve qqch pour ne rafraichir le LCD quand si les compteurs on changé plutôt que de le rafraichir en permanence et afficher toujours la meme chose.. Je vais ajouter des changements d'états.. Ca devient de plus en plus dur ahah

J'espère avoir le temps ce weekend pour étudier ça plus en profondeur..

A+

Hello dfgh,

Après "enquête", j'ai un souci avec le if de LCDCF04();

En fait LCDCF01 et LCDCF02 reste bien affiché 5 seconde comme prévu mais LCDCF04 reste affiché 10 secondes ?? et si je ne me trompe pas le rafraichissement de LCDCF04 s'arrête à 5 sec mais l'affichage continu encore 5 sec soit 10 en tout !!

J'ai du mal à comprendre.. :confused:

c’est normal, je suis reparti de ton prg

ce que je t’ai codé fait ce que voulait faire ton prg
mais celui ci ne voulait peut etre pas faire ce que toi tu voulais

C'est la que ma compréhension de millis et les routines previous/current m'échappent..

Du coup, pour faire ça :

Affichage du compteur 1 qui s'incrémente pendant 5 seconde puis
Affichage du compteur 2 qui s'incrémente pendant 5 seconde puis
Affichage du compteur 4 qui s'incrémente pendant 5 seconde puis retour compteur 1...

j'ai besoin de rajouter une 4ème routine de temps ? :confused:

precise ce que doit faire ton prg
pendant les 5 premières secondes il raffraichit l'affichage lcd1?
puis de 5 à 10 il raffraichit l'affichage lcd2?
puis de 10 à 15 il raffraichit l'affichage de lcd4?

et bien sur pour tout ces raffraichissements, c'est seulement si le compteur correspondant à été modifié ?

Absolument !
J'ai rajouter entre temps rafraichissement uniquement si différent.

de 0 à 5 sec affichage lc1
de 5 à 10 sec affichage lcd2
de 10 à 15 sec affichage lcd4

puis à nouveau lcd1..

hello,c’est un truc comme ça qu’il te faut

unsigned long currentMillislcd1  = millis();
unsigned long currentMillislcd2  = millis();
unsigned long currentMillislcd4  = millis();
unsigned long previousMillislcd1 = currentMillislcd1;
unsigned long previousMillislcd2 = currentMillislcd2;
unsigned long previousMillislcd4 = currentMillislcd4;
int compteur1=0;
int compteur2=0;
int compteur4=0;

int memo_compteur1=0;
int memo_compteur2=0;
int memo_compteur4=0;
void setup() {
  // ici il faut mettre les pinMode, le serial et les pullup
}

void loop() 
{
  LCDCF0124();
}

void LCDCF0124()
{
   currentMillislcd1 = millis();
   currentMillislcd2 = millis();
   currentMillislcd4 = millis();

if(currentMillislcd4 - previousMillislcd4 > 15000  )
  {
    previousMillislcd1 = currentMillislcd1;
    previousMillislcd2 = currentMillislcd2;
    previousMillislcd4 = currentMillislcd4;
    
  }
  else
    {
      if(currentMillislcd4 - previousMillislcd4 > 10000  )
        {
          if(memo_compteur4 < compteur4)
                {
                LCDCF04();memo_compteur4 = compteur4;
                } 
        } // Fin de millis4
      else
        {
          if(currentMillislcd2 - previousMillislcd2 > 5000 )
            {if(memo_compteur2 < compteur2)
                {
                LCDCF02();memo_compteur2=compteur2;
                } 
            } // Fin de millis2
          else //ici, c'est forcement inférieur à 5000
            {
              if(memo_compteur1 < compteur1)
                {
                LCDCF01();memo_compteur1 = compteur1;
                } // Fin de millis1
            }
        }
    }
}// Fin LCDCF0124 !

void LCDCF01()
{
  //affichage sur LCD1
}
void LCDCF02()
{
  //affichage sur LCD2
}
void LCDCF04()
{
  //affichage sur LCD4
}

Hello merci pour ton aide,

après de multiples essais, mais je n'arrive pas a faire ce que je veux même en intégrant ta partie de code. :confused:
Je comprends le principe de ce que je veux faire, je comprends aussi ton code mais je suis bloqué.

hello
charge ce prg dans ton micro et regarde ton LCD. puis étudie le prg

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

unsigned long currentMillislcd1  = millis();
unsigned long currentMillislcd2  = millis();
unsigned long currentMillislcd4  = millis();
unsigned long previousMillislcd1 = currentMillislcd1;
unsigned long previousMillislcd2 = currentMillislcd2;
unsigned long previousMillislcd4 = currentMillislcd4;
int compteur1=1;
int compteur2=1;
int compteur4=1;

int memo_compteur1=0;
int memo_compteur2=0;
int memo_compteur4=0;
void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
    
        lcd.setCursor(0, 0); lcd.print("Pret ?");
       
}

void loop() 
{
  LCDCF0124();
}

void LCDCF0124()
{
   currentMillislcd1 = millis();
   currentMillislcd2 = millis();
   currentMillislcd4 = millis();

if(currentMillislcd4 - previousMillislcd4 > 15000  )
  {
    previousMillislcd1 = currentMillislcd1;
    previousMillislcd2 = currentMillislcd2;
    previousMillislcd4 = currentMillislcd4;
    lcd.setCursor(0, 0); lcd.print("raz ");
    lcd.setCursor(10, 0); lcd.print("      ");
    lcd.setCursor(0, 1); lcd.print("         ");
    
compteur1++;//pour simuler l'appui sur le BP
compteur2++;//pour simuler l'appui sur le BP
compteur4++;//pour simuler l'appui sur le BP

    
  }
  else
    {
      if(currentMillislcd4 - previousMillislcd4 > 10000  )
        {lcd.setCursor(10, 0); lcd.print(currentMillislcd4 - previousMillislcd4);
          if(memo_compteur4 < compteur4)
                {
                LCDCF04();memo_compteur4 = compteur4;
                } 
        } // Fin de millis4
      else
        {
          if(currentMillislcd2 - previousMillislcd2 > 5000 )
            {lcd.setCursor(10, 0); lcd.print(currentMillislcd2 - previousMillislcd2);
              if(memo_compteur2 < compteur2)
                {
                LCDCF02();memo_compteur2=compteur2;
                } 
            } // Fin de millis2
          else //ici, c'est forcement inférieur à 5000
            {lcd.setCursor(10, 0); lcd.print(currentMillislcd1 - previousMillislcd1);
              if(memo_compteur1 < compteur1)
                {
                LCDCF01();memo_compteur1 = compteur1;
                } // Fin de millis1
            }
        }
    }
}// Fin LCDCF0124 !

void LCDCF01()
{
  //affichage sur LCD1
   lcd.setCursor(0, 1); lcd.print("routine 1");
}
void LCDCF02()
{
  //affichage sur LCD2
  lcd.setCursor(0, 1); lcd.print("routine 2");
}
void LCDCF04()
{
  //affichage sur LCD4
  lcd.setCursor(0, 1); lcd.print("routine 4");
}

Génial !
J'intègre mon code dessus dans la semaine !!!
Un grand merci !!!!
La fonction millis() est pas simple à mettre en place même si le principe est relativement simple !