Alors commençons par le début : pourquoi ce projet ?
Simplement pour trouver d’autres façons ludique pour aider les débutants à comprendre comment faire une « station domotique maison » de plusieurs façons. Sur internet, j’ai vu beaucoup de tuto, de vidéo qui en fait n’apporte rien de bon car soit c’est faux ce qu’ils racontent, soit ça fonctionne pas comme il faudrait. Alors pour combler ce tout et n’importe quoi, je vais essayer de lancer un sujet avec de vrais explications depuis le début pour que ça soit compréhensible par n’importe qui. (pilou, ça va pas être de tout repos) 😫😆
Je vais aussi poster quelques liens vers des tutos de personnes qui savent de quoi ils parlent et qui méritent d’être cité, car je trouve leurs vidéos remarquables.
Bon stop à l’intro qui saoul et passons à la suite du programme.
Le choix du matériel et leurs caractéristiques.
- L’afficheur : Mon choix n’est pas arrêter sur tel ou tel type d’afficheur, en effet le mode de fonctionnement est pareil et en modifiant très peu de paramètres vous arriverez au même résultat.
Donc, je vous propose le model LCD 1602A et le model LCD 2004A.
Le LCD 1602A c’est un afficheur 16 caractères sur 2 lignes.
(ici le LCD 2004)
Le LCD 2004A c’est un afficheur 20 caractères sur 4 lignes.
Pour simplifier la programmation ET le cablage, j’ai choisi de piloter l’afficheur que vous aurez choisi parmi les deux modèles en « I2C ». 🙄🙄🙄 "Kesako?" Pour faire simple, c'est un mode de communication Série, j'y reviendrais.
Donc, 1 afficheur LCD 2 ou 4 lignes avec 16 à 20 caractères.
Le controleur I2C pour le LCD: (à souder sur le LCD).
- Le microcontrôleur : Ici, j’ai choisi simplement pour l’encombrement très réduit une Arduino NANO. Bon, ça se passe de commentaires pour le moment.
- La sonde DS18B20 : La ou LES sondes que j’ai choisi peuvent aller jusqu’à 15 sondes et avec une longueur maximale de 30m de câble (que vous faites vous-même, en effet les sondes sont livrées avec un câble de 1m a 3m en général). Le tout brancher sur 1 seul fil de communication série. (Voir images ci-dessous)
- Module Bluetooth HC-05 : Ce module vous permet de communiquer par Bluetooth avec votre téléphone, votre tablette, votre PC….
Mon choix a été de commencer par un truc simple comme celui-ci.
- Un module d’alimentation 5V : Bon pas besoin d’explications là ? J
Bon, le tour du matériel est fait (je vous ai pas mis le fil et la breadboard hein..)
La partie SCHEMA:
Comme le disait un vieil ami : les images parlent mieux que les mots. Donc voici le schéma qui vous servira.
Bon commençons par les sondes, j’ai ai pris 2 mais vous verrez que vous pouvez monter jusque 15.
Une sonde se présente avec 3 fils, 1 noir (GND, 1 Rouge (VCC) et 1 Jaune (le bus Data : One-Wire )
Comme sur le schéma, vous devez raccorder toutes les sondes au même endroit ET avec une résistance de 4.7K entre le fil rouge +5V (VCC) et le fils jaune (Data).
Le fils jaune (Data) doit être raccorder sur l’Arduino Nano sur la pin D5.
L'écran LCD 2004 en I2C: (Rappel, vous avez souder le module I2C sur le LCD).
Noir sur GND
Rouge sur +5V
Le SDA sur la pin A4 de l’Arduino
Le SCL sur la pin A5 de l’Arduino, en effet ses 2 pins sont le ports Série I2C de la Nano.
Bien voila un Bon début.
Le module HC-05 attendra son tour plus tard.
Bon il nous manque quoi maintenant ?
Ah oui un bout de programme pour commencer a faire voir bouger les choses.
/*
*
* Exemple de programme pour lire plusieurs capteurs DS18B20 sur un même bus 1-Wire.
*
* I2C du LCD : SDA sur A4 et SCL sur A5
*/
/* Librairie pour le bus 1-Wire */
#include <OneWire.h>
// Librairie pour afficheur LCD en I2C
#include <LiquidCrystal_I2C.h>
// Configuration du LCD
LiquidCrystal_I2C lcd(0x27,20,4); // ici le 0x27 c'est l'adresse pour la puce PCF8574t
/* Broche du bus 1-Wire */
const byte BROCHE_ONEWIRE = 5; // pin D5 de la NANO/UNO
/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
READ_OK,
NO_SENSOR_FOUND,
INVALID_ADDRESS,
INVALID_SENSOR
};
/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);
/**
* Fonction de lecture de la température via un capteur DS18B20.
*/
byte getTemperature(float *temperature, byte reset_search) {
byte data[9], addr[8];
// data[] : Données lues depuis le scratchpad
// addr[] : Adresse du module 1-Wire détecté
/* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
if (reset_search) {
ds.reset_search();
}
/* Recherche le prochain capteur 1-Wire disponible */
if (!ds.search(addr)) {
// Pas de capteur
return NO_SENSOR_FOUND;
}
/* Vérifie que l'adresse a été correctement reçue */
if (OneWire::crc8(addr, 7) != addr[7]) {
// Adresse invalide
return INVALID_ADDRESS;
}
/* Vérifie qu'il s'agit bien d'un DS18B20 */
if (addr[0] != 0x28) {
// Mauvais type de capteur
return INVALID_SENSOR;
}
/* Reset le bus 1-Wire et sélectionne le capteur */
ds.reset();
ds.select(addr);
/* Lance une prise de mesure de température et attend la fin de la mesure */
ds.write(0x44, 1);
delay(800);
/* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
ds.reset();
ds.select(addr);
ds.write(0xBE);
/* Lecture du scratchpad */
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}
/* Calcul de la température en degré Celsius */
*temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return READ_OK;
}
/** Fonction setup() **/
void setup() {
// init du sérial pour le LCD 20*4
lcd.init();
// Affichage du message de debut
lcd.backlight();
lcd.home();
lcd.setCursor(0,0); // colonne 0, ligne 0
// Petit méssage de démarrage :)
lcd.print("TUTO avec MESURES"); // texte ligne 0
lcd.setCursor(0,1); // colonne 0, ligne 1
lcd.print(" DE TEMPERATURES "); // texte ligne 1
lcd.setCursor(0,2); // colonne 0, ligne 2
lcd.print(" By MELMET for "); // texte ligne 2
lcd.setCursor(0,3); // colonne 0, ligne 3
lcd.print(" Robot-Maker.com "); // texte ligne 3
delay(3000); // tempo de 3 secondes
lcd.clear(); // efface l'ecran
/* Initialisation des ports série */
Serial.begin(115200);
}
/** Fonction loop() **/
void loop() {
float temperature[2];
/* Lit les températures des sondes */
if (getTemperature(&temperature[0], true) != READ_OK) {
Serial.println(F("Erreur de lecture du capteur 1"));
return;
}
if (getTemperature(&temperature[1], false) != READ_OK) {
Serial.println(F("Erreur de lecture du capteur 2"));
return;
}
// si vous avez 3 sonde
// if (getTemperature(&temperature[2], false) != READ_OK) {
// Serial.println(F("Erreur de lecture du capteur 3"));
// return;
// }
// Affiche les températures sur le LCD
lcd.setCursor(0,0); //
lcd.print("Sonde 1: ");
lcd.print(temperature[0], 2);
lcd.write((char)223);
lcd.setCursor(0,2);
lcd.print("Sonde 2: ");
lcd.print(temperature[1], 2);
lcd.write((char)223);
lcd.setCursor(0,1);
lcd.print(" By MELMET");
lcd.setCursor(0,3);
lcd.print("www.robot-maker.com ");
// Affiche les température sur le Moniteur Serie de l'IDE
Serial.print(F("Temperatures : "));
Serial.println("");
Serial.println("Sonde 1: ");
Serial.print(temperature[0],2); // le [0], 2) signifie [numéro de sonde], nb de décimal à afficher)
Serial.print((" C"));
Serial.println("");
Serial.println("Sonde 2 : ");
Serial.print(temperature[1],2); // le [1], 2) signifie [numéro de sonde], nb de décimal à afficher)
Serial.print(" C");
Serial.println("");
// Serial.print(temperature[2], 2); // recopier cette partie de code pour chaque sonde et ajuster la valeur entre [x], 2)
// Serial.println('C');
// Seriel.println("");
}
Bon, voila un bon début je pense.
Vous n'avez plus qu'a brancher l'alim sur le montage et regarder le resultat (pour infos, vous pouvez modifier le message d'intro )
J'attend vos retours, remarques, autres façons de faire....
La suite, prochainement.
Enjoy