Debounce hw pin analogico

Ciao a tutti.
So che probabilmente mi sto perdendo in un bicchier d'acqua... ma ci sto provando da un'ora e non ne vengo a capo...

Sto cercando di far andare il debounce hardware di un pin analogico.
Ho 4 pulsanti collegati ad un pin analogico seguendo lo schema allegato (che ho trovato in questa discussione). Sono certo che lo schema di Etem è corretto, quindi sto sbagliando io da qualche parte.

Tra i pulsanti ho messo tutte resistenze da 1K.
Il condensatore è un ceramico da 100n (non ne ho in casa da 10n).
La resistenza di debounce è da 120 ohm.
La resistenza di pull-up è da 4k7.

Lo schetch è banale... leggo da A5 e scrivo su seriale...

// pin dei pulsanti (4 pulsanti collegati in srie con delle resistenze)
byte pin_pulsante = A5;

// variabile valore analogico letto dal pin
int valore_pulsante;

void setup() {
  Serial.begin(9600);
  Serial.println("inizio");
  
}

void loop() {
  // leggo il valore del pulsante
  valore_pulsante = analogRead(pin_pulsante);
  delay(5);

  if (valore_pulsante < 900) {
    Serial.print("pulsante");
    Serial.println(valore_pulsante);
  }

}

Allego un paio di foto della breadboard, magari qualche anima pia riesce a capire cosa ho sbagliato.

EDIT: non l'avevo specificato, ma ovviamente è il problema è che ad ogni pressione mi ritrovo con 5 o 6 print su seriale.

Semplicemente non puoi fare un antirimbalzo hardware! :frowning: Devi farlo software.

Nella discussione che ho linkato mi pare si dica il contrario...
Dici che lo schema di Etem non serve per questo?

Il problema non è che hai n letture, ma che il condensatore fa variare lentamente la tensione passando per tutti i valori dei pulsanti a livello più basso. Già senza condensatori, piuttosto, devi ritardare un attimo la lettura, perché ci sono capacità parassite e la prima lettura potrebbe rilevare un valore minore di quello che viene raggiunto un attimo dopo.

Questa riga, poi, con un condensatore ben difficilmente può essere vera (salvo mettere un bel delay... :frowning: ):

if (val==0 && vecchio_val==1023)

Sei un elettronico, quindi se più preparato di me.

Questo è quello che vedo sul monitor seriale premendo i 4 bottoni in sequenza:

inizio
pulsante409
pulsante409
pulsante408
pulsante408
pulsante409
pulsante408
pulsante409
pulsante408
pulsante408
pulsante409
pulsante322
pulsante321
pulsante320
pulsante321
pulsante321
pulsante320
pulsante321
pulsante320
pulsante321
pulsante320
pulsante321
pulsante320
pulsante320
pulsante321
pulsante198
pulsante199
pulsante198
pulsante198
pulsante199
pulsante198
pulsante199
pulsante197
pulsante198
pulsante197
pulsante196
pulsante196
pulsante196
pulsante25
pulsante25
pulsante25
pulsante26
pulsante25
pulsante26
pulsante25
pulsante25
pulsante26
pulsante25
pulsante25
pulsante25
pulsante25
pulsante25
pulsante25

I valori mi sembrano coerenti, come se la pressione venisse letta diverse volte consecutivamente.

In ogni caso, se dici che non si può fare provo col debounce software.

Quella riga non è del mio codice, dalla vecchia discussione ho preso solo lo schema, il codice l'ho scritto a me.

Con che condensatore ?

Io dico che non si può fare perché il programma, per principio, dovrebbe girare alla massima velocità. Se fosse così, verrebbero letti tutti i valori che assume il condensatore per passare da 0V alla tensione del pulsante premuto, transitando per i valori dei pulsanti a tensione più bassa e rilevandoli premuti in sequenza.

Datman:
Con che condensatore ?

Ceramico da 100n.

Il mio dubbio è di aver collegato male i vari componenti... per questo ho allegato le foto, nella speranza che qualcuno trovasse l'errore... io dopo un'ora di tentativi non l'ho trovato...

fratt ... se hai un condensatore che si carica/scarica attraverso una risistenza, hai una costante di tempo τ = R x C. Il condensatore si considera carico (se lo stai caricando), o scarico (se lo stai scaricando), dopo un tempo pari a 5 x τ.


Fatti due conti e vedi con un condensatore da 100e-9 F (i tuoi 100 nF) x il valore di R Ω (a seconda del bottone premuto) quanto vale τ e quindi quanto tempo ci vuole per avere una lettura stabile.

Guglielmo

Porta pazienza ma con questi concetti un po' mi perdo...

Se premo il bottone più vicino al condensatore la R è da 120 ohm.
Quindi 120 * 0,0000001 * 5 = 0,00006

Quelli che ottengo sono secondi, giusto?

Il condensatore è troppo piccolo o troppo grande?

Ho provato con valori da 22pF a 100uF ma il problema persiste...

L'antirimbalzo hardware, in realtà, si può fare... ma devi farlo su ogni pulsante, poi per ogni pulsante metti un inverter di Schmitt (es. CD40106) e infine fai un convertitore D/A di tipo R/2R (cerca con Google) con le resistenze.

Ok, a questo punto va oltre le mie capacità hardware...
Provo la strada software che mi è più congeniale.
Grazie a entrambi per il tempo che mi avete dedicato.

fratt:
Porta pazienza ma con questi concetti un po' mi perdo...

C = 100 nF, R = 120 Ω, τ = 12 µSec -> τ x 5 = 60 µSec ...

... un istruzione macchina del ATmega328P che lavora a 16 MHz viene eseguita in 62.5 nSec ... hai idea di quante istruzioni macchina esegue in 60 µSec ? E all'aumentare della resistenza la cosa peggiora ...

Guglielmo

gpb01:
hai idea di quante istruzioni macchina esegue in 60 µSec ?

Evidentemente troppe...

Vedi anche questa discussione, con relativo debounce software di nove pulsanti (premuto uno solo alla volta)...
https://forum.arduino.cc/index.php?topic=675016.msg4543591#msg4543591

Grazie. Me lo guardo con calma.