Home
Accesso / Registrazione
 di 

Stazione Meteo Online con Arduino

Stazione Meteo con Arduino

Con questo articolo voglio condividere con tutta la community la realizzazione della mia ultima creazione: una stazione meteo basata sulla piattaforma Arduino. Non è soltanto una semplice stazione meteo, ma è molto di più. Grazie alle sue funzioni, è possibile salvare i valori acquisiti in un database. Questo articolo vuole evidenziare la possibilità, per chiunque né sia interessato, di tenere sotto controllo i valori climatici di una zona specifica.

In commercio esistono molti dispositivi in grado di acquisire (ma non sempre salvare) i valori climatici, ma spesso non posseggono i requisiti dei quali necessitiamo, o in altri casi sono semplicemente troppo costosi.
Questo è il primo motivo che mi ha spinto a realizzare la mia piccola stazione meteo.
Inoltre l’idea di creare qualcosa di funzionale e meravigliosamente versatile era troppo allettante.

I compiti principali che svolge questa stazione meteo sono:
- Acquisire dati dai sensori
- Preparare i dati per essere memorizzati
- Ogni tot secondi, memorizzare i dati su un server online

I componenti necessari per realizzare questo progetto sono:
- Arduino (io ho utilizzato la board Arduino Uno, ma può essere utilizzata qualsiasi altra piattaforma basata su Arduino)
- Ethernet Shield
- Sensore di temperatura e umidità DHT-22
- Sensore di pressione BMP085
- Sensore di luminosità MF DIY LM358
- Sensore ad ultrasuoni HC-SR04
- Cavetteria varia

Quindi, i parametri che verranno gestiti sono:
- Temperatura
- Umidità
- Pressione atmosferica
- Luminosità dell’ambiente
- Altezza della neve

Per chi non lo sapesse, Arduino è una piattaforma Hardware e Software con cui è possibile imparare i principi fondamentali dell'elettronica e della programmazione.
Questa fantastica board si basa su un circuito stampato che integra un microcontrollore con pin connesso alle porte I/O, un regolatore di tensione ed un'interfaccia USB che permette la comunicazione con il computer per la programmazione del microcontrollore.
Arduino può essere utilizzato per moltissimi progetti, come ad esempio costruire robot, rilevare dati da sensori e svolgere delle azioni correlate, gestire dei servo motori, e come direbbe Ivan Scordato, “L’unico limite è la propria fantasia”.

Il sensore di temperatura DHT22 misura la temperatura nel range -40 °C - +80 °C con un accuratezza di 0.5 °C. Misura l’umidità da 0% a 100% con un accuratezza da 2% a 5%. È un sensore lento, che bisogna leggere massimo ogni due secondi, ma da’ buoni risultati.

Il sensore di pressione barometrica BMP085 permette di ottenere misurazioni nel range 300 - 1100hPa con un'accuratezza fino a 0.003hPa, è basato sulla tecnologia piezo-resistiva che fornisce grande accuratezza, robustezza e stabilità nel tempo. Misura la temperatura ambientale, di cui farò una media con la temperatura rilevata dal sensore DHT22 per ottenere una maggiore precisione.

Il sensore ad ultrasuoni HC-SR04 è una scheda compatta per la rilevazione di distanza misurata con il sistema a ultrasuoni.
Funziona inviando un segnale ad ultrasuoni e aspettando il suo ritorno (che avviene se il raggio ha rimbalzato su un ostacolo); a quel punto, sarà letto dallo stesso sensore. È capace di leggere una distanza variabile dai 2 ai 400 cm, con un margine di errore di 0,3 mm.
Per interfacciarsi con Arduino basterà utilizzare i suoi 4 pin: VCC, GND, il pin Trig e il pin Echo. Fornendo sul pin Trig un impulso positivo di circa 10 uS il trasmettitore invierà un segnale a ultrasuoni che dopo aver rimbalzato sull'oggetto in esame viene captato dal ricevitore.
Invece sul pin Echo verrà restituito un segnale logico "alto" con durata proporzionale alla distanza.
La formula con cui avviene il calcolo della distanza è: Distanza(cm)=Echo(us)/58
Adesso vediamo come collegare tutti i componenti ad Arduino:

Il software che bisogna caricare su Arduino è il seguente:

//Stazione Meteo con Arduino 12/2013
//Ivan Scordato e Giovanni Lorenzini

//dichiaro il pin di entrata del sensore di luminosità in una variabile
int pinfotoresistenza = A0;

//includo la libreria del sensore DHT22 di temperatura e umidità...
//...e dichiaro a che pin è collegato
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

//includo le librerie wire e del sensore di temperatura e pressione BMP085
#include "Wire.h"
#include "Adafruit_BMP085.h"
Adafruit_BMP085 bmp;
//scl--> A5 sda-->A4

//dichiaro in due variabili i pin del sensore ad ultrasuoni HC-SR04 per misurare...
//...l'altezza della neve
const int TRIG_PIN = 5;
const int ECHO_PIN = 6;

//includo le librerie della ethernet shield
#include 
#include 

//variabili per collegarsi a internet
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

IPAddress ip(192,168,50,100); //indirizzo IP disponibile sulla rete

IPAddress myDns(192,168,1,1); //tuo DNS

char server[] = "www.fabbricaopensource.altervista.org"; //sito web

EthernetClient client;

unsigned long lastConnectionTime = 0; //l'ultima volta che ti sei connesso...
//...al server in millisecondi
boolean lastConnected = false;    
const unsigned long postingInterval = 60L*1000L; //la L è necessaria per...
//...usare i numeri di tipo long

//dichiaro la stringa dove scrivo i dati per caricarli sul web
String strURL = "";

void setup()
{
  //inizializzo i sensori sensori
  dht.begin(); //inizializzo il sensore di umidità
  bmp.begin(); //inizializzo il sensore di pressione
  pinMode(TRIG_PIN, OUTPUT); //dichiaro come output il pin trig
  pinMode(ECHO_PIN, INPUT); //dichiaro come input il pin echo

  Serial.begin(9600); //stabilisco una connessione con il pc
  
  delay(1000); //attendo un secondo
  
  Ethernet.begin(mac, ip, myDns);
  
  //invio al pc il mio IP
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());

}

void loop()
{ 
  
    if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  
    if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("Disconnessione...");
    client.stop();
  }
  
    if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    aggiornoDati(); //carico i dati sul server
  }
  
  lastConnected = client.connected();
  
//calcolo il punto di rugiada
double puntoDiRugiada(double temperatura, double umidita)
{
  double a = 17.271;
  double b = 237.7;
  double temp = (a * temperatura) / (b + temperatura) + log(umidita/100);
  double Td = (b * temp) / (a - temp);
  return Td;
}

void aggiornoDati() //carico i dati sul server
{
  //leggo la luminosità dal pin analogico A0
  int luminosita = map(analogRead(pinfotoresistenza), 0, 1023, 0, 100); //eseguo un...
//...procedimento che riduce il range da 0-1023 a 0-100...
//...per esprimere la luminosità in percentuale

  //leggo l'umidità e la scrivo in una variabile
  float umidita = dht.readHumidity();

  //leggo la pressione e la scrivo in una variabile
  float pressione = bmp.readPressure();

  //leggo la temperatura da due sensori, faccio la media e la scrivo in una variabile
  float temperatura = (bmp.readTemperature() + dht.readTemperature());
  temperatura = (temperatura / 2.0);

  //misuro l'altezza della neve
  float neve, durata; //dichiaro la variabile neve e la variabile durata
  float cmPerMicrosecondi = 0.0331 + ( 0.000062 * temperatura); //calcolo i cm/ms...
//...del suono in base alla temperatura
  digitalWrite(TRIG_PIN, LOW); 
  delayMicroseconds(2); 
  digitalWrite(TRIG_PIN, HIGH); 
  delayMicroseconds(10); //faccio un impulso di dieci microsecondi sul pin trig
  digitalWrite(TRIG_PIN, LOW);
  durata = pulseIn(ECHO_PIN,HIGH); //mi metto in ascolto sul pin eco e calcolo la...
//...durata dell'impulso
  neve = (durata*cmPerMicrosecondi/2.0); //calcolo la distanza con la formula...
//...durata*(cm/ms)/2, diviso due perchè il suo va, rimbalza contro...
//...un oggetto e ritorna,...
//...quindi compie due volte il tragitto
  float menoNeve = 200.0 - neve;

  if (client.connect(server, 80))
  {
    Serial.println("Connessione...");

    //creo l'url utilizzando una stringa
    strURL ="GET  /meteo/salva.php?temp="; //url
    strURL+=temperatura;
    strURL+="&umi=";
    strURL+=umidita;
    strURL+="&pres=";
    strURL+=pressione;
    strURL+="&lum=";
    strURL+=luminosita;
    strURL+="&neve=";
    strURL+=menoNeve;
    strURL+="&rug=";
    strURL+=puntoDiRugiada(temperatura, umidita);
    strURL+=" HTTP/1.1";

    //invio la richiesta al server
    client.println(strURL);
    client.println("Host: www.fabbricaopensource.altervista.org"); //sito web
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    
    lastConnectionTime = millis();
    
    delay(1000);
    Serial.println(strURL);
  }
  else
  {
    Serial.println("Errore Connessione");
    Serial.println("Disconnessione...");
    client.stop();
  }
}

Per salvare i nostri dati su un database MySQL, abbiamo bisogno di un dominio e di un database.
I file che dovranno essere caricati sul server sono due: salva.php e visualizza.php.
Il primo file riceve i dati acquisiti da Arduino tramite metodo GET, mentre l’altro sarà la pagina dove possiamo vedere i dati che sono stati acquisiti.
Tutto il codice è commentato e quindi (spero) di facile comprensione.
--- FILE salva.php

<?php
// dichiaro le variabili che ricevo da arduino
$temperatura = $_GET['temp'];
$umidita = $_GET['umi'];
$pressione = $_GET['pres'];
$luminosita = $_GET['lum'];
$neve = $_GET['neve'];
$rugiada = $_GET['rug'];

$tmsp = strtotime("now");
$date = date('d m Y',$tmsp);

// effettuo la connessione al mysql
$host = "host";
$database = "database";
$password = "password";
$link = mysql_connect($host, $database, $password);
if (!$link) {
    die('non connesso : ' . mysql_error());
}

// effettuo la connessione al database mysql
$db_selected = mysql_select_db('NOME_DATABASE', $link);
if (!$db_selected) {
    die ('Non è possibile connettersi al database : ' . mysql_error());
}

// seleziono la tabella nella quale memorizzare i dati
$query = mysql_query("SELECT * FROM dati");
  $fetch = mysql_fetch_array($query);
// inserisco i valori
if (mysql_query("INSERT INTO 
//unite il codice tra i ...
dati(temperatura,umidita,pressione,luminosita,...
...neve,rugiada,data)...
...VALUES('$temperatura','$umidita','$pressione','...
...$luminosita','$neve','$rugiada','$data')...
... ")or die(mysql_error()))
  { // se tutto è andato a buon fine...
	echo "OK";
  }
else{
echo "ERROR";

}

?>

--- FILE visualizza.php

<?php // effettuo la connessione al mysql $host = "host"; $database = "database"; $password = "password"; $link = mysql_connect($host, $database, $password); if (!$link) { die('non connesso : ' . mysql_error()); } // effettuo la connessione al database mysql $db_selected = mysql_select_db('my_fabbricaopensource', $link); if (!$db_selected) { die ('Non è possibile connettersi al database : ' . mysql_error()); } ?> //fate tasto destro ispezione elemento per vedere il codice della tabella

<?php $query = mysql_query("SELECT * FROM dati"); while($row = mysql_fetch_array($query)){ $data = $row['data']; $temperatura = $row['temperatura']; $umidita = $row['umidita']; $luminosita= $row['luminosita']; $pressione = $row['pressione']; $neve = $row['neve']; $rugiada = $row['rugiada']; echo ""; } ?>
Data:Temperatura:Umidità:LuminositàPressione:Altezza della neve:Punto di rugiada:
$data$temperatura$umidita$luminosita$pressione$neve$rugiada

Quello che è stato appena presentato, è il codice che dovrà essere caricato sul server, mentre per creare la tabella nel database mysql potete utilizzare la seguente query:
 


CREATE TABLE `NOME_DATABASE`.`meteo` (
`id` INT NOT NULL ,
`temperatura` VARCHAR( 100 ) NOT NULL ,
`umidita` VARCHAR( 100 ) NOT NULL ,
`pressione` VARCHAR( 100 ) NOT NULL ,
`luminosita` VARCHAR( 100 ) NOT NULL ,
`neve` VARCHAR( 100 ) NOT NULL ,
`rugiada` VARCHAR( 100 ) NOT NULL ,
`data` DATE NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM

 
Considerazioni e osservazioni
Di questa stazione meteorologica ne ho realizzato due esemplari.
Una l’ho posizionata presso la mia abitazione in montagna, mentre l’altra è stata impiantata da un mio amico in valle, dove abita. In questo modo ad entrambi è possibile conoscere in tempo reale i dati di due posti diversi.

Quello che ho presentato è il codice generico. Infatti, nel caso in cui vogliate utilizzare più di una stazione meteo, dovrete modificare il codice aggiungendo un valore identificativo, altrimenti i dati che saranno salvati sul database verranno confusi tra loro.
 

Adesso, potrete leggere quì di seguito un piccolo approfondimento sul Meteo di Sebastiano Carpentari (il mio amico che possiede la seconda stazione meteo)

La velocità del suono e la temperatura

In natura le onde possono essere di vario tipo: onde sismiche, elettromagnetiche, sonore, gravitazionali. Le onde di per se non possono crearsi se non immerse in un mezzo il quale permette loro di muoversi tramite forza elastica che scaturisce dalla deformazione del mezzo stesso (le onde elettromagnetiche e a livello teorico quelle gravitazionali possono diffondersi anche nel vuoto). Per concretizzare quando detto fin qui, immaginiamo di lanciare un sasso in uno specchio d’acqua. Il risultato è noto a tutti: si verranno a formare delle circonferenze concentriche in costante allontanamento dal punto di partenza. Il mezzo che permette alle onde di formarsi è proprio l’acqua. Lo stesso discorso lo possiamo fare per l’aria, quand’essa viene colpita da una vibrazione emessa da una sorgente sonora. Le caratteristiche classiche di un suono sono tre: intensità (energia dell’onda), altezza (tonalità dell’onda, anche chiamata frequenza o armonica fondamentale) e il timbro (composizione in termini di frequenze armoniche superiori dell’onda).
Ma a che velocità si propaga un’onda sonora nei vari mezzi presenti in natura (noi terremo presente l’aria, l’acqua e l’acciaio, che funge da solido)?
La velocità di propagazione di un’onda sonora dipende fondamentalmente dal mezzo che deve attraversare e non dalle caratteristiche del suono. È stato ormai dimostrato il fatto che la velocità delle onde aumenta all’aumentare della temperatura e della densità del mezzo e per quando riguarda quelli presi in esame, essa è:

MEZZO VELOCITA’ SPERIMENTALE
ACQUA a 20°C 1480 m/s
ACCIAIO a 20°C 5980 m/s

Tabella 1 Velocità del suono in alcuni mezzi campione

Ma concentriamoci un momento sulla velocità delle onde sonore in base alla temperatura. L’equazione che ci permette di venir a conoscenza della stessa è, rispettivamente per l’aria e per l’acqua, la seguente:

Dove per 0,6 e 4,2 si intende tasso di variazione della velocità con la temperatura (la sua unità di misura è m/(s*K) .

Alcuni parametri fondamentali nella meteorologia

I parametri che concorrono a una buona previsione meteorologica sono molti. Di seguito ne sono elencati solamente alcuni, rilevati anche dalla stazione meteo creata con Arduino:

  • Punto di rugiada: questo parametro, conosciuto anche come “dew point”, indica la temperatura alla quale bisognerebbe portare una massa d’aria unitaria, a pressione costante, affinché essa, raggiunga la saturazione (100% umidità relativa). La formula che ci permette di calcolarla è la seguente:
  • Umidità relativa: in meteorologia, l’umidità relativa ci indica in via percentuale la quantità di vapore contenuta nell’atmosfera e viene definita come il rapporto tra la densità del vapore contenuto in atmosfera e la densità del vapore saturo alla temperatura della miscela. Lo strumento che la rileva è chiamato igrometro.
  • Pressione: per riassumere in breve il concetto di pressione atmosferica possiamo dire che essa è la pressione che viene esercitata dalla colonna d’aria su un qualsiasi punto della superficie terrestre. A livello del mare essa è pari a 1013,25 mBar, cioè 1Atm. Un accorgimento da tener presente quando si parla di pressione è il fatto che essa varia con la quota e con le perturbazione dell’equilibrio atmosferico come le aree di bassa pressione (o cicloni) oppure gli anticicloni.
  • Temperatura: essa è il parametro meglio conosciuto dalla maggior parte delle persone. La temperatura serve a descrivere lo "stato termico" di un sistema e le unità di misura sono molte. Le più usate sono: Kelvin, Celsius e Fahrenheit.

Possibili modifiche e sviluppi futuri
Quella che è stata presentata in questo articolo, è una versione base che può essere usata in molti contesti.
E’ possibile modificarla facilmente ed ampliare il suo funzionamento.
Ad esempio, è possibile aggiungere la memorizzazione dei dati acquisiti su una memory card “micro sd” (L’ethernet shield è già predisposta) affinchè, nel caso in cui dovesse mancare la connessione internet, automaticamente i dati acquisiti vengono memorizzati sulla memoria locale.
Sul sito si potrebbe inoltre creare un grafico che mostra i dati che sono stati rilevati l’ultimo giorno e quelli rilevati nell’ultimo mese.
Ringraziamenti
Voglio ringraziare Ivan Scordato che mi ha aiutato a realizzare questo progetto, specialmente nella parte del codice PHP e nella scrittura dell’articolo stesso.

AllegatoDimensione
Stazione Meteo con Arduino.zip179.22 KB
Stazione Meteo con Arduino.pdf423.06 KB

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di Ivan Scordato

Ottimo Articolo :D

Ottimo Articolo :D

ritratto di adrirobot

Proposte di progetti futuri.

Ciao
Mi sembra che l’accoppiata con Ivan abbia dato ottimi risultati :-)
Il progetto presentato esce un po’ dai normali schemi in cui i risultati sono di solito rappresentati solo su un display LCD 16x2.
In questo caso le nuove tecnologie, vedi la rete internet, sono entrate nel progetto.
Questo progetto è una buona base, in un prossimo articolo potresti mostrare come realizzare realmente la centralina (inserendo le foto della realizzazione), magari preparando uno specifico shield dove montare i vari sensori.
Un’altra possibile modifica, potrebbe essere quella di realizzare una centralina autonoma alimentata da un pannello solare.
http://www.seeedstudio.com/wiki/Energy_Shield
e in cui l’accoppiata Arduino+ Ethernet Shield potrebbe essere sostituito da un Arduino YUN
http://arduino.cc/en/Main/ArduinoBoardYun?from=Main.ArduinoYUN
che possa comunicare con la rete in WI-FI, in questo modo la centralina potrebbe essere posta all’esterno, ed essere completamente indipendente.
Un saluto
Adriano

ritratto di Tiziano.Pigliacelli

Sono daccordissimo con te

Sono daccordissimo con te Adriano, la collaborazione con Ivan ha senza dubbio dato i suoi frutti. Davvero un'ottima idea quella di inserire il salvataggio dei risultati, e sarebbe davvero bello vedere una centralina alimentata autonomamente attraverso pannello fotovoltaico. Ancor più bella sarebbe la comunicazione Wi-Fi.
Domanda: ma l'immagine è anche opera di Ivan? Mi sembra di riconoscerne lo stile!!!
Un'altra domanda: è possibile inviare una foto per mostrarci il lavoro realizzato?

ritratto di alex272

Bello

Complimenti un bel progetto e un bell articolo, spero di vedere presto gli sviluppi futuri.
Ciao

ritratto di Ivan Scordato

ottimo!

Sono lusingato dalle capacità che mi attribuite :)
Ho solo voluto aiutare qualcuno che aveva bisogno d'aiuto e che ha voluto essere aiutato senza pensare che io volessi ferire il suo orgoglio ;D

Si, il tipo di salvataggio che è stato scelto è davvero ottimo, così è possibile accedere ai risultati salvati direttamente in tempo reale senza essere fisicamente sul posto.

L'idea di utilizzare una connessione Wifi (Potrebbe bastare anche un piccolo access point per non spendere tanto) al posto di un cavo ethernet permetterebbe un ulteriore miglioria, e come avete già detto voi, l'affiancamento di un pannello solare per alimentare il tutto renderebbe senza dubbio il progetto molto più versatile in quanto non servirebbe più avere a disposizione la rete elettrica ed inoltre il costo di mantenimento sarebbe Gratis :)

Non capisco perchè non abbia caricato anche le foto che mostrano il lavoro eseguito, ma sicuramente rimedierà scrivendo un commento nel quale include anche l'immagine.

Saluti,
Ivan

ritratto di adrirobot

Proposta shield

Ciao
Non so se può essere d’aiuto ma per facilitare quanti volessero cimentarsi nella costruzione di una stazione climatica, esiste la disponibilità di uno shield per Arduino su cui sono già presenti (è già saldati poiché di tipo SMD) alcuni sensori per la rilevazione di alcuni parametri meteorologici: temperatura, umidità relativa e pressione atmosferica.
Su di essa sono presenti i sensori: MCP9700A della Microchip per misurare la temperatura; HIH-5030-001 della Honeywell per determinare l’umidità relativa; MPXH6115A6U della Freescale per avere i dati inerenti la pressione atmosferica assoluta.
Sulla scheda è inoltre presente un RTC (Real Time Clock), realizzato con l'integrato DS1307 della Maxim.
Oltre a questo è presente un connettore per l’inserimento di un display LCD.
Perciò con questa base e aggiungendo il sensore di luminosità e il sensore di distanza, si renderebbe ancora più completa la stazione meteo.
Andrà certamente integrato/rivisto il programma ma credo che sia fattibile.
Il kit può essere trovato a questo collegamento:
http://www.futurashop.it/index.php?route=product/product&path=4108_4111&product_id=2260
Un saluto
Adriano

ritratto di bacaezio

Misurazione altezza neve...

Ciao e complimenti per l'articolo, era proprio quello che mi serviva, devo sviluppare una cosa del genere e l'ho preso come base di partenza ;)

Una cosa che non mi torna è il modo in cui viene misurata l'altezza della neve, o meglio è chiaro il modo, ma forse viene presa la viaribile sbagliata e cioè neve al posto di menoNeve? Infatti se ho capito bene, la stazione viene posta a 200 cm da terra e poi viene misurato in tempo reale la distanza da terra, se c'è neve questa distanza sarà minore e la differenza sara l'altezza neve, giusto?

Attendo le foto del progetto completo :)

Grazie
ciao
Andea

ritratto di gioam.lorenzini

Misurazione Neve

Ciao,
grazie per i complimenti, se ti serve qualche aiuto per sviluppare la tua cosa contattami.

Ho controllato il codice e mi sembra giusto, il tuo modo di misurare la distanza e se ce neve è minore è uguale al mio.

SENSORE<------- 200 cm --------->|TERRA --> 200 - 200 = 0 cm di neve
SENSORE<------- 150 cm ->|NEVE|TERRA --> 200 - 150 = 50 cm di neve

Qua calcola la differenza, come hai detto tu:

float menoNeve = 200.0 - neve;

e qui aggiunge la variabile menoNeve alla stringa da inviare al server:

strURL+="&neve=";
strURL+=menoNeve;

Forse vi ho fatto confusione chiamando neve la variabile della distanza e menoNeve quella dell'altezza della neve. Si possono invertire tutti i nomi:

menoNeve = (durata*cmPerMicrosecondi/2.0);
float neve = 200.0 - menoNeve;

e sotto:

strURL+="&neve=";
strURL+=menoNeve;

O al posto di menoNeve usare distanzaSensore o altro

ritratto di h3nk3relett

bravo complimenti

bel progetto e molto ben descrittto.

interessante la parte dove spieghi i valori atmosferici.

ritratto di Cristian.Puddu

Interessante e complimenti!

Interessante e complimenti! E' tecnicamente possibile aggiungere un pluviometro e anemometro? In questo modo potrebbe diventare più completa e degna di numerose stazioni (più costose) già presenti online.

ritratto di gioam.lorenzini

Scusa per il ritardo

Scusa per il ritardo ma mi sono accorto solo adesso del commento.
Io ed Ivan Scordato stiamo lavorando per integrare pluviometro e anemometro, quindi dovrebbe essere tecnicamente possibile.

ritratto di max pucci

Come è andata a finire?

Il progetto mi sembra ottimo e se ci fossero pluviometro e anemometro sarebbe un bella stazione completa.
Con una soluzione wifi e alimentazione a celle solari diventerebbe da urlo!
Buon lavoro
Massimo

ps ne ho parlato con un amico che gestisce un rifugio e la cosa gli piace veramente.... ovvio che si parla di persone che condividono l'autocostruzione e amano l'opensource!

ritratto di Nazario.Tancredi

Grazie!

Ciao e complimenti per le informazioni che hai dato!

 

Sto provando, partendo da zero conoscenze, a realizzare una centralina meteo con un sensore DHT22.

Ho provato a caricare su arduino il tuo codice, con delle piccole modifiche, e nel vericarlo ho un errore del tipo:

 

"ambiguous overload 'operator+='  in 'strURL+=temperatura'.

 

dov'è che sbaglio??

Qui riporto il il codice completo.

 

Ciao e grazie in anticipo per la tua risposta!

 

#include <DHT22.h>
// Only used for sprintf
#include <stdio.h>
#include <Ethernet.h>

// Data wire is plugged into port 7 on the Arduino
// Connect a 4.7K resistor between VCC and the data pin (strong pullup)
#define DHT22_PIN 7

// Setup a DHT22 instance
DHT22 myDHT22(DHT22_PIN);

//variabili per collegarsi a internet
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

IPAddress ip(192,168,0,100); //indirizzo IP disponibile sulla rete

IPAddress myDns(192,168,1,1); //tuo DNS

char server[] = "www.meteopuciacchia.altervista.org"; //sito web

EthernetClient client;

unsigned long lastConnectionTime = 0; //l'ultima volta che ti sei connesso...
//...al server in millisecondi
boolean lastConnected = false;    
const unsigned long postingInterval = 60L*1000L; //la L è necessaria per...
//...usare i numeri di tipo long

//dichiaro la stringa dove scrivo i dati per caricarli sul web
String strURL = " ";

 

 

 

 

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // N: Serial.println("DHT22 Library Demo");
 
  delay(1000); //attendo un secondo
  Ethernet.begin(mac, ip, myDns);
 
  //invio al pc il mio IP
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());

 
 
}

void loop()
{    
    if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

 if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("Disconnessione...");
    client.stop();
  }
 
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    aggiornoDati(); //carico i dati sul server
  }
 
  lastConnected = client.connected();
 
}
 
  void aggiornoDati() //carico i dati sul server
{

  //leggo l'umidità e la scrivo in una variabile
  float umidita = myDHT22.getHumidity();
  float temperatura =myDHT22.getTemperatureC();

if (client.connect(server, 80))
  {
    Serial.println("Connessione...");

    //creo l'url utilizzando una stringa
    strURL ="GET  /meteo/salva.php?temp="; //url
    strURL+=temperatura;
    strURL+="&umi=";
    strURL+=umidita;
    strURL+=" HTTP/1.1";
    
    //invio la richiesta al server
    client.println(strURL);
    client.println("Host: www.meteopuciacchia.altervista.org"); //sito web
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    
    lastConnectionTime = millis();
    
    delay(1000);
    Serial.println(strURL);
  }
 
  else
  {
    Serial.println("Errore Connessione");
    Serial.println("Disconnessione...");
    client.stop();
  }
}

 

 

 

 

 

ritratto di gioam.lorenzini

Grazie per i complimenti

Ho modificato un pò il codice, perchè non avevo le tue librerie.
Ho arduino 1.5.4

Prova così, dovrebbe funzionare anche con queste librerie (standard) per il sensore dht22, se hai quello

http://learn.adafruit.com/dht/downloads

 

 

//DHT22
#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

//Ethernet
#include <SPI.h>
#include <Ethernet.h>

//variabili per collegarsi a internet
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,0,100); //indirizzo IP disponibile sulla rete
IPAddress myDns(192,168,1,1); //tuo DNS
char server[] = "www.meteopuciacchia.altervista.org"; //sito web
EthernetClient client;
unsigned long lastConnectionTime = 0; //l'ultima volta che ti sei...
//... connesso al server in millisecondi
boolean lastConnected = false;
const unsigned long postingInterval = 60L*1000L; //la L è necessaria...
//...per usare i numeri di tipo long

//dichiaro la stringa dove scrivo i dati per caricarli sul web
String strURL = " ";

void setup()
{
dht.begin(); //inizializzo il sensore di umidità
bmp.begin(); //inizializzo il sensore di pressione

// start serial port
Serial.begin(9600);

delay(1000); //attendo un secondo

Ethernet.begin(mac, ip, myDns);

//invio al pc il mio IP
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());

}
void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("Disconnessione...");
client.stop();
}

if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
aggiornoDati(); //carico i dati sul server
}

lastConnected = client.connected();

}

void aggiornoDati() //carico i dati sul server
{
//leggo l'umidità e la scrivo in una variabile
float umidita = dht.readHumidity();
float temperatura = dht.readTemperature();
if (client.connect(server, 80))
{
Serial.println("Connessione...");

//creo l'url utilizzando una stringa
strURL ="GET /meteo/salva.php?temp="; //url
strURL+=temperatura;
strURL+="&umi=";
strURL+=umidita;
strURL+=" HTTP/1.1";

//invio la richiesta al server
client.println(strURL);
client.println("Host: www.meteopuciacchia.altervista.org"); //sito web
client.println("User-Agent: arduino-ethernet");
client.println("Connection: close");
client.println();

lastConnectionTime = millis();

delay(1000);
Serial.println(strURL);
}

else
{
Serial.println("Errore Connessione");
Serial.println("Disconnessione...");
client.stop();
}
}

ritratto di Nazario.Tancredi

GRAZIE PER LA RISPOSTA

ho modiicato il codice...ho solo un problema: come fai a definire la stringa URL con dei dati di tipo float ('temperatura' e 'umidita')? usando il codice come scritto da te mi dava errore...ho modificando inserendo "char(temperatura)" (lo stesso per l'umidità) e non mi da più errore....però nel database viene scritto un intero e non il valore reale.Il codice è:

 

//creo l'url utilizzando una stringa
   strURL ="GET  /salva.php?temp="; //url
   strURL+=char(temperatura);
   strURL+="&umi=";
   strURL+=char(umidita);
   strURL+=" HTTP/1.1";
   
//sprintf(strURL, "GET/meteo/salva.php?temp=%.4g &umi=%.4g HTTP/1.1",temperatura,umidita);    
   //invio la richiesta al server
   client.println(strURL);

 

Dove sbaglio? cosa mi sfugge??

Ti ringrazio in anticipo per la risposta!!!

ritratto di Emanuele.Landolfi

raspberry o ardruino ?

ciao si puo fare questo progetto con la raspberry pi modello B ??

ritratto di Ivan Scordato

raspberry pi

Ciao, la risposta è si.
Pensa che puoi addirittura settare ed utilizzare il Raspberry Pi come Web Server, perciò se fossi in te ci farei un pensierino.
Naturalmente il codice di programmazione cambia.
A presto,
Ivan

ritratto di Emanuele.Landolfi

saresti cosi gentile da

saresti cosi gentile da scrverlo per me ?! ti prego :P

ritratto di Emanuele.Landolfi

ciao Ivan forse ho trovato

ciao Ivan forse ho trovato una soluzione.. vedi se è giusta.. se acquisto una shield arduino per raspberry , le connessioni e la programmazione è la stessa a quella che hai scrutto tu ? ps. e poi posso utilizzare liberamente la mia raspberry con la porta GPIO? (per altre funzioni ?oppure no ?)

ritratto di Ivan Scordato

Purtroppo no

Ciao, no mi dispiace ma sia i pin che il funzionamento sono diversi

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 21 utenti e 78 visitatori collegati.

Ultimi Commenti