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);
}