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 :
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?
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.
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.
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.
Suite à vos différentes réponses, j'ai essayé avec une libraire Sd.fat. Cela fonctionne avec une carte arduino uno + bmp280.
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 Un fichier est créé sur la carte sd mais il n'y a rien dedans.