Go Down

Topic: disabilitare pulsanti per "tot secondi" (Read 646 times) previous topic - next topic

Schwibby

ciao a tutti,

sto giocando con lo shield mp3, ma ho visto che a volte premento i pulsanti, il ritorno di corrente mi fa leggere ad arduino 2 impulsi in sequenza, e quindi il mio sw fa prima start mp3 poi stop mp3.

vorrei quindi, una volta premuto il pulsante far partire un timer che disabiliti eventuali premute per 3 secondi.

come posso fare?

spiego meglio :

premo il pulsante 1 collegato su A0, parte un timer settato a 3 secondi e l'mp3, qualunque altra premuta del tasto su A0 finche il timer non scade non fa accadere niente, dopodiche riprende il normale funzionamento del software.

in pratica ancora piu semplice , una volta che parte l'mp3 devo disattivare tutti i pulsanti per 3 secondi

questa operazione la devo fare per gli ingressi analogici a0 fino a4. , quindi per 4 pulsanti.

grazie

PaoloP

Devi inserire il debounce. Di norma basta un delay di 15 millisecondi.

--> http://arduino.cc/en/Tutorial/Debounce

qsecofr

questo fa quello che chiedi tu... conviene mettere molto meno come delay...

Code: [Select]
int led = 13;
  int i;
  bool acceso;
  long oldMillis =0;
// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
 
  i = digitalRead(8);
  if ((i == HIGH) && (millis() - oldMillis > 3000) ){
      oldMillis = millis();
      //qui scambia lo stato del led: tu hai start mp3 e stop mp3   
      if (acceso) {  //start mp3
        digitalWrite(led, LOW);
        acceso =false;
        } else
        {   //stop mp3
          digitalWrite(led, HIGH);
        acceso =true;         
          }
    }
   
}


io invece mi trovo piuttosto bene con questa soluzione:
Code: [Select]
int led = 13;
  int i;
  bool acceso;

// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
 
  i = digitalRead(8);
  if ((i == HIGH)  ){
      while (i==HIGH)  i = digitalRead(8);
     
      //qui scambia lo stato del led: tu hai start mp3 e stop mp3   
      if (acceso) {  //start mp3
        digitalWrite(led, LOW);
        acceso =false;
        } else
        {   //stop mp3
          digitalWrite(led, HIGH);
        acceso =true;         
          }
    }
   
}


che in pratica consiste nel prendere il comando del tasto solo quando rilasci il tasto (fronte di discesa)... basta aggiungere un loop... unica cosa è che questo programma blocca tutto fintanto che non rilasci il tasto ma di solito non è un problema....provalo: dipende dal tasto che hai ma io mi ci sono sempre trovato molto bene.


MauroTec


questo fa quello che chiedi tu... conviene mettere molto meno come delay...

Code: [Select]
int led = 13;
  int i;
  bool acceso;
  long oldMillis =0;
// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
 
  i = digitalRead(8);
  if ((i == HIGH) && (millis() - oldMillis > 3000) ){
      oldMillis = millis();
      //qui scambia lo stato del led: tu hai start mp3 e stop mp3   
      if (acceso) {  //start mp3
        digitalWrite(led, LOW);
        acceso =false;
        } else
        {   //stop mp3
          digitalWrite(led, HIGH);
        acceso =true;         
          }
    }
   
}


io invece mi trovo piuttosto bene con questa soluzione:
Code: [Select]
int led = 13;
  int i;
  bool acceso;

// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
 
  i = digitalRead(8);
  if ((i == HIGH)  ){
      while (i==HIGH)  i = digitalRead(8);
     
      //qui scambia lo stato del led: tu hai start mp3 e stop mp3   
      if (acceso) {  //start mp3
        digitalWrite(led, LOW);
        acceso =false;
        } else
        {   //stop mp3
          digitalWrite(led, HIGH);
        acceso =true;         
          }
    }
   
}


che in pratica consiste nel prendere il comando del tasto solo quando rilasci il tasto (fronte di discesa)... basta aggiungere un loop... unica cosa è che questo programma blocca tutto fintanto che non rilasci il tasto ma di solito non è un problema....provalo: dipende dal tasto che hai ma io mi ci sono sempre trovato molto bene.




Vero, blocca il programma, ma basta aggiungere al while un timeout basato su mills per farlo uscire dal ciclo, e se esce per timeout assegni LOW ad i, così il programma gira anche se per caso un pulsante rimane premuto, magari si è guasto e per un guasto banale tutta la scheda non funziona.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Schwibby

grazia delle dritte, provo col debounce :) direi che è cio che mi serve

Go Up