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)

5 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
    Réponses
    1. il faut remplacer now.get() par now.unixtime()
      dans l’entièreté du croquis
      copier un croquis datant de 2013 avec un IDE et une biblio RTC maj, ok je l'essaye en 2021 avec 1.8.4 et une archive rtclib v1.2, pblme identique
      Guillaumetell a le probleme en 2016, à peine 3 ans apres le code original
      un débutant arduino risque d'etre découragé...
      Merci quand meme à Mr Pelletier

      Supprimer
    2. Ça avait été programmé avec la RTClib de jeelabs et non avec le fork d'Adafruit. Je vais corriger ça.

      Supprimer
    3. Bonjour Monsieur, çà fonctionne tres bien, ce qui est génial c'est qu'on peut choisir l'intervalle de mesures que l'on désire dans le croquis avant de le televerser, je suis parti de votre travail :
      j'ai supprimé la photoresistance, je mesure 2 temperatures ds18b20, j'utilise dallasTemperature et les adresses DS18 en dur.
      j'ai supprimé l'enregistrement des secondes, inutiles avec l'intervalle que j'utilise, je n'utilise pas la fonction pour changer le point décimal en virgule, çà se fait lors de l'importation du csv renommé txt dans excel pour le traçage du graphique, en lecture nombres temperatures le point n'est pas un problème
      Merci et meilleures salutations

      Supprimer