Datalogger et carte Arduino
Objectif
Il s'agit de montrer comment enregistrer des mesures au cours du temps dans un fichier texte type csv qui peut être ouvert dans un tableur type LibreOffice.
L'adaptateur Micro SD Adafruit
De nombreux adaptateurs SD et Micro SD compatibles avec les cartes Arduino existent. Certains sont même couplés avec une interface Wifi ou ethernet.
Le programme proposé exploite l'adaptateur Micro SD du fournisseur Adafruit. Sa fiche technique [pdf] donne à la fois les informations essentielles, notamment son câblage, et un tutoriel complet pour son utilisation.
Connexion à la carte Arduino
Ce composant est relativement gourmand en bornes E/S. Sur une carte Arduino Uno, les connexions sont les suivantes :
5 V connecté à la borne 5 V de la carte Arduino.
GND connecté à la masse de la carte Arduino.
CLK connecté à l'E/S numérique 13 de la carte Arduino.
DO connecté à l'E/S numérique 12 de la carte Arduino.
DI connecté à l'E/S numérique 11 de la carte Arduino.
CS connecté à l'E/S numérique 10 de la carte Arduino.
La borne CS devra être déclarée dans le programme dans la section setup() :
SD.begin(sdPin);
pinMode(sdPin, OUTPUT);
Exemple : Enregistrer des mesures de températures dans un fichier csv
On reprend le programme permettant de mesurer la température à l'aide d'une thermistance CTN et on le modifie de façon à enregistrer les variations de la température au cours du temps pendant une durée renseignée dans le programme comme variable.
//Importation de la bibliothèque micorSD
File Mesures;//Déclaration d'une variable de type Fichier (File)
const int sdPin = 10;//Définition de la borne de données de la carte.
float tension, RCTN, TK, TC;//Variables pour le calcul de la température.
float dureeAcquisition = 30;//Durée en s
const float R = 547.0;//Résistance connue du pont diviseur
const float B = 3450.0;//Caractéristique de la CTN
const float A = 0.004407;//Coeff dans RCTN=A.exp(B/T)
unsigned long temps;//Variable temps pour gérer la durée d'acquisition.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
SD.begin(sdPin);//Initialisation de la carte.
pinMode(sdPin, OUTPUT);//Délcaration de l'E/S en sortie.
if (SD.exists("tempe.csv")) {
SD.remove("tempe.csv");
//Si le fichier existe déjà, on le supprime.
}
Mesures = SD.open("tempe.csv", FILE_WRITE);//Création du fichier (nom limité à 8 caractères!!)
//Écriture des titres des colonnes.
Mesures.print("t (s)");//On écrit dans le fichier.
Mesures.print(";");//On choisit le ';' comme séparateur de champs.
Mesures.println("T");
temps = millis() / 1000.0;//On relève le temps de la carte Arduino.
while (millis() / 1000 < temps + dureeAcquisition) {
tension = analogRead(A0) * 5 / 1023.0;//Lecture de la tension aux bornes de la CTN
RCTN = R / (5.0 / tension - 1.0);//Calcul de RCNT
TK = B / (log(RCTN / A)); //Calcul de la température en K
TC = TK - 273.0;//Calcul de la température en °C
Serial.println(dureeAcquisition-(millis() / 1000.0-temps), 0);
//Écriture des mesures dans le fichier.
Mesures.print(millis() / 1000.0-temps, 2);
Mesures.print(";");
Mesures.println(TC, 1);
delay(1000);//Une mesure toutes les secondes.
}
Serial.println("Terminé");
Mesures.close();//On ferme le fichier !!!INDISPENSABLE!!!
}
void loop() {
// put your main code here, to run repeatedly:
}
Le fichier csv
généré est disponible ci-dessous.
Par défaut, le séparateur décimal est le '.'. Une fois importé dans LibreOffice, on utilise la fonction Rechercher/Remplacer
pour substituer des ',' aux '.'.
Ci-dessous, le résultat final obtenu.