problema con software per anemometro

salve a tutti ragazzi XD
è da un po che cerco di far funzionare questo mio progetto di anemometro ma il codice non riesco a farlo funzionare.
Per quanto riguarda la parte di elettronica ho sistemato un sensore reed switch (un interruttore magnetico) sotto il passaggio delle coppette sotto ciascuna delle quali ho sistemato una calamita che attiva il reed che invi un impulso al pin 8 di arduino.
Per il software ho realizzato un codice che ad ogni passaggio della camita inplementa la variabile conteggio di 1 e lo invia in seriale e su un monitor lcd ogni 2 secondi (utilizzandola funzione millis) durante i quali si esegue il conteggio e calcola la velocità.
spero di essere stato chiaro. :sweat_smile:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

#define interval 2000
int giri = 0;
float raggio = 0.085; // raggio dell'anemometro in metri
float Pi = 3.141593; // Pigreco
long previousMills = 0;

void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  pinMode(8, INPUT);
}

void loop()
{
  if (millis() -  previousMills > interval )
  {
    previousMills = millis();
    
    if(digitalRead(8)==1)
    {
      (giri=giri+1);
    }
    lcd.setCursor(0, 0);
    lcd.print("giri:  ");
    lcd.print(giri);
    Serial.print("giri: ");
    Serial.print(giri);
  }
  else
  {
    float Metris= (giri*Pi*raggio/3)/2000; // diviso tre perchè le copette sono tre e quindi tre calamite
    float Kmora = (3.6*Metris);
    giri = 0;
    lcd.setCursor(0, 1);
    lcd.print("vento: ");
    lcd.print(Kmora);
    Serial.print("     vento: ");
    Serial.println(Kmora);
  }
}

Se qualcuno riescisse a trovarmi l' errore o magari a mettermi apposto il codice gli sarei grato :wink:
grazie a tutti di cuore per l' aiuto

ciao
sposta la lettura del reed al pin 2 o 3 e usa l'interrupt è la soluzione migliore per non perdere impulsi

Stefano

cos' è l' interrupt e come mai proprio al pin 2 o 3 ???????

nessuno riuscirebbe a pulirmi per bene il software pleaseee :frowning:

davide88:
Se qualcuno riescisse a trovarmi l' errore o magari a mettermi apposto il codice gli sarei grato :wink:

... se magari ci dici che errore ti fa ... ci faciliti il compito XD

Guglielmo

il programma non mi da nessun errore non funziona e basta :sweat_smile:

non fa quello che voglio io :frowning:

Quando hai a che fare con problemi simili, è possibile perdere degli impulsi utili al conteggio solo perché il micro in quel momento sta facendo altre operazioni.

Si usa allora un "external interrupt" cioè si dice ad Arduino di monitorare in continuo un particolare ingresso digitale (come diceva stefa 24 il 2 od il 3) per far partire una routine quando lo stato dell'ingresso cambia.

Si può scegliere la modalità Low, Rising, Falling o Change: ti consiglio di leggere prima il reference:
arduino.cc/en/Reference/AttachInterrupt

@ cyberhs: Ho idea che sia difficile usare gli interrupt così come è il suo circuito.

Lui sta utilizzando un "reed switch" che, come tutti gli switch, purtroppo soffre del problema dei rimbalzi, rimbalzi che in una ISR non puoi pulire via SW, ma richiede che su segnale venga effettuato un debouncing HW a monte :wink:

Guglielmo

@ davide88 :

Allora,
in realtà tu devi fare fronte ad una serie di problemi ...
... primo tra tutti quello che tu, per leggere gli impulsi, non stai usando un sensore elettronico (come un sensore ad effetto Hall), ma un reed switch, che, come tutti gli switch, ha il problema dei "rimbalzi".

Quando un interruttore, anche di ottima qualità, si apre o si chiude, tu non hai un bel passaggio pulito da chiuso ad aperto e viceversa, ma hai una cosa che, osservata all'oscilloscopio, risulta più o meno così :

Capisci bene che, se vai a contare gli impulsi di un tale segnale ... otterrai un valore del tutto falso, motivo per cui .. la prima cosa da fare è pulire il segnale in modo da avere una vera onda quadra al chiudere o aprire del contatto.

Detta pulizia prende nome di "debouncing" e si può fare, sia via software, sia via hardware.

Ora ... la prima cosa è cercare di capire se, nel tuo caso, è fattibile una pulizia via SW o devi per forza aggiungere un circuito esterno.

Quindi ... di QUANTI impulsi al secondo, al massimo, stiamo parlando ??? Ovvero, quanti millisecondi abbiamo tra un impulso ed il successivo ?

Guglielmo

gpb01:
rimbalzi che in una ISR non puoi pulire via SW

Si può fare, l'ho gia fatto in passato ma richiede un pò di sbattimento col codice. Basta contare gli impulsi che arrivano in un certo lasso di tempo: se sono superiori ad una certa soglia, si incrementa il contatore, altrimenti si ignora il tutto e si resetta il timer. Però, ripeto, non è una cosa gestibile da uno che chiede che cos'è un interrupt e perché usare proprio i pin 2 e 3 :sweat_smile:

leo72:
Si può fare, l'ho gia fatto in passato ma richiede un pò di sbattimento col codice. ...

Si, ok, tutto si può fare, ma perdonami ... è ... una porcheria :grin: :grin: :grin:

Se usi gli interrupt, il modo più "corretto" per lavorare è pulire il segnale in ingresso (... oh ... basta una manciatina di componenti :wink:) in modo da avere un bel segnale squadrato :slight_smile:

Poi ripeto, tutto si fa ... XD

Guglielmo

ciao
@gpb01 mi interessa l'argomento ho un segnale di un encoder che vorrei pulire mi puoi suggerire qualcosa?

Stefano

Basta che fai una ricerca su Google con "debouncing circuit" e ti escono fuori un infinità di schemi, dai più semplici (solo una RC) a quelli un po' più complessi (RC + una o due porte logiche) :slight_smile:

Se da ricerca "web" commuti a "immagini" hai i veri e propri schemi e ...
... scegli quello che meglio si adatta alle tue esigenze :wink:

Guglielmo

non ho voglia di fare disegnini....

quindi guarda qua'

http://forum.arduino.cc/index.php?topic=193678.msg1435835#msg1435835

Brunello:
quindi guarda qua' ...

Appunto,come si diceva ... "dai più semplici (solo una RC)" ... :grin: :grin: :grin:

Anche se, io preferisco sempre aggiungerci qualche porta (es. trigger di schmitt) per avere già il segnale discriminato :wink:

Guglielmo

ok grazie
mi mancavano i termini

gpb01:
Si, ok, tutto si può fare, ma perdonami ... è ... una porcheria :grin: :grin: :grin:

Ti do ragione, era solo per precisare :slight_smile: