Bonjour à toutes et à tous
J'avais déjà posté un code pour montrer comment on peut bricoler un Contrôleur de T°, Humidité avec pilotage manuel ou automatique
Lors des discussions on m'a suggéré plusieurs fois de rajouter la possibilité d'enregistrer les données sur carte SD.
J'ai ressorti alors un autre vieux bout de code qui faisait cela et je vais l'injecter dans l'autre code.
Il faudra sans doute utiliser une MEGA pour avoir toutes les PINs voulues (Sur un UNO sans doute conflit avec LED_BUILTIN (pin D13) que j'utilise et SCK de SPI sur UNO - faudrait changer tout ce qui touche LED_BUILTIN - j'avoue ne pas avoir compté si ça rentre - la flemme et l'objectif c'est de montrer un bout de code qui fait le LOG).
Donc en plus des informations de l'autre post, il vous faudra
COMPOSANTS UTILISES
- Une LED fonctionnant sous 5V
- Une Résistance de limitation de courant adaptée à votre LED (220Ω par exemple)
- Un shield SD fonctionnant en mode SPI
- Une carte SD de 2Go par exemple (certains lecteurs ne savent pas gérer plus)
- Des fils de connexion
PINS UTILISEES
- 48 = pin d'une LED (avec sa résistance de limitation de courant) qui sera allumée pendant le LOG
- 50 = SD MISO pour la communication SPI (avec la carte SD)
- 51 = SD MOSI pour la communication SPI (avec la carte SD)
- 52 = SD SCK pour la communication SPI (avec la carte SD)
- 53 = SD CS pour la communication SPI (avec la carte SD)
LIBRAIRIES UTILISEES
CABLAGE
- Carte SD en SPI, utilise les pins standard de la carte MEGA
- Vcc sous 5V, GND à GND
- SD MISO <---> Arduino MEGA 50
- SD MOSI <---> Arduino MEGA 51
- SD SCK <---> Arduino MEGA 52
- SD CS <---> Arduino MEGA 53
- Pin 48 <---> ANODE LED <---> RESISTANCE 200Ω (adaptée à votre LED) <---> GND (led d'activité carte SD)
La LED est optionnelle, elle sert à montrer quand il y a une activité en cours sur la carte SD. Ça vous permet (si d'aventure vous vous mettez à écrire bcp de choses) de savoir si la carte est utilisée, dans ce cas il vaut mieux éviter de couper sauvagement le courant ![]()
J'utilise la librairie SdFat et non pas celle fournie en standard dans l'IDE. La raison est simple, c'est le même auteur pour les deux et la version SdFat est beaucoup plus performante et à jour. Il vous faudra donc l'installer.
ETAPE 1
Après avoir effectué le montage tel que décrit, on va commencer par formatter la carte SD
-
Choisir dans les exemple de la librairie SdFat le programme SdFormatter.ino
-
changez la ligne [
Serial.begin(9600);
](SdFat/SdFormatter.ino at d43541f01b7405c4ad260d0c82e4c427e420df54 · greiman/SdFat · GitHub) en Serial.begin(115200); parce qu'il n'y a aucune raison d'aller lentement (ça m'énerve de voir encore du 9600).
-
compilez le sketch, vérifiez que vous n'avez aucune erreur. chargez le programme sur votre MEGA
-
ouvrez le moniteur Série et laissez vous guider
```
[color=purple]
Type any character to start
This program can erase and/or format SD/SDHC cards.
Erase uses the card's fast flash erase command.
Flash erase sets all data to 0X00 for most cards
and 0XFF for a few vendor's cards.
Cards larger than 2 GB will be formatted FAT32 and
smaller cards will be formatted FAT16.
Warning, all data on the card will be erased.
Enter 'Y' to continue:
Y + return
Options are:
E - erase the card and skip formatting.
F - erase and then format the card. (recommended)
Q - quick format the card without erase.
Enter option:
F + return
Enter option: F
Card Size: 2008 MB, (MB = 1,000,000 bytes)
Erasing
...............
All data set to 0x00
Erase done
Formatting
Blocks/Cluster: 64
FAT16
..
Format done
[/color]
```
Voilà, maintenant nous avons une carte bien formatée en FAT16
ETAPE 2
Je mets en pièce jointe le nouveau programme LCD_RTC_SD_TEMP_HUM_VENT.ino à télécharger directement. C'est la nouvelle version qui gère la carte SD.
Notez les bouts de code suivants:
const char * extensionFichierLog = ".LOG"; // L'extension utilisée pour tous nos fichiers (format .XXX -> un point et 3 caracteres max)
C'est ici que vous pouvez changez l'extension du fichier, par exemple en ".TXT" ou ".DAT" ou ".CSV" à votre convenance (un point et 3 caracteres max)
char * nomDuFichierLog()
{
..
}
Cette fonction doit retourner le nom du fichier à ouvrir (ou créer s'il n'existe pas) pour rajouter à la fin les données que vous voulez sauver. c'est appelé à chaque sauvegarde, donc le nom du fichier peut changer au fil du temps
Le nom de fichier (pour être tranquille dans tous les formats) doit être au max en 8.3 (8 caractères, un point, 3 caractères de suffixe).
Ici je construit un nom de fichier qui va changer tous les mois sous la forme de AAAAMM.LOG ou AAAA est l'année en cours (2018) et MM le mois en cours sur 2 digits donc entre 01 et 12 (lus sur la RTC).
--> Donc si vous exécutez le code en ce moment votre fichier va s'appeler 201807.LOG et en août il sera 201808.LOG etc...
const uint32_t LOG_INTERVAL_MS = 5000; // (5 * 60 * 1000UL); // 5 minutes (attention de bien mettre le UL pour ne pas faire les calculs en int mais bien en unsigned long)
Au début du code vous avez la fréquence de sauvegarde que vous souhaitez. Ici j'ai mis 5 secondes à titre de démo. Si vous voulez sauvegarder toutes les 5 minutes, mettez 5 * 60 * 1000[color=red]UL[/color] (5 x soixante secondes dans une minute x 1000ms dans 1 seconde = 5 minutes).
Le UL est super important pour que le calcul se fasse en unsigned long et pas en int.
Une sauvegarde toutes les 15 minutes pour un processus lent est sans doute approprié (96 lignes par jour - ça fait environ 3000 lignes par mois), n'oubliez pas que l'écriture sur SD est un processus pas super rapide, donc il ralentit la loop et la gestion des boutons - donc n'essayez pas de sauver toutes les 5 ms... ![]()
NB: Je n'ai pas testé si ça marchait sur plusieurs mois, je viens de fusionner les codes... Donc à vous de tester et de me dire si tout se passe bien dans la durée ![]()
Vous trouverez ensuite la fonction
void logToutesDonnees()
{
...
}
c'est dans cette fonction que l'on fait la sauvegarde sur la carte SD. la fonction commence simplement par ouvrir (et créer s'il n'existe pas) un fichier avec le nom tel que défini dans la fonction décrite ci dessus puis j'ai mis une série de print pour faire un dump de tous mes paramètres.
LCD_RTC_SD_TEMP_HUM_VENT.ino (33.5 KB)
