FrigoNet

Tesine 2015-18

Scritto da Acciarri Simone - Neroni Alessandro - Moroni Alessandro

Acciarri Simone - Moroni Alessandro - Neroni Alessandro - Classe 5A-IPAI -  Esame di Stato: 2017-2018        UK
FrigoNet
Applicazione IoT con Arduino

Frigonet è un'applicazione IoT (Internet of Things), basata su Arduino MKR1000, permette di monitorare in locale ed in remoto tramite il Cloud Thingspeak.com ed un cellulare lo stato di un frigorifero.
Il sistema è in grado di controllare la presenza/assenza di alimenti, lo stato della porta, la temperatura e l'umidità interna.
In fig. 1 è riportato lo schema a blocchi mentre in fig. 2 lo schema elettrico.

Schema FrigoNet2

Arduino MKR100 tramite software memorizzato al suo interno gestisce le funzioni dei moduli/sensori collegati:

Sensori alimenti: rilevazione presenza/assenza alimenti  DHT22temperatura ed umidità interna   RTC: data e ora
Modulo porta: rilevazione stato della porta Display: visualizzazione dati  WiFi: collegamento Intenet

 

 

Per monitorare la presenza o l’assenza degli alimenti vengono utilizzati dei mini pulsanti posti sui due piani interni del frigorifero. Un algoritmo, in base allo stato dei mini pulsanti, determina il numero ed il tipo degli alimenti presenti.
I dati trattati in locale vengono inviati, con un intervallo di 15 secondi, ad un access point locale e tramite la rete internet al cloud thinkspeak dove è stato creato un account pubblico per una successiva rielaborazione (grafici, statistiche, diffusione online).
Tramite il seguente link è possibile consultate i dati: https://thingspeak.com/channels/381188
Per la consultazione tramite cellulare oppure tablet si deve scaricare un App ThingSpeak Viewer, ad esempio ThingView e configurarla con il canale 381188.

UKFrigonet is an IOT application (internet og things) based on Arduino MK1000. It allows you to monitor locally and remotely, via the Cloud Thingsspeak.com and a mobile phone, the status of a refrigerator. The system is able to control the presence/absence of food, the status of the door, the temperature and the external humidity.
Arduino MKR1000 through software stored inside manages the functions of the connected modules / sensors:
FOOD SENSORS: presence/absence of food monitoring
♦ DHT22 indoor temperature and humidity
♦ RTC: date and time.
♦ DOOR MODULE: door status monitoring.
♦ DISPLAY: data viewer.
♦ WiFi: Internet connection. mini buttons on two internal shelves of the fridge
In order to monitor the presence or absence of food mini buttons on two internal shelves of the fridge are used. An algorithm, based on the study of minipulsants, determins the number and type of food present.
The data processed locally are sent, with an interval of 15 seconds, to a local access point and , through the internet network, to the cloud thinkspeak where a public account has been created for a next re-elaboration (graphics, statistics, on line diffusion). Through the following link it is possible to consult the data: https: // thingspeak.com/channels/381188. If you want to consult them through cellular or tablets you must download an App “ThingSpeak Viewer, for example ThingView and configurate it with 381188 Channel.


Il progetto è suddiviso in una parte Hardware ed in una parte Software.

frigo swap 2 1) Arduino MKR1000 (Sistema di sviluppo programmabile)
2) Gruppo Sensori Alimenti

3) Modulo porta
4) Modulo Temperatura-Umidità DHT22
5Modulo Orologio RTC DS 1307
6) Display LCD I2C 20x4
7) LED TX IoT

 

 1) Arduino MKR1000 (Sistema di sviluppo programmabile)

MKR1000 Pinouts

ll mondo dell’IoT (Internet of Things) sta prendendo sempre più piede nel mondo che ci circonda. Rimaniamo sempre più affascinati da questo mondo fatto di sensori e microprocessori che si interfacciano sempre di più nel nostro vivere quotidiano. 

Arduino MKR1000 è una  scheda basata sull'Atmel ATSAMW25 SoC della serie SmartConnect; dispone di un modulo WiFi WINC1500 e di un chip per la Crypto-Autenticazione; ideale per gestire i progetti IoT.

Il chip ATSAMW25 è composto da un'antenna PCB stream 1x1 e da tre blocchi principali:

  • microcontrollore a bassa potenza ARM SAMD21 Cortex-M0+ a 32bit;
  • controller di rete a bassa potenza WINC1500 da 2.4GHz, con protocollo WiFi IEEE® 802.11 b/g/n;
  • dispositivo di crypto-autenticazione ECC508.

La scheda Arduino MKR1000 WiFi è caratterizzata da dimensioni molto compatte e da caratteristiche che la rendono la scelta preferita per la creazione di progetti IoT alimentati da batteria. Dispone infatti dei seguenti elementi:

  • una MCU simile a quello della Arduino Zero;
  • la tipica ampia serie di interfacce di I/O delle schede Arduino;
  • un modulo WiFi che supporta il protocollo SHA-256, con chip di Crypto-autenticazione per la comunicazione protetta.

Alimentazione Arduino MKR1000 WiFi
La Arduino MKR1000 WiFi integra un circuito di carica per batterie Li-Po che permette alla scheda di essere alimentata sia da una fonte esterna con tensione di alimentazione di 5V tramite porta USB, che da una batteria; il passaggio da un tipo di alimentazione piuttosto che l'altro avviene automaticamente.

Le batterie Li-Po vengono caricate con una tensione fino a 4.2V e con una corrente che normalmente corrisponde alla metà della capacità nominale. La scheda Arduino MKR1000 WiFi dispone di un particolare chip che fornisce una corrente di ricarica preimpostata di 350mAh; ciò significa che la capacità MINIMA della batteria da utilizzare con la MKR1000 WiFi deve essere di 700mAh. Batterie con capacità inferiore potrebbero venire danneggiate e subire surriscaldamenti o esplosioni; al contrario, una batteria con capacità superiore necessita di un tempo di ricarica maggiore, ma non è soggetta ad alcuno dei suddetti rischi. E' pertanto strettamente consigliato l'uso di una batteria Li-Po con ALMENO 700mAh di capacità.

ATTENZIONE
NON COLLEGARE al connettore JST presente sulla scheda alcun dispositivo diverso dal tipo di batteria indicato.
NON alimentare il pin VIN con una tensione maggiore di 5V.

La batteria Li-Po da utilizzare deve disporre di connettore JST PHR2 2-pin femmina. I pin di riferimento sulla Arduino MKR1000 WiFi sono il pin Left (polarità Positiva) e il pin GND (Polarità Negativa). Il circuito di ricarica è impostato per un ciclo di ricarica di circa 4 ore, dopo il quale entra automaticamente in modalità Sleep; questo fa sì che la capacità di ricarica sia al massimo di 1400mAh per ogni ciclo.

N.B.: a differenza della maggior parte delle schede Arduino, la MKR1000 WiFi opera con una tensione di alimentazione pari a 3.3V; se si applicano tensioni maggiori su uno qualsiasi dei pin di I/O, si potrebbe danneggiare la scheda. Mentre è possibile fornire la tensione di 5V ai dispositivi digitali, la comunicazione bidirezionale con dispositivi a 5V necessita di un'appropriata variazione di tensione.

tabellaarduino

 Specifica dei pin

  • VIN (pin di input): tensione di ingresso della scheda Arduino MKR1000 WiFi; la tensione fornita tramite questo pin deve essere di 5V regolata. Se l'alimentazione è fornita tramite questo pin, la porta USB è disconnessa. La tensione di alimentazione fornita alla scheda Arduino MKR1000 WiFi deve essere compresa in un range 5V~6V; l'utilizzo di questo pin è il solo modo di fornire una tensione di 5V, in alternativa all'utilizzo della porta USB.
    5V (pin di output): tensione di alimentazione utilizzata per il funzionamento del microcontrollore e degli altri componenti della scheda; la tensione disponibile su questo pin NON viene regolata ma proviene direttamente dal pin VIN o dalla porta USB. Quando la scheda è alimentata da una batteria, il pin fornisce circa 3.7V. Questo è un pin di uscita e non deve essere utilizzato come un pin di input.
  • VCC: questo pin fornisce una tensione pari a 3.3V generata dal regolatore incorporato sulla scheda a partire da una qualsiasi delle tre fonti di alimentazione utilizzata (porta USB, pin VIN o batteria).
  • LED ON: indicatore LED per lo stato di accensione della scheda; il LED è collegato al pin 5V solo se la scheda viene alimentata dalla porta USB o dal pin VIN; ciò significa che il LED indica lo stato di accensione della scheda quando la stessa viene alimentata tramite porta USB o pin VIN, al contrario non si accende se l'alimentazione proviene dalla batteria. Questo permette di massimizzare l'uso della batteria; è pertanto normale che il LED rimanga spento se la scheda viene alimentata tramite batteria.
  • CHARGE LED: indicatore LED per lo stato di ricarica; il LED è collegato al circuito di ricarica presente sulla Arduino MKR1000 WiFi e monitorizza l'assorbimento di corrente durante il ciclo di carica. Normalmente il LED si accende quando la scheda riceve la tensione di alimentazione di 5V dal pin VIN o dalla porta USB e il chip inizia a caricare la batteria Li-Po collegata al connettore JST presente sulla scheda. In alcuni casi, il LED inizia al lampeggiare con una frequenza di circa 2Hz e ciò accade se le condizioni elencate di seguito perdurano per un periodo di tempo che va dai 20 ai 70 minuti:
    a) il connettore JST non è collegato ad alcuna batteria;
    b) la batteria collegata al connettore è in sottoscarica o danneggiata e non è possibile effettuare la ricarica;
    c) ad una batteria a piena carica viene applicato un ciclo di ricarica non necessario; questo accade disconnettendo e riconnettendo il pin VIN o la batteria stessa se la scheda è alimentata tramite pin VIN.
    Onboard LED: a differenza delle altre schede, sulla Arduino MKR1000 WiFi il LED Onboard è connesso al pin D6 e non al D13; il codice di esempio va pertanto modificato per funzionare correttamente.

2) Gruppo Sensori Alimenti

Il modulo è composto da una serie di mini pulsanti disposti su due piani (Superiore, Inferiore) all'interno del frigorifero.
In figura è riportata la disposizione degli alimenti e lo schema di collegamento, mentre nella tabella sono riportati i dati per la configurazione del software di gestione.
ripiani tabella 2

Funzionamento: Presenza/Assenza alimenti
Per ogni prodotto viene utilizzato un pulsante normalmente aperto ( N.O. ). 

I pin digitali di Arduino sono configurati via software come ingressi con resistore di PULL – UP come indicato in figura.
In tabella è indicata la scelta dei livelli logici per determinare la presenza o assenza degli alimenti monitorati.

Rilevazione

Stato pulsante Valore letto
Presenza prodotto  Pulsante chiuso Basso
Assenza prodotto Pulsante aperto Alto

  
 
  

 


I dati riportati in tabella vengono letti ed interpretati tramite software, inviati sul display e sul Cloud Thingspeak.

 

 

 

3) Modulo porta

modulo porta 0 Il modulo è composto da:
a) uno  SWITCH (pin 9) montato sulla parte interna della porta;
b) un LED Rosso (pin 10);
c) un BUZZER (pin 14).

Tramite software viene rilevato lo stato dello switch (switch=ON, porta chiusa), (switch=OFF, porta aperta).

a) Porta aperta: LED rosso=ON,  BUZZER= emette un suono (frequenza=1000Hz, durata=50ms)
b) Porta chiusa : LED rosso=OFF, BUZZER= nessun suono


Lo stato della porta viene visualizzato sul display, nello Zoom dela figura e riportato la parte del codice per la gestione del modulo.  

 

 4) Modulo Temperatura-Umidità DHT22

Risultati immagini per am2302

Il sensore DHT22 permette di rilevare l’umidità relativa e la temperatura interna del frigorifero e di trasmetterla digitalmente attraverso un solo filo (oltre ai 2 necessari all’alimentazione) ad Arduino MKR1000 (pin 13). Il sensore di umidità è di tipo capacitivo, utilizza al massimo 2.5mA in fase di e permette di acquisire al massimo un campione ogni 2 secondi. La misurazione dell’umidità varia da 0 a 100% con un’accuratezza tipica pari al ±2%. Per quanto riguarda la temperatura invece il DHT22 ha un range di misurazione tra -40 e +80°C con un accuratezza di ±0.5°C grazie al sensore DS18B20 integrato al suo interno. L’alimentazione può variare da 3.3 a 6Vquindi può essere usato sia con microcontrollori che lavorano a 5v sia con quelli a 3.3v. VCC e GND servono rispettivamente per portare l’alimentazione al sensore, mentre il pin DATA serve per la comunicazione bidirezionale tra sensore e processore. Una nota molto interessante è che il filo DATA che collega il sensore alla MCU (microcontrollore) può essere lungo fino a 20 metri. (si riduce a 1m se alimentato a 3.3V) Il DHT22 non necessita di ulteriore componentistica esterna però, specialmente se si utilizzano fili lunghi, potrebbe essere consigliato l’utilizzo di un condensatore da 100nF tra i pin VCC e GND in prossimità del sensore per filtrare eventuali disturbi all’alimentazione. In alcuni schemi è presente una resistenza detta “di Pull-up” connessa tra la VCC e il pin DATA. Questo per tenere alto lo stato del canale quando non è in corso una trasmissione dati. Il valore della resistenza tipicamente è di 4.7-5.1KΩ a seconda dell’applicazione. Il DHT22 è molto versatile, infatti può essere impiegato ad esempio in sistemi di deumidificazione, automotive, domotica, monitoraggio ambientale e molti altri ambiti in cui è necessario un controllo elettronico di temperatura e umidità.
Caratteristiche tecniche:
• Tensione di alimentazione: da 3 a 5 V e I / O 
• Corrente massima: 2,5 mA durante la conversione (durante la richiesta di dati) 
• Velocità di campionamento non superiore a 0,5 Hz (una volta ogni 2 secondi) 
• Intervallo di temperatura: -40-80 °C risoluzione 0,1 °C errore <± 0,5 °C 
• Intervallo di umidità: 0-100% di risoluzione RH0,1% di errore di UR ± 2% di umidità relativa
Comunicazione
La comunicazione avviene attraverso un solo filo ed è bidirezionale (pin2:Data)
Questo sensore, su sollecitazione di Arduino, trasmette sul pin Data (Uscita digitale) un treno di quaranta bit:
▪ 8 bit per indicare la parte intera del valore di umidità
▪ 8 bit per indicare la parte decimale dell’umidità (.00 nel modello DHT11)
▪ 8 bit per indicare la parte intera della temperatura
▪ 8 bit per indicare la parte decimale della temperatura (.00 nel modello DHT11)
▪ 8 bit per indicare il numero di controllo (per validare il valore dei precedenti 32 bit) I dati di umidità e temperatura sono formati da 16bit ciascuno, quindi 32 bit di informazione.
Es:
Umidità = 65.8%RH in binario 00000010 10010010 Temperatura= 26.9%RH in binario 00000001 00001101 La trasmissione avviene a gruppi di 8 bit, quindi ci saranno 4 gruppi di 8 bit (32 bit) Vengono aggiunti ulteriori 8 bit per verificare che la trasmissione sia avvenuta correttamente. Questo numero viene calcolato sommando i 4 blocchi:
Verifica = 00000010 + 10010010 + 00000001 + 00001101 = 10100010
Quindi in totale 5 blocchi da 8 bit per un totale di 40 bit.
Sincronizzazione:
Processore porta a 0 lo stato del bus DATA per 800μs che significa “sensore, preparami i dati”. Il sensore di risposta porta lo stato del bus a 0 per 80μs per dire “inizio trasmissione” Poi il sensore inizia a trasmettere i dati di temperatura e umidità:
• Blocco 1: primi 8 bit riguardanti l’umidità, Es. 00000010
• Blocco 2: gli ultimi 8 bit riguardanti l’umidità Es. 10010010
• Blocco 3: primi 8 bit riguardanti la temperatura Es. 00000001
• Blocco 4: ultimi 8 bit riguardanti la temperatura Es. 00001101
• Blocco 5:8bit di checksum/verifica Es. 10100010
La gestione del modulo avviene tramite la libreria (DHT.h) che deve essere scaricata ed installata prima della compilazione del programma.
 
 

5) Modulo orologio RTC DS1307
Il modulo si basa sull'integrato DS1307 I2C RTC è dotato di EEPROM (AT24C32 - Erasable and Programmable Read Only Memory) con 32kbyte memoria. Il modello in esame integra il circuito per l’istallazione del sensore di temperatura DS18B20.

Tabella degli indirizzi dei registri interni dell’RTC

È presente una batteria tampone ricaricabile LIR2032 al litio che consente di alimentare il dispositivo e garantisce un funzionamento a lungo termine anche quando è disconnesso da Arduino. Il circuito risulta essere così totalmente indipendente: incrementa l’ora senza aver bisogno di un microcontrollore e con la batteria completamente carica è in grado di funzionare per 1 anno intero quando il sensore di temperatura risulta spento oppure non presente.
In Fig 7 è riportato lo schema elettrico del modulo.
L'orario e il calendario sono salvati nei registri in formato BCD. In questo formato ogni cifra di un numero è rappresentata con un codice binario a quattro bit, il cui valore è compreso tra 0000 (0) e 1001 (9). Ad esempio il numero 127 in formato BCD viene registrato in questo modo: 0001 0010 0111. 
Sebbene il BCD comporti un notevole spreco di bit (circa 1/6 di memoria inutilizzata in packed BCD), in alcuni casi è preferibile perché ha una diretta corrispondenza con il codice ASCII.

È sufficiente infatti sostituire i primi quattro bit inutilizzati con 0011 per ottenere il corrispondente ASCII (0011 + BCD => 0011 + 0000 => '0').
Il codice BCD è molto usato in elettronica, specialmente in circuiti digitali privi di microprocessore, perché facilita la visualizzazione di lunghe cifre su display a sette segmenti dove ad ogni display fisico corrisponde esattamente una cifra. Esistono appositi circuiti integrati che effettuano la conversione da BCD nella corrispondente sequenza di accensione dei segmenti. Anche l'esecuzione di semplici calcoli aritmetici è più semplice da effettuarsi su cifre BCD per circuiti logici combinatori.

I registri dell'RTC vanno dall'indirizzo 00h a 07h. 
I registri utilizzabili come RAM vanno da 08h a 3Fh.
- Il Bit 7 del registro dei secondi (00h) è il bit di halt (CH) dell'orologio. Quando questo bit è posto a 1 l'oscillatore è spento mentre se posto a 0 l'oscillatore viene riattivato.
- I valori che corrispondono al giorno della settimana vengono definiti dall'utente (solitamente 1 = domenica, 2 Lunedì etc.). Allo scadere della mezzanotte questi vengono incrementati di uno (se vale 7 viene riportato a 1).
- Il Bit 6 del registro delle ore (02h) indica se l'orario è definito con modalità 12-ore (quando vale 1) oppure 24-ore (se vale 0). Nel caso si utilizzi la modalità a 12 ore il bit 5 (bit AM/PM) viene posto a 1 se è PM, 0 se è AM. Nel caso sia abilitata la modalità 24-ore il 5 bit è usato per la codifica delle decine delle ore. Se si cambia da 12 a 24 ore l'orario deve essere resettato.
- il registro di controllo (08h) è utilizzato per pilotare l'uscita SQ (che è un'onda quadra). Infatti il nostro modulo RTC ha la possibilità di generare un onda quadra di 1Hz, 4096KHz, 8192KHz, 32768KHz. Tramite software viene programmato il registro per generare un’onda quadra ad 1 Hz. Sul Datasheet sono riportati tutti i dettagli per la configurazione dei registri.
Il modulo utilizza i pin 12 (SCL) e 11 (SDA) per la comunicazione seriale "I2C" . Il DS1307 supporta il protocollo I2C. Un dispositivo che invia i dati sul bus è definito trasmettitore mentre quella che li legge ricevitore. Il dispositivo che controlla gli altri, detti slave, è detto master e deve generare il segnale di clock, controllare l'accesso al bus e generare le condizioni di START e STOP. 
Il DS1307 opera come slave sul bus I2C ed è allocato all’indirizzo 0x68 (Nel linguaccia C si usa il suffisso 0x per indicare un numero esadecimale).

 

6) Display LCD I2C 20x4

Modulo LCD 20x4 dispone di 4 righe e 20 colonne è basato sul controller HD44780; dotato di retroilluminazione blu, caratteri bianchi, regolazione del contrasto e di un'interfaccia di comunicazione I2C.

Lo schermo a cristalli liquidi (LCD) è un display a schermo piatto, una visualizzazione elettronica o un video che utilizza le proprietà modulanti della luce dei cristalli liquidi. I cristalli liquidi non emettono direttamente la luce. 
Come mostrato nell'immagine, un'importante caratteristica di questo modulo LCD è l'interfaccia di comunicazione I2C integrata posta sul retro che ne rende estremamente semplice l'utilizzo con Arduino.
Il modulo è dotato di 4 pin (Alimentazione: Vcc, Gnd) e (Dati: SDA, SCL)
Questo modulo permette di comunicare con un display LCD mediante il protocollo I2C che impegna quindi due sole porte. (Dati: SDA, SCL) oltre ai due terminali di alimentazione (VCC, GND).
Sul modulo è presente un potenziometro per la regolazione del contrasto ed un jumper rimovibile per l'attivazione della retroilluminazione. Se il jumper viene rimosso e tra i due pin viene inserita una resistenza, si può modificare l'intensità di retroilluminazione (ad esempio con una resistenza da 470 ohm 1/4w l'intensità si dimezza).

Settaggio dell'indirizzo del modulo
Sono inoltre presenti tre connessioni denominate A1, A2 e A3 per il settaggio (a 3-bit) dell'indirizzo I2C tra 0x20 e 0x27. L'indirizzo di default è 0x27 (A0, A1 e A2 lasciati aperti). La chiusura di una coppia si effettua collegando tra loro le due rispettive piazzole. E’ ovvio che tale indirizzo hardware deve coincidere con l’indirizzo I2C nel software/libreria di gestione del Modulo. Il display viene gestito tramile la libreria LiquidCrystal_I2C.h.

7) LED TX IoT

 Il LED giallo, montato sopra al display, segnala la trasmissione dei dati al Cloud ThingSpeak.
LED ON : inizio trasmissione
LED OFF: fine trasmissione

 

 

 

 

 

Software

Di seguito è riportato un estratto del software (Sketch) di gestione

/* ----------------------------------------------------------------------------------------

- Acciarri Simone - Moroni Alessandro - Neroni Alessandro - Esame di Stato A.S.2017-2018 - CL:5AIPAI
-----------------------------------------------------------------------------------------
*/

 

 

Bibliografia:
1) Appunti scolastici
2) www.arduino.cc 
3)