Tre pulsanti in un solo pin?

Ciao a tutti, vorrei collegare tre interruttori ad arduino in un solo pin in ingresso per controllarci tre diversi dispositivi. Ho eseguito il collegamento abbinando ad ogni interruttore una resistenza diversa (10 - 15 - 20kOhm mi sembra) e mettendone una in serie a tutti gli interruttori da 10kOhm. Ogni volta che si innesca un'interruttore essendo collegati in parallelo ho un valore di resistenza sempre diverso che va dai 15kOhm ai 30kOhm. Ho cosi collegato il tutto su arduino (pin analog 4 e +5Vcc) e avviato lo sketch che mi permette i vedere sulla seriale i valori in ingresso al pin dove sono collegati gli interruttori e ho notato che i valori non sono stabili ma oscillano di qualche valore e anche cambiando combinazione di interruttori si trovano tutti tra 700 e 800 rendendo inutile ogni utilizzo.
La parte hardware non dovrebbe essere sbagliata, quindi credo sia un problema di arduino, secondo voi cosa potrebbe essere?

Prova a guardare QUI e vedi che valori sono stati usati ...

Guglielmo

per togliere le oscilazzioni usa il comando map tipo così:

val = map(val, x, y, 1, 8);

dove val è il valore letto dalla porta analogica.
x il valore analogico minore che leggi, tipo 700 da quanto scrivi
y il valore massimo che legg,i 800 sempre dal tuo primo post
Così con qualunque combinazione avrai un singolo valore a rappresentarlo da 1 a 8.... almeno credo :o

-zef-:
.... almeno credo :o

... non credo :smiley: :smiley: :smiley:

Ha un problema di valori troppo vicini e, forse, anche di instabilità di riferimento del ADC (dipende come alimenta).

  1. provare prima con lo schema che gli ho indicato e vedere se la situazione migliora/si risove

  2. se non migliora, ricalcolare i valori delle resistenze in modo che il massimo sul pin analogico sia 1.1V ed usare il riferimento interno a 1.1V che è più stabile.

Guglielmo

Poesia di mezza mattina:

Vedendo lo schema ho capito il problema....

Non è granché come poesia, vero?

Io non faccio il poeta....

gpb01:
… non credo :smiley: :smiley: :smiley:

mi sembrava troppo semplice come soluzione, pazienza ci ho provato :slight_smile:

Diciamo che hai i pulsanti con le resistenze per implementare un partitore, come nello schema di PighiXXX. Ti consiglio di gestirli con una funzione tipo questa (nel mio esempio i pulsanti sono 4, puoi averne di meno, ma comunque meglio non metterne più di 4):

#define PULSANTI A0

int pulsante() {
  static int p0 = 0;
  int v = analogRead(PULSANTI);
  int p = 0;
  if ( v < 100 )
    p=0; // Nessun pulsante
  else if ( v < 300 )
    p=1; // Pulsante 1
  else if ( v < 500 )
    p=2; // Pulsante 2
  else if ( v < 700 )
    p=3; // Pulsante 3
  else
    p=4; // Pulsante 4
  // Breve delay per cercare di aggirare i rimbalzi, generalmente 10 o 20 basta
  if ( p > 0 )
    delay(20);
  // Se il pulsante è sempre lo stesso, ritorna 0
  if ( p == p0 )
    return 0;
  p0 = p;
  return p;    
}

I valori 100, 300, 500 e 700 li ho messi “ad occhio”, ma dipendono dalle resistenze che hai usato: devi misurare tu i valori letti per ogni pulsante (e per nessun pulsante) e scegliere valori che stiano in mezzo agli intervalli.
La funzione restituisce il numero del tasto solo alla pressione, poi anche mantenendolo premuto restituisce zero.

Quindi nel loop() basta verificare se è stato premuto un pulsante con:

int p = pulsante();
if ( p > 0 ) {
// Pulsante “p” premuto
}

Ho fatto delle prove collegando vari valori di resistenza coprendo un range che va dai 20kOhm ai 70kOhm e variando il valore di resistenza ho sul monitor seriale una piccola variazione dei valori nonché rimangono molto instabili. Faccio un esempio collego 20kOhm e leggo sul seriale valori da 700 a 750, collego 40kOhm e sul seriale leggo valori da 800 a 850 variando in modo casuale. Inoltre se non vi è collegato nulla leggo sempre dei valori e non 0.
Se sono stato poco chiaro chiedo scusa. Il collegamento l'ho effettuato come da sito sopra linkato.

Visto che sul sito linkato le resistenze citate sono da 1k
mi domando da dove ti sei inventato 20k e 40k

In effetti mi domando anche dove le hai trovate, dato che non sono valori standard...

davide12:
Ho fatto delle prove collegando vari valori di resistenza coprendo un range che va dai 20kOhm ai 70kOhm

Scusa, ma perché quei valori? Considera che all'aumentare della resistenza avrai correnti sempre più deboli e quindi credo che aumenti la possibilità di oscillazione dei valori letti dal convertitore A/D... E poi come le hai collegate ste resistenze?

Insomma, prova a guardare bene questo utile sito e segui ESATTAMENTE quello che c'è scritto, e ti funzionerà correttamente tutto:

Ho dovuto modificare il progetto sostituendo i tre pulsanti con tre interruttori. Cambia qualcosa nel collegamento e dimensionamento delle resistenze?

Visto che non le hai ancora dimensionare e non ci hai mostrato lo schema...

Come potrei risponderti?

davide12:
Ho dovuto modificare il progetto sostituendo i tre pulsanti con tre interruttori. Cambia qualcosa nel collegamento e dimensionamento delle resistenze?

No, ma cambia tutto il resto! Se metti 3 o 4 pulsanti su uno stesso ingresso, è perché ne premi solo UNO PER VOLTA, ma se metti 3 interruttori possono essere attivati anche tutti. Quindi se hai presente almeno la differenza tra pulsante e interruttore, capisci che non puoi cambiare i pulsanti con interruttori a meno che tu non sia sicuro che degli interruttori non ne attiverai mai più di uno (ma in tal caso perché devi usare interruttori?). Ma se hai posto questa domanda…

Perchè non potrei? Se accoppio ad ogni interruttore un diverso valore di resistenza per ogni combinazione, a seconda se viene premuto uno o più interruttori, corrisponde un diverso valore di resistenza che non potrà mai essere uguale in nessun altra combinazione.

Vedi che ti sei risposto da solo?

Hai fatto una domanda, ti abbiamo chiesto delucidazioni

Non le hai date

Hai cambiato la domanda

Ti abbiamo chiesto altre delucidazioni

Non le hai date

Adesso hai la risposta

Quindi non ti chiederò nuove delucidazioni

Così magari stavolta ce le darai....