Translate

samedi 8 février 2014

Thermostat multi sondes et multi sorties a affichage LCD

Version afficheur 128X64



Aujourd’hui, je vous propose la réalisation d'un thermostat a affichage digital utilisant 1 a 10 sondes ds18B20. Cette réalisation servira pour la régulation des diverses température du graveur Laser.  Rien n'interdit de l'utiliser pour la gestion du chauffage ou pour avoir plusieurs indications de température.


Le schéma est assez simple, j'utilise un afficheur 128x64 avec la librairie GLCD a télécharger ici
L'avantage de l'afficheur 128x64 est qu'on peut mettre des petits dessins, un fichier java permettant de générer un fichier .h a partir d'une image est joint dans la librairie, je vous montrerai un peu plus loin comment l'utiliser.

Le schéma



Le schéma est assez simple, afin de pouvoir câbler de cette manière, j'ai du modifier l'ordre des broches dans la librairie. Sinon le câblage est éparpillé sur la UNO. L'afficheur est piloté par un K01008 mais d'autres afficheurs peuvent être utilisés avec la même librairie.
 Dans le schéma j'ai oublié de donner la valeur de la résistance se trouvant sur les sondes, il s'agit d'une 4K7.

Le code

#include <glcd.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_PIN A5 // raccordement des sondes sur la broche A6
OneWire oneWire(ONE_WIRE_BUS_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress Probe01 = {
  0x28, 0x7F, 0x47, 0xFC, 0x04, 0x00, 0x00, 0xE7 };
DeviceAddress Probe02 = {
  0x28, 0x59, 0x92, 0xFC, 0x04, 0x00, 0x00, 0x6F };
  DeviceAddress Probe03 = {
  0x28, 0x59, 0x92, 0xFC, 0x04, 0x00, 0x00, 0x6F };
// Les adresses des sondes peuvent être trouvées grace a un petit programme arduino


#include "fonts/Arial14.h"        
#include "fonts/SystemFont5x7.h"  
#include "bitmaps/JhIcon.h"    
#include "fonts/Arial_bold_14.h"      
#include "fonts/Corsiva_12.h"
#include "fonts/Verdana_digits_24.h"  
#include "fonts/fixednums7x15.h"     
#include "fonts/fixednums8x16.h"     
#include "fonts/fixednums15x31.h"  
//#include "bitmaps/thermo.h" // image a remplacer, dans la librairie il y a un fichier java permettant de convertir de petites images.


#if DISPLAY_HEIGHT < 64
#error ks0108 example requires a display at least 64 pixels tall
#endif
#if DISPLAY_WIDTH < 128
#error ks0108 example requires a display at least 128 pixels wide
#endif

//unsigned long startMillis;
//unsigned int loops = 0;
//unsigned int iter = 0;


int R1 = A0; // relai 1
int R2 = A1;//relai 2
int R3 = A2; //relai 3

int value_T1 = 0;
int value_T2 = 0;
int value_T3 = 0;

int consT1 = 23; // consigne de température T1
int consT2 = 24;
int consT3 = 25;

void setup(){
  sensors.setResolution(Probe01,10);
  sensors.setResolution(Probe02, 10);

  GLCD.Init(NON_INVERTED);  // initialisation de l'afficheur en fond clair pour un fond sombre, il suffit d'enlever le NON_
  GLCD.ClearScreen(); 
 

  pinMode (R1,OUTPUT);
  pinMode (R2,OUTPUT);
  pinMode (R3,OUTPUT);
}


void  loop(){  

  GLCD.SelectFont(SystemFont5x7);  
  GLCD.GotoXY(2, 2);
  GLCD.DrawRoundRect(0,0,127,63, 5, BLACK); 

  sensors.requestTemperatures();

  GLCD.GotoXY(22, 24);

  GLCD.SelectFont(Corsiva_12);
  GLCD.Puts("Temp 1 "); // texte affiché a modifier selon vos envies
  printTemperature(Probe01);

  GLCD.GotoXY(22, 36);
  GLCD.Puts("Temp 2 ");
  printTemperature(Probe02);
  delay(1000);
 }

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);

  if (tempC == -127.00)
  {
    GLCD.Puts("Erreur "); message d'erreur si une des sondes est déconnectée
  }
  else
  {

    GLCD.PrintNumber(tempC);
    GLCD.Puts("C ");
  }

   
//xxxxxxxxxxxxxxxxxx temperaturexxxxxxxxxxxxxxx

  int temp1 = sensors.getTempC(Probe01); // déclaration des température associée a la sonde
  int temp2 = sensors.getTempC(Probe02);
  int temp3 = sensors.getTempC(Probe03);
{
  digitalWrite (R2,HIGH);
}

  if ((temp1) >= consT1 + 1)
// formule a adapter suivant les besoins, ici on dit : si la température de la sonde 1 est égale ou    supérieur a la consigne consT1 + 1°, on commande le relais sinon on l'éteint
  // cela veut dire que si on donne une consigne de 20°,  a 21° le relai s'enclenche et a 19.9° il s'éteint
  {
    digitalWrite (R1,HIGH); // allumage relai 1
  }
  else

   {
    digitalWrite (R1,LOW);
  }

if ((temp2) >= consT2 + 1)
{
  digitalWrite (R2,HIGH);
}

else
   {
    digitalWrite (R2,LOW);
  }

if ((temp3) >= consT3 + 1)
{
  digitalWrite (R3,HIGH);
}
else
   {
    digitalWrite (R3,LOW);
  }
}


Version 4x20 lignes


Sur ce schéma, il y a un afficheur 2x16 lignes, cela conviens aussi il suffit de faire les bonnes déclarations dans le sketch. Le câblage entre le 2x16 et le 4x20 lignes est identique.

Le code

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd (5,6,4,3,2,1);

#define ONE_WIRE_BUS 15

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Probe01 = { 0x28, 0x13, 0x2A, 0xA8, 0x04, 0x00, 0x00, 0x72 };
DeviceAddress Probe02 = { 0x28, 0x71, 0x17, 0xA8, 0x04, 0x00, 0x00, 0xB7 };
DeviceAddress Probe03 = { 0x28, 0x35, 0x98, 0xFC, 0x04, 0x00, 0x00, 0x6C };


void setup() {


sensors.begin();

  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
  sensors.setResolution(Probe03, 10);


 lcd.begin (20,4);
 delay (10);
  lcd.clear ();
  delay (10);
  lcd.setCursor (3,1);
   lcd.print ("Fraiseuse CNC");
   lcd.setCursor (2,2);
   lcd.print ("BY JOJO BRICOLO");
   delay(4000);
   lcd.clear ();
  delay (10);

}

void loop() {
  //lcd.clear ();
  //delay (10);
  sensors.requestTemperatures();
 
 lcd.setCursor(0,3); //Start at character 0 on line 0
  lcd.print("X");
  displayTemperature(Probe01); 
 
  lcd.setCursor(7,3); //Start at character 0 on line 1
  lcd.print("Y");
  displayTemperature(Probe02); 
 
  lcd.setCursor(14,3); //Start at character 0 on line 2
  lcd.print("Z");
  displayTemperature(Probe03); 
 
   delay(1000);
 
}

void displayTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00) // Measurement failed or no device found
   {
    lcd.print("Erreur");
   }
   else
   {
   //lcd.print("C=");
   lcd.print(tempC);
  
   }
}

Le sketch pour trouver l'adresse des DS 18B20


Si cela vous intéresse, je suis en mesure de vous faire un kit ou même vous réaliser ce montage !!!
N'hésitez pas a me contacter.

36 commentaires:

  1. Bonjour je souhaiterais échanger avec vous via mail, est ce possible ?
    tactac77@gmail.com

    RépondreSupprimer
  2. Oui c'est possible, je viens de vous envoyer un mail afin que vous ayez mon adresse.
    Sinon c'est:
    heim.joel68@gmail.com
    A bientôt

    RépondreSupprimer
    Réponses
    1. C'est le meilleur ce monsieur foncez !!!

      Supprimer
    2. Salut Fred!
      Merci pour ton message, c'est super sympa
      Je te souhaite de bonnes fêtes
      A++
      Jojo

      Supprimer
  3. bonjour,
    je désire piloter une vanne motorisée ouverture /fermeture en fonction d'une température demandée pour mitiger de l'eau chaude, pouvez vous m'aider
    merci à vous

    mon adresse mail est: francois.constant@brutele.be

    RépondreSupprimer
  4. Bonjour,
    Je peux vous aider, mais il me faut plus d'éléments. Je vous contact donc par mail.

    RépondreSupprimer
    Réponses
    1. Bonjour
      Votre schéma m’intéresse beaucoup. Pour refroidir un capteur ccd de camera (QHY8)

      Supprimer
    2. Bonjour,
      J'ai répondu a votre mail, il me faut simplement quelques jours car j'ai d'autres demandes d'aide!!!
      Cordialement
      Jojo

      Supprimer
  5. Bonsoir,
    J'ai un arduino Ethernet et 4 sondes DS18B20 branchées sur un seul pin. J'arrive à lire la t° d'1 seule sonde par le câble Ethernet. Pouvez vous m'aider à les lire toutes Merci

    RépondreSupprimer
  6. Bonjour,
    Sans voir votre programme, je ne peux pas vous dire d’où viens l'erreur. Visualisez vous toutes les sonde via le moniteur série?
    Vous pouvez m'envoyer votre sketch via le formulaire de contact je pourrais le vérifier et éventuellement le corriger.
    Cordialement
    Jojo

    RépondreSupprimer
  7. Merci pour votre programme cela marche bien
    Le circuit électrique ce comporte bien
    http://www.webastro.net/forum/showthread.php?t=122119

    RépondreSupprimer
    Réponses
    1. J'ai été voir votre sujet, belle réalisation
      A bientôt
      Jojo

      Supprimer
  8. Bonjour Jojo,

    J'ai acheté un afficheur GLCD et une sonde de température DS18D20,montée sur circuit imprimé!
    je voudrais afficher la température sur mon afficheur, j'ai donc pris votre code et j'ai laissé juste un seul capteur, mais hélas ça ne marche pas!
    j'arrive pourtant à afficher HELLO où je veux sur l'écran.
    la deuxième question je cherche des pistes pour faire défiler un texte sur mon GLCD...
    Ouvert sur vos propositions.
    merci d'avance.

    RépondreSupprimer
  9. Bonjour
    Super tous se que vous faite
    Une question a combien reviendrez le cout pour faire un thermostat qui pourez gerer un rack pour serpent avec 8 tapis chauffant chaleur et hygro
    + un imcubateur ou la comme le rack chaleur avec un cable chauffant humidité avec un thermoplongeur et air ext int le tout connecté et controlable par smartphone et pc
    Cordialemment Cédric

    RépondreSupprimer
  10. Bonjour
    Super tous se que vous faite
    Une question a combien reviendrez le cout pour faire un thermostat qui pourez gerer un rack pour serpent avec 8 tapis chauffant chaleur et hygro
    + un imcubateur ou la comme le rack chaleur avec un cable chauffant humidité avec un thermoplongeur et air ext int le tout connecté et controlable par smartphone et pc
    Cordialemment Cédric

    RépondreSupprimer
    Réponses
    1. Bonjour,

      Merci pour le compliment,
      Il faudrait me donner plus d’éléments sur le fonctionnement
      - gestion de l'hygrométrie (bac a eau avec thermoplongeur, pompe...?)
      - Fonctionnement de l'incubateur
      - Principe de la ventilation (hygrométrie, température?)
      A++
      Jojo

      Supprimer
  11. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer
  12. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer
  13. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer
  14. Bonjour mr Joël j'espère que tout va bien chez vous !!.
    Au premier je veux te remercier pour vos efforts incroyables qui nous a aider beaucoup dans ce domaine d'électronique etc...
    J'ai fais un thermostat controlé(température et humidité) par une carte arduino + DHT22, j'ai ajouté un réglage des consignes de température et humidité avec des boutons poussoirs et ça marche bien. le problème c'est quand le courant est coupée de la carte arduino, les consignes sont perdues. C'est pour ça je veux les stocker dans l'EEPROM de l'arduino. Pouvez vous m'aider à modifier mon code!! merci d'avance monsieur et j'attends d'une réponse favorable.
    voilà mon email : adybissam94@gmail.com

    merçi encore une fois ^^

    RépondreSupprimer
  15. Bonjour mr Joël j'espère que tout va bien chez vous !!.
    Au premier je veux te remercier pour vos efforts incroyables qui nous a aider beaucoup dans ce domaine d'électronique etc...
    J'ai fais un thermostat controlé(température et humidité) par une carte arduino + DHT22, j'ai ajouté un réglage des consignes de température et humidité avec des boutons poussoirs et ça marche bien. le problème c'est quand le courant est coupée de la carte arduino, les consignes sont perdues. C'est pour ça je veux les stocker dans l'EEPROM de l'arduino. Pouvez vous m'aider à modifier mon code!! merci d'avance monsieur et j'attends d'une réponse favorable.
    voilà mon email : adybissam94@gmail.com

    merçi encore une fois ^^

    RépondreSupprimer
  16. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer
  17. Bonjour,
    le tuto est vraiment super!
    Cependant serait il possible de faire un tuto sur une conception plus poussé pour la gestion d'un chauffage bois?

    L'idée serai d'enclencher un 1er circulateur lorsque que la température de l'eau atteint 40° puis d’enclencher le circulateur des radiateurs lorsque l'eau atteint 63° le tout
    coupler à la régulation d'une vanne 3 voies motorise.

    Ont pourrait aussi ajouter une fonction qui permet d'enclencher les circulateurs lors pendant quelques minutes lorsque ceci ne sont plus en fonction depuis plus de 7 jour pour évité qu'ils se grippe.

    Pensez vous que cela et faisable ?

    RépondreSupprimer
    Réponses
    1. Bonjour,

      Oui c'est faisable par contre je ne peux pas faire un tuto pour toutes les demandes, je ne ferai plus que ça lol
      Contactez moi par le biais du formulaire de contact et on en reparle

      Supprimer
  18. salut c'est un poussoir qui est relié au lcd si oui c'est un contact no ou nf?
    merci

    RépondreSupprimer
    Réponses
    1. Salut,

      Ce n'est pas un bouton mais un potentiomètre pour le réglage du contraste de l'afficheur

      Supprimer
  19. ok merci je vais regarder a tout ca
    merci

    RépondreSupprimer
  20. salut aurais tu un lien pour l'ecran 128x64.
    Je suis nul en code aurais tu un lien qui permettent d'apprendre les bases? Je suis dans le meme cas que la personne au dessus je veux faire pour controler une chaudiere bois mais je dois considerablement modifié ton tuto deja en utilisant un shield reseau pour pouvoir controler via le smartphone. Je controle deja un arduino pour les portes de garage via jeedom

    RépondreSupprimer
  21. Bonjour,
    Superbe travail.
    Quel longueur et type de câble peut on mettre pour les sondes de température.
    Merci
    Bonne continuation

    RépondreSupprimer
    Réponses
    1. Bonjour,

      Merci!

      Pour des grandes longueur, j'utilise un simple câble blindé. J'ai réussi a faire fonctionne une sonde a 20 mètres.Se sont des sondes numériques donc pas d’influence liées au câble.

      Supprimer
  22. bonjour super vos tuto je suis nul en programmation
    es que on peux afficher la température demandée et modifié
    selle ci avec des bouton poussoir sur l’ecrans 128x64
    un grand merci pour votre aide

    RépondreSupprimer
  23. Bonjour,
    Merci!
    Oui c'est réalisable, le seul hic est que la sonde de température demande un délai mini de 750ms pour rafraichissement de la mesure, cela veut dire que lors de l'appui sur un bouton la valeur ne s'incrémente pas instantanément.

    RépondreSupprimer
    Réponses
    1. cela ne serai pas un problème pour moi savais vous m'aidé
      encore un grand merci

      Supprimer
  24. Réponses
    1. Je ne répond pas forcement tout de suite, accessoirement j'ai un emploi! Et j'ai répondu a votre question en vous disant que c'est possible avec quelques soucis.
      Je sais vous aider mais que voulez vous?

      Supprimer
    2. bonjour comme je vous l'ai Ecrit avoir en plus de l' affichage existent l’affichage de les températures demandée
      et pour voir changer selle ci a laide de bouton poussoir
      en vous remercient

      Supprimer