25/02/2011

Arduino Weather Station

Filed under: — admin @ 19:55

by Mauro Cicolella – www.emmecilab.net

Premessa

In questo progetto vedremo come sia possibile realizzare una semplice stazione meteo utilizzando Arduino e uno specifico shield realizzato da Ethermania. I sensori utilizzati permettono di rilevare temperatura, pressione atmosferica ed umidità relativa.
Il WeatherShield1 non solo semplifica il nostro lavoro mettendo a disposizione un circuito completo ma é dotato di un microprocessore PIC12F683 appositamente programmato per interfacciare i sensori ad Arduino utilizzando una linea seriale sincrona bidirezionale.
In particolare il microprocessore esegue delle rilevazioni periodiche (in base al tempo di campionamento impostato) ed effettua la media delle ultime 8 misurazioni restituendo i valori nelle corrette unità di misura.
Accanto ai valori medi vengono forniti anche i valori raw (grezzi) ovvero le letture del valore digitale associato al segnale del sensore.
Si tratta di valori a 10 bit (con un range variabile tra 0 e 1023) proporzionali alla tensione presente sui piedini del convertitore A/D analogico/digitale montato sul microcontrollore dello shield.
Il vantaggio é duplice: da un lato é possibile elaborare le misurazioni bypassando i calcoli effettuati dal WeatherShield1, dall’altro si può aggirare il calcolo della media disponendo di un sistema in grado di rispondere tempestivamente alle richieste, visto che la media richiede almeno 8 misurazioni.

Hardware

L’hardware consiste di

  • una scheda Arduino UNO (in alternativa va bene anche Arduino 2009)
  • un Ethernet Shield
  • un WeatherShield1

L’utilizzo di uno shield Ethernet comporta diversi vantaggi:

  • accesso ai dati tramite web
  • trasferimento dei dati verso un server locale e/o remoto
  • funzionamento indipendente dalla presenza di un pc (necessario in caso di comunicazione seriale)

Diamo uno sguardo più approfondito ai sensori presenti sul WeatherShield ed al codice necessario per convertire correttamente i valori raw nelle corrispondenti unità di misura.

Sensore di temperatura – Microchip MCP9803

Il sensore fornisce già un’uscita digitale per cui il valore raw può essere utilizzato per calcolare il valore della temperatura.
Dal datasheet si ricava l’equazione necessaria per la conversione

T = raw / 2^(-n)

dove n é uguale a 4 nel nostro caso in quanto il valore raw é stato convertito in un intero senza segno a 16 bit. Quindi

T = raw / 16

Volendo essere più precisi il calcolo della temperatura da parte del WeatherShield viene effettuato seguendo una relazione non lineare come specificato nell’application note di Microchip reperibile a questo link.

Dal momento che non abbiamo bisogno di una precisione così elevata possiamo semplicemente utilizzare la relazione scritta in precedenza.

Prima di esaminare i sensori di pressione e umidità occorre evidenziare che il loro segnale in uscita risulta essere raziometrico (proporzionale) rispetto alla tensione di alimentazione, per cui le relazioni ricavate dal datasheet devono essere riscritte considerando che il dato raw va moltiplicato per Vs/1024 (vs tensione di alimentazione e diviso per 1024 in quanto con la funzione decodeShortValue() si ottiene un valore intero a 16 bit senza segno).
Effettuando gli opportuni calcoli algebrici si ottiene una relazione indipendente dalla tensione di alimentazione.

Sensore di pressione atmosferica – Freescale MP3H6115A

Dal datasheet relativo ricaviamo l’equazione che ci permette di ottenere il valore di pressione:

Vout = Vsupply X (0.009 X P – 0.095)

dove Vout é la tensione di uscita, Vsupply é la tensione di alimentazione di alimentazione, P é la pressione.

Ricordando quello che abbiamo detto in precedenza sul segnale raziometrico otteniamo:

Vout = (raw x Vsupply)/1024 = Vsupply X (0.009 X P – 0.095)

da cui semplificando si ottiene

P = ((raw/1024)+0.095)/0.009


Sensore di umidità relativa – Honeywell HiH-5030-001

Il sensore di umidita’ HIH-5030 fornisce in uscita una tensione proporzionale al valore di umidita’ presente nell’ambiente in cui e’ collocato. Richiede una tensione non superiore a 3.3Volt (per questo motivo lo WeatherShield1 e’ dotato di un preciso regolatore di tensione a 3.3Volt in modo da renderlo indipendente dalla tensione di alimentazione fornita da Arduino).
La tensione di uscita puo’ essere applicata ad un ingresso analogico di Arduino per essere letta e convertita. Quindi il valore atteso in uscita sarà compreso tra 0 e 3 volt.

Ancora una volta leggiamo il datasheet per ricavare l’equazione che ci permette di ottenere il valore di umidità relativa:

Vout = Vsupply X (0.00636 X RH + 0.1515)

dove Vout é la tensione di uscita, Vsupply é la tensione di alimentazione di alimentazione, RH é l’umidità relativa.

Anche in questo caso adattiamo la relazione tenendo presente il segnale raziometrico:

Vout = (raw x Vsupply)/1024 = Vsupply X (0.00636 X RH + 0.1515)

dalla quale con le opportune semplificazioni si giunge a:

P = ((raw/1024)-0.1515)/0.00636

Disponendo della misura di temperatura possiamo effettuare una compensazione dell’umidità rilevata ottenendo un valore più attendibile. L’equazione da utilizzare è la seguente:

RH = (RH sensor) / (1.0546-0.00216XT)

dove RH sensor é il valore misurato dal sensore (con gli opportuni adattamenti specificati in precedenza) e T la temperatura misurata.

Codice Arduino

Il codice, scaricabile a questo link, è ben documentato per cui mi limiterò a dare alcune indicazioni di massima sul suo funzionamento. Viene utilizzata una classe WeatherData per memorizzare le letture dei sensori, dotata dei metodi necessari per l’acquisizione e la stampa dei valori. Occorre precisare che le medie sono elaborate via firmware dal microprocessore presente a bordo del WeatherShield, mentre per i valori attuali sono utilizzate le relazioni presenti sui vari datasheet.
Sfruttando l’Ethernet Shield viene creato un server in ascolto sulla classica porta TCP 80. Alla ricezione di una richiesta viene visualizzato il menu che permette di accedere alle letture dei sensori ma anche di visualizzare i parametri (MAC e IP) associati alla porta Ethernet di Arduino.
A parte le funzionalità connesse al WeatherShield, questo esempio mostra come dotare Arduino di un web server self-contained e come gestire un menu con link ipertestuali visualizzando le corrispondenti pagine html.

Funzionamento

Dopo aver collegato Arduino alla rete LAN o ad un pc (utilizzando un cavo cross) basta aprire il browser e digitare l’indirizzo di default http://192.168.1.1. Naturalmente l’indirizzo ethernet di Arduino dovrà essere compatibile con quelli della rete in cui verrà integrato.
Nel caso in cui si voglia fare a meno del pc, Arduino andrà alimentato utilizzando un alimentatore da collegare al jack presente sulla scheda oppure tramite il cavo USB ed un adattatore per la rete elettrica.

Ringraziamenti

Un ringraziamento speciale va a Marco Signorini di EtherMania per i suoi illuminanti chiarimenti indispensabili per il completamento del progetto.

Riferimenti

Scheda del prodotto WeatherShield1
Guida rapida a WeatherShield
Datasheet sensore di temperatura
Datasheet sensore di pressione atmosferica
Datasheet sensore di umidità relativa
Sito ufficiale Arduino

Per suggerimenti, critiche, correzioni ed altro potete scrivere a mcicolella@libero.it

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.