
Leggere temperatura da sensore DS18B20 con Raspberry e GPIO
Configurare il sistema operativo per interagire con la sonda di temperature DS18B20
•Abiltare i moduli del kernel per interagire con il sensore editando il file:
/etc/modules
•Aggiungere i due moduli:
w1_gpio w1_therm
quindi, salvare.
•Nel file /boot/config.txt aggiungere:
dtoverlay=w1-gpio
quindi, salvare.
• Riavviare il RaspBerry per far caricare i moduli nuovi al boot.
Test e lettura dei dati
A questo punto se tutto funziona a dovere, potremo vedere il sensore tra i devices:
pi@itc-Pi:~$ ls /sys/bus/w1/devices/ 28-0417c46565ff w1_bus_master1
Ogni sensore collegato al BUS ha un ID univoco e per per ogni sonda collegata al GPIO si potrà vedere una directory avente nome l’id del sensore in /sys/bus/w1/devices/
.
Leggendo il file virtuale w1_slave con cat è possibile eseguire la lettura della temperatura:
pi@itc-Pi:~$ cat /sys/bus/w1/devices/28-0417c46565ff/w1_slave b5 01 4b 46 7f ff 0c 10 cd : crc=cd YES b5 01 4b 46 7f ff 0c 10 cd t=27312
27312 è la temperatura rilevata “grezza”, nel senso che il valore ritornato non è in formato decimale.
Script di lettura
#!/usr/bin/php <?php // DaxTech.net 2018 # # check parameter # if( !isset($argv[1]) or (count($argv) != 2) ) { die(json_encode(array('error'=>'true', 'message'=>'wrong parameters','errorCode'=>'-2'))); } # # get dev id # $devId = trim($argv[1]); # # exec raw read # $rawRead = shell_exec("echo \$(cat /sys/bus/w1/devices/$devId/w1_slave | grep -E -o \".{0,0}t=.{0,5}\" | cut -c 3-)"); $rawRead = str_replace("\n", '', $rawRead); # # check 4 errors # if(!is_numeric($rawRead)) { die(json_encode(array('error'=>'true', 'message'=>"read error: $rawRead",'errorCode'=>'-1'))); } # # parse float - 25875 > 25.8 # $value = floatval($rawRead); $value = round(($value / 1000), 1); # # do output # die(json_encode(array('error'=>'false', 'message'=>"$value",'errorCode'=>'0'))); ?>
Lo script fa uso dell’inteprete php-cli percui non funzionerà se non si installa il pacchetto php-cli (apt install php-cli).
Installare lo script
Installare lo script in una directory di environment così da poterlo usare in qualunque cartella ci si trovi:
nano /usr/local/bin/GPIOtemperature
Incollare lo script, salvare
Flaggare il file come eseguibile:
chmod +x /usr/local/bin/GPIOtemperature
Utilizzo script
Lo script prevede un argomento: l’ID del sensore che deve leggere, esempio:
pi@itc-Pi:~ $ GPIOtemperature 28-0417c46565ff {"error":"false","message":"27.4","errorCode":"0"}
Se non ci sono stati problemi, lo script restituisce il testo in formato JSON ( utile se si vuole leggere il valore da un’altra applicazione ) contenente la temperatura letta e se ci sono stati errori di lettura. Ovviamente è possibile modificare lo script a piacimento per far ritornare un valore prettamente testuale, se lo si desidera.