====== SENSORI DI TEMPERATURA DS18B20 ====== **FONTI:**\\ • [[http://tecnogeppetto.blogspot.it/2013/09/come-rilevare-la-temperatura-con.html|Come rilevare la temperatura con Raspberry Pi ed il sensore DS18B20]]\\ • [[http://www.robotstore.it/product/365/DS18B20-Sensore-di-Temperatura-Digitale-1-Wire.html|DS18B20 - Sensore di Temperatura Digitale 1-Wire]]\\ • [[http://www.raspibo.org/wiki/index.php/1Wire_e_il_sensore_di_temperatura_ds18s10|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. | {{ :img_metern:ds18b20:ds18b20_package_1.jpg?nolink&200 |}} | {{ :img_metern:ds18b20:ds10b20_package_2.jpg?nolink&200 |}} | 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 | {{ :img_metern:ds18b20:ds18b20_schedina_1.png?nolink&200 |}} | {{ :img_metern:ds18b20:ds18b20_schedina_2.png?nolink&200 |}} | Nel caso invece dei sensori stagni con cappuccio in acciaio occorre collegare esternamente la resistenza di pull-up {{ :img_metern:ds18b20:ds18b20_stagni.png?nolink&200 |}} 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: {{ :img_metern:ds18b20:ds18b20_schema1.jpg?nolink&600 |}} \\ 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: {{ :img_metern:ds18b20:ds18b20_schema2.jpg?nolink&600 |}} \\ 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). {{ :img_metern:ds18b20:ds18b20_schema3.jpg?nolink&600 |}} \\ 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 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/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 #!/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 #!/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: [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: [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: } 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: } 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: {{ :img_metern:ds18b20:ds18b20_metern_config.png?direct |}} \\ **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 [[https://www.issgreppi.gov.it/corsi/claroline/backends/download.php?url=L0xvd19MZXZlbF9CdXMvMS13aXJlLnBkZg%3D%3D&cidReset=true&cidReq=VIL_TEC_3TA_002|guida in italiano]]