Help ! SD + BMP280

Bonjour,

Je débute en programmation sur Arduino et j'aimerai que les données de température et de pression reçues du BMP280 sur ma carte arduino nano every se sauvegardent sur une SD card en plus d'apparaitre dans le moniteur série de l'IDE.

J'ai fait le programme ci-joint :

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include <SD.h>

Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

File myFile;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.print("Initializing SD card...");

  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println(F("BMP280 test"));

  //if (!bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID)) {
  if (!bmp.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    while (1) delay(10);
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop() {
   // open the file. note that only one file can be open at a time,
 File myFile = SD.open("DATA.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
         myFile.print(bmp.readTemperature());
         myFile.print(",");
         myFile.print(bmp.readPressure());
         myFile.print(",");
         myFile.println(bmp.readAltitude(1013.25));

    Serial.print(bmp.readTemperature());
    Serial.print(",");
    Serial.print(bmp.readPressure());
    Serial.print(",");
    Serial.println(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */

myFile.close();

delay(1000);

  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}
 
     

Le hic c'est que ceci s'affiche sur le moniteur série :

Le programme du BMP seul fonctionne parfaitement, les programmes inclus dans la libraire de la SD également.
Je ne vois pas où cela coince...

Merci beaucoup pour vos conseils et remarques !

Probablement ouvrir "/DATA.txt".

Oui il y a une erreur d'ouverture du ficher SD. Pourtant il y a bien une ligne dans mon code pour l'ouvrir.

C'est bien ce que je dis : ouvrir /DATA.txt au lieu de DATA.txt

Ok ! :ok_hand: je vais essayer. Merci !

Non. Malheureusement ce ne fonctionne pas... /DATA.text

Essayer un exemple de la librairie, ReadWrite par exemple.

Il semblerait d'après ta copie d'écran que cela passe une fois (on voit l'affichage des valeurs relevées) le fichier est-il créé et une ligne apparaît-elle dedans?

Déjà essayé. Les programmes de la librairie fonctionnent.

C'est exactement cela. Et le fichier est introuvable/impossible à ouvrir sur la carte SD.

Je ne vois pas de problème dans le code.
Mes déboires passés avec SD sur ARDUINO ne m'engagent pas à encourager son utilisation. Le résultat est trop dépendant de la SD.
D'autre part, l'écriture fréquente sur une SD pose un problème d'ordre pratique : il va bien falloir au bout d'un certain temps retirer la SD pour la lire, sur un PC par exemple, mais comment sait-on que l'on peut retirer la SD, en toute sécurité, en étant sûr qu'on ne le fasse pas en plein milieu d'une écriture ?
A moins d'avoir prévu un bouton pour signaler "fin des mesures", ou tout autre moyen.
Pour ma part je préfère utiliser un ESP32 par exemple, avec consultation des résultats sur une page WEB.
L'ESP32 a suffisamment de mémoire FLASH pour stocker une grande quantité de données dans son système de fichiers (LittleFS ou FAT). Sinon, envoyer les données sur un serveur externe.

La température est une grandeur qui varie lentement. Une période de 15 minutes me paraît plus raisonnable.

Merci pour vos conseils.
Je ne connais pas le ESP32. Je vais me renseigner, voir si cela convient au projet. Car on doit mettre notre capteur de température et de pression dans une canette. Cette dernière sera envoyée dans une fusée à 1km d'altitude et lors de sa chute devons récupérer par radio communication la température et la pression toutes les secondes (contrainte imposée dans le concours) et en plus les sauvegarder sur Sd. La SD doit etre également dans la canette.

Bonjour 12laure

Même, si au départ ta carte ne contient pas de fichier nommé DATA.txt, le programme le crée.
FILE_WRITE a une fonction d'ajout au fichier ouvert (append).
Dans ton programme tu peux changer le nom du fichier sans que cela pose de problème, le programme le crée au premier FILE_WRITE.
Je n'ai pas de BMP280, alors j'ai essayé ton programme en isolant cette partie et en écrivant des valeurs quoiqu'onques et ça fonctionne sans problème.

Cordialement
jpbbricole

1 Like

Par exemple, la manip suivante est intéressante avec la librairie SD :

  • en boucle : ouvrir un fichier, écrire une ligne de texte, fermer le fichier, afficher OK, attendre 1s
  • retirer la SD pendant l'exécution

Le programme continue d'afficher OK même en l'absence de SD !!!

Avec la librairie SdFat par contre, l'ouverture du fichier échoue. Mais la réinsertion de la SD ne permet pas la reprise de l'écriture. Il faut à nouveau appeler SD.begin() pour que l'écriture reprenne :

  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
    if (!SD.begin(10)) {
      Serial.println("initialization failed!");
      delay(1000);
    }

D'une part je déconseille fortement SD par rapport à SdFat.
D'autre part je ne pense pas qu'une solution de ce genre soit mécaniquement viable, le moindre faux contact peut tout foutre en l'air.
La solution finale devra forcément être basée sur autre chose qu'un module SD, un ARDUINO et des fils DUPONT. Tout souder serait préférable.

J'ai fait des essais avec une SD Sandisk Extreme 16Go. Pas de problème pour écrire des données en boucle comme dans le code du post #1. Mais certaines SD bas de gamme m'ont déjà causé des soucis.

1 Like

Suite à vos différentes réponses, j'ai essayé avec une libraire Sd.fat. Cela fonctionne avec une carte arduino uno + bmp280. :slight_smile:
Par contre, quand je passe à une arduino nano every avec le même programme ou avec un programme plus dense (plusieurs capteurs : O2, CO2, BMP280, luminosité, humidité...) la même erreur revient : error opening test.txt :frowning: Un fichier est créé sur la carte sd mais il n'y a rien dedans.

Il y a peu d'utilisateurs de cette carte sur ce forum.

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