Enregistrer température humidité carte sd

Bonjour

Je me permet de vous demander de l'aide afin de mener à bien mon projet qui est de récupérer des données de température et d'humidité dans une carte sd. J'ai donc crée mon fichier csv qui est censé stocker toutes les données mais mon code bloque à l'initialisation de la carte SD.

Merci d'avance.

Code :

#include <SPI.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <DHT_U.h>
#include <SD.h>

const int   sdCardPinChipSelect     = 53;               // Le lecteur de carte SD sera branché sur la pin 10 pour le CS (chip select), 11/12/13 pour le MOSI/MISO/SCK du bus SPI
const char* temphum = "donnees.csv";    // Format 8.3 (c'est à dire 8 lettres maximum pour le nom, et optionnellement 3 pour l'extension)
File monFichier;


const int brocheDeBranchementDHT    = A0;                // Le bus de communication du DHT22 sera branché sur la pin D8 de l'Arduino (mais libre à vous de le mettre ailleurs !)
const int typeDeDHT                 = DHT22;            // Ici, le type de DHT utilisé est un DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT); 
Sd2Card CarteSD;
SdVolume VolumeCarteSD;
uint32_t volumesize;
const long delaiIntervalleDeMesures = 2000;  // Délai de mesure du capteur
SoftwareSerial bluetooth(10, 11); // définit les pins 10 et 11 pour le modem bluetooh

void setup() {

  Serial.begin(9600);
  dht.begin();
  bluetooth.begin(9600); // Fixe le débit de communication en nombre de caractères par seconde
  randomSeed(analogRead(0));


  Serial.println(F("Étape 1 : Initialisation de la carte SD :"));
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println(F("Échec de l'initialization !"));
    while (1);    // Boucle infinie (arrêt du programme)
  }
  Serial.println(F("Initialisation réussie."));
  Serial.println();

  
  Serial.println();
  volumesize = VolumeCarteSD.clusterCount() * VolumeCarteSD.blocksPerCluster();
  volumesize = volumesize / 2;         // Nota : les blocs d'une carte SD font toujours 512 octets (il faut donc 2 blocs pour faire 1KB)
  Serial.print(F("Taille du volume (en GB): ")); Serial.println(volumesize / 1024 / 1024.0);
  Serial.println();

  Serial.println(F("Fin !"));

}

void loop() {

 // Lecture des données
  float tauxHumidite = dht.readHumidity();        // Lecture du taux d'humidité, exprimé en %
  float temperature = dht.readTemperature();      // Lecture de la température ambiante, exprimée en degrés celsius
  
  bluetooth.print(temperature); // Affiche la température sur le téléphone
  bluetooth.print(" *C"); // Affiche le texte "*C" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure
  bluetooth.print(tauxHumidite);// Affiche l'humidité sur le téléphone
  bluetooth.print(" %"); // Affiche le texte "%" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure}

 

  // Vérification si données bien reçues
  if (isnan(tauxHumidite) || isnan(temperature)) {
    Serial.println(F("Aucune valeur retournée par le DHT22. Est-il bien branché ?"));
    delay(2000);
    return;         // Si aucune valeur n'a été reçue par l'Arduino, on attend 2 secondes, puis on redémarre la fonction loop()
  }

  // Mise en forme de ces données (un seul chiffre après la virgule)
  String tauxHumiditeArrondi = String(tauxHumidite, 1);   // Affichage d'une seule décimale (car précision de 0,1 % ici)
  String temperatureArrondie = String(temperature, 1);    // Affichage d'une seule décimale (car précision de 0,1 °C ici)
  tauxHumiditeArrondi.replace(".", ",");                  // et on remplace les séparateurs de décimale, initialement en "." pour devenir ","
  temperatureArrondie.replace(".", ",");                  // (permet par exemple d'affichier 12,76 au lieu de 12.76 (ce qui facilite l'interprétation dans Excel ou tout autre tableur)

  // Affichage des valeurs sur le moniteur série de l'IDE Arduino
  Serial.print("Humidité = "); Serial.print(tauxHumiditeArrondi); Serial.print(" % - ");
  Serial.print("Température = "); Serial.print(temperatureArrondie); Serial.println(" °C");

  // Enregistrement de ces données sur la carte SD
  monFichier = SD.open(temphum, FILE_WRITE);
  if (temphum) {
    monFichier.print(tauxHumiditeArrondi);
    monFichier.print(";");                  // Délimiteur du fichier CSV
    monFichier.println(temperatureArrondie);
    monFichier.close();                     // L'enregistrement des données se fait au moment de la clôture du fichier
    Serial.println(F("Enregistrement réussi en carte SD"));
  } 
  else {
    Serial.println(F("Erreur lors de la tentative d'ouverture du fichier en écriture, sur la carte SD"));
  }

  // Temporisation de X secondes (2 sec min, pour que le DHT22 ait le temps de faire ses mesures)
  Serial.println();
  delay(delaiIntervalleDeMesures);


}

faites tourner un des exemple de SD.h
tant que ça ne fonctionne pas, il n'est pas utile d'aller plus loin dans votre code

➜ vérifier le montage, les fils, la carte SD et son format, etc

comme on a aucune information sur tout ça (mais c'est bien d'avoir utiliser les balises de code), difficile de vous aider

J'utilise une Carte micro sd Sandisk 128Go avec un module Micro SD TF Memory Card module

Quand je la formate en FAT32 tout va bien mais quand je veux créer mon fichier csv pour récolter mes données l'initialisation ne se fait plus

ça veut dire quoi "tout va bien" ? elle est reconnue et fonctionne avec les exemples de la bibliothèque ?


il est possible (je ne me souviens plus) que la bibliothèque SD ne soit pas capable de gérer des cartes de plus de 32Go. Faudrait essayer avec la bibliothèque SdFat qui est une version beaucoup plus aboutie de la bibliothèque SD Arduino.

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