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 :o . 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:
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


Arduino Forum > International > Italiano > Software (Moderator: leo72) > Problema nella lettura di un segnale digitale


arduino

Comments

Popular posts from this blog

DHT11 Time out error using v0.4.1library

Sketch upload fails with Java error (___REMOVE___/bin/avrdude)!

Arduino Uno + KTY81/210 temperature sensor