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