Problema Arduino Lettura pulsante

Ciao a tutti

mi servirebbe qualche dritta per un piccolo proggetto che ho in mente,

con un arduino devo accendere un led(niente di piu semplice)solamente ho fatto in modo che il led rimanga

acceso per un tempo da me desisderato e siccome questo deve essere di 50ms mi crea problemi perchè il

tempo in cui tengo premuto il pulsasnte ovviamente supera i 50ms. ed il programma come è ora è
semplicemente un accendi led da pulsante :confused:

Ora non avendo ancora a conoscenza tutte le funzioni di arduino mi potreste consigliare un metodo che

quando premo il pulsante mi dia un solo impulso e non darne altri finche non vado a ripremerlo

const int pulsante = 2;     
const int led =  13;      
int statopulsante = 0;       
int tempodelay = 42;


void setup() {
  
  pinMode(led, OUTPUT);
  pinMode(pulsante, INPUT);
}

void loop() {
 
  
  statopulsante = digitalRead(pulsante);
   if (statopulsante== HIGH
  ) {
     digitalWrite(led, HIGH);
     delay(tempodelay);
  
   
   } else {
    
    digitalWrite(led, LOW);

  }
}

vi ringrazio in anticipo :smiley: :smiley: :smiley:

Ciao, per il tuo caso ti consiglio innanzitutto di utilizzare un bel debounce hardware per evitare false letture, dopodiché nel programma quando premi il pulsante setti una variabile che serve a far accendere una sola volta il led indipendentemente da quanto tempo resta premuto il pulsante:

if(digitalRead(pulsante)==HIGH)
{
  if(!flagAcceso)
  {
    flagAcceso=true;
    digitalWrite(led, HIGH);
    delay(tempodelay);
    digitalWrite(led, LOW);  
  }
}
else
{
  flagAcceso=false;
}

In questo modo premi il pulsante, accendi il led per 50ms e poi finché non rilasci il pulsante il led non si accenderà più.
Essendo presente il delay (seppur breve) occorre valutare se in quel tempo arduino non debba verificare altre cose, se no allora va tutto bene così, altrimenti va ripensato tutto con uso di millis().
Attenzione che senza debounce hardware potresti avere risultati inprevedibili

In alternativa puoi fare una cosa tipo
Se sento il tasto accendo il led, aspetto 50 MS e lo spengo. Dopo di che inserisco una whike (leggo il pulsante) vuota, Così che di fatto sia una delay per un tempo indefinito. E se il programma deve fare solo questo il programma é finito.
Più complicata di quella proposta da Polli, ma credo più di rapida intuizione.

fabpolli:
Ciao, per il tuo caso ti consiglio innanzitutto di utilizzare un bel debounce hardware per evitare false letture, dopodiché nel programma quando premi il pulsante setti una variabile che serve a far accendere una sola volta il led indipendentemente da quanto tempo resta premuto il pulsante:

if(digitalRead(pulsante)==HIGH)

{
 if(!flagAcceso)
 {
   flagAcceso=true;
   digitalWrite(led, HIGH);
   delay(tempodelay);
   digitalWrite(led, LOW);  
 }
}
else
{
 flagAcceso=false;
}



In questo modo premi il pulsante, accendi il led per 50ms e poi finché non rilasci il pulsante il led non si accenderà più.
Essendo presente il delay (seppur breve) occorre valutare se in quel tempo arduino non debba verificare altre cose, se no allora va tutto bene così, altrimenti va ripensato tutto con uso di millis().
Attenzione che senza debounce hardware potresti avere risultati inprevedibili

interessa anche a me per minitorizzare il click del pulsante di un encoder, come lo realizzi il debounce hardware?

flagAcceso è una variabile boolean che va definita nello sketch, non ho indicato la cosa perché la davo per scontato :-[
comunque prima del setup metti

boolean flagAcceso = false;

the_dragonlord:
interessa anche a me per minitorizzare il click del pulsante di un encoder, come lo realizzi il debounce hardware?

Il debaouce hardware semplice semplice lo realizzi con una rete RC (Resistenza condensatore), ma sopratutto nel caso degli encoder va tarato con accuratezza, se l'encoder da impulsi molto veloci e esageri con la rete RC ne perdi qualcono ad esempio.
Comunque se cerchi su google "debounce hardware" o "Arduino debounce hardware" trovi tanto di quel materiale che ti stufi di leggerlo :slight_smile: dalla semplice rete RC ai debounce più raffinati

the_dragonlord:
interessa anche a me per minitorizzare il click del pulsante di un encoder, come lo realizzi il debounce hardware?

Come da allegato ... :smiley: (... nota che è presente decine e decine di volte qui sul forum :smiling_imp: )

Guglielmo

debouncing_hw.pdf (22.8 KB)