collegare anemometro ad arduino

Ciao a tutti,
come primo progetto ho rispolverato un vecchio progetto funzionante che avevo fatto assieme ad alcuni amici su PIC per la gestione di una tenda motorizzata.
Ho risolto abb.za tutto ma vorrei un aiuto da voi su come gestire l'anemometro che sto usando.
L'anemometro in questione ad una velocità del vento pari a 10 km/h corrisponde a 4 impulsi al secondo.
Come potrei misurarla con arduino?

grazie
ciao

Usa gli interrupt
l'interrupt hardware 0 dovrebbe corrispondere al pin 2 dell'arduino..

ehm vado a leggermi come si usano gli interrupt... se magari avete qualche esempio di come dovrei fare..

Nel frattempo ho provato ad usare la funzione pulseIn ma non mi sembra faccia al caso mio o forse sbaglio ad usarla...

AnemometroState = pulseIn(AnemometroPin,HIGH);

sapendo che l'anemometro fa 4 impulsi/secondo @ 10km/h vuol dire che fa 1 impulso in 250ms (250000 microsecondi)

Ho provato a debuggare il comando facendo girare la ventolina con un phon ma mi torna dei valori non tanto ragionevoli in quanto facendo girare piano la ventola ho un valore di circa 28000, aumentapo poco la velocità mi ritrovo con valori compresi tra 26 e 45 e ogni tanto anche valori negativi

hints?

ciao

Ciao TheBus,
forse questo 3ad della sez. HW può tornarti d'aiuto:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1244483843/all

Mi sembra che rispecchi la tua situazione.
M

grazie del suggerimento, ora mi trovo con dei valori corretti ma... qualcuno mi spiega perchè questo if è vero?

WindSpeed=1000000.0/AnemometroState*2.5;

const float VelocitaVentoChiusura=15.00;
          
if (WindSpeed >= VelocitaVentoChiusura) {
        Serial.println("Anemometro ");   
        Serial.println(WindSpeed);
        Serial.println(VelocitaVentoChiusura);
        StatoSensori = B00000001;
        ChiudiTenda();
        timeWhen = millis();
                }

WindSpeed e VelocitaVentoChiusura sono dichiarati come float
Non capisco perchè con WindSpeed che vale 0.00 la condizione if si avvera e applica il codice.

come fa a essere 0 WindSpeed se e dato da WindSpeed=1000000.0/AnemometroState*2.5; ?? che valore ha la costante AnemometroState ?

c

è 0.00 se l'anemometro è fermo in quanto anenometrostate misuare il tempo che il contatto sta in stato low

  AnemometroState = pulseIn(AnemometroPin,LOW);
  WindSpeed = abs(1000000.0/AnemometroState*2.5);

l'unico modo che ho trovato per risolvere è usare un int al posto del float e moltiplicando per 100 il valore (15 diventa 1500).
il compare con i float leggendo anche sulle reference non sembra funzionare molto bene... Altra cosa strana è che se modifico la funzione aggiungendo un + 0.01 tanto per far valere windspeed qualcosa di diverso da 0.00 mi torna sempre 0.00

WindSpeed = abs(1000000.0/AnemometroState*2.5)+0.01;

ti ricordo che un numero diviso 0 non fa 0 ma infinito ..

@camba192
Da quel che ricordo vagamente dei miei esami all'uni....

un numero diviso zero NON esiste (algebra).

Se pero' ci addentriamo all'interno della teoria dei limiti....
e facciamo tendere il dividendo a 0.. allora hai pienamente ragione... fa infinito

e cmq sia che non esiste sia che sia infinito fa confondere il micro e ti da vero l'if ..

e fin qui sono d'accordo.. ma:

  1. se modifico la funzione iniziale WindSpeed = abs(1000000.0/AnemometroState2.5); in WindSpeed = abs(1000000.0/AnemometroState2.5)+0.01; cmq non funziona

  2. perchè se modifico la funzione in WindSpeed = abs(1000000.0/AnemometroState*2.5)*100; definendo WindSpeed come variabile int funziona correttamente.

cmq per ora uso la modalità scritta nel punto 2 ma non mi è chiaro perchè non andasse prima...

ciao

ciao TheBus
per primo una divisione di 0 produce un errore perché é un valore non definito.
Nella matematica considerando il limes della funzione 1/0 si arriva che il valore é infinito. ma un microprocessore non gestisce cosí il calcolo.

Incolla tutto il codice senó non possiamo capire cosa stai facendo.

Controlla prima di fare la divisione se il tempo reso dalla funzione pulseIn() non sia sopra un valore limite oppure 0. Le eliche dei anemometri hanno un limite di funzionamento sotto il quale non girano a causa della resistenza dei cuscinetti. (é ca 0,4m/s per quelli a elica)
Solo nel caso di un valore rilevante fai il calcolo della velocitá.
cerca di non fare calcoli inutili che fanno appesantire il codice e il tempo di esecuzione: al posto di
1000000.0/AnemometroState*2.5
scrivi
2500000/AnemometroState

Ciao Uwe

ecco il codice che mi da problemi

const int AnemometroPin  = 4;     // Pin sensore anemometro
const float VelocitaVentoChiusura = 15.00;
float AnemometroState;
int WindSpeed;

void setup() {
pinMode(AnemometroPin, INPUT); 
}
void loop() {
      AnemometroState = pulseIn(AnemometroPin,LOW);
      //WindSpeed = abs(1000000.0/AnemometroState*2.5)*100;
      WindSpeed = abs(2500000/AnemometroState);
      Serial.print("ANEMOMETRO: ");
      Serial.println(WindSpeed);
      // check Anemometro
      
      if (WindSpeed >= VelocitaVentoChiusura) {
        Serial.println("Anemometro ");   
        Serial.println(WindSpeed);
      }
  delay (5000);
}

mentre cosi funziona ma non mi piace molto perchè gestisco i 2 decimali come un intero

const int AnemometroPin  = 4;     // Pin sensore anemometro
const int VelocitaVentoChiusura = 1500;
int AnemometroState;
int WindSpeed;

void setup() {
pinMode(AnemometroPin, INPUT); 
}
void loop() {
      AnemometroState = pulseIn(AnemometroPin,LOW);
      //WindSpeed = abs(1000000.0/AnemometroState*2.5)*100;
      WindSpeed = abs(250000000/AnemometroState);
      Serial.print("ANEMOMETRO: ");
      Serial.println(WindSpeed);
      // check Anemometro
      
      if (WindSpeed >= VelocitaVentoChiusura) {
        Serial.println("Anemometro ");   
        Serial.println(WindSpeed);
      }
  delay (5000);
}