arduino meteo - Benvenuto nel sito MAGISTRI

Realizziamo
unoshieldper
Arduino
in grado
di misurare
e
visuatizzare
sudisplay
LCD
i principati
parametri
r
di VINTENZO
MENDOLA
I I ru delle particolarità che ha
lV reso Arduino tanto popolare
è sicuramente la facilità con cui
è possibile realizzare estensioni
hardware p er sonalizzate chiamati
"SHIELD".
In commercio ce ne sono tantissime, praticamente per ogni esigenza, sia "ufficialí" , cioè realizzati
dal team di Arduino,
che non ufficiali,
3
ovvero dalla comu-:
nità di hobbisti e
appassionati e da quelle azien5!
come ad esempio Sparkfun o
SeeedStudio, che hanno fatto
dell'open hardware e del successo di questa piattaforma di strrdio e prototipazione i1
meteorotogici:
temperatura,
umidità
relativa
e pressione
atmosferica.
E L E T T B O Ì IlItC
l -RN o v e m b2r e0 1 2
57
o
o
\
tr
tr
VoRSED+D5D607
lrt
d
(ù
E
Q)
q
o
.v)
vcc
IC4
soA
scL
s0w
xt
x2
VBATT
GND
A1
analogici che sono il "cuore" del
dispositivo:
- MCP9700Adella Microchip per
misurare la temperatura;
- HIH-5030-001della Honeywell
per determinare l'umidità relativa;
- MPXH6115A6U della Freescale
per disporre dei dati inerenti la
pressioneatmosfericaassoluta.
Questi tre trasduttori sono stati
selezionatiall'interno dell'ampia gamma di componenti in
commercio,in quanto hanno un
ottimo rapporto prezzo/ accuratezza e sono sufficientemente
diffusi per cui non dovrebbe
essereun grossoproblema
recuperarnequalche unità per
chiunque voglia cimentarsi
nella r ealizzazionedi questo
sistema.
30
25
loro business, tanto da proporre
anche dei veri e propri cloni e
delle versioni altemative; anche
sul sito di Futura Elettronica potete trovare numerosi shield, molti dei quali presentati su questa
rivista. Per chi volesse cimentarsi
nellarealizzazione di una propria
versione, ricordiamo che l'unico
accorgimento da seguire è quello
di rispettare alcune specifiche,
inerenti essenzialmente le dimensioni, il passo e le connessioni
dei connettori SIL di Arduino,
attenendosi alle quali chiunque
può realizzare un proprio circuito
di espansione compatibile.
IL METEOSHIETD
Sfruttando gli ingressi analogici
di Arduino, abbiamo realizzato
una di queste "estensioni", in
grado di misurare e visualizzare i
principali parametri meteorologici: temperatura, umidità relativa
e pressione atmosferica; per
5f
tsr
úU - A,"ETTR0il|CR
[{
questomotivo abbiamo deciso
di chiamarloMETEO SHIELD.A
questi tre sensoriè stato aggiunto un RTC (RealTime Clock),
rcalizzato con lo stessointegrato
DS1307della Maxim utilizzato
nel RTC SHIELD presentatosulla
rivista 163del mesedi Febbraio,
questavolta in versione SMD.
Aggiungendo questascheda
possiamotrasformare il nostro
Arduino Uno in una vera e propria stazionemeteo che non ha
nulla da invidiare ai dispositivi
commerciali oggi tanto di moda,
questoperché,a differenza dei
primi che non sono modificabili
e con prestazioni non espandibili,
la nostra piattaforma lo è, semplicemente cambiando il codice
ed eventualmente,sfruttando
la filosofia che ha reso Arduino
tanto versatile, aggiungendo
ulteriori schede.
Il nostro meteo-shieldè stato
realizzatointorno a tre sensori
xcPltút
rcP9t0 tl
^to
à
115
t.o
xcP9tú
xcPttoa
05
OT
150n5025n75rm1?6
HIH-5030f5031
Series
tF-}
!t!J,949!!!!f!e_v_!!+!q!!T-!_qg!F_9
nl.i1!*,
è
èa
:ú
o
tubre Bmdry (w)
!FlIEF!g!pqy!!q1qit!l_!!!!-r_Ì!_r!4ltj!tx_o:q.!_._c_!!4q!:rd,cj
05
_ -,, _
r,ulr",g,"."1
'
v , . , 1 . ' l ' Ì ! ' P } ? : l1 i '
Yi.:iìlrdi
f!!lP : C:c a:'a
Fí9.3
5
,. I
SCHEMA ELETTRICO
Com'è possibile vedere daiio schema elettrico il circuito è pir-rttosto
semplice: ognuno dei 3 serrsori è
connesso ad un ingresso analogico
di Arduino, in particolare il sensore di pressionead A0, qr.rellodi
umidità ad ,A1e quello cli temperatura ad A2. Con-reriprortatcrrrel
datasheet[1], il sensore\fCf't);00A
può esserealimentato con LlI1.ìtensione di 3.3V o di 5V, o comunque
comDresanell'inten'allo 1.3+5.l\'
ed ha una caratteristicacli tr.rscluzione linearecon tma \'.ìriazi(ìnc
di 10mV/"C con un'uscitac1itl.5\'
a OoC,come visibile chiar.rnrentt'
dalla Fig. 1, ricavata dalle specifiche fomite dal costnttttrrr'; tale
trasduttore inoltre non ttt'cessit.rdi
calibrazioneed ha un'accur.ltt'zza
d i + 2 " Cn e l r a n g e- - 1 0 - 1 r 5 ' Ct - 1 ' C
nel range 0+70'C). L'\lCFr;ùì.\
è stato scelto in contenitrrre TC)91
per facilitameil posizitrn.rnìcnt(r
anche all'estemo del PCB qualt'
ra fosse necessario;per lt.r:tcs:tr
motivo è stato coliocattrnella p.1rk'
estema del PCB, in ntocÌr eìaagr'
volare un eventuale contatto con
la superficie di misura scelta. Oltre
al condensatore di bypass C3 da
100nI, è stata introdotta anche la
resistenza R2 da 2200 per ridurre
gli effetti del rumore sulla tensione
d'uscita. Anche il sensore di umidità HIH-5030-001 può funzionare
con una tensione di 3 o di 5V, o
comunque un valore compreso
tra21Y e 5.5V, e presentauna
tensione d'uscita proporzionale
all'umidità relativa secondo la funzione VOUT=(VSUPPLY) [0.00636
(sensorRH) + 0.1515(valore tipico
a 25'C)] con un' accuratezzadi
+37ogarantita entro l'intervallo 1189% di RH [2] Come visibile dalla
Fig. 2, la relazione tr a le grandezze
è caratterizzata da una buona
linearità; è possibile osservare
un'isteresi trascurabilea 25'C ed
uno scostamento contenuto delle
caratteristiche
di trasduzionea
0'C e a 70'C. Come richiesto da
Hone).well è stata inserita una
resistenzadi carico da 100 kO in
uscita.
La misura di oressioneviene effettuata tramiteì circuito integrato
\ÍPXH6115A6U che deve essere
alimentato con una tensione di
5\', garantendo un'accuratezzadí
--1.5"ndi VFSS(differenza algebrica tra la tensione d'uscita al valore
nrassimoe minimo di oressione) [3]. Anche in questo casola
(Fig. 3) viene
lirrearizzazione
effetfuata direttamente dal circuito
integrato e non è necessariaalcuna
taratura o regolazione dell'offset.
Ci sono sensori di oressione che
clevonoesserealimentati a 3.3V
(ad esempio il MP3H6115A)per
cui sul circuito stampato è stato
previsto il ponticello J3.3VJ5V per selezionare Ia corretta
tensione nel caso si abbia a
disposizione uno di ques t i c o m p o n e n t iG
. li altri
due trasduttori, come
i t
abbiamo visto, p-rossono esserealimentati
9.2
E L E T T R 0 i I Il lC{ -RN o v e m b2r e0 1 2
59
Elenco Gomponenti:
R 1 :5 1 k o h m( 0 8 0 5 )
R2:22Qohm (0805)
R3: 100 kohm(0805)
R4: 100 ohm (0805)
R5: 1 kohm(0805)
R6: 1 kohm(0805)
R 7 :1 k o h m( 0 8 0 5 )
R 8 :2 2 o h m( 0 8 0 5 )
C 1 : 1 0 0n F m u l t i s t r a t o
C 2 :4 7 p F c e r a m i c o
C 3 : 1 0 0n F m u l t i s t r a t o
'1
C4: 00 nF multistrato
C 5 : 1 0 0n F m u l t i s t r a t o
l C 1: M P X H 6115 A 6 U
l C 2 :M C P 9 7 0 0 A
l C 3 :H I H 5 0 3 0 - 0 0 1
l C 4 :D S 1 3 0 7 S O 8
Q1: Quarzo32,768k1z
L C D :D i s p l a yL C D 1 6 x 2
retroilluminato
Varie:
- Portabatteriaper CR2032
- BatteriaCR2032
- S t r i pM a s c h i o6 p o l i
- S t r i pM a s c h i o8 p o l i( 2 p z . )
- S t r i pM a s c h i o1 0 p o l i
- S t r i pM a s c h i o1 6 p o l i
- S t r i pF e m m i n1a6 p o l i
- C i r c u i t os t a m p a t o
HH
ruH
anche a 5V; si è scelto di utilizzare3.3Y perché nei datasheetle
specifichee le curve di trasduzione
sono riportate per questo valore.
La sezione circuitale inerente
I'RTC ricalca le semplici connessioni ai pochi componenti previsti
dalla Maxim per far funzionare
l'integrato [4] costituiti essenzialmente dal quarzo a32.768kHz che
fomisce un riferimento temporale
stabile all'oscillatore e dalle due
resistenze di pull-up dell'I2C R6 e
R7. L'uscita SQW del DS1307che,
come abbiamo visto nell'articolo
inerente I'RTC Shield permette
di avere un clock ausiliario, utile
ad esempio,per far ìampeggiare
un led alla frequenza dilHz, è
stato reso disponibile sul pin A3 di
Arduino Der usi futuri.
60
lt{
2012- ELETTR0I{ICR
Novembre
R7
il
!
PIANO DI MONTAGGIO
Per il montaggio del circuito: è
necessario utllizzare un saldatore di buona qualità, dotato di
una punta conica di dimensioni
adatte ai componenti SMD, i
quali saranno saldati per primi,
lasciando per ultimi i sensori,
che andranno saldati evitando
di indugiare eccessivamentesui
terminali per evitare un loro eccessivo riscaldamento con conseguente possibile danneggiamento. Si proseguirà con il quarzo, il
sensore di temperatura in TO92,
il connettore per il display LCD, i
connettori SIL caratteristici degli
shield Arduino e infine con il
portapile per le comunissime
batterie al litio a bottone da 3V
del tipo 2032.
LO SKEÍCH PER ARDUINO
Veniamo ora al codice impiegato per far funzionare lo shield
(Liitato 1). Owiamente ognuno
di voi potrà adattarlo alle proprie esigenze.Il codice, piuttosto
semplice, è come di consueto
costituito da una parte iniziale
in cui vengono incluse le librerie
necessarie al funzionamento
dello shield: possiamo notare la
presenza della libreria "LiquidCrystal", utllizzata per rendere
il meteo-shield indipendente,
dotandolo di un proprio display,
un comune LCD 76X2 affiancato
dal codice per la visualizzazione dei dati sulla seriale. Per far
funzionare I'RTC, facente capo
come già visto ai piedini A4 e A5
utllizzati da Arduino per l'I2C, si
utlTizza la consueta libreria "Wfte"
e la stessalibreria "RTClib" e la
relativa porzione di codice presentata sul numero 163 relativa al
funzionamento dello RTC shield;
seguono le righe di definizione ed
inizializzazione delle variabili con
l'assegnazionedei piedini dotati
di ADC A0, AL e ,A2 di Arduino
che hanno il compito di acquisire
i dati da visualizzare; l'istruzione
visibile in Fig. 4 è stata scritta al
fine di realizzare il carattere "oC"
personalizzato, come spiegato in
dettaglio nella sezione "Reference" del sito ufficiale di Arduino
[5], la quale è associataalla riga
" lcd.createChar(O,
degree)
;" in " uoid
setup()", eseguita mediante "Icd.
urit e((uint B-f )0)". Come facilmente intuibile, il resto del codice
si occupa divisualizzare l'ora
e la data ed acquisire e rendere
disponibili alla seriale ed al dib y t e d e g r e e [ 8 ]= { / / C H A M C T E"R" C " D E F I N I T I 0 N
810111,
801000,
B1 0 0 0 0 ,
810000,
810000,
801000,
800111,
l;l
FÍ9.a
/ / C O D E M A D E B Y V T N C E N Z OM E N D O L AU S I N G T H E S A M E R T C L I B R A R Y A N D R T C C O D E M A D E
BY FUTUR-\ELETTRONICA//
/,/ LIBR.ARI'S
splay LCD i dati provenienti dai
3 sensori analogici. I dati acquisiti
dai 3 ingressi analogici vengono
mediati su 100 campioni prima di
essere inviati alla seriale e visibili
sul display, questo al fine di ottenere un risultato analogo ad un
filtraggio di tipo passa basso e ridurre l'effetto del rumore e le fluttuazioni; le funzioni di trasferimento utilizzate per determinare i
valori delle tre grandezze meteorologiche sono quelle riportate sui
datasheet dei rispettivi produttori.
Il codice è stato testato sull'ultima versione dell'IDE disponibile
al momento della r ealízzazíone
dell'articolo, la 1,.0.1per cui non
dovreste incontrare alcun problema nella sua compilazione; si
ricorda che è possibile servirsi
anche della versione 0.23 dell'IDE,
semplicemente modificando
l'istruzione " Icd.write((uintI-t)0) /'
'
con "lcd.write(0)f .
Come abbiamo detto i sensori
scelti non necessitano di calibrazione; ad ogni modo, qualora si
volesse migliorare l' accuratezza
dei dati e compensare gli scostamenti dovuti alle tolleranze come
precedentemente discusso, è
possibile correggere i valori forniti dai tre integrati assegnando
opportunamente un valore alle
gr andezze "TCORR", "RHCORR"
e "PCORR", inbase a quanto sperimentalmente riscontrato caso
per caso;per fare ciò è necessario,
owiamente, disporre di una stazione meteo o trasduttori dall'accuratezza nota e ben definita con
cui effettuare la comparazione.
Il valore di pressione indicato dai
barometri rappresenta la pressione atmosferica relativa mentre
il trasduttore da noi impiegato
riporta la pressione assoluta. La
pressione atmosferica dipende
dall'altitudine e questo legame
viene utilizzato dalla maggior
parte degli altimetri che sono di
tipo barometrico; la pressione
# i n c l u d e < ! ' ù i r e .h >
*RTCtib.h"
#include
#innt"d^ <l :drìd^rvc-À
.h>
LCD PINS
//
LiquidCrystal
lcd(7,
6,
5,
4,
3,
2)ì
R T C _ D S 1 3 O ?R T C ;
VARIABLES DEFINITION AND INITIALIZATlON
//
#define TEMP 2
/ /TEMPERATURE ACQUISITION ON ANALOG PIN 2
+define UMTD 1
//HUMIDTTY ACQUISITION ON ANALOG PTN 1
//PRESSURE ACQUISITION ON ANALOG PIN 0
#define PRESS 0
float val : 0.0;
float T= 0.0;
double umidita = 0.0;
double RH = 0.0;
double RHout = 0.0,'
doubÌe UM : 0.0;
double Pascal=O . 0;
d o u b l e P S = 0. 0 ;
double P=0.0;
float VADC: 5;
int DPR : 0;
i n t R H C O R R: 0 ;
i n t P C O R R= 0 , '
int TCORR: 0;
doubfeSTAMPAT=0;
double STAMPA-U = 0;
doubleSTAMPAP=0;
C H A R A C T E R* " c " D E F T N T T T o N
byte degreelSj : I //
B10111,
801000.
810000,
810000,
810000,
B01000,
800111.
t;
void setup O {
S e r i a l . b e g i n ( 9 6 0 0 );
lcd.begin \I6, 2) ì
lcd.createChar (0, degree) ,' // "'C" SYMBOL
Wire. begin O ;
RTc.beginO,
- 1 Freq IHz - 2îLs\4a96kHz
Rrc.sqw{1);
//0redoff
i €
Ì
Ì
/ l
P T a
- 3 Freq 8192kHz- 4 Freq 32168YJlz
i c n r ^ ^ i n ^ / ì
Serial.prrnt.Ln("RTC is NOT running!") ;
// following line sets rhe RTc to Lhe daLe & Lime Lhis skelch was comp-L1ed
TIME ));
// RTC.adjust(DateT.ime( DATE ,
void
//
loop O {
RTC LCD OUTPUT
DateTime now = RTC.nowO;
.Icd.setCursor(0, 1);
1f (now-hourO < 10) {
lcd.print ("0") ;
Ì
// H]UR
-cd.print(now.hour{),DEc);
lcd.print.(":");
(now.minuteO < 1C/ r
if
lcd.print ("0") ;
i
l c d . p r i n L ( n o w . m i n u t e O , D E c )ì / / M I N U T E S
1 c d . s e t C u r s o r ( 6, 7 l ;
(now.dayO < 10) {
if
lcd.print ("0");
)
lcd.princ(now.dayO,
lcd.print ('-');
(now.month O<10)
if
lcd.print ("0");
DEC);
//
DAY
{
Ì
l c d . p r i n L ( n o w . m o n t hO , D E C ); / / M O N T H
lcd.print ('-') ;
lcd.print(now.yearO,
D E c )i
//YEAP
//
if
SERIAL RTC OUPUT
(now.hourO < 10) {
("0") ;
Serial.print
I
(C-ontínua)
ELETTROI{ICR
lll - Novembre
2012
61
{-ì
I
I
I
I
( n o w . h o u r ( ) , D E c );
Serial.print
;, ^.
Serial.qrint(":")
(now.mj.nuteO < 10) {
if
(
"
0
"
) ;
Serial.Print
Ì
(now.minute O.
óerial.print
Serial.prinL(":");
jt
(now.secondO < 10) {
("0") ;
Serial.Print
DEc) ;
ó e r i a l . p r i n t ( n o w. s e c o n d O '
("; ") ;
Serial.Print
(now.dayO < 10) {
if
("0") ;
Serial.Print
DEc)'
Ì
relativa è la pressionecalcolataal
livello del mare.
Un modo semPlicePer averel/indicazionedella pressionerelativa
è quello di aggiungereal nostro
codiceun valore, che abbiamo
per comodità definito DP& che
può esserefacilmenteottenuto
dalla differeîzatra il valore di
pressionevisualizzato da una
stazione meteo che indica aPPunto la pressioneassolutae il valore
fornito dal nostro trasduttore di
Ì
( n o w ' d a y O ' D E c );
àerial.print
Serial.Print ('-') ;
(
n
o
w
.
m
o
n
t
h O<10) t
if
Seriat.Print ("0") ;
i
D E c );
3eríal.print(now.monthO,
('-') ;
Serial.print
(now.year O' DEc);
Serial.println
Serial.PrintlnO;
SERIAL METEO OUTPUT
//
STAMPA T= (temp O ) ;
S T A M p AU = ( r e a d U M I D O ) ;
STAMpA-p : lpressureO);
")
("TEMPERATURA
Seria1.print
"
S e r i a [ . P r i n t ( S T A M P AT- ) ;
Serial.write(176),
("C,' ") ;
Serial.print
("UMTDITA' ") ;
Serial.Print
S e r i a . L . P r i n c ( S T A M P A - U );
");
Serial.Print("%;
( " P R E S S I O N E" ) ;
Serial.Print
(
S
T
A
M
P A - P ;)
SeriaÌ. Print
SeriaI. Println ("mbar") ,'
Pressione.
Ún ottimo comPlemento del
METEO SHIELD (Fig. s) è il
SOLAR SHIELD (Fig. 6), venduto da Futura Elettronicacon
il codice7300-SOLARSHIELD
con cui è Possibiletrasformare
facilmentel'Arduino dotato di
METEO SHIELD (Fig. 7) in una
completaed autonoma stazione
meteorologicain grado di funzionare utilizzando solamente una
],CD METEO OUTPUT
//
1cd. setcursor (0.
i"à.pii".léterlPA-r,r)
i;;.;;i;;ir'tìta
0) ;
;
//s*ow
oNLY rHE FrRSr
DEclMAl
D E1 ' 0 ' 1 )
t i 0 ) ; / / p R r n r * ' c ' c H A R A c T (ErR
delay (200);
Icd.setCursor(6' 0);
1) ; / /sHow oNLY rHE FrRSr
iàà.pii.iléreuPA-u,
1cd. setcursor {10, 0) ;
lcd.print ("%");
delay(200);
lcd.setcursor (L2' 0);
P,0) i//slaw
i.a.p.i.llétarlPA
d e l a y ( 2 0 0) ;
)
! r ^ ^ -
' - É : " ; ; ' +; "^ ;- i- "/ \j d
val
)
//
soma
N U M B E Ro F R E A D T N G S
i++)
= anafogRead(TEMP)t
i*:
o N l ' Y T H E T N T E G E RP A R T
I
= 100'0;
double soma = 0.0i
(int 1:0; i<nread;
for
{
DECTMAI'
r t t v À ó c l r o z so. * v a i i
- 0 . s 1* 1 o o ,+ r c o R R ; / / T E M P E R A T U R E
+= T;
d e l a v ( 1 0 0) ;
(soma/nread)
retuin
;
l
*d"oàu.b" lùer . - "r te"a. d
aUMID O {
='ioo.o;
double somma= 0.0;
(int i:0;
i<nread;
for
{
)
Ì
//
N U M B E Ro F R E A D T N G S
i++)
U M = a n a l o g R e a d (U M I D ) ;
R H o u r : ( ( ( u M . v A D C / 1 0sr - o i l - z l - 0 . 1 5 1 5 ) / 0 ' 0 0 6 3 6 ) + R H C O R R ;
Soma += RHout;
delav(100);
( soma
retuin
/
nread
//HUMrDrrY
);
float pressure O {
// NUMBER OF READINGS
double nread : 100.0;
double soma = 0.0;
i
+
+
)
(int i=0; i<nread;
for
t
P a s c a L = a n a l o g R e a d ( P R E S S) ì
; í r l o ct ì o z q l 1 v i o c + 0 . 0 e 5 ) / 0 ' 0 o e ) * 1 0 + D P R + P c o R R ; / / P R E S S U R E ;:iiì;.;;;1
// TMNSFERT FUNCTION
soma l= P;
Ì
delav(100);
( soma
retu-rn
82
,/ nread
);
lil 1-.
2012- ELETTROilICR
Novembre
Tutti i componentiutilizzatiin questo progettosono di facile reperibilità.ll masterdel circuitostampato può esserescaricatodal sito
della rivista così come il firmware
utilizzato. Meteo-Shieldè anche
disponibilein kit o già montatoal
prezzodi42,00 Euro;sonocompresi tutti i sensori,la basetta forata
e serigrafata,la batteria al litio'
e le minuterie.Non è comPresoil
display LCD retroilluminatocon
LED bianchidisponibileseparatamente (cod'1446-LCD16X2WB'
né la boardArduinoche
Euro15,O0)
costa24,50Euro.Tuttii prezzisiintendonoIVA comPresa'
F
ttD
B
3
J
>
D
D.
I
n
l-
t.
t
n-
batteria al litio, ricaricatada un
pannello solare mediante appunto il SOLARSHIELD(Fig.8).
Questo è munito oltre che di due
connettori a cui collegarerispettivamente la batteria e il pannello
solare (ad esempioil 7500-SOLPAN1W della Futura Elettronica),
anchedi una presamini USB che
può essereutilizzataper ricaricare la batteria tramite il PC: un
LED rossosegnalala corretta
applicazionedella tensionedi
caricae l'inizio di questamen-
tre un LED verde ne indica il
termine. Sullo stesso lato in cui
sono disposti questi connettori è
presente un piccolo switch: i. posizione "ON" il circuito applica la
tensione di 5V al relativo terminale del connettore SIL, alimentando di conseguenza l'Arduino
ed eventuali altri shield a questo
connessi.
È possibile trovare ulteriori dettagli inerenti la scheda, tra cui lo
schema elettrico completo ed i file
Eaglecad, sul wiki ufficiale 16l. I
I
1"\ ELETTR0ilICR
lJ{- Novembre
2012
63