Il SoC (System on a Chip) implementato nella nota board ARM Raspberry Pi è dotato di una serie di sensori della temperatura che servono al sistema operativo per monitorare il calore generato dal device e di conseguenza regolare la velocità di clock della CPU. In questo modo è possibile attivare, se necessario, il cosiddetto thermal throttling, ovvero la strategia di scaling dinamico della potenza del processore con cui evitare surriscaldamenti del device e il suo danneggiamento causato da stress termico. In questo tutorial impareremo a monitorare i livelli di calore generati dal Raspberry Pi tramite un piccolo programma scritto in Python.
I software da utilizzare
L'obbiettivo finale della guida è quello di scrivere i dati all'interno di un file CVS sfruttando uno script Python. Inoltre spigheremo anche come impostare l'esecuzione del programma in modo automatizzato con l'utility Cron. Oltretutto sfrutteremo la libreria software open source Matplotlib per genere un grafico interattivo dei log registrati dai sensori di temperatura. Cosi facendo l'utente potrà visualizzare con maggiore semplicità i dati dei livelli di calore generati dalla board durante i task e negli stati di inattività. Come sistema operativo utilizzeremo Raspberry Pi OS.
Uno script Python per monitorare la temperatura dai sensori di Raspberry Pi
Nella guida di oggi daremo per scontato che l'installazione del sistema operativo sia già terminata e che abbiate dunque configurato completamente il vostro ambiente Desktop di Raspberry Pi OS. Non ci dilungheremo sull'installazione della distribuzione né sui setting da applicare a Raspberry Pi OS dopo il primo boot.
Passiamo dunque alla scrittura di un semplice script Python che si occupa concretamente di raccogliere i dati dai sensori di temperatura del device. Apriamo quindi il code editor Mu che troviamo preinstallato. Possiamo reperirlo dal menu di sistema all'interno della sezione chiamata "Programming".
Per catturare il dato della temperatura utilizziamo il pacchetto gpiozero che dovrebbe essere preinstallato. Se assente possiamo installarlo manualmente in questo modo:
sudo apt install python3-gpiozero
Quindi torniamo all'interno del documento vuoto di Mu ed iniziamo a scrivere lo script:
from gpiozero import CPUTemperature
cpu = CPUTemperature()
Salviamo quanto scritto, tramite l'apposito tasto "Save" e proviamo ad eseguire lo script con "Run". Come output dovremmo poter vedere una stringa del genere:
>>> cpu.temperature 64
A questo punto dobbiamo scrivere la parte inerente al salvataggio di tale dato in un file CSV, che può essere letto da una moltitudine di programmi. Ecco il codice da aggiungere:
from time import sleep, strftime, time
with open("/home/pi/cpu_temp.csv", "a") as log:
Con la prima stringa abbiamo indicato al programma di salvare i dati in base alla data (strftime
) e di prelevare queste informazioni dal sistema (time
). Il parametro sleep
consente invece di mettere in pausa il programma. Esso crea un file chiamato cpu_temp.csv
dentro la nostra home directory. Attenzione: di base in questo esempio stiamo usando il nome utente "pi", se il vostro username è diverso modificate il comando di conseguenza.
Tale programma però ha un piccolo difetto, infatti auto-termina appena ha ultimato il task. È necessario dunque impostare un loop cosi che sia necessario l'intervenuto umano per terminare il programma:
with open("/home/pi/cpu_temp.csv", "a") as log:
while True:
In tale loop dovremo inserire i parametri che ci interessa salvare, dunque la temperatura e l'orario del valore registrato:
with open("/home/pi/cpu_temp.csv", "a") as log:
while True:
temp = cpu.temperature
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str(temp)))
La funzione log.write()
permette di scrivere nel file CSV tutto ciò che l'utente inserisce all'interno della parentesi iniziale. In questo caso stiamo scrivendo, sfruttando il placeholder format
e la funzione str()
, due informazioni: la data e la temperatura separate da una virgola, tramite la stringa {0},{1}\n
. In fine aggiungiamo anche sleep(1)
cosi da impostare una pausa dopo aver scritto il dato sul file.
Dunque ora lo script completo dovrebbe apparire cosi:
from gpiozero import CPUTemperature
from time import sleep, strftime, time
cpu = CPUTemperature()
with open("/home/pi/cpu_temp.csv", "a") as log:
while True:
temp = cpu.temperature
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"), str(temp)))
sleep(1)
Creare un grafico con i dati della temperatura tramite matplotlib
Per consultare rapidamente i dati salvati dallo script possiamo utilizzare la libreria matplotlib che è stata sviluppata per realizzare grafici animati. Procediamo quindi alla sua installazione:
sudo apt install python3-matplotlib
Ora dovremo modificare lo script creato prima cosi:
from gpiozero import CPUTemperature
from time import sleep, strftime, time
import matplotlib.pyplot as plt
cpu = CPUTemperature()
plt.ion()
x = []
y = []
def write_temp(temp):
with open("/home/pi/cpu_temp.csv", "a") as log:
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"), str(temp)))
def graph(temp):
y.append(temp)
x.append(time())
plt.clf()
plt.scatter(x, y)
plt.plot(x, y)
plt.draw()
while True:
temp = cpu.temperature
write_temp(temp)
graph(temp)
plt.pause(1)
Come potete notare ci sono state diverse modiche. import matplotlib.pyplot as plt
va sostanziale a richiamare la libreria installata poco prima. plt.ion()
invece indica allo script come disegnare il grafico basato su due assi cartesiani, mentre def write_temp(temp):
indica alla libreria da dove pescare i dati. Le incognite X e Y saranno la temperature e la data/orario in cui viene registrato il dato.
Tali parametri sono definitivi successivamente dalla stringa def graph(temp)
, da y.append(temp)
e x.append(time())
. Mentre poco sotto viene indicato allo script come calcolare le linee sul grafico. Inoltre il tutto deve aggiornarsi con delle pause prestabilite, ecco perché è stata sostituta la funzione sleep
con quella di matplotlib chiamata plt.pause
.
Ora eseguendo manualmente lo script dovremmo poter vedere il grafico.
Inserire lo script su Cron per l'esecuzione automatizzata
Salvate lo script nuovamente e nominatelo temperature.py
. A questo punto per farlo partire al boot del Raspberry Pi basta usare crontab. Apriamo il terminale e digitiamo:
crontab -e
Selezioniamo l'editor di testo "nano" e scrolliamo il documento aperto fino alla fine ed incolliamo tale stringa al suo terminale:
@reboot python3 /home/pi/temperature.py
Salviamo le modifiche con CTRL+O ed usciamo con CTRL+X
Al riavvio del device lo script dovrebbe partire in automatico. Per visualizzare il grafico nuovamente dovete avviare lo script sempre su Mu. Oppure se lo preferite potete consultare i dati grezzi usando il tool cat:
cat cpu_temp.csv