Lezione 15: Come realizzare una stazione meteo con Arduino

Lezione 15: Come realizzare una stazione meteo con Arduino

Come realizzare una stazione meteo professionale con Arduino

 

Nelle scorse puntate abbiamo visto come è semplice collegare Arduino alle rete; questo è stato possibile sfruttando le schede Ethernet disponibili sul mercato.

In questo articolo vedremo come realizzare una stazione meteo sfruttando un po’ di dispositivi che abbiamo visto precedentemente. Vediamo un po’ qual è l’occorrente per poter realizzare questo progetto.

 

 

Requisiti per il progetto

 

Hardware

 

  • 2 x Arduino Uno
  • Scheda Ethernet W5100
  • 2 x DHTXX (nel nostro caso DHT22)
  • Kit TX RX Wireless 433 MHz AMSK
  • 2 x Resistenza da 10 kOhm
  • Un po’ di cavi flessibili

Software

 

Come funziona il sistema

guida-all-acquisto-stazione-meteorologica

 

Il sistema è articolato da molti dispositivi, in quanto è necessario leggera la temperatura che c’è fuori di casa, inviarla in modalità  wireless ad un Arduino Uno connesso alla rete, che dovrà poi inviare i dati ad un servizio di archiviazione (Xively) per poter leggere e analizzare i dati.

Come appena detto, fuori casa verrà posto un Arduino Uno a cui verrà collegato un trasduttore di temperatura/umidità, il quale invierà i dati sfruttando i trasmettitori wireless che abbiamo già visto nei scorsi progetti ad un altro Arduino Uno, che sarà dotato anch’esso di un trasduttore di temperatura/umidità per leggere i rispettivi valori presenti in casa ed inviarli ad un server, attraverso il cavo Ethernet e la connessione Internet di casa.

Ovviamente sarebbe anche possibile far inviare i dati della temperatura/umidità fuori di casa, ma questo comporterebbe l’acquisto di una scheda Wireless per Arduino oppure l’acquisto di un Arduino Yun. Per ora vogliamo tenere il costo del progetto contenuto, ma prossimamente vedremo altri strumenti interessanti, che permetteranno di aumentare le funzionalità della stazione meteo.

 

Come collegare i dispositivi

 

Come detto in precedenza, il progetto si basa sull’utilizzo di due Arduino, di cui uno verrà collocato in casa e l’altro all’esterno.

 

Arduino fuori casa (TX)

DHT22

Bildschirmfoto-2012-10-17-um-14.02.38

PIN 1 -> VCC

PIN 2 (Data) -> PIN 2 in pull-up con una resistenza da 10 kOhm

PIN 3 -> Niente

PIN 4 -> GND

 

Wireless KIT 433 MHz

 txrx-433-pin

PIN ATAD -> 12

PIN VCC -> 5 V

PIN -> GND

 

 

Arduino in casa

 

Per quanto riguarda il sensore di temperatura, il collegamento è il medesima, mentre per quanto riguarda il ricevitore wireless, è necessario collegare i cavi, nel modo che è riportato nell’immagine precedente. Inoltre, occorre ricordare, che questo Arduino dovrà avere la Ethernet Shield, per poter inviare i dati al servizio Xively.

 

Passiamo alla parte dei codici

 

Nella repo di Github sono presenti tre programmi di Arduino

 

  • DHT22_wireless_TX
  • DHT22_wireless_RX_Serial
  • Xively_DHT22

Il primo programma è quello che verrà caricato sull’Arduino che verrà posto all’esterno e permetterà di inviare i dati che si riferiscono alla temperatura all’umidità, all’Arduino che si troverà in casa. Per testare il corretto funzionamento della sola comunicazione tra i due dispositivi, è possibile utilizzare l’applicazione DTH22_wireless_RX_Serial, che permetterà di far mostrare i valori letti all’esterno, sulla seriale di Arduino IDE.

Mentre l’ultimo programma, Xively_DHT22, permette anche di caricare i dati su Xively. Per quest’ultimo è necessario registrarsi sul sito, per poter ottenere alcuni parametri, che devono essere sostituiti all’interno del codice.

 

 

DHT22_wireless_TX

/**
Questo programma permette di inviare i valori della temperatura e dell'umidità fuori casa, ad un Arduino, che avrà il compito di caricare
i dati su Xively
Versione 1.0
Autore Giacomo Bellazzi
*/
#include "DataCoder.h"
#include "VirtualWire.h"
#include "DHT.h"
#define DHTPIN 2 
#define DHTTYPE DHT22

int transmit_pin = 12;
int led_pin = 13;
int baudRate = 800;
int delayTime = 10000;

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  pinMode(led_pin,OUTPUT);
  Serial.begin(9600);
  SetupRFDataTxnLink(transmit_pin, baudRate);
  dht.begin();
}

void loop()
{
  float outArray[2];
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  outArray[0] = t;
  outArray[1] = h;
  union RFData outDataSeq;
  EncodeRFData(outArray, outDataSeq); 
  TransmitRFData(outDataSeq);  
  delay(delayTime);//Tempo che passa tra l'invio dei dati
}

 

 

DHT22_wireless_RX_Serial

 

/**
Questo programma permette di ricevere i dati della temperatura e dell'umidità, che vengono inviati da Arduino posto fuori casa,
sfruttando i sensori Wireless 433 MHz
Versione 1.0
Autore Giacomo Bellazzi
*/
#include <DataCoder.h>
#include <VirtualWire.h>

const int rx_pin = 11;
const int led_pin = 13;
const int baudRate = 800;

void setup()
{
  delay(1000);
  Serial.begin(9600);
  pinMode(led_pin,OUTPUT);
  digitalWrite(led_pin,LOW);
  SetupRFDataRxnLink(rx_pin, baudRate);
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  union RFData inDataSeq;//To store incoming data
  float inArray[2];//To store decoded information
  if(RFLinkDataAvailable(buf, &buflen))
  {
        for(int i =0; i< buflen; i++)
        {
          inDataSeq.s[i] = buf[i];
        }
        DecodeRFData(inArray, inDataSeq);
        Serial.println("Temperature: ");
        Serial.print(inArray[0]);
        Serial.print(" ° Humidity: ");
        Serial.print(inArray[1]);
  }
}

Xively_DHT22 (OCCORRE INSERIRE I VALORI DEL PROPRIO ACCOUNT XIVELY)

/**
Questo programma permette di leggere la temperatura e l'umidità dentro e fuori casa e inviare i dati al servizio Xively
Versione 1.0
Autore Giacomo Bellazzi
*/
#include "SPI.h"
#include "Ethernet.h"
#include "HttpClient.h"
#include "DataCoder.h"
#include "VirtualWire.h"
#include "Xively.h"
#include "DHT.h"

#define DHTPIN 3    
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
int rx_pin = 11;
int baudRate = 800;
// MAC address for your Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Your Xively key to let you upload data
char xivelyKey[] = "INSERIRE IL PROPRIO VALORE";
// Define the strings for our datastream IDs
char tIN[] = "TemperaturaDentro";
char hIN[] = "UmiditaDentro";
char tOUT[] = "TemperaturaFuori";
char hOUT[] = "UmiditaFouri";
XivelyDatastream datastreams[] = {
  XivelyDatastream(tIN, strlen(tIN), DATASTREAM_FLOAT),
  XivelyDatastream(hIN, strlen(hIN), DATASTREAM_FLOAT),
  XivelyDatastream(tOUT, strlen(tOUT), DATASTREAM_FLOAT),
  XivelyDatastream(hOUT, strlen(hOUT), DATASTREAM_FLOAT),

 };
// INSERIRE IL PROPRIO VALORE
XivelyFeed feed(12345678, datastreams, 4 /* number of datastreams */);

EthernetClient client;
XivelyClient xivelyclient(client);

void setup() {
  Serial.begin(9600);
  Serial.println("Starting single datastream upload to Xively...");
  Serial.println();
  dht.begin();
  while (Ethernet.begin(mac) != 1)
  {
    Serial.println("Error getting IP address via DHCP, trying again...");
    delay(15000);
  }
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  SetupRFDataRxnLink(rx_pin, baudRate);
}

void loop() {
  float hIN = dht.readHumidity();
  float tIN = dht.readTemperature();
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  union RFData inDataSeq;//To store incoming data
  float inArray[2];//To store decoded information
  if(RFLinkDataAvailable(buf, &buflen))
  {
        for(int i =0; i< buflen; i++)
        {
          inDataSeq.s[i] = buf[i];
        }
        DecodeRFData(inArray, inDataSeq);
        float tOUT = inArray[0];
        float hOUT = inArray[1];
        // Setting data to send to Xively
        datastreams[0].setFloat(tIN);
        datastreams[1].setFloat(hIN);
        datastreams[2].setFloat(tOUT);
        datastreams[3].setFloat(hOUT);
        Serial.println("Uploading it to Xively");
        int ret = xivelyclient.put(feed, xivelyKey);
        Serial.print("xivelyclient.put returned ");
        Serial.println(ret);
  }
}

 

 

Ed ecco il risultato finale:

Xively

Come sempre i miei codici sono disponibile a questo indirizzo https://github.com/jackbell16/Arduino-Book-Code/tree/master/Capitolo%2015

ismanettoneblog

7 pensieri su “Lezione 15: Come realizzare una stazione meteo con Arduino

  1. Complimenti per il tutorial molto ben fatto.
    Ho cercato un po’ di info sulla libreria Datacoder.h ma vedo che è poco usata, in particolare mi chiedevo se è possibile utilizzare la funzione RFLinkDataAvailable per determinare se arduino ha perso il segnale della trasmittente.
    Ovvero se non sta ricevendo nulla.

    1. Salve,
      il principale utilizzo della libreria Datacoder.h è per via della semplicità con cui è possibile inviare informazioni (int, string, float etc..). Per quanto riguarda una corretta verifica di ricezione, il consiglio è quello di installare un kit TX e RX sia su chi trasmette e su chi riceve, in modo da poter avere conferma del corretto invio del messaggio.

  2. Salve,
    complimenti per l’ottimo lavoro svolto in questo e negli altri progetti che hai pubblicato.
    Trovo utile l’idea dell’utilizzo di DataCoder per snellire un po’ le operazioni sui tipi di dato, tuttavia, provando il tuo sketch (senza modifiche), la IDE mi dà il seguente errore: ‘SetupRFDataRxnLink’ was not declared in this scope
    lo stesso avviene se utilizzo lo sketch del progetto simile su Bayesian Adventures.
    Cosa può essere che non va?

    1. Salve,
      il numero esatto non saprei dirlo perché nell’esempio dell’articolo l’alimentazione viene fornita da prese di correnti e quindi il consumo non è un problema. Facendo due conti non penso vengano superati i 100mA, ma è possibile ridurre notevolmente il consumo, mettendo il sleep mode l’Arduino. In alternativa esistono schede che contengono già una scheda Wireless, come Photon.

  3. Buonasera, ho provato a seguire passo a passo quanto descritto ma non riesco a ricevere nulla di sensato, mi riceve i dati in continuo e da stampa seriale ottengo 0 per il vettore 0 e -8.04 per il secondo, oppure -0.00 per il primo e ovf per il secondo. Sai dirmi dove sbaglio?

    1. Salve,
      ci sono tanti componenti in questo progetti e quindi diversi possibili motivi del malfunzionamento. Uno può essere che i due sensori wireless sono troppo distanti, oppure il sensore di temperatura non funziona bene. Proverei anche a verificare sul dispositivo che manda la temperatura, se tale valore è corretto

I commenti sono chiusi.