CellarKare

De Wiki Makilab
Révision datée du 22 juin 2015 à 08:34 par Admin (discussion | contributions) (Le code : test syntaxhighlight)
Aller à : navigation, rechercher

Un projet lancé par --Quentin (discussion) 14 juin 2015 à 19:58 (CEST)

En bref

Le projet est de créer une "station météo" pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-) Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:

  • Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino
  • Utiliser un maximum toutes les techniques/machines du Makilab
  • Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.

Mark 1: Le matos et un premier proto

Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.

T° et humidité: DHT22 / AM2303

Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:

L'affichage LCD: LCM1602

Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux "kits de démarrage" en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:

Le montage

Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.

Sur le schéma du capteur DHT, la résistance de 10K sert de "résistance pull-up". Cette résistance n'est pas nécessaire dans le cas du capteur AM2302 (la version avec câble et boitier en plastique, comme sur la photo). Cette version intègre une résistance de 5.1K dans le boîtier, qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).

Cellarkare mark1 bb.png
Cellarkare mark1.jpg

Le code

Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.

Le code est aussi disponible (et éventuellement mis à jour) sur gitlab

<syntaxhighlight lang="c"> /* CellarKare - Mark #1 Un projet de station de mesure de la température et l'humidité dans une cave à vin Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/

  • /

// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE

  1. include <LiquidCrystal.h>

// Bibliothèque DHT, pour le capteur de température. Installable directement depuis // l'IDE, via Sketch -> Include LIbrary -> Manage Libraries -> DHT sensor Library

  1. include "DHT.h"

// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre // (RS pin, LCD Enable, D4, D5, D6, D7) LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Définition des pin et type pour le senseur de t° et humidité

  1. define DHTPIN 7 // senseur (fil data, en jaune), sur pin 7
  2. define DHTTYPE DHT22 // type DHT 22 (AM2302)

// Définition du capteur DHT22, pour un Arduino "normal" à 16mhz, comme le Uno DHT dht(DHTPIN, DHTTYPE); // les variables associées qui vont lire les valeurs (température, ...) float hum; float tempC; float tempF; float indiceHum;

// les variables qui permettent de gérer le temps, // voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay long prevMillis = 0; // enregistre le temps de la denière lecture DHT22 long dhtInterval = 3000; // L'intervalle de lecture du DHT22: 3 secondes

// la procédure d'initialisation arduino void setup() {

 // on ouvre une connection série (pour afficher un maxium d'info)
 Serial.begin(9600); 
 Serial.println("CellarKare Mark #1 Test");
 // initialisation du capteur
 dht.begin();
 // initialisation de l'écran, 16 colonnes et 2 lignes
 lcd.begin(16, 2);

}

// la boucle principale arduino void loop() {

 unsigned long curMillis = millis();
 
 if(curMillis - prevMillis < dhtInterval) {
   goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()
 }
 
 // on enregistre le dernier temps d'exécution de la lecture
 prevMillis = curMillis;   
 
 // la lecture de la t° et l'humidité prends environ 250 millisecondes
 // mais les lectures du capteur peuvent etre vieillies de 2 secondes
 // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre
 // certain d'avoir des lectures correctes.
 // lecture de l'humidité
 hum = dht.readHumidity();
 // lecture de la température en degrés Celsius
 tempC = dht.readTemperature();
 // lecture de la température en degrés Fahreneit
 tempF = dht.readTemperature(true);
 
 // On vérifie que les lectures on bien été réalisées. Si pas, on quitte
 // la boucle pour ré-essayer
 if (isnan(hum) || isnan(tempC) || isnan(tempF)) {
   Serial.println("Lecture sur le capteur DHT ratée");
   goto end_loop;
 }
 // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )
 // La température doit etre fournie en degré Fahreneit
 indiceHum = dht.computeHeatIndex(tempF, hum);
 // On affiche les valeurs sur la console série (n'est pas indispensable)
 Serial.print("Humidite: "); 
 Serial.print(hum);
 Serial.print(" %\t");
 Serial.print("Temperature: "); 
 Serial.print(tempC);
 Serial.print(" *C ");
 Serial.print(tempF);
 Serial.print(" *F\t");
 Serial.print("Indice de chaleur: ");
 Serial.print(indiceHum);
 Serial.println(" *F");
 
 // On affiche les valeurs sur l'écran LCD, curseur à (0,0)
 lcd.setCursor(0, 0);
 // print Temp in C°
 lcd.print("deg C: ");
 lcd.print(tempC);
 lcd.setCursor(0,1);
 lcd.print("hum %: ");
 lcd.print(hum);
 // label pour goto
 end_loop:
 ;

} </nowiki>

La conclusion

Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes. La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)

Mark 2: la même chose avec un Raspberry Pi

Le but de cette nouvelle itération: réaliser un montage équivalent avec un Raspberry Pi (RPi en abrégé). Pourquoi un RPi ?

  • Parce que j'en avais un sous la main ;-)
  • Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)
  • Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)

Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un Arduino Yun), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.

L'installation de l'OS

La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:

  • le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...
  • le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable "petit ordinateur", avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).

Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe plusieurs, le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là que j'ai installée.

Petit truc pour les distraits: un écran/clavier/souris n'est pas indispensable pour l'installation, il est tout à fait possible de se connecter via SSH au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet), et que vous connaissiez sont adresse IP (il est souvent possible de la récupérer en se connectant à son routeur/bbox/... et en affichant la liste des périphériques connectés). Dans mon cas, l'adresse c'est 192.168.0.100, et un ssh pi@192.168.0.100 à fait l'affaire. Pour le mot de passe, c'est raspberry par défaut. Ensuite raspi-config permet de terminer la procédure d'installation.

En ce qui me concerne, tout le reste de la configuration se fera donc en ligne de commande (shell) via SSH.

Le wifi

Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (sudo tail -f /var/log/syslog) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de /etc/network/interfaces pour entrer les références du réseau wifi:

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "Le_nom_(SSID)_de_votre_wifi"
wpa-psk "Le_mot_de_passe_de_votre_wifi"
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Ensuite un redémmarrage de la carte avec $ sudo ifdown wlan0 suivi de sudo ifup wlan0 et ça devrait être OK. On peut maintenant se passer de câble ethernet!

La température avec le DHT22 / AM2302

Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en python. Quelques ressources:

Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:

cd /home/pi
git clone https://github.com/adafruit/Adafruit_Python_DHT.git 
cd Adafruit_Python_DHT
sudo apt-get install build-essential python-dev  
sudo python setup.py install

Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:

Cellarkare mark2 bb.png
Cellarkare mark2.jpg

Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):

cd /home/pi/Adafruit_Python_DHT/examples/
sudo ./AdafruitDHT.py 2302 4

Ce qui affiche Temp=23.0*C Humidity=53.8%, des valeurs censées pour une après-midi d'été ;-)

L'affichage LCD

A suivre...