Questa è una vecchia versione del documento!


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.


• 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 3:
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.

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

  • sensori_vari_ds18b20.1572776619.txt.gz
  • Ultima modifica: 2019/11/03 11:23
  • da flane