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.
#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
grazie a tutti di cuore per l' aiuto
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.
@ 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
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 ?
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
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
Se usi gli interrupt, il modo più "corretto" per lavorare è pulire il segnale in ingresso (... oh ... basta una manciatina di componenti ) in modo da avere un bel segnale squadrato
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)
Se da ricerca "web" commuti a "immagini" hai i veri e propri schemi e ...
... scegli quello che meglio si adatta alle tue esigenze