Anemometro

Anemometro

L'anemometro scelto per questa stazione meteo è della Argent Data System e per il suo basso costo va bene per lo scopo. In commercio ce ne sono tantissimi e di tanti tipi. Questo è uno classico con tre cucchiai.

Dispone di un sensore reed che al passaggio di un magnete si chiude permettendo un collegamento elettrico come illustrato in figura.

reed-switch-2

Il costruttore nel datasheet dice che l'anemometro misura la velocità del vento mediante un magnete che durante il movimento chiude un contattoil reed appunto. Ad una velocità di 1,492MPH, cioè 2,4km/h il magnete provoca una chiusura una volta al secondo. L'anemometro ha solo 2 conduttori e si presenta così:

Schermata 2014-05-23 alle 20.46.34

Ora dobbiamo interfacciare l'anemometro con arduino e la cosa non è stata velocissima. C'è bisogno di un circuito che riesca a leggere le chiusure del reed, e poi creare uno sketch che legga e traduca in linguaggio comprensibile ed immediato soprattutto.

Girovagando per la rete ho capito che arduino ha la possibilità di sfruttare due canali di interrupt e quindi uno per l'anemometro e uno per il pluviometro che vedremo successivamente. 

L'interrupt permette di contare o far accadere qualcosa alla variazione di uno stato di un segnale digitale. Se per esempio abbiamo un'onda quadra ho la possibilità con arduino di controllare la salita o la discesa del fronte d'onda.

Come fare a far questo? Un sistema che è quello che ho usato io è la carica e scarica di un condensatore. Il circuito è il seguente:

 IMG 1811

Con l'alimentazione di 5V e il reed aperto il condensatore si carica. Nel momento del passaggio del magnete presente nell'anemoscopio di fronte al reed, il reed si chiude e fa scaricare il condensatore. Nello stesso momento il pin 2 dell'arduino dedicato al pwm funziona da interrupt e dallo stato logico alto (5V), passa allo stato basso. Questo fa si che venga letto un impulso dall'ingresso. In questo caso viene letto il fronte di discesa del gradino di scarica che si viene a creare.
La resistenza scelta è da 12kohm ed il condensatore da 0,1microF in modo da ottenere una costante di tempo di un millisecondo all'incirca visto che il contatto si chiude e si apre in un tempo breve.

Ora, dopo aver fatto il circuito possiamo testare il funzionamento creando uno sketch. Io ho scritto questo con aiuti da parte della rete:

 

//Anemometro

float rpm=0;
float timeold=0;
float rpmcount=0;

void setup(){
  Serial.begin(9600);
  attachInterrupt(0,arduino_anemometer, FALLING);
  //attachInterrupt(0,arduino_anemometer, RISING);
  // 0 = l’interrupt dell’anemometro è collegato al pin 2, attraverso la function arduino_anemometer
  // 1 = l’interrupt dell’anemometro è collegato al pin 3, attraverso la function arduino_anemometer

}

void loop(){

  if(rpmcount>=3) {//Update wind speed every 3 RPM
    rpm=(2400*rpmcount)/((millis()-timeold)); //Convert RPM to Km/h basde on 1hz=2,4km/h
    timeold = millis(); //count the ms spent in IRQ
    rpmcount = 0;
    Serial.println(rpm);
  }
}

void arduino_anemometer(){
  noInterrupts();
  rpmcount++;
  //delay(50);
}

Nella parte del setup dichiaro che uso gli interrupt con rampa in salita (rising) o rampa in discesa (falling) ed il pin collegato. Poi attivo la funzione attachInterrupt che resterà sempre attiva: essa conta quanti interrupt ha "ascoltato" la porta.

Nel loop infine stabilisco che dopo almeno tre impulsi ricevuti stampo a video (seriale) la velocità convertita in km/h.