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.

L'adaptateur MicroSD Adafruit

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);

Connexion de l'adaptateur Adafruit à la carte ArduinoInformations[1]

ExempleEnregistrer 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.

1
#include <SD.h> //Importation de la bibliothèque micorSD
2
File Mesures;//Déclaration d'une variable de type Fichier (File)
3
const int sdPin = 10;//Définition de la borne de données de la carte.
4
float tension, RCTN, TK, TC;//Variables pour le calcul de la température.
5
float dureeAcquisition = 30;//Durée en s
6
const float R = 547.0;//Résistance connue du pont diviseur
7
const float B = 3450.0;//Caractéristique de la CTN
8
const float A = 0.004407;//Coeff dans RCTN=A.exp(B/T)
9
unsigned long temps;//Variable temps pour gérer la durée d'acquisition.
10
11
void setup() {
12
  // put your setup code here, to run once:
13
  Serial.begin(9600);
14
  SD.begin(sdPin);//Initialisation de la carte.
15
  pinMode(sdPin, OUTPUT);//Délcaration de l'E/S en sortie.
16
  if (SD.exists("tempe.csv")) {
17
    SD.remove("tempe.csv");
18
    //Si le fichier existe déjà, on le supprime.
19
  }
20
  Mesures = SD.open("tempe.csv", FILE_WRITE);//Création du fichier (nom limité à 8 caractères!!)
21
  //Écriture des titres des colonnes.
22
  Mesures.print("t (s)");//On écrit dans le fichier.
23
  Mesures.print(";");//On choisit le ';' comme séparateur de champs.
24
  Mesures.println("T");
25
  temps = millis() / 1000.0;//On relève le temps de la carte Arduino.
26
  while (millis() / 1000 < temps + dureeAcquisition) {
27
    tension = analogRead(A0) * 5 / 1023.0;//Lecture de la tension aux bornes de la CTN
28
    RCTN = R / (5.0 / tension - 1.0);//Calcul de RCNT
29
    TK = B / (log(RCTN / A)); //Calcul de la température en K
30
    TC = TK - 273.0;//Calcul de la température en °C
31
    Serial.println(dureeAcquisition-(millis() / 1000.0-temps), 0);
32
    //Écriture des mesures dans le fichier.
33
    Mesures.print(millis() / 1000.0-temps, 2);
34
    Mesures.print(";");
35
    Mesures.println(TC, 1);
36
    delay(1000);//Une mesure toutes les secondes.
37
  }
38
  Serial.println("Terminé");
39
  Mesures.close();//On ferme le fichier !!!INDISPENSABLE!!!
40
}
41
42
void loop() {
43
  // put your main code here, to run repeatedly:
44
45
}

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.

Graphique obtenu à partir des données enregistrées sur la carte micro SD.