Enregistrement date et heure avec 2 chiffres

Bonjour à tous,

J'ai un programme qui me permet de récupérer des températures / humidités et je souhaite ensuite les stocker sur une carte SD avec la date et l'heure 'acquisition.
Le soucis c'est que, par exemple, si on est le 12/01/2022 ou qu'il est 14h01, ca va enregistrer:
12/1/2022 et 14:1

Après je galère à traiter ce format heure.
Il faudrait que j'obtienne aaaa/mm/jj hh:mm

Sauriez-vous comment je peux réussir à remédier à ca ??

Merci beaucoup !!!!
:pray:



#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include <ds3231.h> //Librairie à installer
#include "DHT.h"    //Librairie à installer

 * Affectation des broches
#define CS_PIN 10 // arduino UNO
#define DHTPIN 2
#define DHTTYPE DHT22

 * Création des instances
File monFichier1;

DHT monDHT(DHTPIN, DHTTYPE);
struct ts t; // module RTC

 * Initialisation
 
void setup()
{
  Serial.begin(9600);
  //monRTC.begin();
  monDHT.begin();
  Wire.begin();
  DS3231_init(DS3231_INTCN);

  Serial.print("Initialisation de la carte SD en cours...");
  if (SD.begin())
  {
    Serial.println(" Terminee.");
  } else
  {
    Serial.println(" Echec.");
    return;
  }  
  monFichier1 = SD.open("donnees.csv", FILE_WRITE);
  if (monFichier1) 
  {   
    monFichier1.println("Jour,Heure,Temperature,Humidite");
    Serial.println("");
    Serial.println("Jour  |   Heure  | Temperature | Humidite");
    monFichier1.close();    
  } 
}

 * Boucle Infinie
 
void loop()
{  
  // mesure humidité et température.
  float humidite = monDHT.readHumidity();
  float temperature = monDHT.readTemperature();
  
  // Date et Heure
  DS3231_get(&t);
  String temps = String(t.mday);
    String annee = String(t.year);
    String mois = String(t.mon);
    String heure = String(t.hour);
    String minu = String(t.min); 
    String sec = String(t.sec);    


  // On met en forme la donnée au formar csv séparé par une virgule.
  String donnee = annee + "/"+ mois + "/" + temps + " , " + heure+ ":" + minu + "," + String(temperature) + "," + String(humidite);

  // On enregistre les donnéees
  monFichier1 = SD.open("donnees.csv", FILE_WRITE); //Maximum 8 caractères avant le .csv
  if (monFichier1) 
  {   
    monFichier1.println(donnee);
//    Serial.println(" " + temps + " |    " + String(temperature)+ "    |   " + String(humidite));
    Serial.println(" " + annee + "/"+ mois + "/" + temps + " " + heure+ ":" + minu    + " |    " + String(temperature)+ "    |   " + String(humidite));

    monFichier1.close();    
  } 
  else 
  {
    Serial.println("Impossible d'ouvrir le fichier");
  }  
    delay(900000); //pas de temps de 15mn
}


:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”


ne faites pas des String... ça sert à rien et vous prend de la mémoire

vous pouvez écrire une petite fonction qui fait l'impression d'un 0 si la valeur est inférieure à 10

void imprimeSurDeuxDigits(uint8_t valeur) {
  if (valeur < 10) Serial.write('0');
  Serial.print(valeur);
}

ça donnerait un truc comme cela (pour sortie sur la console série)

#include <ds3231.h> //Librairie à installer
struct ts t; // module RTC

void imprimeSurDeuxDigits(uint8_t valeur) {
  if (valeur < 10) Serial.write('0');
  Serial.print(valeur);
}

void setup() {
  Serial.begin(9600);
  DS3231_init(DS3231_INTCN);
}

void loop()
{
  DS3231_get(&t);
  imprimeSurDeuxDigits(t.hour);
  Serial.write(':');
  imprimeSurDeuxDigits(t.min);
  Serial.write(':');
  imprimeSurDeuxDigits(t.sec);
  Serial.println();
  delay(1000); // attente bloquante de 1s
}

vous pouvez écrire de la même manière en plusieurs fois dans le fichier, pas la peine de bâtir la chaîne complète en mémoire

sinon vous pouvez utiliser snprintf() (mais ça prend plus de mémoire)

Salut

Merci pour ta réponse ! C'est une super idée cette fonction, une bonne astuce !! Merci beaucoup.

Est-ce que je eux me permette de te demander un petit complément...
Je ne comprends pourquoi, j'ai essayé pas mal de trucs mais je n'arrive pas à enregistrer les valeurs en ligne aaaa/mm/jj hh:mm dans la carte SD.
Pourrais me montrer ce qu'il faut faire stp.

Merci beaucoup !!!!

c'est vraiment une séquence de print

  DS3231_get(&t);
  float humidite = monDHT.readHumidity();
  float temperature = monDHT.readTemperature();

  fichier = SD.open("donnees.csv", FILE_WRITE);
  if (fichier)   {   
    fichier.print(t.year);     fichier.write('/');
    fichier.print(t.month);    fichier.write('/');
    fichier.print(t.day);     
    fichier.write('\t'); // une tabulation pour la séparation

    if (t.hour < 10) fichier.write('0');   
    fichier.print(t.hour);      fichier.write(':');
    if (t.min < 10) fichier.write('0');   
    fichier.print(t.min);
    fichier.write('\t'); // une tabulation pour la séparation

    fichier.print(temperature,1);  // 1 chiffre après la virgule
    fichier.write('\t'); // une tabulation pour la séparation

    fichier.println(humidité,0);  // (juste la partie entière) println et non pas print pour ajouter le passage à la ligne

    fichier.close();    
  } 

Mais bien-sur ... ohlala pourquoi toujours chercher compliqué !

Merci beaucoup de ton aide, ca fonctionne parfaitement, je peux commencer mon étude :wink:

Bonne continuation