LCD problème programme

Bonjour , je voudrais afficher sur un écran lcd 1602 l’heure ainsi qu’un peu de texte.
J’ai le programme suivant

#include <Wire.h>
#include "DS1307.h"
#include "rgb_lcd.h"

rgb_lcd lcd;
DS1307 clock;
void setup()
{
    Serial.begin(9600);
    clock.begin();
    clock.fillByHMS(16,30,00);
    clock.setTime();
}
void loop()
{
    printTime();
    lcd.setCursor(0,0);
    lcd.print("depart du train");
    lcd.setCursor(0,1);
    lcd.print("16h31   ");
    delay(60000);
    lcd.setCursor(0,0);
    lcd.print("arivee du train ");
    lcd.setCursor(0,1);
    lcd.print("16h33   ");
    delay(120000);
    lcd.setCursor(0,0);
    lcd.print("train en gare   ");
    delay(60000);
    lcd.setCursor(0,0);
    lcd.print("arivee du train ");
    lcd.setCursor(0,1);
    lcd.print("16h36   ");
    delay(5000);
}

void printTime()
{
    
    lcd.setCursor(8,1);
    clock.getTime();
    lcd.print(clock.hour, DEC);
    lcd.print(":");   
    lcd.print(clock.minute, DEC);
    lcd.print(":");
    lcd.print(clock.second, DEC);
    lcd.print("  ");   
    delay(1000);

}

il ne m’affiche pas l’heure car il affiche d’abord la partie texte , je voudrais savoir le moyen de faire afficher l’heure et le texte en même temps. Comment faire ?

Si il affiche l'heure. C'est même la première chose qu'il fait en entrant dans loop(). Seulement après, tu attends un peu plus de 4 minutes avant de changer l'heure.
Est-ce vraiment ça que tu veux faire?

C'est sa , il m'affiche 16h30 puis je passe à 16h34 au bout de 4 min.
Ce que moi je veut c'est voir défiler l'heure avec les secondes c'est à dire 16:30:01 ,, 16:30:02 etc...

Bonjour,

Il faut que tu supprimes les delay() en utilisant millis() car les delay() vont bloquer complètement le programme donc l'affichage.

j'ai remplacer les delay() par des millis() et il y a quelques choses qui ne va pas, voila ce qu'Arduino m'affiche ;

programme_final.ino: In function 'void loop()':
programme_final:21: error: expected unqualified-id before '.' token
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:105: error: too many arguments to function 'long unsigned int millis()'
programme_final:26: error: at this point in file
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:105: error: too many arguments to function 'long unsigned int millis()'
programme_final:29: error: at this point in file
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:105: error: too many arguments to function 'long unsigned int millis()'
programme_final:34: error: at this point in file
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h: In function 'void printTime()':
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:105: error: too many arguments to function 'long unsigned int millis()'
programme_final:48: error: at this point in file

Mets ton code

Mon code c’est le même que celui du début juste avec des millis() a la place des delay() du coup on a

#include <Wire.h>
#include "DS1307.h"
#include "rgb_lcd.h"

rgb_lcd lcd;
DS1307 clock;
void setup()
{
    Serial.begin(9600);
    clock.begin();
    clock.fillByHMS(16,30,00);
    clock.setTime();
}
void loop()
{
    printTime();
    lcd.setCursor(0,0);
    lcd.print("depart du train");
    lcd.setCursor(0,1);
    lcd.print("16h31   ");
    millis(60000);
    lcd.setCursor(0,0);
    lcd.print("arivee du train ");
    lcd.setCursor(0,1);
    lcd.print("16h33   ");
    millis(120000);
    lcd.setCursor(0,0);
    lcd.print("train en gare   ");
    millis(60000);
    lcd.setCursor(0,0);
    lcd.print("arivee du train ");
    lcd.setCursor(0,1);
    lcd.print("16h36   ");
    millis(5000);
}

void printTime()
{
    
    lcd.setCursor(8,1);
    clock.getTime();
    lcd.print(clock.hour, DEC);
    lcd.print(":");   
    lcd.print(clock.minute, DEC);
    lcd.print(":");
    lcd.print(clock.second, DEC);
    lcd.print("  ");   
    millis(1000);

}

Utiliser millis() à la place de delay(), ce n'est pas simplement remplacer du texte. C'est faire une programmation qui modifie la structure du code.

Il te faut d'abord comprendre que delay bloque l'avancement du programme : si tu mets un delay(4000), le code ne fera rien pendant 4 secondes puis reprendra son exécution juste après cette instruction. On parle de 'code bloquant'.

Pour faire un code non bloquant, il faut modifier sa structure : la fonction millis() fournit le nombre de millisecondes passées depuis lancement du programme. Pour l'utiliser, il faut soit réfléchir un bon coup (!) soit s'inspirer d'exemples ou de tutos qu'on trouve un peu partout.

Un exemple : blink without delay. Il montre la manière d'utiliser millis() mais explique mal pourquoi...

Un bon tuto est disponible en anglais ici

millis() n'est pas l'équivalent de delay(). millis() ne prend pas d'arguments, mais retourne le nombre de millisecondes écoulées depuis le démarrage.

Il faut que tu fasses un mini automate.
Suivant le type d'affichage, tu fais tel ou tel affichage, tu affiches l'heure et quand millis() a atteint la valeur mémorisée au début d'affichage plus la durée tu changes d’affichage.

Je comprend mieux la différence entre delay() et millis() maintenant .

Donc je dois faire un nouveau programme??

Je ne comprend presque pas la langue anglaise ... Pouvez-vous me dire ce que je devrais modifier ?

un mini automate?
Vous pouvez me dire comment faire?

melih67:
Je ne comprend presque pas la langue anglaise ...

Google translate fais ça assez bien

Pour les automates, c'est

Ca pourrait ressembler à ça :

#include <Wire.h>
#include "DS1307.h"
#include "rgb_lcd.h"

rgb_lcd lcd;
DS1307 clock;
unsigned long chorono = 0;
unsigned int temps = 0;


void setup()
{
  Serial.begin(9600);
  clock.begin();
  clock.fillByHMS(16, 30, 00);
  clock.setTime();
  temps = clock.hour * 60 + clock.minute;
  chrono = millis();
}

void loop()
{
  if (millis() - chrono >= 1000ul) { // teste si une seconde est passée
    chrono = millis();
    clock.getTime(); // si oui affiche l'heure
    temps = clock.hour * 60 + clock.minute;
    printTime();
    if (temps = 16 * 60 + 31) { // s'il est 16h31
      lcd.setCursor(0, 0);
      lcd.print("depart du train  ");
      lcd.setCursor(0, 1);
      lcd.print("16h31   ");
    } else if (temps = 16 * 60 + 33) { // s'il est 16h33
      lcd.setCursor(0, 0);
      lcd.print("arrivee du train ");
      lcd.setCursor(0, 1);
      lcd.print("16h33   ");
    } else if (temps = 16 * 60 + 35) { // s'il est 16h35
      lcd.setCursor(0, 0);
      lcd.print("train en gare    ");
    } else if (temps = 16 * 60 + 36) { // s'il est 16h36
      lcd.setCursor(0, 0);
      lcd.print("arrivee du train ");
      lcd.setCursor(0, 1);
      lcd.print("16h36   ");
    }
  }
}

void printTime()
{
  lcd.setCursor(8, 1);
  lcd.print(clock.hour, DEC);
  lcd.print(":");
  lcd.print(clock.minute, DEC);
  lcd.print(":");
  lcd.print(clock.second, DEC);
  lcd.print("  ");
}

J'irai voir tout a l'heure pour le fonctionnement des automates merci

lesept , le programme fonctionne mais pour l'heure il ne me l'affiche pas correctement il reste figer sur "45:165:8" . Est-ce que c'est normal ?

La première chose à faire est de voir si ta DS1307 fonctionne.

Que faire s'il ne fonctionne pas?
En racheter un?
Débrancher/rebrancher la pile -un reset du pauvre-?
Le reinitialiser?
Prier?

melih67:
le programme fonctionne mais pour l'heure il ne me l'affiche pas correctement il reste figer sur "45:165:8" . Est-ce que c'est normal ?

A ton avis?
Il y a quelques minutes encore l'heure était modulo 24 et les minutes modulo 60 alors évidemment 45:165:8 ce n'est sans doute pas normal.

J'ai utiliser un programme pour scanner ce qu'il y a sur la base shield et effectivement il ne capter pas ma rtc , alors j'ai voulu enlever la pile et la remettre sauf qu'il ma détecter la rtc après avoir enlever la pile.

Donc cette fois l'heure tourne correctement mais le texte reste fixer .... (Il n'y a plus de pile je l'ai enlever).

est ce que c'est possible quand possible de finaliser ce programme sans pile?

Tu testes avec un exemple fourni dans la librairie

Si ça ne fonctionne pas tu vérifies le cablage
Tu retestes
Si ça ne fonctionne pas tu revérifies le cablage
Tu reretestes
Si ça ne fonctionne pas tu rerevérifies le cablage

Si ça ne fonctionne toujours pas tu essaies sans la pile
Si vraiment ça ne fonctionne pas tu peux en acheter un autre, mais ne prends pas un ds1307 mais un ds3231 beaucoup plus précis.

Oups je n'avais pas vu ton dernier message
Oui, il est possible de mettre ton programme au point sans pile, mais tu perdras l'heure si tu coupes le courant.

Le problème c'est que j'ai un budget limité et j'ai atteint la limite . Sinon on m'avais aussi proposer une ds3231 mais finalement j'ai du récupérer la ds1307 que j'ai emprunter sans rien payer...

C'est super bizarre car avec la pile il ne me détecte pas du tout la RTC donc je vais faire sans , ce n'est pas problématique pour moi de faire sans.

Donc si le texte reste fixer c'est pas une erreur dans le programme?

Change la fonction printtime par celle ci

void printTime()
{
  static bool tic = true;
  if (tic) Serial.print ("tic");
  else Serial.print ("tac") ;
  tic =! tic;
  lcd.setCursor(8, 1);
  lcd.print(clock.hour, DEC);
  lcd.print(":");
  lcd.print(clock.minute, DEC);
  lcd.print(":");
  lcd.print(clock.second, DEC);
  lcd.print("  ");
}

Est-ce que quelque chose s'affiche sur la console ?
Si oui, c'est que le problème vient de la RTC. S'il n'y a pas de pile, elle ne met pas l'heure à jour.