Radiateur connecté
Lors de cet atelier, Alexis propose la réalisation d'un système de contrôle connecté d'un radiateur électrique. Au menu : un peu d'arduino ou de raspberry pi, de la mesure de température, une touche de communication ethernet ou wifi et un des relais ! Le tout permet par exemple d'économiser un peu d'énergie en programmant une (vieille) installation.
Contrôle du radiateur
On positionne le radiateur en mode manuel et on met au maximum. Puis on branche le radiateur à travers une prise électrique commandée par radio. De cette façon, on court-circuite le thermostat interne et la prise contrôle directement la résistance du radiateur.
Pour tester le bon fonctionnement de cette partie, il suffit d'utiliser la télécommande fournie avec la prise: à l'arrêt le radiateur est éteint, en marche le radiateur doit chauffer au maximum sans arrêt.
Contrôle avec le Raspberry Pi
Maintenant que le radiateur peut-être commandé par radio, on va le piloter depuis un programme qui tourne sur le raspberry pi.
On pourrait juste démonter la télé-commande et brancher des pins du raspberry pi à la place des boutons marche/arrêt, mais ce ne serait pas très élégant.
Il existe des modules émetteurs 433 MHz à très bas coût. Ils ont seulement trois pins: deux pour l'alimentation et un pour activer ou désactiver l'oscillateur. Seule la modulation OOK est donc supportée, mais c'est suffisant pour commander des prises DI-O.
Le branchement de l'émetteur et le logiciel pour le piloter sont détaillés à l'adresse: http://blog.idleman.fr/raspberry-pi-12-allumer-des-prises-distance/
Mesure de la température avec le Raspberry Pi
On utilise une sonde de température DS18B20 qui renvoie directement la température sous forme numérique.
Le branchement est détaillé à l'adresse suivante: http://www.framboise314.fr/mesure-de-temperature-1-wire-ds18b20-avec-le-raspberry-pi/
Le driver pour ces sondes est directement présent dans le noyau Linux et les valeurs sont lisibles depuis un script shell en interrogeant simplement un fichier du sysfs.
Tout ça mis ensemble pour faire un asservissement de la température
#!/bin/bash get_temp() { cat /sys/bus/w1/devices/28-80000028279c/w1_slave | grep -o 't=.*$' | sed 's/t=//' } heater_control() { sudo /home/pi/dio/hcc/radioEmission 0 12325261 1 $1 >/dev/null } target_t=30000 while true; do t=$(get_temp) echo "t=$t target_t=$target_t" sleep 2 if [ "$t" -lt 15000 -o "$t" -gt 40000 ] ; then echo "bad value" continue fi if [ "$t" -lt "$target_t" ] ; then echo "heater on" heater_control on else echo "heater off" heater_control off fi done
Interface web
On modifie légèrement le script de contrôle pour écrire la température courante dans un fichier et lire la consigne depuis un fichier.
#!/bin/bash get_temp() { cat /sys/bus/w1/devices/28-80000028279c/w1_slave | grep -o 't=.*$' | sed 's/t=//' } heater_control() { sudo /home/pi/dio/hcc/radioEmission 0 12325261 1 $1 >/dev/null } while true; do target_t=$(cat target_t) t=$(get_temp) echo "$t" > current_t echo "t=$t target_t=$target_t" sleep 2 if [ "$t" -lt 15000 -o "$t" -gt 40000 ] ; then echo "bad value" continue fi if [ "$t" -lt "$target_t" ] ; then echo "heater on" heater_control on else echo "heater off" heater_control off fi done
En parallèle on lance notre interface web.
from flask import Flask app = Flask(__name__) @app.route('/') def main(): t = float(open('current_t').read())/1000 target_t = float(open('target_t').read())/1000 return 't=%.2f target_t=%.2f' % (t, target_t) @app.route('/s/<int:new_t>') def s(new_t): f = open('target_t', 'w') f.write("%d" % (new_t*1000)) f.close() return 'target_t=%d' % new_t if __name__ == "__main__": app.run(host='0.0.0.0')
La page “/” permet d'afficher la température et la page “/s/<nombre>” permet de définir à la consigne à “nombre”.