Enregistrer des données
Besoin
Lorsque l’on veut récupérer des données acquises par un Arduino, il existe différentes solutions :
- Communiquer par le câble USB et le terminal série (voir Bibliothèque Serial)
- Utiliser un média de communication sans fil (Bluetooth, Xbee, …))
- ou bien enregistrer les données localement de manière à pouvoir les consulter plus tard.
La dernière solution est particulièrement adaptées pour :
- des acquisitions sur de longues périodes : pas besoin laisser un PC allumé (avec les risques de coupure !)
- des acquisitions rapides : les média de communication série ne sont pas très rapides
- des systèmes embarqués sur véhicules : pas de câble ni de problème de portée de signal
Problématique
La problématique est la suivante :
- Sauvegarder les données sur un média de stockage de masse, rapide et de grande capacité.
- Déclencher périodiquement l’enregistrement et/ou maitriser la variable « temps ».
Utilisation d’une carte SD
Pour utiliser une carte SD, il faut un module spécial.
Il existe de nombreux shields possédant un slot pour carte microSD. Dans ces cas là, aucun branchement particulier n’est à faire.
Les autres modules, plus universels et non réservés aux Arduino, fonctionne sur un bus SPI, et doivent être connectés sur les ports suivants :
Exemple : module MicroSD card de CATALEX :
Ils peuvent être utilisés avec la bibliothèque standard SD., ou bien avec une bibliothèque plus évoluée nommée SDfat.
Installation de SDFat
- Télécharger l’archive zip du dépot de SDfat,
- Dézipper cette archive,
- Placer le dossier
SdFat
dans le sous-dossierlibraries
du dossierDocuments/Arduino
.
Exemple de programme
#include <SdFat.h> SdFat carteSD; SdFile fichier; // fichier pour les données const byte SD_PIN = 4; // port de la carte SD (ne pas changer) unsigned long t0 = 0; // variable pour le timer const unsigned long periode = 1000; // période d'enregistrement (en ms) void setup() { // Initialisation de la carte SD carteSD.begin(SD_PIN); // Mise à zéro du timer t0 = millis(); } void loop() { unsigned long t = millis(); if (t-t0 > periode) { t0 = t; EcrireDonnees(t); } // Autres opérations à réaliser ....... delay(100); } void EcrireDonnees(unsigned long t) { // Acquisition des données float donnee = float(analogRead(A0)) / 180; // Enregistrement des données if (fichier.open("donnees.csv", O_RDWR | O_CREAT | O_AT_END)) { fichier.print(t); fichier.print(","); fichier.println(donnee, 1); fichier.close(); // fermeture du fichier } }
Exploitation des données
Le programme précédent enregistre les données au format CSV (comma-separated values), la plupart des tableurs peuvent ouvrir ce format !