Problema nella lettura di un segnale digitale
salve tutti, sono nuovo nel forum e nel mondo di arduino.
per scuola dovrei realizzare il progetto di un tachimetro (che funge anche da contachilometri) per una bicicletta (leggendo gli impulsi con un sensore reed). le misure della velocità e dello spazio percorso devo visualizzare su un display lcd 16x2. fino qui è tutto ok, poi ho voluto rendere il progetto più complesso, misurando la velocità istantanea e lo spazio totale (stampandoli sull'lcd), poi premendo un pulsante la schermata dell'lcd cambia e visualizza la velocità massima e lo spazio parziale (che potranno essere azzerati premendo lo stesso pulsante per almeno 3 secondi, ma questa utima opzione devo ancora pensarci).
il problema sorge quando premo il pulsante per cambiare schermata, perchè (verificando con un led, quando è acceso si visualizza una schermata e quando è spento si vede l'altra), o si accende correttamente, ma dopo molto tempo da quando premo il pulsante (circa 3-4 secondi, e anche il display cambia schermata dopo quel tempo) o non si accende (e neanche il display cambia
se proverete ad aiutarmi ve ne sarò veramente grato visto che mi sono scervellato in tutti modi per trovare una soluzione, ma senza riuscirci
. di seguito lascio il mio sketch (da terminare, ma funzionante per quello descritto in precedenza... se avete dritte da darmi riguardo al programma meglio, visto probabilmente che ci sarà qualche errore haha).
grazie mille in anticipo.
sketch:
per scuola dovrei realizzare il progetto di un tachimetro (che funge anche da contachilometri) per una bicicletta (leggendo gli impulsi con un sensore reed). le misure della velocità e dello spazio percorso devo visualizzare su un display lcd 16x2. fino qui è tutto ok, poi ho voluto rendere il progetto più complesso, misurando la velocità istantanea e lo spazio totale (stampandoli sull'lcd), poi premendo un pulsante la schermata dell'lcd cambia e visualizza la velocità massima e lo spazio parziale (che potranno essere azzerati premendo lo stesso pulsante per almeno 3 secondi, ma questa utima opzione devo ancora pensarci).
il problema sorge quando premo il pulsante per cambiare schermata, perchè (verificando con un led, quando è acceso si visualizza una schermata e quando è spento si vede l'altra), o si accende correttamente, ma dopo molto tempo da quando premo il pulsante (circa 3-4 secondi, e anche il display cambia schermata dopo quel tempo) o non si accende (e neanche il display cambia
se proverete ad aiutarmi ve ne sarò veramente grato visto che mi sono scervellato in tutti modi per trovare una soluzione, ma senza riuscirci

grazie mille in anticipo.
sketch:
code: [select]
#include <liquidcrystal.h>
liquidcrystal lcd (12, 11, 7, 6, 5, 4);
extern unsigned long timer0_millis;
int cont=0; //contatore impulsi
float s=0;
float circonferenza = 2.1; //circonferenza ruota
float sparz=0; //spazio parziale
float stot=0; //spazio totale
float vi=0; //velocita' istantanea
float vmax=0; //velocita' massima
float a=0;
boolean state=true; //variabile booleana che cambiera' stato premendo per almeno 3s il pulsante 'a', decidendo cosi' se visualizzare su lcd valori istantanei, o fissi
void setup()
{
pinmode (13,output);//////prova
attachinterrupt (0, prova, falling); //interrupt 0: quando il magnete passa vicino al sensore, c'e' un'interruzione che richiama la funzione "prova"
attachinterrupt (1, visualdisplay, rising); //interrupt 1: quando premo il pulsante 'a' richiama la funzione "visualdisplay"
serial.begin (9600);
lcd.begin (16,2); //imposto lcd 16 x 2
}
void loop()
{
if (millis()<=3000) //tempo di attesa = 3s per contare impulsui (quindi dati vengono aggiornati ogni 3 secondi)
{
}
else
{
s=circonferenza*(cont/2); //calcolo spazio percorso nei 3 secondi
vi= s/3; //calcolo la velocita' media (in m/s)
sparz=sparz+s; //incremento valore spazio parziale (che potra' essere azzerato)
stot=stot+s; //incremento spazio totale (che non potra' mai essere azzerato)
if (vi>vmax) //verifico se la velocita' acquisita e' maggiore di quella massima attuale
{
vmax=vi; //se e' maggiore aggiorno la variabile della velocita' massima(che potra' essere azzerata, come lo spazio parziale)
}
switch (state)
{
case true: //stampa valori istantanei su lcd (se state = true)
digitalwrite (13,high);
lcd.clear ();
lcd.setcursor (0,0); //imposto 1 riga lcd
lcd.print("speed:"); lcd.print (vi*3.6,0); lcd.print (" km/h"); //stampo su lcd la velocita' istantanea
lcd.setcursor (0,1); //imposto 2 riga lcd
lcd.print ("space:"); lcd.print (stot/1000); lcd.print (" km"); //stampo su lcd lo spazio totale
break;
case false: //stampa valori costanti su lcd (se state = false)
digitalwrite (13,low);
lcd.clear ();
lcd.setcursor (0,0); //imposto riga 1 lcd
lcd.print ("topspeed:"); lcd.print (vmax*3.6,0); lcd.print(" km/h");
lcd.setcursor (0,1); //imposto riga 2 lcd
lcd.print ("totspace:"); lcd.print (sparz/1000,1); lcd.print (" km");
break;
}
cont=0; //azzero contatore impulsi
resetmillis(); //richiamo funzione reset millis
}
}
void prova() //funzione prova
{
if (digitalread(2)==low)
{
cont++; //incremento contatore impulsi
}
}
void visualdisplay () //funzione visual display
{
state=!state; //inverto valore di state (da finire con "se premo per almeno 3 secondi")!!!!!!!!!!!!!!!!
delay(50);
}
void resetmillis() //funzione reset millis
{
cli();
timer0_millis = 0;
sei();
}
non mi sarebbe venuto in mente di scrivere con millis() un codice bloccante.
ciao uwe
ciao uwe
Arduino Forum > International > Italiano > Software (Moderator: leo72) > Problema nella lettura di un segnale digitale
arduino
Comments
Post a Comment