Electronique > Réalisations > Affichage / Mesures > Thermostat 001

Dernière mise à jour : 15/04/2012

Présentation

Le thermostat présenté ici permet de réguler la température ambiante dans une pièce de la maison ou dans une petite serre. Il est basé sur l'emploi d'un PIC de type 16F628A et d'un capteur de température numérique de type DS1820.

thermostat_001_pcb_3d_a

La programmation de la température et de l'hystérésis désirés se fait au moyen de petits interrupteurs (micro-switches). J'aurais pû mettre un afficheur LCD (comme le fait Dany, voir un peu plus loin), mais j'ai plutôt misé sur un usage avec température de consigne constante ou tout du moins peu souvent modifiée. La consigne de température peut être ajustée par pas de 0,5 °C entre -20 °C et +100 °C (précision de 0,5 °C dans la plage -10 °C à +85 °C, moins bonne au-delà), avec un hystérésis ajustable entre 0,0 °C et 3,5 °C par pas de 0,5 °C. Trois LED indiquent en permanence si la valeur de température transmise par le capteur est inférieure, égale ou supérieure à la température de consigne. La partie puissance est composée d'un triac permettant de commuter une charge résistive dont la puissance ne devra pas excéder 1000 W ou 1200 W. Afin d'éviter toute production de parasite sur le réseau EDF lors des commutations On / Off de la charge, un optocoupleur avec détection de passage par zéro de l'onde secteur (modèle MOC3041) est inséré entre le circuit de commande et le circuit de puissance. Cet optocoupleur assure par la même occasion une bonne isolation entre les deux parties. Un thermostat sans composant programmable, basé sur le LM35, est proposé en page Thermostat 002.

Remerciements / Thanks

Un grand merci à Dany, qui a mis à disposition de tous un ensemble de routines pour le traitement des données du DS1820, via son site, routines que j'ai utilisées dans le présent projet (fichier DS1820.ppas). Dany a également réalisé un thermostat, mais un peu différent, avec afficheur LCD et modification de la température de consigne par boutons poussoir plus / moins.
A big thank to Dany, that made available on his site, some routines for DS1820 data handling (DS1820.ppas file), routines I used in my thermostat 001 project. Dany has already made a thermostat, but with a different concept : on its project, he use a LCD display and push-buttons (up / down) to specify desired temperature.

Schéma

Incluant les sections commande, commutation de puissance et alimentation secteur, il se présente comme suit.

thermostat_001

Fonctionnement général
Le principe de fonctionnement de ce montage est fort simple. Le PIC questionne le capteur de température DS1820 à intervalles réguliers, afin que ce dernier lui envoie la valeur de la température actuelle. Si la valeur reçue est conforme (un contrôle de CRC permet de s'affranchir des erreurs éventuelles de transmission entre capteur et PIC), alors le PIC compare la valeur lue (T) avec la valeur de consigne (C). La lecture de la température à lieu toutes les minutes, inutile en effet de faire plus rapide, bien que ce soit bien sûr tout à fait possible. Une fonction d'hystérésis (valeur H) permet de conserver un écart de déclanchement entre mise sous tension et mise hors tension de la charge. On pourrait considérer la présence de cet hystérésis comme superflux du fait de la grande valeur de temps qui sépare deux mesures, mais comme elle est désactivable (si spécifiée à la valeur 0 °C), vous pourrez en faire ce que vous voulez.
- Si la valeur lue est inférieure à la valeur de consigne moins la valeur d'hystérésis (T < C-H), alors la charge est mise sous tension pour monter le chauffage.
- Si la valeur lue est égale à la valeur de consigne (T = C), alors la charge est laissée hors tension, on ne fait rien.
- Si la valeur lue est supérieure à la valeur de consigne (T > C), alors la charge est mise hors tension.
Les trois LED D1 à D3 permettent de savoir à tout instant où la température actuelle en est par rapport à celle de la consigne.
Remarque : vous avez sans doute remarqué que le capteur de température DS1820 ne possède qu'un seul fil de données en plus de ses deux fils d'alimentation. Le fait de pouvoir questionner ce composant (lui envoyer des ordres) et de pouvoir lire ce qu'il envoie peut semble un peu curieux, à première vue. Il faut juste savoir que cet unique fil de données permet d'établir une communication bi-latérale, mais pas en full duplex : côté DS1820, le fil de données peut être configuré en entrée ou en sortie, ce qui d'un point de vue électronique est assez aisé à réaliser (notez que c'est le cas de beaucoup de broches sur les microcontrolleurs). L'appellation officielle d'un tel "bus" de données est "One-Wire" (un seul fil).

Réglage de la consigne de température
Le réglage de la température désirée s'opère en plaçant dans la position adéquate les microswitches (interrupteurs miniatures) regroupés sous l'appellation SW1. J'aurais bien pû me contenter de suivre une configuration "logique et normale", de sorte que la valeur de la température de consigne soit directement égale à la valeur spécifiée par les switches. Mais non, il a encore fallu que je n'en fasse qu'à ma tête, je voulais absolument autoriser une température de consigne négative... et avec des switches codés en binaire, ce n'est pas évident, si ce n'est en sacrifiant un bit pour le signe, au détrimant de la plage de réglage totale. Bref, je voulais pouvoir spécifier une température de consigne comprise entre -20 °C et +100 °C, et non entre 0 °C et +125 °C, avec un codage binaire qui ne peut mener plus loin que 128 (le bit de poids le plus faible RB0 donnant la précision à 0,5 °C, il ne reste que 7 bits pour le reste). J'ai donc du prendre une décision qui m'a demandé un mois et trente-sept migraines affreuses, pour finalement conclure à l'inévitable : je ne ferai pas comme tout le monde. Mais que l'on se rassure, la migraine ne vous guète pas pour autant, car j'ai également pris la sage décision de vous expliquer comment opérer, au moyen de quelques exemples pratiques. Mais commençons par le début. Nous souhaitons pouvoir ajuster la consigne de température à la valeur de -20 °C, mais la valeur minimale que l'on peut coder ici est la valeur 0 (tous switches fermés, et donc toutes les entrées du port B à la masse). Qu'à cela ne tienne, il suffit de décaler la valeur minimale programmée avec les switches, de façon à la faire correspondre à la valeur de consigne minimale. Ainsi, la valeur programmée 0 correspond à la valeur de température -20 °C. Et la valeur 20 correspond à la valeur de température 0 °C, et la valeur 42 correspond à la valeur de température 22 °C. Il y a toujours un décalage de 20 °C entre la valeur programmée et la consigne de température "réelle". Ainsi, si la température de consigne désirée est de 19 °C, il faut simplement coder la valeur des switches pour obtenir 39 (19 °C + 20). Avouez que j'aurais pû pousser le sadisme plus loin...

Réglage de l'hystérésis
Le réglage de l'hystérésis s'opère en plaçant dans la position adéquate les microswitches regroupés sous l'appellation SW2. Là, pas de diablerie mathématique, j'étais bien trop fatigué par l'exercice précédent. Il suffit d'additionner les valeurs corespondant aux switches qui sont ouverts (car ouverts, ils conduisent à avoir un niveau logique haut sur les entrées RA5..RA7 concernées, au travers des résistances R4 à R6). Sur le schéma, seul le switch de l'entrée RA5 du PIC est ouvert, nous avons donc un hystérésis de 0,5 °C.

Exemple concret
On veut établir une consigne de température C à 19 °C, avec un hystérésis H de 0,5 °C. La température ambiante T actuelle est de 15 °C, le comportement du thermostat sera donc le suivant :
- T (15,0 °C) < C (19,0 °C) : le système de chauffage est activé, et la température dans la pièce augmente, jusqu'à atteindre la valeur de la consigne de 19 °C.
- T (19,0 °C) = C (19,0 °C) : le système de chauffage est désactivé. La température dans la pièce va descendre petit à petit, jusqu'à atteindre 18,5 °C. Comme la résolution du capteur de température est de 0,5 °C, la valeur mesurable immédiatement inférieure à la consigne est précisement 18,5 °C. Le système de chauffage reste désactivé, à cause de l'hystérisis de 0,5 °C. En d'autres termes, il faut que la température descende à 18,0 °C pour que le système de chauffage se remette en route. Si l'hystérésis avait été de 0,0 °C, le système de chauffage se serait remis en route dès 18,5 °C. Et si l'hystérésis avait été de 1,5 °C, le système de chauffage se serait remis en route dès 17,5 °C. Maintenant, la température ambiante a encore chutée et vaut désormais 18,0 °C.
- T (18,0 °C) < C (19,0 °C) : le système de chauffage est réactivé, et la température dans la pièce remonte. A la température ambiante de 18,5 °C, le système de chauffage reste activé car la température ambiante augmente (le logiciel du PIC fait la différence entre 18,5 °C atteint sur diminution ou sur augmentation de température). Puis la température ambiante T repasse au-dessus de 19 °C. Comme un rayon de soleil carresse le capteur de température (pensez-y), la mesure suivante rapporte 19,5 °C.
- T (19,5 °C) > C (19,0 °C) : le système de chauffage est désactivé.
Etc.

Périodicité des mesures
Dans l'état, le logiciel effectue une mesure toutes les quatre secondes. Vous pouvez modifier la partie du code qui détermine cet intervalle, mais n'allez pas plus vite qu'une mesure par seconde car il faut 750 ms au capteur pour acquérir une mesure de façon fiable (je conseille une mesure toutes les deux secondes au plus rapide). Les lignes à modifier le cas échéant se trouvent dans la routine Interrupt, qui est appelée à chaque débordement du Timer1, toutes les 500 ms environ. Les lignes de code à modifier sont celles écrites en rouge.

procedure Interrupt;
begin
if PIR1.TMR1IF then // timer 1 overflow (~500 ms elapsed)
begin
Inc(TimeCnt);

// start conversion
if TimeCnt = 5 then // start conversion every 4 secondes (8 - 3)
//if TimeCnt = 27 then // start conversion every 15 secondes (30 - 3)
//if TimeCnt = 57 then // start conversion every 30 secondes (60 - 3)
//if TimeCnt = 117 then // start conversion every minute (120 - 3)
Convert := true;

// and wait a little (1500 ms) before accept temps value ("AcceptTemp")
if TimeCnt = 8 then // 4 secondes elapsed
//if TimeCnt = 30 then // 15 secondes elapsed
//if TimeCnt = 60 then // 30 secondes elapsed
//if TimeCnt = 120 then // 1 minute elapsed
begin
TimeCnt := 0; // wrap around
AcceptTemp := true; // accept measured temperature x secondes, first time after 5 seconds
if TimeState < MaxTimeState then
Inc(TimeState) // increment TimeState
else
TimeState := 0;
end;

//TMR1H := cTMR1H; // |- done in main program
//TMR1L := cTMR1L; // |
PIR1.TMR1IF := 0; // clear interrupt flag
end;
end;


Comme les interruptions ont lieu toutes les 500 ms, la variable compteur TimeCnt s'incrémente de 1 point toutes les 500 ms. Une valeur de compteur TimeCnt = 5 correspond donc à 2,5 secondes, et une valeur de compteur TimeCnt = 8 correspond à 4 secondes. Le temps d'attente entre début de conversion (convert := true) et mesure effective (AcceptTemp := true) est fixé ici à 1500 ms (3 coups de compteur TimeCnt, soit 8-5 si mesure toutes les quatre secondes, ou 120-117 si mesure toutes les minutes). Pour ceux qui n'ont pas de quoi recompiler le code source fournit, je propose quatre fichiers compilés (*.hex) prêts à l'emploi pour quatre périodicité différentes (4, 15, 30 et 60 secondes).

Précision du capteur
Suite à remarque de Vincent concernant la précision des différents types de capteurs DS1820 qu'on peut trouver, voici le complément d'info qui s'impose. Je parle du DS1820 et sur mon schéma on voit un DS18S20.
- DS1820 : boîtier 8 broches (SO), plage mesure -55 °C à +125 °C, précision +/-0,5 °C entre -10 °C et +85 °C
- DS18S20 : boîtier 3 broches (TO92), plage mesure -55 °C à +125 °C, précision +/-0,5 °C entre -10 °C et +85 °C
- DS18B20 : boîtier 8 broches (SO) ou boîtier 3 broches (TO92), plage mesure -55 °C à +125 °C, précision +/-0,5 °C entre -10 °C et +85 °C
La résolution du capteur DS18B20 peut être ajustée par l'utilisateur en mode 9, 10, 11 ou 12 bits, ce qui correspond de façon plus parlante à des précisions respectives de 0,5 °C, 0,25 °C, 0,125 °C ou 0,0635 °C. Si on ne spécifie rien, la résolution est la plus haute (12 bits). La résolution la plus haute est celle qui demande le temps de conversion le plus long (750 ms). Les capteurs DS1820 et DS18S20 n'ont qu'une résolution de 9 bits (0,5 °C). Comme on peut le voir, la précision est toujours de +/-0,5 °C au maximum, quelque soit le capteur utilisé. Une valeur lue de 21 °C correspond donc à une valeur réelle comprise entre 20,5 °C et 21,5 °C.
Attention, le logiciel actuel ne permet pas le fonctionnement avec un DS18B20 ! Vous devez utiliser un DS1820 ou un DS18S20.

Alimentation
Sa valeur est pour ainsi dire imposée par le PIC, qui réclame une tension comprise entre 3 V et 6 V. L'idéal est de se fixer une valeur de 5 V, bien connu des électroniciens "logiques" et facile à obtenir avec un régulateur de tension tripode classique style LM7805, ou même 78L05 auquel on ne peut demander que 100 mA, ce qui suffit bien ici. Une alim telle l'alimentation simple 001 configurée en 5 V conviendra donc parfaitement, c'est celle adoptée ici.

Logiciel du PIC

Le fichier binaire compilé *.hex à flasher dans le PIC et les fichiers de code source (MikroPascal Pro V5.30) sont compris dans l'archive zip ci-jointe.
Thermostat 001 - 16F628A - (version du 15/04/2012)
L'archive contient en outre quatre fichiers compilés (*.hex) prêts à l'emploi pour quatre périodicité différentes :
- pour périodicité 4 secondes : fichier electronique_thermostat_001_16F628a_04_sec.hex
- pour périodicité 15 secondes : fichier electronique_thermostat_001_16F628a_15_sec.hex
- pour périodicité 30 secondes : fichier electronique_thermostat_001_16F628a_30_sec.hex
- pour périodicité 60 secondes : fichier electronique_thermostat_001_16F628a_60_sec.hex
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Circuit imprimé

Le circuit imprimé est réalisé en simple face, tous les composants, exceptée la résistance chauffante et le transformateur d'alimentation, sont positionnés dessus.

thermostat_001_pcb_composants

Typon aux formats PDF, EPS et Bitmap 600 dpi

Remarques :
- Deux straps assurent la continuité des lignes d'alimentation pour le microcontrolleur (broches 5 et 14). Pensez à les souder avant placement de tout autre composant !
- Le groupe d'interrupteurs SW2 peut être composé de plusieurs façons : soit un bloc tout fait de quatre microswitches dont on ignore un quart (il y a assez de place vers le bas pour ce type de pièce, il faut juste penser à couper ou replier les deux pattes inutilisées en dessous) ; soit trois microswitches individuels placés côte à côte. Soit encore un double et un simple. Je vous fais confiance pour le choix...
- La faible place réservée pour le triac n'autorise pas la pose d'un radiateur de grandes dimensions. La puissance dissipée par ce dernier sera donc limitée à quelques centaines de watts, à moins de le déporter à côté du circuit, sur un radiateur de plus grand volume.

Prototypes

A ma connaissance, deux protos construits.

Mon prototype
Mon prototype est identique au circuit dessiné ci-avant, à l'exception de la résistance R10 que j'avais omise dans l'implantation, et que j'ai du rajouter côté cuivre. Pour les tests, j'ai retiré l'optotriac MOC3041 et ai mis une LED rouge entre les deux pattes 1 et 2 (optotriac en place sur la première photo et retiré sur la deuxième), afin de vérifier le bon fonctionnement de la commande sans avoir à brancher le secteur sur le circuit.

thermostat_001_proto_001a thermostat_001_proto_001d

Gros plan sur le capteur de température numérique DS1820 monté sur trois petits bouts de support en barrette sécable, et circuit en action :

thermostat_001_proto_001c thermostat_001_proto_001e thermostat_001_proto_001b

Tout fonctionne comme prévu.

Prototype de Vincent
Merci à Vincent pour son retour positif sur la réalisation de ce thermostat 001.

thermostat_001_proto_vas_001a thermostat_001_proto_vas_001b

Et merci aussi pour les photos, ça va de soi.

Température de fonctionnement

Si vous utilisez des composants traditionnels pour réaliser ce thermostat, vous ne pourrez pas le faire fonctionner dans une ambiance de -10 °C ou de +80 °C. Le capteur en lui-même est capable de travailler dans la plage de fonctionnement de la consigne (-20 à +100), mais le reste des composants non. Le capteur peut donc être placé là où il doit se trouver, mais le circuit thermostat quant à lui doit être positionné dans une pièce où règne une température "normale", c'est à dire comprise entre +10 °C et +35 °C.

Historique

15/04/2012
- Ajout d'une LED (D8) en série avec l'entrée de l'optotriac U3 (la résistance R7 passe de 220 ohms à 47 ohms) pour un retour visuel sur le déclanchement de la section puissance.
- Ajout infos indiquant comment modifier la périodicité des mesures.
- Ajout infos concernant la précision et la résolution des capteurs DS1820, DS18S20 et DS18B20.
25/12/2011
- Ajout photos prototype de Vincent.