Comment enregistrer des valeurs sur carte SD toutes les x secondes?

Bonjour, j'introduis mon projet afin d'y voir plus clair (je précise que je débute en programmation):

J'ai réalisé un montage et un code qui permet de lire les temperatures de 4 sondes DS18B20 sur un afficheur 20x4.

Jusque la aucun souci, seulement maintenant le coté "sympa" du projet serait d'enregistrer les données des capteurs temp a x intervalles de temps (toutes les heures par exemple).

Je précise que j'ai réalisé le même circuit avec une horloge RTC qui fonctionne parfaitement, c'est la partie enregistrement carte SD qui me pose souçi.
De plus je sais comment enregistrer les valeures des dates ainsi que des capteurs temp sur carte SD mais sa enregistre au moins 300 mesures en 0.5 secondes, c'est trop.

Je me tourne donc vers vous, si vous auriez un bout de code qui permet de verifier un temps d'une RTC et de réaliser une capture lorsque la variable de l'heure passe a +1.
J'ai pensé a une boucle while, mais je ne sais pas comment m'en servir correctement.

Si il manque des infos, n'hésitez pas a demander.

Merci d'avance pour vos réponses. :slight_smile:

le code du projet:

#include <LiquidCrystal.h>         //Librairie pour ecran LCD
LiquidCrystal lcd(11,10,5,4,3,2);  //Défini la liaison du LCD comme un 4 bits de données
#include <OneWire.h>               // librairie pour capteur OneWire

//---- code des instructions du capteur
const int modeLecture=0xBE;
const int lancerMesure=0x44;

// --- constantes des broches ---
const int broche_OneWire=7;       // declaration constante de broche des capteurs

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
OneWire  capteur(broche_OneWire);  // crée un objet One Wire sur la broche voulue

void setup()   {
  lcd.begin(20,4);    //Initialise l'ecran LCD
  lcd.setCursor(6,1);  //Place le curseur de l'ecran aux coordonnées 6,1 (x,y)
  lcd.write("Copyright");  //Ecris le texte contenu entre les ""
  lcd.setCursor(6,2);
  lcd.write("Bulenger Andy");
  delay(5000);        //Mets le programme en pause (durée en Millisecondes)
  lcd.clear();        //Fais disparaitre le contenu de l'afficheur
  delay(800);
} 

void loop(){
  unsigned long tps;
  float Temp1=0.00;    //Assigne un variable a virgules et 2 zeros pour la valeur Temp1
  float Temp2=0.00;    //Assigne un variable a virgules et 2 zeros pour la valeur Temp2
  float Temp3=0.00;    //Assigne un variable a virgules et 2 zeros pour la valeur Temp3
  float Temp4=0.00;    //Assigne un variable a virgules et 2 zeros pour la valeur Temp4
  byte Adresse1[8]={
    0x28, 0x91, 0xA6, 0x89, 0x06, 0x0, 0x0, 0xAC          };    //Toute cette partie sert a attribuer une Adresse MAC propre a chaque sonde
  byte Adresse2[8]={
    0x28, 0x31, 0x7C, 0x8A, 0x06, 0x0, 0x0, 0x9B          };
  byte Adresse3[8]={
    0x28, 0xC5, 0x4B, 0x8A, 0x06, 0x0, 0x0, 0xE0          };
  byte Adresse4[8]={
    0x28, 0xC0, 0x25, 0x8A, 0x06, 0x0, 0x0, 0xB8          };
  delay (500);
  while (1){                                              // Fonction servant a faire plusieurs tâches en même temps (tandis que)
    Temp1=capteurMesureTemp(Adresse1);
    Temp2=capteurMesureTemp(Adresse2);                    //Attribue a la variable Temp la valeur récupérée sur les capteurs a chaque adresse MAC
    Temp3=capteurMesureTemp(Adresse3);
    Temp4=capteurMesureTemp(Adresse4);

    lcd.setCursor(0,0);
    lcd.write("Entree Lait");
    lcd.setCursor(15,0);
    lcd.print(Temp1);            //Ici la fonction lcd.print n'est pas a confondre avec lcd.write, print sert a inserer des variables alors que write sert a inserer du texte ou des valeures fixes
    lcd.setCursor(0,1);
    lcd.write("Sortie Lait");
    lcd.setCursor(15,1);
    lcd.print(Temp2);            // Les fonctions lcd.print des lignes 47 a 62 servent a afficher la temperature relevée des capteurs sur l'ecran LCD
    lcd.setCursor(0,2);
    lcd.write("Entree eau");
    lcd.setCursor(15,2);
    lcd.print(Temp3);
    lcd.setCursor(0,3);
    lcd.write("Sortie eau");
    lcd.setCursor(15,3);
    lcd.print(Temp4);
    lcd.home();
    delay(2000);                 // L'écran va donc se raffraichir toute les 2 secondes et afficher les nouvelles valeures des capteurs ds18b20
    //tps=millis()+28500;       // Temporisation de 28.5 secondes mise en commentaire car utile mais trop longue lors de la configuration initiale
  }
}
float capteurMesureTemp(byte adressecapteur[8]) {     //fonction qui renvoie résultat float et ne reçoit rien
  byte data[12];                                     // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire 
  int tempet=0;                                     // variable pour resultat brute  de la mesure
  float tempetf=0.0;                               // variable pour resultat à virgule de la mesure
  capteur.reset();                                // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adressecapteur);                // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(lancerMesure,1);                // lance la mesure et alimente le capteur par la broche de donnée
  delay(750);                                  // au moins 750 ms (voir Datasheet de la sonde)
  capteur.reset();                            // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adressecapteur);            // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(modeLecture,1);             // passe en mode lecture de la RAM du capteur
  for ( int i = 0; i < 9; i++) {           // 9 octets de RAM stockés dans 9 octets
    data[i] = capteur.read();             // lecture de l'octet de rang i stocké dans tableau data
  }
  tempet=(data[1]<<8)|data[0];  //Cette partie de code est primordiale, c'est le calcul a réaliser afin de convertir les données de la sonde numerique en temperature
  tempetf=float(tempet)*6.25;
  tempetf=tempetf/100.0;
  return (tempetf);
}

PS: je suis obligé de mettre un lcd.clear car l'emplacement de l'Arduino se situe a coté de nombreux parasites (variateurs, électrovannes...) c'est donc la seule parade que j'ai trouvé (je compte quand même rajouter des anti-parasitaires au système).

bonjour,
si tu sais gérer les secondes avec le rtc, c'est un truc simple.
tu prends une variable de temps interval par exemple qui fera référence au nb de secondes pour enregistrement.

tu prends un compteur qui sera incrémenté de l'interval
tu récupère les secondes sur le rtc

si secondes rtc = compteur=>enregistrement sd=>compteur = compteur + interval
si non, on continue sans rien faire

exemple
interval = 10 secondes
compteur =interval

dans le loop
if seconde == compteur
compteur = compteur + interval
écriture sd
else compteur = compteur

autre solution que le rtc, utiliser la lib timer

Pour ça tu dois pouvoir utiliser la librairie SimpleTimer, qui permet d'exécuter une fonction toutes les x ms.

http://playground.arduino.cc/Code/SimpleTimer

#include <SimpleTimer.h>

SimpleTimer montimer;

void SaveSurSD() {
    ...
    ...
}

void setup() {
    montimer.setInterval(1000 * 60 * 60, SaveSurSD);
}

void loop() {
    montimer.run();
}