Je me permet de solliciter votre aide car j’ai un petit soucis, premièrement pour expliquer j’ai un capteur de déplacement et 2 PT100 . Je souhaite que les données soient enregistrées sur une carte SD. L'affichage sur le moniteur série fonctionne bien.
Le soucis est que les données ne s'enregistrent pas sur la carte SD: le fichier csv est créé mais il est vide. Avez-vous des pistes d'erreur?
Même en enlevant la 1ère PT100, tjs le même problème: Est-ce la partie getTemp qui engendre le pb?
Je ne suis pas non plus un expert mais je me demande si ce n’est pas un soucis de code ou de bibliothèque. Par ailleurs il y a surement quelques optimisations à faire dans le programme donc si vous voyez quelque chose n’hésitez pas.
Merci
#include <SPI.h>
#include <SD.h>
#include <RTClib.h> // horodatage
#include <Wire.h> // Pour la communication I2C horodateur
#include <Adafruit_MAX31865.h>
const int cst = 120;
const int chipSelect = 10;
//Adafruit_MAX31865 mon_capteur = Adafruit_MAX31865(5, 6, 7, 8);
RTC_DS1307 RTC;
File monFichier;
#include <ADS1X15.h>
ADS1115 ADS(0x48);
#include <OneWire.h> // pour PT100 2
int DS18S20_Pin = 3; //DS18S20 Signal pin on digital 3
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 3
// Variables utilisées pour la carte SD
const int sdCardPinChipSelect = 10; // 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* nomDuFichier = "donnees.csv"; // Format 8.3 (c'est à dire 8 lettres maximum pour le nom, et optionnellement 3 pour l'extension)
void setup() {
Serial.begin(9600);
Wire.begin();
RTC.begin();
//Serial.begin(115200);
//mon_capteur.begin(MAX31865_2WIRE);
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) { // see if the card is present and can be initialized:
Serial.println("Card failed, or not present");
while (1); // don't do anything more:
}
Serial.println("card initialized.");
}
// ADS1115
//ADS.begin(); // Initialisation du module ADS1115
//ADS.setGain(1); // On prend le gain 1 pour fixer la mesure. Rmq :le gain est le plus bas (index 0), pour avoir la plus grande plage de mesure (6.144 volt)
//ADS.setMode(1); // On indique à l'ADC qu'on fera des mesures à la demande, et non en continu (0 = CONTINUOUS, 1 = SINGLE)
//ADS.setDataRate(7); // On spécifie la vitesse de mesure de tension qu'on souhaite, allant de 0 à 7 (7 étant le plus rapide, soit 860 échantillons par seconde)
//ADS.readADC(0); // Et on fait une lecture à vide, pour envoyer tous ces paramètres
//}
void loop() {
// Mesure de la tension différentielle entre A0 et A1 (le résultat se situera entre -32768 et +32767, comme nous sommes sur 16 bits)
int16_t difference_potentiel_A0_A1 = ADS.readADC_Differential_0_1();
Serial.print("Lecture de l'ADC (A0-A1) : ");
Serial.println(difference_potentiel_A0_A1);
// Conversion de cette valeur en volts (le résultat sera fonction de la plage sélectionnée, fonction du gain ; ici, le résultat sera entre -6.144 et +6.144 volts)
float tension_volts_A0_A1 = ADS.toVoltage(difference_potentiel_A0_A1);
//float deplacement = tension_volts_A0_A1 / cst ;
Serial.print("Tension différentielle = ");
Serial.print(tension_volts_A0_A1,4); // On limite l'affichage à 4 chiffres après la virgule
Serial.println(" volts");
//Serial.print("Mesure de déplacement = ");
//Serial.print(deplacement,4); // On limite l'affichage à 4 chiffres après la virgule
//Serial.println(" µm ");
// Mesure PT100 n°1
//float R = mon_capteur.lecture_resistance();
//float T=(R-101.7)/0.378;
//Serial.println(T);
//Mesure PT100 n°2
float temperature = getTemp();
Serial.print("Temp=");
Serial.println(temperature, 2);
File dataFile = SD.open(nomDuFichier, FILE_WRITE);
if (dataFile) { // if the file is available, write to it:
DateTime now = RTC.now();
uint16_t year1 = now.year();
uint16_t month1 = now.month();
uint16_t day1 = now.day();
uint16_t hour1 = now.hour();
uint16_t minute1 = now.minute();
uint16_t second1 = now.second();
String dataReg = String(year1) + ";" +String( month1) + ";" + String(day1) +";" + String(hour1) + ";" + String(minute1) + ";" + String(second1) + ";" + String(tension_volts_A0_A1) + ";" + String(temperature);
dataFile.println(dataReg);
dataFile.close();
// print to the serial port too:
Serial.println(dataReg);
delay(2000);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening fichier csv");
delay(2000);
}
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}