Enregistrement de donnees SD tableaux

Bonjour à tous,

Je suis à la recherche d'aide ou d'un conseil.
J'arrive à enregistrer mes données sur carte midcroSD dans un tableau toutes les 20s qui est situé dans mon void loop().
Maintenant, j'aimerai créer un nouveau tableau qui s'enregistre toutes les 30min par exemple.

Bref, il me faut deux tableaux enregistrés sur carte SD :

  • un toutes les 20s (celui-ce est enregistré dans le Void loop
  • l'autre toutes les 30min

Est ce possible?
Si oui comment faire svp?

Merci d'avance pour votre aide,
Cordialement,
Pierre

Oui, mais plus tu en dire sur ce que tu veux faire, plus la réponse sera précise.
Il est souvent bon de donner le code de départ du projet. On ne sait pas par exemple d'où viennent les données dans le premier et le deuxième tableau, si un tableau efface le précédent, si le tableau des 30mn remplace celui des 20s ...etc.

Il peut être utile de consulter Les bonnes pratiques du Forum Francophone qui montre quels sont les renseignements à donner pour avoir un maximum de réponses et pour avoir des réponses plus ciblées.

Une possibilité: comme 30mn c'est exactement 90 fois 20s, on peut chaque 20s ou l'on écrit un tableau, incrémenter un comptage. Si le comptage arrive à 90, on le repasse à 0, et on écrit le tableau pour les 30mn.

votre architecture de code pourrait ressembler à cela:

unsigned long chrono20Secondes;
unsigned long chrono30Minutes;

int donnees;

void lireDonnees() {
  donnees = random(0, 100); // ici mettre le vrai code de lecture de données
}

void ecrireDonnees(const char * nomDeFichier) {
  // ici écrire les données dans le fichier
}

void setup() {
  Serial.begin(115200); Serial.println();
}

void loop() {

  if (millis() - chrono20Secondes >= 20000ul) {
    chrono20Secondes = millis();
    // effectuer ici l'enregistrement des données 20 s
    lireDonnees();
    ecrireDonnees("20sec.csv");
  }

  if (millis() - chrono30Minutes >= 1800000ul) {
    chrono30Minutes = millis();
    // effectuer ici l'enregistrement des données 30 min
    lireDonnees();
    ecrireDonnees("30min.csv");
  }

}

on utilise millis() pour faire un code non bloquant et déclencher la lecture des données et l'écriture dans le bon fichier lorsque la tempo est terminée. (code tapé ici absolument non testé et il manque bien sûr plein de trucs)

merci beaucoup pour l'information.
C'est un peu ça l'idée que j'aimerai réaliser et surtout faire des moyennes toutes les 30min et les mettre dans second tableau.

Après tu peux rajouter une fonction qui détermine si la place mémoire de la carte micro SD n'est pas remplie.

dans le cas "20s" vous lisez la donnée et la stockez puis vous l'ajoutez à une variable somme du bon type et incrémenter une variable compteur de 1.

dans le cas "30min" vous divisez somme par compteur (si compteur est non nul) et écrivez le résultat dans votre fichier puis vous remettez somme et compteur à 0 pour recommencer le cycle

Bonjour et merci pour vos retour divers.
Est ce que ceci pourrai aller svp? Puis je avoir des conseils. Merci d'avance, Cordialement,
Pierre

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h" //bibliotheque RTC pour DS3231

#include "DFRobot_SHT20.h"//bibliotheque SEN0227

File myFile; //creation SD
const int sdCardPinChipSelect = 10;//creation SD

RTC_DS3231 rtc;//RTC DS3231
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};//RTC DS3231

//SEN0227
DFRobot_SHT20    sht20;

unsigned long chrono20Secondes;
unsigned long chrono30Minutes;

int donnees;

void enteteDonnees(){
  myFile.print("Date");//nom premiere colonne date
  myFile.print(";");//separateur
  myFile.print("Heure");//nom deuxieme colonne date
  myFile.print(";");//separateur de colonne
  myFile.print("Tenv en *C");//intitule de la colonne
  myFile.print(";");//separateur de colonne
  myFile.println("Henv en %");
  myFile.close();//fermeture fichier
}

void lireDonnees() {
  float humd = sht20.readHumidity();//SEN0227
  float temp = sht20.readTemperature();//SEN0227
  DateTime now = rtc.now();//lecture RTC DS3231
}

void lireDonnees30min(){
  //réalisation des moyennes à la 30min ce qui correspond à des moyennes toutes les 90 mesures
    int Somme1 = 0;
    int Somme2 = 0;
    int n = 0;
    
    while (n < 90) {
    Somme1+=humd;
    Somme2+=temp;
    n++;
    }
    
    float Moyenne1=(Somme1)/(90.0);
    float Moyenne2=(Somme2)/(90.0);
    }
    
void ecrireDonnees(const char * nomDeFichier) {
    myfil.print(now.day());
    myfil.print("/");//format jour _ _/_ _/_ _
    myfil.print(now.month());
    myfil.print("/");
    myfil.print(now.year());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(now.hour());
    myfil.print(":");//format heure _ _:_ _:_ _
    myfil.print(now.minute());
    myfil.print(":");
    myfil.print(now.second());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(humd, 1);
    myfil.print(";");
    myfil.println(temp, 1);
    myfil.close();
}

void ecrireDonnees1(const char * nomDeFichier) {
    myfil.print(now.day());
    myfil.print("/");//format jour _ _/_ _/_ _
    myfil.print(now.month());
    myfil.print("/");
    myfil.print(now.year());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(now.hour());
    myfil.print(":");//format heure _ _:_ _:_ _
    myfil.print(now.minute());
    myfil.print(":");
    myfil.print(now.second());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(Moyenne1, 1);
    myfil.print(";");
    myfil.println(Moyenne2, 1);
    myfil.close();
}

void setup() {
  Serial.begin(57600);//RTC DS3231
  
  Wire.begin();//shield SD
  
  if (!SD.begin(sdCardPinChipSelect)) { //SD pour UNO 
    while (1);
  }

  if (! rtc.begin()) { //RTC DS3231
    Serial.flush();
    while (1);
  }

  if (rtc.lostPower()) {
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  sht20.initSHT20();//SEN0227
  sht20.checkSHT20();//SEN0227
}

void loop() {
    float humd = sht20.readHumidity();//SEN0227
    float temp = sht20.readTemperature();//SEN0227

    DateTime now = rtc.now();//lecture RTC DS3231
    Serial.print(now.day(), DEC);//premiere colonne date
    Serial.print('/');//format jour _ _/_ _/_ _
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);//deuxieme colonne heure
    Serial.print(':');//format heure _ _:_ _:_ _
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(' ');
    Serial.print(humd, 1);Serial.print("T_env *C\t");// T en °C
    Serial.print(temp, 1);Serial.println("H_env %\t");// HR en %
    
    if (millis() - chrono20Secondes >= 20000ul) {
    chrono20Secondes = millis();
    // effectuer ici l'enregistrement des données 20 s
    enteteDonnees()
    lireDonnees();
    ecrireDonnees("20sec.csv");
  }


  if (millis() - chrono30Minutes >= 1800000ul) {
    chrono30Minutes = millis();
    // effectuer ici l'enregistrement des données 30 min
    enteteDonnees()
    lireDonnees30min();
    ecrireDonnees1("30min.csv");
  }
  
    }
    //delay(20000);
}

Merci d'éditer votre post pour rajouter les balises de de code, c'est quasiment illisible tel quel:

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône </> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Re voici, j'espère que ça ira (encore merci) :

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h" //bibliotheque RTC pour DS3231

#include "DFRobot_SHT20.h"//bibliotheque SEN0227

File myFile; //creation SD
const int sdCardPinChipSelect = 10;//creation SD

RTC_DS3231 rtc;//RTC DS3231
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};//RTC DS3231

//SEN0227
DFRobot_SHT20    sht20;

unsigned long chrono20Secondes;
unsigned long chrono30Minutes;

int donnees;

void enteteDonnees(){
  myFile.print("Date");//nom premiere colonne date
  myFile.print(";");//separateur
  myFile.print("Heure");//nom deuxieme colonne date
  myFile.print(";");//separateur de colonne
  myFile.print("Tenv en *C");//intitule de la colonne
  myFile.print(";");//separateur de colonne
  myFile.println("Henv en %");
  myFile.close();//fermeture fichier
}

void lireDonnees() {
  float humd = sht20.readHumidity();//SEN0227
  float temp = sht20.readTemperature();//SEN0227
  DateTime now = rtc.now();//lecture RTC DS3231
}

void lireDonnees30min(){
  //réalisation des moyennes à la 30min ce qui correspond à des moyennes toutes les 90 mesures
    int Somme1 = 0;
    int Somme2 = 0;
    int n = 0;
    
    while (n < 90) {
    Somme1+=humd;
    Somme2+=temp;
    n++;
    }
    
    float Moyenne1=(Somme1)/(90.0);
    float Moyenne2=(Somme2)/(90.0);
    }
    
void ecrireDonnees(const char * nomDeFichier) {
    myfil.print(now.day());
    myfil.print("/");//format jour _ _/_ _/_ _
    myfil.print(now.month());
    myfil.print("/");
    myfil.print(now.year());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(now.hour());
    myfil.print(":");//format heure _ _:_ _:_ _
    myfil.print(now.minute());
    myfil.print(":");
    myfil.print(now.second());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(humd, 1);
    myfil.print(";");
    myfil.println(temp, 1);
    myfil.close();
}

void ecrireDonnees1(const char * nomDeFichier) {
    myfil.print(now.day());
    myfil.print("/");//format jour _ _/_ _/_ _
    myfil.print(now.month());
    myfil.print("/");
    myfil.print(now.year());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(now.hour());
    myfil.print(":");//format heure _ _:_ _:_ _
    myfil.print(now.minute());
    myfil.print(":");
    myfil.print(now.second());
    myfil.print(" ; ");//separateur de colonne
    myfil.print(Moyenne1, 1);
    myfil.print(";");
    myfil.println(Moyenne2, 1);
    myfil.close();
}

void setup() {
  Serial.begin(57600);//RTC DS3231
  
  Wire.begin();//shield SD
  
  if (!SD.begin(sdCardPinChipSelect)) { //SD pour UNO 
    while (1);
  }

  if (! rtc.begin()) { //RTC DS3231
    Serial.flush();
    while (1);
  }

  if (rtc.lostPower()) {
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  sht20.initSHT20();//SEN0227
  sht20.checkSHT20();//SEN0227
}

void loop() {
    float humd = sht20.readHumidity();//SEN0227
    float temp = sht20.readTemperature();//SEN0227

    DateTime now = rtc.now();//lecture RTC DS3231
    Serial.print(now.day(), DEC);//premiere colonne date
    Serial.print('/');//format jour _ _/_ _/_ _
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);//deuxieme colonne heure
    Serial.print(':');//format heure _ _:_ _:_ _
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(' ');
    Serial.print(humd, 1);Serial.print("T_env *C\t");// T en °C
    Serial.print(temp, 1);Serial.println("H_env %\t");// HR en %
    
    if (millis() - chrono20Secondes >= 20000ul) {
    chrono20Secondes = millis();
    // effectuer ici l'enregistrement des données 20 s
    enteteDonnees()
    lireDonnees();
    ecrireDonnees("20sec.csv");
  }


  if (millis() - chrono30Minutes >= 1800000ul) {
    chrono30Minutes = millis();
    // effectuer ici l'enregistrement des données 30 min
    enteteDonnees()
    lireDonnees30min();
    ecrireDonnees1("30min.csv");
  }
  
    }
    //delay(20000);
}

l'idéal aurait été de modifier le post existant mais ça ira. (je l'ai fait pour vous pour ne pas laisser un message super long et moche dans le forum)

lisez les recommandations listées dans "Les bonnes pratiques du Forum Francophone” pour en savoir plus sur comment bien utiliser le forum


est-ce que votre code compile ?? (je vois du myfil et du myfile) et je ne vois pas le fichier s'ouvrir open() mais vous le fermez bien

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.