[Résolu] lcd et heur

comme j'avais rien a faire je me suis amuser a faire sa pour me familiariser avec le lcd 16*2
et le rtc ds1307

//librairie

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

//comfiguration

LiquidCrystal lcd(11,10,5,4,3,2);
RTC_DS1307 RTC;
DateTime Clock; 

byte heurval, minuteval, secondeval; 

void setup(){
  
  Serial.begin(9500); 
  Wire.begin();
  RTC.begin();

   if (! RTC.isrunning()) {

   }

}
   
   
void loop() {
  Clock = RTC.now();
    secondeval = Clock.second();  
    minuteval = Clock.minute(); 
    heurval = Clock.hour(); 
     
    lcd.begin(16,2); // utilisation d'un écran 16 colonnes et 2 lignes
   
   lcd.write(secondeval);
   lcd.print(minuteval);
   lcd.print (heurval);



    Serial.print(heurval, DEC);
   Serial.print(':');
  Serial.print(minuteval, DEC);
   Serial.print(':');
   Serial.println(secondeval, DEC);
  }

j'ai 6 problème et une question

P1 l'écrand clignote rapidement ~~j'ai déplacer lcd.begin(16,2);dans void setup ~~
P1' j'ai lheur qui safhiche 4fois (a la suite et par moment il devien fou) rajout de lcd .setCursor (,);

P2 il n'affiche pas le temps rtc mal brancher
P3 quand je regarde le com le temps ne défile pas rtc mal brancher
P4les seconde me font apparaître 123456789:;§"# (et d'autre signe a la place des seconde) j'ai remplacer write par print
P5 j'ai lheur du rtc qui est pas a lheur
Q1 quel est la différence entre lcd.write et lcd.print les deux alaire de marcher
par raport a P4 il y a une difference mes quoi

Pour P5 : un module RTC est souvent équipé d'une pile qui permet de retenir des choses en mémoire : l'heure, la date, des réveils, etc. Il faut juste l'initialiser une première fois et ensuite, plus rien à faire.

Pour cela, tu as souvent un programme dans la bibliothèque qui le fait, par exemple : DS1307. Dans le setup, tu décommentes cette ligne :

    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

A la compilation, l'heure et la date seront envoyées à la RTC qui se mettra à jour automatiquement.

Ensuite, ce n'est plus nécessaire, dans ton code tu n'as plus qu'à consulter ta RTC comme tu le fais déjà.

Q1 quel est la différence entre lcd.write et lcd.print

Les collègues pourront confirmer, car je ne maîtrise pas trop, mais je crois que LCD.write envoie d l'ASCII, alors que LCD.print envoie les données selon le type (int, char, byte, float, etc)

par rapport à P4 il y a une différence mais quoi

Ben oui, P4 est barrée. :grin:

write(): considère que les paramètres sont des codes ASCII et les envoie directement vers le périphérique sans aucun formattage
print(): met en forme le contenu de la variable pour le rendre humainement interprétable

Exemple
unsigned int maVar = 0x4130;
char[] maChaine = "AB"

0x41 est le code ASCII du caractère A
0x30 est le code ASCII du caractère 0

write(maVar); affichera la chaine 0 (le chiffre zéro, en effet write attend un byte en paramètre)
write(maVar,2); affichera la chaine A0
print(maVar); affichera 16688 la valeur numérique de la variable

write(maChaine); affichera la chaine AB
print(maChaine); affichera la chaine AB

En règle générale,
on utilise print pour des informations "lisibles"
on utilise write pour envoyer des commandes vers l'organe d'affichage. Par exemple pour envoyer des commandes de redéfinition des caractères utilisateur de l'afficheur LCD (au cas où la librairie ne le gérerait pas)

oui ce qui est barrer cest ce que j'ai trouver par moi méme ^^j’arrive de mieux en mieux XD je vais changer ma description juste par noob je crois ^^

j'ai changer le code sa marche ou presque

//librairie

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>


//comfiguration

LiquidCrystal lcd(11, 10, 5, 4, 3, 2);
RTC_DS1307 RTC;
DateTime Clock;

byte heurval, minuteval, secondeval;
//char daysOfTheWeek [ 7 ] [ 12 ] = { " dimanche " , " lundi " , " mardi " , " mercredi " , " jeudi " , " vendredi " , " samedi " };


void setup() {

  Serial.begin(9500);
  Wire.begin();
  RTC.begin();

  RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));





  lcd.begin(16, 2); // utilisation d'un écran 16 colonnes et 2 lignes
}


void loop() {


  Clock = RTC.now();




  secondeval = Clock.second();
  minuteval = Clock.minute();
  heurval = Clock.hour();

  if (heurval > 11) heurval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
  heurval = (heurval * 60 + minuteval) / 12;


  lcd.setCursor  (0, 0);
  lcd.print(heurval);
  lcd.setCursor  (2, 0);
  lcd.print(":");
  lcd.setCursor  (3, 0);
  lcd.print(minuteval);
  lcd.setCursor (5, 0);
  lcd.print(":");
  lcd.print(secondeval);
  lcd.setCursor  (0, 1);


  Serial.print(heurval, DEC);
  Serial.print(':');
  Serial.print(minuteval, DEC);
  Serial.print(':');
  Serial.println(secondeval, DEC);
}

il est actuellement 15:32:30
il affiche 17:32:30 (il y a quelque minute il étais a 16H sa a changer sens reson
le format est HdHu :MdMu:SdSd

( d = dizaine u = unité )
par exemple sur l'aficheur sa fait sa

17:30:58
17:30:59
17:30:09
17:30:19
17:30:29
17:30:39
17:30:49
17:30:59
17:30:69
17:30:79
17:30:89
17:30:99
17:30:10
17:30:11
17:30:12

comme si quand il y a 0 a Sd Su prend sa place et le dernier chiffre de Su reste en mémoir ou il étais avent et sa reprend normalement quand sd !0

et aussi sa prend quel heur l’osque on compile j'ai changer l'heur de mon pc pour voir si sa fait pareil a 01:09:50 mes sa garde lheur réel pas de l'ordi

BON pour lui il est actuellement 19H53 le temps passe si vite que sa :')

sur le rtc on dois brancher la broche sqw ??(la SDA et SCL sont sur communication SDA et SCL)

aufaite sa le fait a tous les endrois ou il y a 0 au dizaine

Ton problème de différence d'heure vient de cette ligne :

heurval = (heurval * 60 + minuteval) / 12;

Elle te sert pour l'anneau de leds à connaitre le numéro de la led des heures. Mais elle prend en compte les minutes car l'aiguille des heures se déplace pendant les 60 minutes d'une heure. Tu vois ce que je veux dire ?

  • A 15h00, l'aiguille est sur le 3
  • A 15h15, elle est un peu plus bas
  • A 15h30, elle est au milieu du 3 et du 4
  • A 15h45 elle est plus proche du 4
  • A 15h59, elle est presque sur le 4
    Donc tu ne dois pas afficher cette valeur mais la "vraie heure". Deux possibilités (si tu gardes les leds bien sûr) :
    heurled = (heurval * 60 + minuteval) / 12;Tu crées une autre variable pour les leds.

Sinon, tu affiches l'heure sur le LCD avant de faire ce calcul pour les led...

Concernant l'affichage, ton problème vient du fait que pour les chiffres inférieurs à 10, il faut mettre en 0 devant. Voici ce que je te propose :

  char mytime[9];
  sprintf(mytime,"%02d:%02d:%02d",heurval, minuteval, secondeval);
  lcd.print(mytime);

Pour le branchement, si tu as plusieurs périphériques I2C, tu les branches en parallèle.

Au fait, une fois que tu l'as fait tourner, tu peux commenter la ligne

RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));

C'est pas grave de la laisser, ça remet l'horloge à l'heure à chaque compilation, mais tu peux aussi l'enlever.

Par contre, tu devrais investir dans une RTC DS3231, car la DS1307 dérive assez rapidement (quelques secondes par jour). DS3231 : 1€ et quelques en Chine (plus un Corona virus gratuit...)

ludocraft:
sur le rtc on dois brancher la broche sqw ??

Non, cette sortie permet de sortir un signal interne à la RTC (généralement à des fins de test)

a si le Corona est offert je prend XD

sinon la derive de quelque seconde et linéaire ?? exemple 3seconde par jour

si oui on peux pas juste calculer de combien et dire que chaque 24 enlever X seconde

bon sur ceux je vais essayer de trouver tous seule pour quoi les unité prend la place des dizaine quand les dizaine sont a 0 si je trouve ou trouve un truc qui m'avance ou trouve pas je revien ici ^^

Regarde mon message numéro 5

Je ne sais pas si c'est linéaire, mais l'autre RTC est bien meilleure

j'étais chaux pour essayer un truc mes enfaite c'est mieux comme tu a fait mes tu peux m'éspliquer comment sa marche ^^

char mytime[9];
tu crée une variable mytime mes sa fait quoi les [] cest comme()

sprintf(mytime,"%02d:%02d:%02d",heurval, minuteval, secondeval);
%c'est modulo (je connais pas tros mes je sais que c'est le reste d'une division mes 02d: sa fait quoi ??

lcd.print(mytime);
çà sa imprime le résultat de mytime

Les [] servent à définir un tableau, ici un tableau de 9 caractères. Compte ce que tu veux écrire pour l'heure et ajoute un caractère à la fin du tableau pour mettre un 0. Ça fait 9. Le 0 sert à dire au compilateur que le tableau s'arrête là, il se met tout seul, pas la peine de le faire. Il faut juste y penser quand on calcule la taille du tableau.

sprintf écrit des choses dans un tableau de caractères, selon un format bien précis, que l'on met entre ".

Un format commence par le caractère %, pour écrire un entier il se termine par un d et le 02 indique que je veux l'écrire sur 2 caractères avec un 0 s'il y a de la place (donc pour les chiffres inférieurs à 10)

Si tu Google sprintf c format tu devrais trouver plus d'explications.

merci demain je m'attaque a la date ^^

100 eme méssage plus la limite de 5 minute entre 2 message 8)

je reviens plus tot car fini avec la date tous marche ALLELUIA

mes j'ai 2 question (je remet pas tous le code juste ce qui est nouveau)

  secondeval = Clock.second();
  minuteval = Clock.minute();
  heurval = Clock.hour();
 int jourval = Clock.day(); 
 int moisval = Clock.month ();
 int anneeval = Clock.year ();

et

 lcd.setCursor (0,1);
  lcd.print(jourval);
  lcd.print("/");
  lcd.print(moisval);
  lcd.print("/");
  lcd.print(anneeval);

pour quoi sur jour mois année je dois métre un int (ou autre) devant (sinon il veux pas exemple "'jourval' was not declared in this scope
") alore que heur minute seconde sa marche sens

et je supose que sa

lcd.setCursor (0,1);
lcd.print(jourval);
lcd.print("/");
lcd.print(moisval);
lcd.print("/");
lcd.print(anneeval);

je peux le remplacer par un truc comme pour l'heur

pour la première j'ai trouver elle étais déclarer en byte j'ai fait

int heurval, minuteval, secondeval, jourval, moisval, anneeval;

As-tu affiché le contenu de mydate ? Que valent les 3 variables ?

j'ai pas u le temps de suprimer mon message tu avais deja répondu ^^

cets juste lcd.print que je me suis tromper

lcd.print (mydate)

jai fait

lcd.print (mytime)

a la place

Ok

dernier question et aprés normalement j'ai fini peux t-on faire un décalage de X seconde j'ai remarquer que entre le téléversement ( heur réel et l'affichage il y a un décalage de -5 seconde

Regarde dans les instructions de la bibliothèque s'il est possible d'ajouter quelques secondes à l'heure.