surveillance-temperature.sh

Raspberry Pi Compute Module 1 (CM1) · File : surveillance-temperature.sh · Language : Bash · Use case : Surveiller la température du processeur et alerter en cas de chauffe

With zero dependencies, this script reads the thermal sensor exposed by the Linux kernel, logs CPU temperature and frequency to CSV and prints an alert past a threshold. Perfect to size passive cooling.

Hardware required

A Compute Module 1 (BCM2835) on a Compute Module IO Board v1/v3, powered by 5 V micro-USB, with an SD card flashed with legacy Raspberry Pi OS (Buster). None: the board measures its own temperature (SoC sensor).

Wiring

No wiring. Check /sys/class/thermal/thermal_zone*/temp exists (otherwise load the SoC thermal module).

How it works

The kernel exposes temperature in milli-°C in sysfs; the script converts it, compares with the threshold and appends a timestamped CSV line. The current frequency confirms thermal throttling. The CM1 is a Raspberry Pi 1 (ARMv6): use 32-bit legacy Raspberry Pi OS and RPi.GPIO (sudo apt install python3-rpi.gpio). GPIO numbers follow the classic BCM numbering.

Going further

Add forced cooling (pwm-fan in sysfs), or push the CSV to a server with curl in the same cron.

surveillance-temperature.sh

#!/bin/bash
# Surveillance thermique : /sys/class/thermal + journalisation + alerte.
# Aucune dependance : sysfs et bash uniquement.

SEUIL_C="${SEUIL_C:-70}"     # degres avant alerte (variable d'env)
INTERVALLE="${INTERVALLE:-5}" # secondes entre deux mesures
JOURNAL="${JOURNAL:-/tmp/cpu-temp.csv}"

[ -f "$JOURNAL" ] || echo "horodatage,temp_c,frequence_mhz" > "$JOURNAL"

# Premier capteur thermique expose par le noyau (varie selon la carte)
ZONE=$(ls /sys/class/thermal/ | grep ^thermal_zone | head -1)
[ -n "$ZONE" ] || { echo "aucun capteur thermique dans /sys/class/thermal"; exit 1; }
echo "Capteur : $ZONE"

while true; do
  TEMP=$(($(cat /sys/class/thermal/$ZONE/temp) / 1000))  # milli-C -> C
  FREQ=$(awk 'NR==1{print $1/1000}' \
        /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq 2>/dev/null || echo 0)
  TS=$(date -Is)
  echo "$TS,$TEMP,$FREQ" >> "$JOURNAL"
  if [ "$TEMP" -ge "$SEUIL_C" ]; then
    echo "$(date +%T) ALERTE : ${TEMP}C >= ${SEUIL_C}C (freq ${FREQ} MHz)"
  else
    echo "$(date +%T) temp ${TEMP}C  freq ${FREQ}MHz"
  fi
  sleep "$INTERVALLE"
done

← Back to the board