Différences
Ci-dessous, les différences entre deux révisions de la page.
| 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.1 | ateliers:radiateur_connecte [2025/10/09 08:22] (Version actuelle) – jdorel | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | MIGRÉ | ||
| + | ===== 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' | ||
| + | Le tout permet par exemple d' | ||
| + | |||
| + | ==== 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' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== 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/ | ||
| + | |||
| + | Il existe des modules émetteurs 433 MHz à très bas coût. Ils ont seulement trois pins: deux pour l' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Le branchement de l' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== 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' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 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 / | ||
| + | } | ||
| + | |||
| + | heater_control() { | ||
| + | sudo / | ||
| + | } | ||
| + | |||
| + | target_t=30000 | ||
| + | |||
| + | while true; do | ||
| + | t=$(get_temp) | ||
| + | echo "t=$t target_t=$target_t" | ||
| + | sleep 2 | ||
| + | if [ " | ||
| + | echo "bad value" | ||
| + | continue | ||
| + | fi | ||
| + | if [ " | ||
| + | echo " | ||
| + | heater_control on | ||
| + | else | ||
| + | echo " | ||
| + | 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 / | ||
| + | } | ||
| + | |||
| + | heater_control() { | ||
| + | sudo / | ||
| + | } | ||
| + | |||
| + | |||
| + | while true; do | ||
| + | target_t=$(cat target_t) | ||
| + | t=$(get_temp) | ||
| + | echo " | ||
| + | echo "t=$t target_t=$target_t" | ||
| + | sleep 2 | ||
| + | if [ " | ||
| + | echo "bad value" | ||
| + | continue | ||
| + | fi | ||
| + | if [ " | ||
| + | echo " | ||
| + | heater_control on | ||
| + | else | ||
| + | echo " | ||
| + | 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(' | ||
| + | target_t = float(open(' | ||
| + | return ' | ||
| + | |||
| + | @app.route('/ | ||
| + | def s(new_t): | ||
| + | f = open(' | ||
| + | f.write(" | ||
| + | f.close() | ||
| + | return ' | ||
| + | |||
| + | if __name__ == " | ||
| + | app.run(host=' | ||
| + | </ | ||
| + | |||
| + | La page "/" | ||