[RESOLU] Affichage heure DS3231

Bonjour,

Mon problème est je pense simple.

J’ai mon code (ci dessous) pour afficher l’heure reçu par le DS3231 jusque là rien de très compliqué.

#include <Wire.h>
#include <ds3231.h>
struct ts t;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  DS3231_init(DS3231_INTCN);
}
 
void loop() {
  DS3231_get(&t);
  Serial.print("Heure :");
  Serial.print(t.hour);
  Serial.print(":");
  Serial.print(t.min);
  Serial.print(":");
  Serial.println(t.sec);
}

Maintenant le problème c’est que les variables que je voudrais qu’il m’affiche soit au format 00:00:00.
Donc quand admettons les secondes sont en dessous de 9 il m’affiche 09.

Autre contrainte je ne veux pas que ce soit juste de l’affichage, je veux que ma variable contienne 09.

Merci pour votre temps

Bonjour,

Il y a plusieurs façons de faire.
Par exemple:

void loop() {
  DS3231_get(&t);
  Serial.print("Heure :");
  if (t.hour< 10)
    Serial.print('0');
  Serial.print(t.hour);
  Serial.print(":");
  if (t.min < 10)
    Serial.print('0');
  Serial.print(t.min);
  Serial.print(":");
  if (t.sec < 10)
    Serial.print('0');
  Serial.println(t.sec);
}

Le problème de cette méthode c'est que c'est juste de l'affichage, alors que je voudrais que ce soit stocké de cette façon dans une variable.

Pour quelle raison tu souhaites conserver cette forme dans une mémoire ?
Je m'avance peut être mais cette forme "09" implique un format texte et donc s'il doit y avoir des calculs par la suite ils seront bien compliqués => il faudra repasser en format nombre.

Oui j'avais pensé à un format texte, il n'y aura pas de calcul c'est surtout pour envoyer dans des trames UDP vers une application Android qui l'affichera voir même la régler.

Donc si c'est pas trop demandé j'aimerais connaitre la solution pour passer cette variable au format texte puis l'inverse pour la remettre au format int ou autre.

Mon truc c'est le matériel, le code je le laisse a des plus compétents en la matière.
Le C/C++ possède des fonctions de manipulation de chaine texte
Attention ==> il n'existe pas de langage Arduino , c'est uniquement du C et du C++

Ici par exemple :
http://www.cplusplus.com/reference/cstring/

C'est là que je vais quand j'ai une question.

michaelcentenico:
Le problème de cette méthode c'est que c'est juste de l'affichage, alors que je voudrais que ce soit stocké de cette façon dans une variable.

Comme 68tjs, je ne vois pas bien l'intérêt de la chose.
Si tu veux vraiment le faire tu peux utiliser sprintf()

 // création d'une chaine par variable
  char sHour[3];
  char sMin[3];
  char sSec[3];

  sprintf(sHour,"%02d",t.hour);
  sprintf(sMin,"%02d",t.min);
  sprintf(sSec,"%02d",t.sec);

  // creation de la chaine globale
  char str[20];
  sprintf(str,"Heure: %02d:%02d:%02d",t.hour,t.min,t.sec);

Je complète les liens :
Conversion integer vers alphanumérique :
https://www.cplusplus.com/reference/cstdlib/itoa/

Conversion alphanumérique vers integer :
https://www.cplusplus.com/reference/cstdlib/atoi/

Attention ce sont des fonctions non standard, il faut vérifier qu'elles sont dans l'avr-gcc ==> je n'en sais rien.

kamill:
Comme 68tjs, je ne vois pas bien l'intérêt de la chose.
Si tu veux vraiment le faire tu peux utiliser sprintf()

 // création d'une chaine par variable

char sHour[3];
  char sMin[3];
  char sSec[3];

sprintf(sHour,"%02d",t.hour);
  sprintf(sMin,"%02d",t.min);
  sprintf(sSec,"%02d",t.sec);

// creation de la chaine globale
  char str[20];
  sprintf(str,"Heure: %02d:%02d:%02d",t.hour,t.min,t.sec);

Parfait ça marche comme je le voulais.

Merci pour votre aide