IoT: sensore di temperatura con RaspBerry

In questo esempio, creiamo una piccola applicazione con il simulatore di RaspBerry e Python per intercettare la temperatura di una stanza e provvedere a chiudere una finestra ed accendere un ventilatore se si supera una soglia critica. Qui si usano le funzione customWrite e la lettura analogica di un valore proveniente dal sensore di temperatura.

  1. Selezionare una basetta MCU tra i [Components->Boards] e posizionarla nel piano di lavoro.
  2. Spostati su [Boards->Sensors] e scegli un sensore di temperatura “Temperature sensor” e collegalo con la porta D0 alla board su D0 (3 tacche con una estremità nera)
  3. Vai su [End Devices->Home] e questa volta scegli una finestra “Window” ed un ventilatore “Ceiling Fan”. Posizionali vicino alla board e collegali con un cavo IoT alle porte D1 e D2
  4. Piazziamo ora una fonte di calore ed una di freddo. Vai in [End Devices->Home] e scegli un termostato Thermostat” mentre in [Components->Actuators] scegliamo un Air Cooler e un Heating Element.
  5. Li posizioniamo vicino al termostato e li colleghiamo: alla porta D1 colleghiamo con un cavo IoT la fiamma, alla D2 colleghiamo l’elemento freddo (come specificato nella Specifica del termostato)
  6. Facciamo un test preliminare con i dispositivi: se premiamo ALT+Tasto sinistro del mouse sulla finestra si apre/chiude; con la stessa combinazione il ventilatore si accende cambiando animazione con una sorta di venticello stilizzato (possiede due velocità); sul termostato con la combinazione di tasti ALT+ click sinistro si accendono alternatamente le fonti di calore e di freddo e possiamo notare una variazione della temperatura che di default varia di 10 gradi centigradi per ora, piuttosto lentamente. Su Linux, la combinazione di tasti da usare è Alt+Maiusc+sinistro mouse
  7. Abbiamo proceduto  rinominare con nomi di comodo tutti i dispositivi per non lasciare la generica nomenclatura IoT1, IoT2 ecc. Non è una operazioni obbligatorio ma è sempre consigliato.

Creata la nostra infrastruttura hardware, provvediamo al lato software.

Per prima cosa, per semplificare i nostri test, modifichiamo il codice degli elementi refrigeranti e di calore. Non è una parte obbligatoria per la buona riuscita del nostro esercizio, ma è consigliata per risparmiare tempo e fare un po’ di reverse engineering nel codice altrui per capire come funzionano le cose.

Clicchiamo col sinistro doppio click sulla fonte di caldo, approfittiamo per leggere le specifiche del dispositivo e clicchiamo sul bottone Advanced, quindi andiamo nel Tab Programming. Qui ci sono due script nella colonnina a sinistra, uno in JavaScript, uno in Python. Di default, il Cisco Packet Tracer attiva/fa girare il Javascript (si capisce dall’asterisco che c’è vicino al nome) ma noi un po’ per coerenza, alleniamoci e modifichiamo quello in Python. Clicchiamoci su due volte, quindi due volte su main.py Dovrebbe comparire un frammento di codice tipo quello qui riportato:

from time import *
from physical import *
from gpio import *
from environment import Environment

HUMIDITY_RATE = -2./3600; # -2% per hour
TEMPERATURE_RATE = 10./3600; # 10C per hour
VOLUME_AT_RATE = 100000.
MAX_RATE = 1.e6

input = 0.

Eccezion fatte per le librerie from… a noi interessano le variabili dichiarate e in particolare la TEMPERATURE_RATE = 10./3600; # 10C per hour. Modifichiamola per far aumentare la temperatura più velocemente, ad esempio impostandola a 50./3600 o addirittura 100./3600.Premete il tasto RUN in alto sulla destra: manderà in esecuzione il nostro codice con la nostra modifica. Analogamente facciamo la stessa cosa per la fonte di freddo modificandola la rispettiva riga TEMPERATURE_RATE = float(-10)/3600; # -10C per hour con una -50/3600. Occhio sempre a premere il RUN!

Testiamo la modifica accendendo in modo alternato le fonti di caldo/freddo sempre cliccando sopra il termostato con Alt premuto + bottone sinistro del mouse. e controlliamo la temperatura del termostato se si alza o scende più velocemente.

Passiamo a programmare il nostro RaspBerry. Doppi click sulla basetta, clicchiamo sul tab Programming. Ci troveremo davanti ad una finestra con un software Javascript chiamato Blink che non ci interessa. Clicchiamo su New, scegliamo un nome “name” a piacere per il nostro script e nella tendina in basso Template scegliamo Empty – Python. A questo punto siamo pronti ad inserire il nostro codice qui sotto riportato.

from gpio import *
from time import *

if __name__ == "__main__":
	pinMode(0,IN)
	pinMode(1,OUT)
	pinMode(2,OUT)

	while True:
		print digitalRead(0)
		if digitalRead(0) >700  : #700 = 38 gradi C
			customWrite(1, 0)
			customWrite(2, 2)
		else :
			customWrite(1, 1)
			customWrite(2, 0)

Commentiamo passo passo. Importiamo prima le librerie che ci occorrono, in particolare la GPIO che è la responsabile per comandare ed interagire con i componenti collegati al nostro RaspBerry. Il RaspBerry, come Arduino e basette di sviluppo simili hanno dei pin digitali e analogici a cui è possibile collegare altre componenti, come quelle dell’esercizio, e occorre una libreria con alcune funzioni che permettono di interargirci. Nel programma mai, in genere questi script sono a file singolo, nella prima parte dobbiamo indicare come verranno utilizzati e quali PIN. Nel nostro esempio usiamo i PIN 0,1,e 2. Il pin 0 in particolare serve per ricevere dati in INPUT, quindi dal sensore di temperatura  al raspberry. Gli altri due pin invece servono a emettere in OUTPUT un segnale dal raspberry verso la finestra e verso il ventilatore. A qusto punto facciamo un ciclo infinito con il while. La prima istruzione è una semplice print di qeullo che viene mandato sul pin 0. Come da specifica del sensore di temperatura, il sensore può captare tra -100 °C e 100 °C, ma per ragioni tecnologiche questa temperatura viene passata al raspberry come un valore intero positivo tra 0 e 1023. Ora senza scomodare conversioni e scale, anche sperimentalmente, possiamo testare che a 700 corrisponde una temperatura di 30 °C. Usiamo questo valore per scatenare le nostre azioni per cui, controlliamo che si superi o meno questa soglia per mandare un comando alla finestra e al ventilatore. I comandi sono sempre di due tipi digitalWrite(PIN, VALORE) oppure customWrite(PIN,VALORE). Quali delle due usare è specificato nella Specification del componente. Solitamente, digitalWrite si usa nei componenti che assumono due valori 0, 1 oppure acceso/spento; customWrite se si possono avere più stati di due come il ventilatore che è spento, velocita1 e velocità2. Ci sno eccezioni, ad esempio la finestra si controlla col customWrite nonostante abbia solo lo stato 0 e 1, chiusa ed aperta. Lanciate lo script con RUN e provate a far scendere e salire la temperatura col termostato intorno ai 38 gradi!

Ultima modifica 5 Febbraio 2022