SENSORI DI TEMPERATURA DS18B20
FONTI:
• Come rilevare la temperatura con Raspberry Pi ed il sensore DS18B20
• DS18B20 - Sensore di Temperatura Digitale 1-Wire
• 1Wire e il sensore di temperatura ds18s10
La presente guida è stata testata con sistema operativo Raspbian Jessie e Stretch
Il sensore DS18B20 è un sensore di temperatura 1-Wire della Maxim IC. Questo sensore ha la capacità di rilevare temperature con precisione da 9-bit a 12-bit in un range di temperature fra un minimo di -55°C ed un massimo di +125°C con un'approssimazione di +/-0.5°C.
La particolarità di questi sensori di temperatura è rappresentata dal fatto che ciascun sensore ha numero seriale unico di 64-bit che lo identifica memorizzato all'interno di una ROM presente al loro interno. Questa caratteristica permette di poter utilizzare un vasto numero di sensori su di un unico bus di dati; caratteristica di fondamentale importanza nella maggior parte di progetti di data-logging e di progetti basati sul controllo della temperatura.
Il protocollo utilizzato da questi sensori è lo Unique 1-Wire®; questa interfaccia richiede l'utilizzo di un unico pin per la comunicazione. Inoltre, per poter funzionare nelle applicazioni tipiche questi sensori di temperatura non necessitano di alcun altro componente esterno. Possono essere alimentati direttamente dalla linea dati ed il range di alimentazione supportato è da 3.0V a 5.5V.
Caratteristiche tecniche
• Alimentazione: da 3.0V a 5.5V
• Calibrato direttamente in ° Celsius (Centigradi)
• Range di temperature misurabili: da -55°C a +125°C (da -67°F a 257°F)
• Accuratezza: ±0.5°C (nel range -10°C / 85°C)
• Risoluzione del sensore: da 9-bit a 12-bit (impostabile dall'utente)
• Tempo di conversione di temperature a 12-bit : 750ms
• Ogni sensore ha un indirizzo univoco a 64-bit memorizzato in una ROM interna
Si tratta di un sensore di temperatura tra i più utilizzati sia nel campo hobbistico che in quello professionale, in quanto ha una sensibilita' ed una accuratezza della rilevazione di tutto rispetto.
Risulta quindi ottimo per ogni tipo di test a livello hobbistico e per la maggior parte delle applicazioni in campo domotico.
E‘ possibile trovare in commercio questo sensore sia come integrato semplice sia già accoppiato ad altri componenti oppure in versione stagna da pozzetto ad immersione (per boiler ad esempio).
Questi sensori montati su schedina risultano già dotati della resistenza di pull-up necessaria per il collegamento al Raspberry
Nel caso invece dei sensori stagni con cappuccio in acciaio occorre collegare esternamente la resistenza di pull-up
Per individuare i conduttori di questa tipologia, la regola è:
Rosso —– VCC
Nero —– GND
Altro colore —- DATA
I collegamenti da effettuare tra il sensore DS18B20 ed il Raspberry Pi sono i seguenti:
Se la resistenza da 4,7K non dovesse funzionare, provate con una da 10K.
Nel caso i sensori siano connessi al Raspberry con cavi lunghi (oltre ~10m),per avere delle letture corrette è meglio utilizzare una resistenza di pull-up da 2,2kohm
Nel caso dei sensori stagni con cappuccio, una soluzione pratica per effettuare il collegamento e per collegare la resistenza di pull-up è la seguente:
Nella pratica il collegamento può essere realizzato saldando i vari fili dei sensori da collegare ed isolando opportunamente le saldature con del termo-restingente, e collegare la resistenza di pull-up fra il cavo data e +3,3V come di seguito illustrato (la resistenza è nel cerchietto verde).
Il pin 7 (GPIO4) è quello utilizzato di default sul Raspberry per il protocollo 1Wire, ma se avete necessità e comunque possibile modificarlo.
Per cambiarlo ed impostare ad esempio il pin 18 (GPIO24) ci sono 2 modi diversi:
1. Per Raspberry B e B+ (A e A+) (o kernel più vecchio del 3.18.0):
sudo -s echo "options w1_gpio gpiopin=24" > /etc/modprobe.d/w1
2. Per Raspberry 2 e successivi:
E’ necessario editare il file /boot/config.txt e modificare la seguente riga:
# device tree config dtoverlay=w1-gpio,gpiopin=24
In entrambi i casi sarà necessario riavviare il Raspberry per attivare le modifiche.
Installazione e configurazione sensore
Innanzitutto è necessario editare il file modules e config.txt
Da terminale è necessario modificare il file /etc/modules
sudo nano /etc/modules
aggiungendo le righe
w1_gpio w1_therm
Da terminale
sudo nano /boot/config.txt
ed inserire il fondo la stringa
- /boot/config.txt
dtoverlay=w1-gpio,gpiopin=4
Premere ctrl+O per salvare e ctrl+X per uscire
Riavviamo il raspberrry
sudo reboot
Installiamo ora il software per la lettura dei sensori:
cd /home/pi git clone https://github.com/timofurrer/w1thermsensor.git cd w1thermsensor/ python setup.py build sudo python setup.py install
ricaviamo il seriale dei sensori appena collegati:
cd /sys/devices/w1_bus_master1/ ls -d 28-*
che vi restituirà qualcosa del genere:
28-000005b8a78e
Annotatevi il numero che vi restituirà (parte dopo 28-) in quanto è il numero seriale del vostro sensore e servirà in seguito per la lettura dei dati.
Creare il file /usr/local/bin/ds18b20.py
sudo nano /usr/local/bin/ds18b20.py
ed incolliamo il seguente contenuto:
- /usr/local/bin/ds18b20.py
#!/usr/bin/env python import sys from w1thermsensor import W1ThermSensor address = sys.argv[1] sensor = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, address) temperature_in_celsius = sensor.get_temperature() print("{0:.2f}".format(temperature_in_celsius))
Premere ctrl+O per salvare e ctrl+X per uscire
Diamo i permessi in esecuzione al file:
sudo chmod +x /usr/local/bin/ds18b20.py
Testiamo ora se il sensore risponde correttamente (sostituire il numero seriale 000005b8a78e con quello del vostro sensore):
ds18b20.py 000005b8a78e 26.38
Per evitare possibili errori, è meglio però non utilizzare direttamente il file python appena creato, ma creiamo uno script bash come il seguente, che invoca il file python dove potremmo eventualmente anche inserire all’interno un controllo per evitare dati errati, ed infine andremo poi con cron ad invocare il seguente script:
sudo nano /usr/local/bin/ds18b20
- /usr/local/bin/ds18b20
#!/bin/sh DATA="$(ds18b20.py $1)" if [ x"$DATA" != x ] && [ "$DATA" != "ERROR" ]; then echo "$2($DATA*C)" > /dev/shm/metern$2.txt fi
Crtl+O per salvare e CRTL+X per uscire
Impostare i permessi in esecuzione:
sudo chmod +x /usr/local/bin/ds18b20
Per utilizzare lo script bash:
ds18b20 “seriale sensore” “meterID”
ad esempio:
ds18b20 000005b8a78e 12
che restituirà
12(26.38*C)
Lettura automatica sensore con cron
Impostare cron per eseguire periodicamente (ogni 5 minuti) la lettura dei valori, modificando opportunamente il seriale del vostro sensore (000005b8a78e) ed il numero di misuratore (12)
nano /etc/cron.d/ds18b20
- /etc/cron.d/ds18b20
#!/bin/bash SHELL=/bin/bash PATH=/usr/local/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO="" # Minute Hour Day of Month Month Day of Week User Command # (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) 4,9,14,19,24,29,34,39,44,49,54,59 * * * * root /usr/local/bin/ds18b20 000005b8a78e 12 > /dev/null 2>&1
Crtl+O per salvare e CRTL+X per uscire
Nel caso aveste più sensori di questo tipo da leggere, sarà necessario inserire in cron una riga per ogni sensore, con il rispettivo seriale e ID di MeterN, ed esempio:
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root /usr/local/bin/ds18b20 000005b8a78e 12 > /dev/null 2>&1 4,9,14,19,24,29,34,39,44,49,54,59 * * * * root /usr/local/bin/ds18b20 000001234567 13 > /dev/null 2>&1
Avvio script al boot
Per fare in modo che lo script venga eseguito anche all’avvio del Raspberry (e quindi creato all’avvio del Raspberry il file temporaneo con la lettura del sensore) è necessario anche creare un apposito servizio che chiameremo ds18b20.service:
Utilizzando Putty, colleghiamoci al Raspberry ed eseguiamo quanto segue.
sudo nano /etc/systemd/system/ds18b20.service
ed incolliamo quanto segue:
- /etc/systemd/system/ds18b20.service
[Unit] Description=DS18B20 sensor service Requires=local-fs.target Requires=network-online.target After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/ds18b20 000005b8a78e 12 [Install] WantedBy=multi-user.target
Premere ctrl+O per salvare e ctrl+X per uscire
Il servizio eseguirà la lettura una sola volta (Type=oneshot) per creare il file temporaneo appena avviato il raspberry. Per le successive letture ci penserà cron ad eseguirle con la frequenza preimpostata.
Nel caso aveste più sensori di questo tipo da leggere, sarà necessario inserire nel service una riga ExecStart per ogni sensore, con il rispettivo seriale e ID di MeterN, ed esempio:
- /etc/systemd/system/ds18b20.service
[Unit] Description=DS18B20 sensor service Requires=local-fs.target Requires=network-online.target After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/ds18b20 000005b8a78e 12 ExecStart=/usr/local/bin/ds18b20 000001234567 13 [Install] WantedBy=multi-user.target
Premere ctrl+O per salvare e ctrl+X per uscire
Abilitiamo il servizio
sudo systemctl enable ds18b20.service
Riavviamo il Raspberry Pi :
sudo reboot
A riavvio avvenuto è possibile controllare lo stato del servizio:
sudo systemctl status ds18b20.service
Se il servizio è stato correttamente avviato si avrà una risposta del tipo:
● ds18b20.service - DS18B20 sensor service Loaded: loaded (/etc/systemd/system/ds18b20.service; enabled; vendor preset: enabled) Active: inactive (dead) since Tue 2018-08-21 00:26:08 CEST; 4min 44s ago Process: 6188 ExecStart=/usr/local/bin/ds18b20 000006b1f42f 12 (code=exited, status=0/SUCCESS) Main PID: 6188 (code=exited, status=0/SUCCESS) ago 21 00:26:07 raspberrypi systemd[1]: Started DS18B20 sensor service.
Per eventualmente disabilitare il servizio:
sudo systemctl disable ds18b20.service
Invece per fermare momentaneamente il servizio (che ripartirà automaticamente al riavvio del raspberry):
sudo systemctl stop ds18b20.service
Configurazione MeterN
Dobbiamo ora editare il file reqsdm aggiungendo le righe necessarie per leggere le letture del sensore da MeterN:
sudo nano /var/www/comapps/reqsdm.php
ed aggiungiamo le seguenti righe:
- /var/www/comapps/reqsdm.php
} elseif ($argv[1] == 'tempDS1') { $outstr = exec('cat /dev/shm/metern12.txt | egrep "^12\(" | grep "*C)"');
andando ovviamente a modificare il numero di misuratore di MeterN (12) secondo le nostre esigenze.
Nel caso fossero presenti più sensori si ripeteranno le righe con il relativo numero di misuratore:
- /var/www/comapps/reqsdm.php
} elseif ($argv[1] == 'tempDS1') { $outstr = exec('cat /dev/shm/metern12.txt | egrep "^12\(" | grep "*C)"'); } elseif ($argv[1] == 'tempDS2') { $outstr = exec('cat /dev/shm/metern13.txt | egrep "^13\(" | grep "*C)"');
Infine, su meterN si configura il sensore come di seguito:
Main pooling:
Command: reqsdm tempDS1
Dashboard live pooling
Live command: reqsdm tempDS1
Per chi volesse approfondire il funzionamento del bus 1-wire ecco una interessante guida in italiano