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.
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.
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 DS18
S20.
- 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 DS18
B20 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.
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.
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 :
Tout fonctionne comme prévu.
Prototype de Vincent
Merci à Vincent pour son retour positif sur la réalisation de ce thermostat 001.
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.