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.
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.
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/
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.
#!/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
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”.