Antirimbalzo con libreria

Buongiorno a tutti ho gia letto tutto a riguardo ma non ne vengo a capo quindi chiedo aiuto perche immagino che per voi sia una banalità. Devo intercettare il passaggio di una macchinina (tipo polistil) su un pezzo speciale di pista che altro non è che un contatto sempre aperto che si chiude al passagio della macchina. Purtroppo il contatto soffre del problema dell'antirimbalzo e quindi ho studiato la funzione debounce con il trucchetto del mills() e il tutto funziona bene solo che il codice avendo 4 contatti è diventato pesante da leggere e quindi volevo implementare una libreria che facesse cio che ho bisogno cioe leggere un valore e poi ignorare gli altri per un tempo modificabile. Ho provato la libreira Button, la libreria myButton, la libreira Clickbutton ma non ne tirato fuori nulla. Esiste una altra libreria? Oppure mi aiutate a usare quelle nomimate? Devo scrivere qualcosa di simile a questo in modo piu elegante :roll_eyes:

int controllo_1()
  
   {

 valore_pulsante_01=digitalRead(pulsante_01);

if (valore_pulsante_01 != precedente_valore_pulsante_01)
{

    lastDebounceTime01 = millis();
  } 

if ((millis() - lastDebounceTime01) > debounceDelay)

{

if (valore_pulsante_01 != stato_pulsante_01) 

{
      stato_pulsante_01 = valore_pulsante_01;


if (stato_pulsante_01 == LOW) //macchina taglia
  {
       
    contagiri1=contagiri1-1;
    
  }

 }

 }

Non c'è bisogno di una libreria, ma di una semplice funzione:

boolean digitalDebouncedRead(byte Pin, boolean Status, unsigned long DebounceTime) {

  if (digitalRead(Pin) != Status) delay(DebounceTime);
  return digitalRead(Pin);
}

L'uso è semplice e nel tuo caso dovrebbero bastare 20 ms di DebounceTime:

Stato = digitalDebouncedRead(Pin, 1, 20);

Cyb, per quanto possa essere piccolo il delay, se ha altre macchinine in pista potrebbe succedere di perdere un impulso.

Hai ragione Paolo, avevo dimenticato che ci sono 4 piste. Allora si potrebbero usare una routine che legge lo stato dei 4 switch e ogni volta che uno degli switch cambia il suo stato normale fa partire un timer (TimerX = millis())

const unsigned long DebounceTime= 20;

unsigned int Giri1 = 0;
unsigned int Giri2 = 0;
unsigned int Giri3 = 0;
unsigned int Giri4 = 0;

unsigmed long Timer1 = 0;
unsigmed long Timer2= 0;
unsigmed long Timer3= 0;
unsigmed long Timer4= 0;

void ReadSwitch()  {
  if (Timer1 == 0)  {    // leggi switch 1
    if (digitalRead(Pin1) > 0) {   // cambio stato
      Giri1 ++;
      Timer1 = millis());
  }
  else {     // inibisce successive letture per il tempo di debounce
    if (millis() - Timer1 > DebounceTime) Timer1 = 0;  // reset Timer1
  }
... //ripete per gli altri switch
}

pemporizza

A mio parere l'antirimbalzo va fatto prima di tutto a livello hardware e non software (sempre) e in questo caso più che mai visto che gli impulsi sono molto ravvicinati e brevissimi Un circuito RC intanto per cominciare molto semplice fino ad andare su logiche, operazionali o altro per la perfezione, farlo via software significa perdere tempo e risorse per un micro così piccolo e indifeso XD Non è neanche detto che risolvi con l'hardware senza l'ausilio degli interrupt

Grazie a tutti ragazzi
Purtroppo il delay non posso usarlo, ma gli swich SI :slight_smile: adesso ci provo a integrarli nel listato e vediamo che succede.
A livello hardware ci avevo gia pensato ma speravo di cavarmela via software.
Intanto vi posto una foto dell’oggetto incriminato…i led che vedete li ho saldati di prova. In realtà andranno collegati sulla scatola a formare il semaforo dello start