CellarKare : Différence entre versions
(→Le code) |
(→Le code) |
||
Ligne 36 : | Ligne 36 : | ||
<code> | <code> | ||
− | + | /* | |
+ | 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 | ||
+ | */ | ||
+ | |||
+ | /* | ||
+ | Copyright © 2015 Quentin BERTEN <quentin@berten.me> | ||
+ | This program is free software. It comes without any warranty, to | ||
+ | the extent permitted by applicable law. You can redistribute it | ||
+ | and/or modify it under the terms of the Do What The Fuck You Want | ||
+ | To Public License, Version 2, as published by Sam Hocevar. See | ||
+ | http://www.wtfpl.net/ for more details. | ||
+ | */ | ||
+ | |||
+ | // Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE | ||
+ | #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 | ||
+ | #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é | ||
+ | #define DHTPIN 7 // senseur (fil data, en jaune), sur pin 7 | ||
+ | #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 secInterval = 1000; // Un intervalle d'un seconde | ||
+ | // L'intervalle de lecture du DHT22: 3secondes, doit etre plus grand que secInterval | ||
+ | long dhtInterval = 3000; | ||
+ | |||
+ | // 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 princiaple 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 | ||
+ | // Check if any reads failed and exit early (to try again). | ||
+ | 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: | ||
+ | ; | ||
+ | } | ||
</code> | </code> |
Version du 16 juin 2015 à 19:10
Un projet lancé par --Quentin (discussion) 14 juin 2015 à 19:58 (CEST)
Sommaire
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 s'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
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. Quelques liens et documentation utiles:
- Les specs du DHT22 (anglais);
- Pour acheter: ~10 $ chez AdaFruit ou ~17 € chez MCHobby, c'est un peu plus cher, mais ils sont belges et sympas;
- Un tutotiel pour arduino sur Aduino.cc;
- Un tutoriel pour arduino sur AdaFruit, et sa version française;
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 "kit 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:
- Les specs (chinois ou anglais)
- Pour acheter: on en trouve plein sur ebay...
- La librairie LiquidCrystal, qui permet de le contrôler sur Arduino
Le montage
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et example d'utilisation de l'écran et du capteur.
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. Dans le code ci-dessous, les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.
/*
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
- /
/*
Copyright © 2015 Quentin BERTEN <quentin@berten.me>
This program is free software. It comes without any warranty, to
the extent permitted by applicable law. You can redistribute it
and/or modify it under the terms of the Do What The Fuck You Want
To Public License, Version 2, as published by Sam Hocevar. See
http://www.wtfpl.net/ for more details.
- /
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE
- 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
- 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é
- define DHTPIN 7 // senseur (fil data, en jaune), sur pin 7
- 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 secInterval = 1000; // Un intervalle d'un seconde
// L'intervalle de lecture du DHT22: 3secondes, doit etre plus grand que secInterval
long dhtInterval = 3000;
// 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 princiaple 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
// Check if any reads failed and exit early (to try again).
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:
;
}