mardi 25 juin 2013

Saisie de données (data logging) avec un Arduino



Mise à jour (31 octobre 2016):  voici une version plus récente dans laquelle j'utilise un "data logging shield" plutôt que des composants individuels.

Voici un projet classique qui montre de façon éloquente l'efficacité de l'Arduino pour la conception de systèmes de mesures scientifiques: un "data logger".


Dans ce projet, l'Arduino consigne à toutes les minutes, sur une carte SD,  les valeurs de température et de luminosité mesurées par des capteurs appropriés.

En plus d'un Arduino Uno, j'ai donc utilisé un lecteur de cartes SD muni d'un adapteur lui permettant de recevoir les signaux de 5 V,  un capteur de température numérique DS18B20, une photorésistance et une horloge temps réel (RTC).

Tous ces périphériques étaient déjà prêts à l'emploi, puisqu'ils ont déjà été utilisés dans des articles précédents (que vous pouvez consulter en cliquant les liens du paragraphe précédent).

La seule nouveauté, c'est la sonde d'intensité lumineuse constituée d'une photorésistance branchée en diviseur de tension avec une résistance de 10 kΩ (ma photorésistance varie entre 50 Ω et 200 kΩ, avec une valeurs moyenne d'environ 10 kΩ avec un éclairage moyen).   Cette sonde indique presque 0 dans l'obscurité complète, et pas très loin de 5 V en plein soleil.   Par contre, il ne s'agit que d'une tension donnant une indication grossière de l'intensité lumineuse:  quand l'intensité double, la tension ne va probablement pas doubler.

Les branchements des différents périphériques à l'Arduino sont les suivants:

Le lecteur de cartes SD occupe les pins 10, 11, 12, 13 de l'Arduino (SPI).  Mais prenez garde d'abaisser à 3,3 V les signaux qui doivent l'être (plus d'informations à ce sujet ici).

L'horloge RTC est branchées aux pins A4 et A5 (i2c) de l'Arduino (plus d'infos ici).

Le thermomètre DS18B20 est branché à la pin 7 de l'Arduino (plus d'infos ici).

La sonde à base de photorésistance est branchées à la pin A0 de l'Arduino.

Les données sont enregistrées sur la carte SD sous la forme d'un fichier CSV:  "comma-separated value".  Il s'agit d'un fichier texte destiné à être ouvert dans un tableur comme Excel.  Dans mon sketch, j'ai choisi de respecter la convention adoptée par la version française d'Excel:  les valeurs d'une même ligne sont séparées par des points virgules (plutôt que par des virgules).  De plus, je remplace le point décimal de la température par une virgule.

Pendant le fonctionnement, on peut observer le fonctionnement correct du data logger grâce au moniteur série du programme Arduino:  chaque minute, l'Arduino consigne le temps en secondes depuis le début de la prise de mesure, la date, l'heure, une tension proportionnelle à l'intensité lumineuse, et la température en degrés celcius.

Tel que prévu, les fichier CSV enregistré sur la carte SD s'ouvre facilement dans Excel, et on peut alors effectuer des calculs sur les données, les mettre en graphique, etc.

Ci-contre:  un graphique de la température en fonction du temps pendant quelques heures aujourd'hui.  Journée chaude et humide, puis averse pendant laquelle la température a diminué pour devenir plus confortable.


Il serait utile d'ajouter un dispositif permettant de s'assurer que tout fonctionne correctement pendant que l'Arduino n'est pas branché à un ordinateur.  Car ça doit être un peu frustrant de mettre en place le système pour une série de mesures d'une durée de plusieurs jours, pour ensuite se rendre compte que la carte SD a refusé de s'initialiser au départ.  Ça pourrait être une simple LED qui s'allume en cas d'erreur, ou un afficheur LCD indiquant la dernière valeur mesurée, etc.

Notez qu'Adafruit fabrique un "Data Logging Shield" spécialement conçu pour ce genre d'exercice:  puisque le shield contient déjà un lecteur de carte SD et une horloge RTC, il ne reste plus qu'à brancher les capteurs désirés.

Yves Pelletier (Twitter: @ElectroAmateur)

2 commentaires:

  1. Bonjour,
    Merci pour cet article fort intéressant.
    Serait-il possible de générer un fichier par jour, fichier qui porterait le nom du jour ?
    J'ai un projet similaire mais pour le moment je ne sais que copier ce que font les autres et quand ça veut bien fonctionner !

    RépondreSupprimer
  2. 'class DateTime' has no member named 'get'
    quand j'essayes sur arduino 1.6.5 ?
    a la ligne Serial.print(now.get()-tempsInitial); // nombre de secondes depuis le début du sketch

    RépondreSupprimer

Related Posts Plugin for WordPress, Blogger...