Problème de fonctionnement de la carte sd et de la rtc simultanément

Bonjour à tous,

Je suis novice dans ce domaine et je n’ai encore jamais publié ici, excusez-moi si je dis des bêtises ou si je n’ai pas correctement utilisé le forum.

Dans le cadre d’un projet étudiant, je travaille sur la mise en place d’un système de mesure météo (température, humidité, …). Je travaille sur un Arduino Uno avec un shield sur lequel j’ai installé 2 capteurs SHT10, 1 capteur BME680 et 1 capteur SGP30. J’ai branché les capteurs BME680 et SGP30 en I2C. Les fils « data » et « clock » des deux sondes SHT10 sont branchés respectivement sur les broches 9 et 3 pour l’une et 5 et 6 pour l’autre. Tous les capteurs sont branchés sur 5 Vcc.

J’ai fait un premier programme qui me permet de visualiser les valeurs des 4 capteurs sur le moniteur série. Celui-ci fonctionne. J’ai ensuite essayé d’ajouter la date et l’heure avec la RTC PCF8523 du shield et d’enregistrer toutes ces données sur la carte SD du shield. J’arrive à faire afficher la date, l’heure et les données des capteurs sur le moniteur série sans les enregistrer sur la carte SD. J’arrive à enregistrer les données des capteurs sur la carte SD sans faire fonctionner la RTC. Mais je n’arrive pas à tout faire fonctionner correctement en même temps. Lorsque je lance le programme complet, le moniteur série affiche « error opening filename ».


J’ai tenté de nombreuses choses sur le programme mais je n’ai pas encore réussi à trouver une solution.
Quelqu’un aurait-il une idée de qui ne va pas, de ce que je n’ai pas correctement fait/ce qu’il faudrait que je rajoute ou modifie ? Je suis preneuse de tout conseil !

Merci d’avance pour votre aide !

Mon programme est le suivant :

[code]
#include <Wire.h>                     
#include "Adafruit_SGP30.h"
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include <Arduino.h>
#include <SHT1x.h>
#include <SD.h>
#include <RTClib.h>

Adafruit_SGP30 sgp;
int counter = 0;
uint32_t getAbsoluteHumidity(float temperature, float humidity) {
    // approximation formula from Sensirion SGP30 Driver Integration chapter 3.15
    const float absoluteHumidity = 216.7f * ((humidity / 100.0f) * 6.112f * exp((17.62f * temperature) / (243.12f + temperature)) / (273.15f + temperature)); // [g/m^3]
    const uint32_t absoluteHumidityScaled = static_cast<uint32_t>(1000.0f * absoluteHumidity); // [mg/m^3]
    return absoluteHumidityScaled; }
    
Adafruit_BME680 bme;
#define SEALEVELPRESSURE_HPA 1013.25

SHT1x sht1(9, 3); //(data pin, clock pin)
SHT1x sht2(5, 6); //(data pin, clock pin)

File dataFile;
const int sdCardPinChipSelect = 10;

RTC_PCF8523 RTC;


void setup() {

//SGP30
  Serial.begin(9600);
  while (!Serial);
  Serial.println("SGP30 test");
  
  if (! sgp.begin()){                
    Serial.println("SGP30 not found");
    while (1);
  }
 
//BME680
  Serial.begin(9600);
  while (!Serial);
  Serial.println("BME680 test");

 if (!bme.begin()) {                 
   Serial.println("BME680 not found");
   while (1);
  }

  //Set up oversampling and filter initialization
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150); // 320*C for 150 ms

//SHT10
   Serial.begin(9600);
   Serial.println("SHT10 test");

//SD
  Serial.begin(9600);
  while (!Serial);
  Serial.print("Initializing SD card...");
  
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

//RTC
  Wire.begin();
  if (!RTC.begin()) {
    Serial.println("RTC failed");
  }
}


void loop() {

  DateTime now = RTC.now();

  if (! sgp.IAQmeasure()) {
    Serial.println("Measurement failed");
    return;
  }

  if (! sgp.IAQmeasureRaw()) {
    Serial.println("Raw Measurement failed");
    return;
  }

  if (! bme.performReading()) {
    Serial.println("Failed to perform reading");
    return;
  }

  /*baseline SGP30
  counter++;
  if (counter == 30) {
    counter = 0;
    uint16_t TVOC_base, eCO2_base;
    if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
      Serial.println("Failed to get baseline readings");
      return;
    }
    Serial.print("****Baseline values: eCO2: 0x"); Serial.print(eCO2_base, HEX);
    Serial.print(" & TVOC: 0x"); Serial.println(TVOC_base, HEX);
  }*/

  dataFile = SD.open("filename.csv", FILE_WRITE); //change "filename" by the name of your file

  if (dataFile) {
    Serial.println("Writing to filename.csv");  //change "filename" by the name of your file
    dataFile.print(now.day(), DEC);
    dataFile.print('/');
    dataFile.print(now.month(), DEC);
    dataFile.print('/');
    dataFile.print(now.year(), DEC);
    dataFile.print(" ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(':');
    dataFile.print(now.minute(), DEC);
    dataFile.print(':');
    dataFile.print(now.second(), DEC);
    dataFile.print(";");
    dataFile.print(sgp.eCO2);
    dataFile.print(";");
    dataFile.print(sgp.TVOC);
    dataFile.print(";");
    dataFile.print(sgp.rawH2);
    dataFile.print(";");
    dataFile.print(sgp.rawEthanol);
    dataFile.print(";");
    dataFile.print(bme.temperature);
    dataFile.print(";");
    dataFile.print(bme.humidity);
    dataFile.print(";");
    dataFile.print(bme.pressure / 100.0);
    dataFile.print(";");
    dataFile.print(bme.gas_resistance / 1000.0);
    dataFile.print(";");
    dataFile.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    dataFile.print(";");
    dataFile.print(sht1.readTemperatureC());
    dataFile.print(";");
    dataFile.print(sht1.readHumidity());
    dataFile.print(";");
    dataFile.print(sht2.readTemperatureC());
    dataFile.print(";");
    dataFile.println(sht2.readHumidity());
    dataFile.close();
    Serial.println("done.");
  }
  else {
    Serial.println("error opening filename.csv"); //change "filename" by the name of your file
  }
  
  delay(10000);
}
[/code]

Bonjour,

essayez :

 dataFile = SD.open("/filename.csv", FILE_WRITE); //change "filename" by the name of your file

Un seul : Serial.begin(9600);
au début de void setup() {
suffit :

void setup() {
Serial.begin(9600);
//SGP30
   while (!Serial);
  Serial.println("SGP30 test");

Après je ne connais pas votre shield et son fonctionnement ainsi que vos composants.
Si ça peut vous aider...
Bonne journée

J'ai essayé mais cela ne fonctionne toujours pas…
Merci quand même d'avoir pris le temps de me lire et de me répondre !

ça devrait vous aider :

RTClib.h PCF8523

Beaucoup de capteurs, beaucoup de librairies plus la gestion de carte SD.
Il est fort probable que la RAM est mise à mal.
Qu'indique le compilateur sur l'utilisation mémoire?
Ou mieux, utilise la librairie MemoryFree. Il suffit ensuite d'ajouter les lignes suivantes à la fin du setup()

    Serial.print("freeMemory()=");
    Serial.println(freeMemory());

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