Bonjour à tous,
Je construit une mini station météo avec le matériel suivant :
- carte UNO rev3
- capteur DHT11
- capteur BMP085
- Module SDCard Micro SDCard Adapter
- Module RTC DS3231
Jusqu'ici je n'ai rencontré aucun problème de lecture et d'enregistrement de données sur la carte SD, sauf depuis que j'ai ajouté le capteur BMP085. J'affiche correctement les valeurs lues sur le moniteur série, mais aucune valeur n'est enregistrée sur ma carte SD (cela fonctionnait avant l'ajout du BMP085).
Je mets le sketch, le schéma de montage, une copie du moniteur série et du fichier DATA0001.LOG en PJ.
Quelqu'un aurait une idée d'où vient le problème pour la sauvegarde sur carte SD ?
Code du programme :
//-------------------------------------------------------------------------------------------------------------------------------------------------------
// DESCRIPTION DU PROGRAMME
//-------------------------------------------------------------------------------------------------------------------------------------------------------
/* Début de commentaire
Programme enregistrant les données des capteurs DHT11 et BMP085 sur carte SD + horodatage par DS3231.
Fin de commentaire */
//-------------------------------------------------------------------------------------------------------------------------------------------------------
// DEFINITION DES BIBLIOTHEQUES
//-------------------------------------------------------------------------------------------------------------------------------------------------------
//Librairie DS3231
#include <Wire.h>
#include "RTClib.h"
//Librairie du capteur DHT11
#include <dht11.h>
#define DHT11PIN 9 //Branché sur pin 9 digital
//Librairies du module SDCard
#include <SPI.h>
#include <SD.h>
//Librairies BMP085
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
//-------------------------------------------------------------------------------------------------------------------------------------------------------
// DEFINITION DES VARIABLES/INSTANCES DES CAPTEURS
//-------------------------------------------------------------------------------------------------------------------------------------------------------
//Instance DS3231
RTC_DS3231 rtc;
//Instance du capteur DHT11
dht11 DHT11;
//Instance module SDCard
File dataFile;
//Instance BMP085
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(12345);
//Tableau stockant les jours de la semaine
char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
//Variables
long tempo = 5000;
const int CS_PIN = 10;
//-------------------------------------------------------------------------------------------------------------------------------------------------------
// INITIALISATION DU PROGRAMME
//-------------------------------------------------------------------------------------------------------------------------------------------------------
void setup ()
{
Serial.begin(9600);
delay(100); // Attente de l'ouverture de la console
// Initialisation DS3231
if (! rtc.begin())
{
Serial.println("Couldn't find RTC");
while (1);
};
if (rtc.lostPower())
{
Serial.println("RTC lost power, lets set the time!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
};
// Initialisation SDCard
if (!SD.begin(CS_PIN))
{
Serial.println("Initialization SDCard failed!");
while (1);
}
Serial.println("Initialization SDCard done.");
// Ouverture du fichier DATA0001.LOG :
dataFile = SD.open("DATA0001.LOG", FILE_WRITE);
// Si le fichier est ouvert, écrire dedans :
if (dataFile)
{
// Concaténation chaîne pour date et heure :
String dataString = "";
DateTime now = rtc.now();
dataString += "Programme [DS3231_SDCard_DHT11_BMP085_V01], ";
dataString += daysOfTheWeek[now.dayOfTheWeek()];
dataString += " le ";
dataString += now.day();
dataString += "/";
dataString += now.month();
dataString += "/";
dataString += now.year();
dataString += " - ";
dataString += now.hour();
dataString += ":";
dataString += now.minute();
dataString += ":";
dataString += now.second();
dataString += ".";
dataFile.println(dataString);
dataString = "";
dataString += "Date\tHeure\tHumidité (%)\tTempérature (°C)\tPression (hPa)\tTempérature BMP085 (°C)";
dataFile.println(dataString);
dataFile.close();
}
// Sinon, afficher une erreur :
else
{
Serial.println("error opening DATA0001.LOG");
};
delay(100);
// Initialisation du capteur DHT11
Serial.print("Vérification du capteur DHT11 : ");
int chk = DHT11.read(DHT11PIN);
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK.");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Erreur de Checksum.");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Erreur de Time out.");
break;
default:
Serial.println("Erreur inconnue.");
break;
}
// Initialisation BMP085
Serial.print("Pressure Sensor Test : ");
// Vérification de la connexion du capteur
if(!bmp.begin())
{
Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
while(1);
}
else
{
Serial.println("BMP085 ready.");
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------
// BOUCLE PRINCIPALE
//-------------------------------------------------------------------------------------------------------------------------------------------------------
void loop ()
{
writeSD();
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------
// FONCTIONS DE LA BOUCLE PRINCIPALE
//-------------------------------------------------------------------------------------------------------------------------------------------------------
void writeSD()
{
// Lecture des données sur DHT11
float humi = DHT11.humidity;
float temp = DHT11.temperature;
// Lecture données BMP85
sensors_event_t event;
bmp.getEvent(&event);
float tempBMP085;
bmp.getTemperature(&tempBMP085);
float pressure = event.pressure;
//Concaténation des données dans la chaîne dataString
String dataString = "";
DateTime now = rtc.now();
dataString += now.day();
dataString += "/";
dataString += now.month();
dataString += "/";
dataString += now.year();
dataString += "\t";
dataString += now.hour();
dataString += ":";
dataString += now.minute();
dataString += ":";
dataString += now.second();
dataString += "\t";
dataString += humi;
dataString += "\t";
dataString += temp;
dataString += "\t";
dataString += pressure;
dataString += "\t";
dataString += tempBMP085;
// Ecriture de dataString sur la carte SD.
File dataFile = SD.open("DATA0001.LOG", FILE_WRITE);
dataFile.println(dataString);
dataFile.close();
// Affichage sur console de dataString :
Serial.println(dataString);
delay(tempo);
}
Merci à vous !
Waykot.
[Edit] : le module DS3231 et le capteur BMP085 communiquent tous les deux via la librairie Wire (DS3231 branché sur pins SDA+ SCL et BMP085 sur les pins analogiques A4 + A5). Est-ce qu'il ne pourrait pas y avoir conflit, d'où les données non sauvegardées sur SD ? Mais dans ce cas, pourquoi je vois bien les données sur la console ?
[Edit 2] : ça a l'air de venir de la déclaration des variables du capteur BMP085, j'ai commenté cette section :
// Lecture données BMP85
// sensors_event_t event;
// bmp.getEvent(&event);
// float tempBMP085;
// bmp.getTemperature(&tempBMP085);
// float pressure = event.pressure;
Du coup, je retrouve le fonctionnement normal d'avant.
Si vous avez des suggestions d'amélioration du code ci-dessus pour qu'il fonctionne, je suis preneur !