🛠 Surveillance thermique et fréquence sous contrainte 256 Mo
Objectifs
- Lire température, fréquence et drapeaux de bridage du firmware : le BCM2835 throttle au-delà de 85 °C ou en cas de sous-tension.
- Construire un historique léger (les 256 Mo n'attendent pas un vrai TSDB) avec cron et RRD ou CSV.
- Poser une alerte quand la fréquence maxi passe sous 700 MHz.
Matériel
- Model A, idéalement en boîtier (l'intérêt du modèle : faible échauffement en enceinte scellée).
- Alimentation micro-USB 5 V de qualité — une sous-tension bride la fréquence autant que la chaleur.
- Optionnel : dissipateur adhésif.
Code complet
#!/usr/bin/env bash
# /usr/local/bin/thermonut.sh — un point de mesure par minute
T=$(vcgencmd measure_temp | cut -d= -f2 | tr -d "'C")
F=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)
U=$(vcgencmd get_throttled | cut -d= -f2)
echo "$(date -Is),$T,$F,$U" >> /var/log/thermonut.csv
# Bit 0 de throttled = sous-tension ; bits 16-18 = bridage fréquence atteinte
[ $(( 0x$U & 0x10000 )) -ne 0 ] && logger -p user.warning "THERMIQUE: bridage détecté"
# /etc/cron.d/thermonut (ligne unique)
* * * * * root /usr/local/bin/thermonut.sh
# Consulter
vcgencmd get_throttled && tail /var/log/thermonut.csv
Vérification attendue
Le CSV se remplit chaque minute ; sous charge (yes > /dev/null &) la température grimpe et, au seuil de 85 °C, scaling_cur_freq chute sous 700000 kHz pendant que le drapeau get_throttled s'allume. >
Erreurs fréquentes
- Interpréter
get_throttled=0x50000comme une panne : ces bits mémorisent un événement passé, un reboot remet à zéro. - Accuser la chaleur alors que le bit sous-tension (0x1) est seul actif : c'est l'alimentation ou le câble.
- Stocker l'historique en RAM (/tmp) : tout disparaît au redémarrage, et la carte SD n'aime pas les écritures à la seconde.
bc/outils lourds pour l'arithmétique : le bash suffit, économiser les 256 Mo.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython