giovedì 2 gennaio 2014

-Update 22.12.2015- How to make a professional Weather Station with arduino and a cheap auriol h13726 with wunderground auto uploading

Ciao a tutti,
 
 inizio questo nuovo anno con un tutorial per l'autocostruzione economica di una stazione meteo professionale.

Per le feste mi sono regalato una stazione low(iper)-entry metereologica che ho comprato alla li-dl a 55 euri, una "Auriol H13726" .



Senza riempirvi troppo la testa con le sue specifiche da malati di mente vi dico che è composta da 3 unità, due wireless esterne e una ricevente interna con un bel display ma totalmente inutile dato che non dispone di nessuna uscita per il logging dei dati.

Giusto il tempo di infilarci dentro le pile, soffiare un pò sull'anemometro per testarne il funzionamento e via di cacciavite a vedere come erano fatti dentro...

Qui vi faccio vedere semplicemente il pluviometro e il retro dell'anemometro ( visto che nella parte anteriore sono locati solo un potenziometro a 360° per la direzione del vento e un magnete incastrato nella parte calettata che viene posta in rotazione dal vento.


(tremendo da vedere come è costruito il pluviometro...)

---->fin qui nulla di interessante...

Io ho bisogno di loggare i dati in qualche modo perchè voglio tenerne traccia anzichè dovere usare carta e penna e una buona dose di fosforo quotidiana per avere una anche minima traccia temporale, dovevo ingegnarmi.

Smanettando dopo la mezzanotte (sarà forse merito dei neuroni addormentati) ho scoperto che la casa produttrice (OWIM) a sua volta compra questo sistema embedded da un'altra ditta che produce la ventus w155, di questa è noto il protocollo di trasmissione ed è proprio quello di cui avevo bisogno.

Dal sito di tfd.hu è possibile scaricare lamappatura completa del segnale a 433mHz che le stazioni esterne inviano alla centrale = tombola!
link diretto all pagina del codice

Da qui inizia lo smanettamento...

Hardware necessario

  1. Stazione Meteo Auriol h13726 o compatibili
  2. Arduino 2009
  3. Shield ethernet W5100
  4. Rf 433 receiver module per arduino, da 0.5€ a hk va benone (il mio)
 Dopo aver installato la stazione all'esterno iniziamo a scancherare con duino..

Installate la scheda sul micro e fate in modo che sul vostro router abbiate fissato uno statico specifico per l'arduino visto che la memoria ristretta non permetterà di associare lo script per l'auto configurazione dello stesso :)

Registratevi su Wunderground e alla voce Weather->PWS->my PWS registrate la vostra stazione eannotatevi il nominativo assegnato, questo sarà l'username per fare accedere l'arduino al servizio online!

Montate la scheda ethernet sopra l'arduino e collegatevi la scheda rf433 con il pin data=8

Io per scrupolo ho aggiunto anche un dht11 per l'acquisizione della temperatura interna (o comunque vicina al sensore) collegato al pin2.

NB, per ottimizzare la ricezione del segnale è OPPORTUNO che la ricevente sia messa a sbalzo sulla solderless e connessa senza troppi rinvii di tensione per non abbattere il segnale in ingresso e ridurre il raggio di copertura ( max 6m..) -- Risolto con Update 2.0 Esteso a 50m ca.


 Come funziona lo sketch...

Per semplificarmi la vita e ottimizzare la cosa ho lasciato il ciclo di ascolto in loop costante, la scheda resta sempre allerta e solo quando riceve una stringa corretta allora effettua la pubblicazione sulla pagina di wunderground.
Ho risolto il problema delle temperature negative che sballavano i valori in output e ho aggiunto un considerevole debug in seriale per monitorare il lavoro dal pc :)

Devo ancora finire di mappare l'uscita del sensore di pioggia, a breve aggiungerò il bugfix e l'aggiunta del modulo per il rilevamento della pressione barometrica bmp085 oppure un MPXV5010DP gentilmente offerto dalla freescale semiconductor :)

 Lo schetch va compilato con i campi "id" e password relativi ai dati inseriti sul sito wunderground, ricordatevi di settare a dovere i valori della rete, ip statico gw e mask!

//AGGIORNAMENTO 13/12/2014//

A causa di utenti scorretti che hanno venduto il mio progetto (inizialmente offerto con licenza gratuita) ho deciso che divulgherò solo a chi si dimostrerà gentile.

Ho perso decine di ore a far partire il programma, chi mi sarà riconoscente (una pizza) avrà tutto, chi vorrà continuare la propria esistenza a rubare e rivendere il (poco) bottino per tirare a campare può evitare di perdere tempo qui.

scrivetemi a mattia.gambazza@gmail.com per ogni questione  o problema

vi lascio qualche screenshot per dimostrarvi il funzionamento :)

//AGGIORNAMENTO 26/12/2015//

Con il secondo "Compleanno del progetto" rilascerò la versione aggiornata e corretta stabile. 
Aggiunte

-Sensore Barometrico Bmp085
-Lettura Radiazione IR
-Lettura campo EMF (in V/m)
-Possibilità di attivare e disattivare da web eventuali altri sensori sull'arduino (Compresa Domotica)

Clicca Qui per vedere in tempo reale la stazione!
 link stazione



//AGGIORNAMENTO 15/03/2018//
-Cambiato gestore scansione e aggiornato intermante programma.
-Esteso supporto a pubblicare su più stazioni contemporaneamente.... si adesso si può spammare.
---.... aggiungo il .hex se qualcuno vuol provare a caricare come debug, si possono leggere da seriale i dati che invia la stazione sterna e interagire con un piccolo help.

https://drive.google.com/open?id=1sO6wECHHNJpQ2eZSCHw922-71mZX0QLJ

Per trasmettere a wunderground gli servono le credenziali che comportano la ricompilazione del .hex
Tradotto, se qualcuno vuol provarlo così com'è vede solo quello che fa la scheda esterna, se vuol trasmettere deve scrivermi e comunicarmi di dati di accesso wunderground così da poter ricompilare il file.


/////////    MG Wunderground 1.0 31/12/2013    ////////

// licenza GNU senza finalità a scopi commerciali, fatta da uno studente di ing meccanica per altri poveracci come me : //

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
#include <EEPROM.h>
#define nobits 36
#define   smin   7500
#define   smax   9900
#define   semin 250
#define   semax   750
#define   lmin   1700
#define   lmax   2300
#define   hmin   3700
#define   hmax   4300
#define receiverpin 8
float rain2;
float rainf;
float averagew;
float gust;
float temperature;
int temperature2;
int temperature3;
float temperature4;
int humidity;
int humidity2;
int humidity3;
int humidity4;
float rain;
int windd;
unsigned long ReadMills;
char winddr;

/////////////  calcolo della temperatura di rugiada /////////////

float dewPointFast(double temperature4, double humidew)
{
  double a = 17.271;
  double b = 237.7;
  double temp = (a * temperature4/10) / (b + temperature4/10) + log(humidew/100);
  double Td = (b * temp) / (a - temp);
  return Td;
}






DHT dht(DHTPIN, DHTTYPE);

byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01}; // mac address

byte ip[] = {
  192, 168, 0, 20 }; // ip arduino internet in

byte gateway[] = {
  192, 168, 0, 1 }; // internet access via router

byte subnet[] = {
  255, 255, 255, 0 }; //subnet mask

byte server[] = {
  38,102,137,156  }; /// http://weatherstation.wunderground.com/



#define UPDATE_INTERVAL            300000    // tempo di aggiormaneto preimpostato, fate passare almeno 30 secondi!
unsigned long update=0;
const int ledPin = 13;                       // led di bellezza... si può benissimo rimuovere
String id = "metti qui l'id ";               //metti l'id qui ad esempio IEMILIAR47
String PASSWORD = "wmettiquilapassword";     //metti la password
boolean upload=1;
boolean leggicontinuo=0;
EthernetClient client;

//client.connect(server, 80);   //se usi Arduino IDE<1.03

void setup() {
  Ethernet.begin(mac , ip);
  digitalWrite (ledPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("         /-/-/-/-/");
  Serial.println(" ");
  Serial.println("Ciao semo, mi sono avviato!");
  Serial.println(" ");
  Serial.println("         /-/-/-/-/");
  Serial.println(" ");
  pinMode(ledPin, OUTPUT);
  dht.begin();
  Serial.print(" ");

}         //fine setup



//---------inizio loop-----------


void loop() {
  //  Serial.println("Break point 1 inizio loop!");    // solo per debug
    Serial.print(code);
 



   
//se sono sotto zero

else {
 
    Serial.print("&dewptf=");               
    Serial.println("00_sono sottozero mongolo! ");     
    
}   
  //  Serial.println(dewPointFast(temperature4, humidew));
  Serial.println("");
  Serial.println("");
  //  delay(500);

  // fine scrittura valori stazione radio via seriale




  //inizio la pubblicazione sul sito dei valori

  Serial.print("connecting  ");

  if (cli

    ///// ----------- inserisco variabili per il calcolo della temperatura di rugiada (anonymous/Dropbox/Work/dewpoint_string_output_13luglio/) mattia -//


// se sono sopra lo zero, considerato che lo stronzo quando vado sottozero mi aumenta a 400 la temperatura,
// se dico che sono sotto 100 va bene.

    if(temperature4/10 < 100) {

      int humidew = humidity*10 +humidity2;
float dewpointfah = dewPointFast(temperature4 , humidew)*1.8+32; //converto in fah   
      Serial.print("&dewptf=");
      Serial.print(dewpointfah);      
           
        }

//se sono s
} //fine pubblica() --ovviamente lo sketch è incompleto. update 13.12.2014





















}




//////////////////////// fine script//////



Questo è tutto, per problemi o info scrivetemi pure a .. vedi mail sopra

Ciao a tutti, tanti auguri di un buon 2014!