Come ben sappiamo il mondo Raspberry permette di creare una moltitudine di progetti interessati. Rispetto ad Arduino con Raspberry è possibile realizzare interfacce di invio dati tramite App su smartphone e PC in quanto l’instaurarsi di una connessione a internet è più semplice rispetto alla board Arduino dal momento che non vi è la necessità di utilizzare shield o componenti particolari per connettersi al proprio router-modem poiché il modulo per la connessione wifi è integrato negli ultimi modelli di Raspberry.
Fase preliminare: idea
In questo articolo sarà illustrato un progetto tramite il quale sarà possibile misurare i valori di temperatura e umidità tramite un sensore di temperatura DHT 11 in un determinato luogo a nostra scelta. La visualizzazione dei dati avverrà tramite l’ausilio di un messaggio di testo inviato da un bot Telgram. Inoltre saranno illustrati in questa guida la metodologia per la creazione del bot su Telegram e di varie estensioni al progetto.
Componenti
Le componenti basilari di questo progetto sono i seguenti:
- Board Raspberry PI 3 o 4, connessa a internet
- sensore di temperatura DHT 11 (o altri sensori come DHT 22)
- Breadboard
- 3x jumper
Vi sono altri componenti da poter utilizzare ma sarà visto in seguito nel momento in cui si parlerà delle possibili estensioni.
Sensore DHT 11: datasheet
Il sensore DHT è un sensore in grado di rilevare umidità e temperatura grazie alle semplici librerie forniteci da Adafruit.
Le specifiche tecniche sono le seguenti:
- Range di misurazione: Umidità: 20-90%RH , Temperatura: 0-50°
- Accuratezza umiditià: Umiditià ±5%RH
- Accuratezza Temperatura: ±2℃
- Risoluzione: 1
- Alimentazione: 3-5.5v
Attenzione, in alcuni modelli di sensore DHT 11 i pin Vcc e Signal possono essere invertiti. Un eventuale problema per il quale il programma compilato non funzioni potrebbe consistere in questo motivo.
Il sensore DHT11 espone 3 pin denominati:
- GND: piedino di massa
- VCC: piedino di alimentazione
- sitgnal: piedino di comunicazione dati 1-wire
Il DHT11 va alimentato con una tensione compresa tra i 3 e 5V. In che modo rileva l’umidità relativa e la temperatura? Il DHT11 è in grado di rilevare il valore percentuale dell’umidità relativa misurando la resistenza elettrica tra i due elettrodi. La conduttività tra gli elettrodi aumenta all’aumentare dell’umidità relativa. Mentre per quanto concerne la temperatura il DHT11 utilizza un sensore NTC.
Collegamenti con la board Raspberry
Il piedino signal sarà collegato al pin 7 (GPIO). Il piedino Vcc sarà collegato al pin 2, mentre il pedino GND sarà collegato al pin 6.
ecco qui una schema dei pin GPIO
È importante notare che la numerazione in figura è valida solo per i seguenti modelli:
- Raspberry Pi Model B+
- Raspberry Pi 2B
- Raspberry Pi Zero
- Raspberry Pi Zero W
- Raspberry Pi 3B
- Raspberry PI 4
ecco qui il diagramma di collegamento
Creazione bot
Il primo passo consiste nell’aprire l’applicazione telegram. Una volta aperta cerchiamo “BotFather” tramite la funzione cerca cliccando sull’apposita lente di ingrandimento.
“BotFather” è un bot che permette di creare altri bot.
Avviamo il bot scrivendo “/start“, poi premiamo invio.
Per creare un nuovo bot digitiamo “/newbot”.
BotFather ci chiederà di assegnare un nome al nostro nuovo Bot, basta digitare un qualsiasi nome e poi premere Invio.
Dobbiamo anche inserire un username che lo renderà riconoscibile pubblicamente. Username deve terminare in “Bot” o ” _bot”.
In seguito alla assegnazione del nome e dell’username BotFather ci comunicherà informazioni importanti in seguito per compilare il codice per il funzionamento del sensore e dell’invio dati. ATTENZIONE: QUESTE INFOMAZIONI LE DOVREMMO TENERE SOLO PER NOI. La prima parte riguarda il percorso per trovare il nostro bot. La seconda è la API che sarà utilizzato nel nostro codice.
Operazioni preliminari per la programmazione del codice su Raspberry
Per utilizzare il sensore dobbiamo scaricare la libreria Adafruit. Digitiamo sul terminale la seguente stringa:
sudo apt-get install git-core
Se da errore provare ad utilizzare la stringa sudo apt-get update
e riprovare.
Installiamo la libreria utilizzando la seguente stringa:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
Cambiamo directory con la seguente stringa:
cd Adafruit_Python_DHT
Ora digitiamo;
sudo apt-get install build-essential python-dev
e installiamo la libreria con:
sudo python setup.py install
Tutto questo per il funzionamento del sensore DHT 11. Per l’implementazione del bot occorre una specifica libreria. Per installare questa libreria basta eseguire il comando (prima usciamo dalle eventuali directory digitando cd).
pip install telepot
Codice completo
Ecco il codice in python che permette di leggere i dati dal sensore e inviarli tramite messaggio di testo tramite il bot creato da noi.
Per far si che i miei passaggi corrispondano con quelli degli esempi seguenti è consigliabile creare un nuovo file dal nome “simple_bot_DHT.py” nella cartella “examples” contenuta a sua volta nella cartella “Adafruit_Python_DHT”.
Ecco qui il codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import sys import Adafruit_DHT import telepot sensor = Adafruit_DHT.DHT11 pin=4 def on_chat_message(msg): content_type, chat_type, chat_id = telepot.glance(msg) humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) if content_type == 'text': bot.sendMessage(chat_id, 'Ciao, la temperatura e pari a {0:0.01f}* e umidita e del {1:0.01f}%'.format(temperature, humidity)) TOKEN = 'XXXXXXXXX:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' bot = telepot.Bot(TOKEN) bot.message_loop(on_chat_message) print 'Listening ...' import time while 1: time.sleep(1) |
Spiegazione codice
Vediamo adesso passo passo come funziona il codice implementato sopra.
Per prima cosa abbiamo importato varie librerie:
1 2 3 |
import sys import Adafruit_DHT import telepot |
Le righe seguenti permettono di identificare di che sensore si tratti e a che pin BMC è collegato.
1 2 |
sensor = Adafruit_DHT.DHT11 pin=4 |
In seguito è stata definita la funzione on_chat_message
. Questa funzione verrà richiamata ogni qual volta il nostro bot riceve un messaggio, ed è (a tutti gli effetti), il vero cuore del nostro programma.
Questa funzione riceverà sempre un argomento, che corrisponde al messaggio che è stato inviato al bot, contenuto nel parametro msg
. Per capire come si comporta una funzione vi è un articolo che approfondisce questo contenuto: Arduino IDE: cosa sono le funzioni #9.
All’interno della funzione vengono eseguite 4 istruzioni.
Per prima cosa, estraiamo dei dati importanti dal messaggio usando il comando content_type, chat_type, chat_id = telepot.glance(msg)
. In questo modo, creiamo 3 variabili con i seguenti significati:
content_type
dice che tipo di dati sono contenuti nel messaggio (se un messaggio di testo, un’immagine, un messaggio vocale, o altro);chat_type
contiene informazioni sul tipo di chat: se privata, gruppo, ecc.chat_id
contiene un identificativo univoco alla chat, e può essere usato per rispondere nella stessa chat in cui è stato mandato il messaggio.
La seconda istruzione consiste nel calcolo da parte del sensore della temperatura è umidità.
Come terza operazione, controlliamo che il messaggio che è stato mandato al bot sia di tipo testuale, andando a fare un check sul contenuto di content_type
, con la rica if content_type == 'text':
.
Nella quarta istruzione il bot invia sulla chat da cui è arrivato il messaggio un messaggio riguardante i dati di temperatura e umidità:
1 |
bot.sendMessage(chat_id, 'Ciao, la temperatura e pari a {0:0.01f}* e umidita e del {1:0.01f}%'.format(temperature, humidity)) |
Rivediamo la funzione completa:
1 2 3 4 5 |
def on_chat_message(msg): content_type, chat_type, chat_id = telepot.glance(msg) humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) if content_type == 'text': bot.sendMessage(chat_id, 'Ciao, la temperatura e pari a {0:0.01f}* e umidita e del {1:0.01f}%'.format(temperature, humidity)) |
Una volta importata la libreria, possiamo andare a creare il nostro bot con questi semplici passaggi. In particolare, all’interno della variabile TOKEN
dovremmo andare a inserire il token ritornato dal botFather (attezione, si tratta di una stringa).
Una volta ottenuto il token creiamo realmente il bot con il comando bot = telepot.Bot(TOKEN)
.
Con l’istruzione bot.message_loop(on_chat_message) la funzione verrà richiamata.
1 2 3 |
TOKEN = 'XXXXXXXXX:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' bot = telepot.Bot(TOKEN) bot.message_loop(on_chat_message) |
L’ultima parte del codice, serve semplicemente per evitare che il programma termini. Senza un ciclo il programma terminerebbe e il bot non potrebbe rispondere alla chat.
1 2 3 4 |
print 'Listening ...' import time while 1: time.sleep(1) |
Test del programma
per testare il programma dobbiamo utilizzare il terminale usando diversi comandi:
1 2 3 |
cd Adafruit_Python_DHT cd examples python simple_bot_DHT.py |
Una volta comparsa nel terminale la scritta “listeling…” apriamo la chat telegram ed iniziamo a messaggiare con il nostro bot.
Per chiudere il programma basta premere i pulsanti ctrl-C
dal terminale.
Possibili estensioni
Vi sono tantissime estensioni per quanto riguarda questo progetto. Una tra le tante è l’uso di una cassetta di derivazione in plastica al cui interno è inserita la board Raspberry alimentato da un power bank. In questo sarà possibile inserire questa cassetta nel balcone della propria abitazione (la board deve essere connessa a internet) e osservare in che modo i dati cambino durante il corso della giornata.
Inoltre è possibile anche realizzare una “piccola stazione meteo” dotata di più componenti come un barometro BME280 che ci permette di misurare la pressione.
Vi è data anche la possibilità di salvare i dati in locale sulla propria board Raspberry tramite l’utilizzo dei File. Vi è un tutorial del nostro caro Luigi Morelli a riguardo: Pillole di Python #020 – Files e persistenza
Componenti utilizzati (link per acquisto)
- Board Raspberry PI 3 o 4,Modello B+
- Sensore di temperatura e umidità DHT 11
- Breadboard
- Jumper
- Cassetta di Derivazione da Parete esterna
- Barometro BME280
Conclusioni
Il progetto in questione è davvero interessante e può avere davvero tante estensioni che variano in base alle proprie esigenze e grazie al bot telegram potremmo sempre reperire i dati in qualsiasi momento.
Link utili