Arduino

Anemoscopio

Eccomi a presentare anche l'anemoscopio. Ma cos'è l'anemoscopio?

È uno strumento che serve per conoscere la direzioine del vento e precisamente indica con la punta da dove arriva il vento. Come per l'anemometro ce ne sono di molti tipi in commercio. Io ho scelto questo della Argent Data System che assieme a pluviometro ed anemometro ha un prezzo interessante. 
Si presenta così: 

Non è precisissimo, ma dato che anche il vento è poco lineare (in gergo tecnico si dice con moto laminare) e ha sempre delle turbolenze (moto turbolento) dovuto a vortici o ostacoli come case, piante ecc., questo anemometro va più che bene per avere un'idea di come si muovono le masse d'aria nel luogo dell'installazione.

Lo strumento è composto da 8 sensori di tipo reed come l'anemometro e il pluviometro, da un magnete che fa azionare i reed da soli o in coppia per avere una risoluzione di 22,5° e quindi 16 posizioni, e da un po' di resistenze.

Questo è lo schema dato dal datasheet della Argent:

Ma come funziona?

Partitore Anemometro

Abbiamo di fronte un partitore di tensione dove la resistenza R è posta all'inizio del circuito. Il magnete posto in direzione della punta dell'anemoscopio chiude un contatto (o due) reed inserendo una resistenza in serie al circuito. Se facciamo scorrere una corrente nel circuito e ne misuriamo la tensione ai capi tramite l'analog input dell'Arduino (es. A1), possiamo conoscere il valore di tensione e quindi che direzione ha il vento in base ad una tabella di valori:

Arduino dispone di ingressi analogico-digitale con risoluzione di 10bit quindi si riesce ad ottenere 2^10=1024 valori possibili da acquisire con range di 5V/1024=0,00488V cioè circa 5mV.

Il resistore esterno funge appunto da divisore di tensione.

In figura è mostrato lo schema di collegamento dal datasheet dell'anemoscopio. L'output viene collegato all'ingresso analogico dell'arduino, V+ all'alimentazione di arduino dei 5V. La resistenza da 10kohm rispetta i valori della tabella. Se ne inseriamo una diversa (es. 12kohm) bisogna andare a modificare i valori di tensione nell'array WindDirection[] per esempio andando a misurarli prima di inserirli.

Di seguito il codice usato per testare l'anemoscopio con una resistenza da 12kohm:

int windDirInput = 0; // variable to store the value coming from the sensor

int WindDirection[]={750,363,417,69,77,54,158,106,250,212,588,557,933,800,866,662};

void setup() {
  Serial.begin(9600);
}

void loop() {
  // read the value from the sensor:
  windDirInput = analogRead(A1);
  Serial.println(windDirInput);
  // compute wind direction
  int bestDiff = 20;
  int windDir = 0;
  for (int i = 0; i < 16; i++) {
    int diff = windDirInput - WindDirection[ i ];
    if (diff < 0) diff = -diff;
    if (diff < bestDiff) {
      bestDiff = diff;
      windDir = i;
    }
  }
  Serial.println(windDir * 22.5);
  delay(500);
}

Alla dichiarazione delle variabili imposto WindDirection[] un array contenente tutti i valori possibili in bit che verranno confrontati con l'ingresso analogico-digitale. Per esempio il valore 750 moltiplicato per la risoluzione di 0,005V mi da 750*0,005=3,75V e sarà il valore letto per il nord con la resistenza da ma inserita. In tabella c'era 3,84V per il nord. L'ingresso analogico-digitale quando viene letto, da in uscita un numero compreso tra 0 e 1023 che moltiplicato per l'opportuno fattore di 0,005V (0,00488... ) mi forniace il valore di tensione letta.

Nel ciclo for del programma vado a confrontare il valore letto con quello presente nell'array e siccome non è certo che i valori letti siano costanti vista la risoluzione piccolissima dell'ingresso, devo confrontare questo valore con un range in modo da "centrare" il valore giusto presente nell'array e faccio questo andando ad inserire bestDiff e un ciclo di confronto if. In uscita poi avrò il numero windDir intero corrispondente al numero di casella dell'array e lo vado a moltiplicare per la risoluzione dell'anemoscopio di 22,5°.