ateliers:radiateur_connecte

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
ateliers:radiateur_connecte [2023/06/11 14:21] – supprimée - modification externe (Unknown date) 127.0.0.1ateliers:radiateur_connecte [2023/06/11 14:42] (Version actuelle) fredervish
Ligne 1: Ligne 1:
 +===== 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.
 +
 +{{:ateliers:20161122_0035.jpg?500|}}
 +
 +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.
 +
 +{{:ateliers:20161122_0039.jpg?500|}}
 +
 +==== 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.
 +
 +{{:ateliers:20161122_0023.jpg?500|}}
 +
 +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/
 +
 +{{:ateliers:20161122_0027.jpg?500|}}
 +
 +==== 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.
 +
 +{{:ateliers:20161122_0041.jpg?500|}}
 +
 +Le branchement est détaillé à l'adresse suivante: http://www.framboise314.fr/mesure-de-temperature-1-wire-ds18b20-avec-le-raspberry-pi/
 +
 +{{:ateliers:20161122_0046.jpg?500|}}
 +
 +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 ====
 +
 +{{:ateliers:20161122_0050.jpg?500|}}
 +
 +<code>
 +#!/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
 +</code>
 +
 +==== 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.
 +
 +<code>
 +#!/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
 +</code>
 +
 +En parallèle on lance notre interface web.
 +
 +<code>
 +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')
 +</code>
 +
 +La page "/" permet d'afficher la température et la page "/s/<nombre>" permet de définir à la consigne à "nombre".