keypad 4x4 con scala di resistenze

Ciao, ho realizzato una scala di resistenze che mi permette di leggere un keypad 4x4 con l’utilizzo di un solo pin analogico. (politica del risparmio ;D )
Collegato tutto, caricato lo sketch e i vari tasti funzionano tranne il n.7 che invece del valore che ho chiesto mi restituisce lettere dalla d alla k senza senso logico (a caso), il valore misurato rientra nel range assegnato ma il valore restituito non corrisponde.
Ho controllato il keypad con la relativa libreria e otto pin digitali collegati e tutto funziona correttamente.

int val=analogRead(A1);
char numero() {
  val=analogRead(A1);
  if (val >= 1018){return '1';}
  if (990 <= val && val <= 1010){return '2';}
  if (960 <= val && val <= 980){return '3';}
  if (943 <= val && val <= 959){return 'a';}
  if (925 <= val && val <= 935){return '4';}
  if (908 <= val && val <= 918){return '5';}
  if (880 <= val && val <= 902){return '6';}
  if (863 <= val && val <= 876){return 'b';}
  if (859 <= val && val <= 846){return '7';}
  if (830 <= val && val <= 844){return '8';}
  if (810 <= val && val <= 822){return '9';}
  if (795 <= val && val <= 809){return 'c';}
  if (780 <= val && val <= 794){return '*';}
  if (765 <= val && val <= 779){return '0';}
  if (750 <= val && val <= 763){return '#';}
  if (730 <= val && val <= 749){return 'd';}
}
void setup() {
  delay(1000);
  Serial.begin (9600);
}
void loop() {
  int val=analogRead(A1);
  if (val>500){
  Serial.print("Il valore e' : ");
  Serial.println(val);
  Serial.print("Il numero e' : ");
  Serial.println(numero());
  delay (500);
  }
}

Qualcuno sa dirmi perché?

Per completezza di informazione e per rendere più semplice aiutarti, potresti postare anche uno schema dei collegamenti che hai fatto?

Attilio

Sono fuori casa, mi sembra che sia come di seguito:

5V sulla prima riga tot R 1K sulla seconda tot R 2k sulla terza tot R 3k sulla quarta

la prima colonna diretta su A1 la seconda colonna collegata a A1 con 220 la terza colonna collegata a A1 con 560 la quarta colonna collegata a A1 con 780

Ho controllato, i collegamenti sono quelli riportati nel post precedente. In più c'è solo una resistenza di pull-down da 10K Mi sembrava abbastanza chiaro A1 misura la corrente che torna dopo essere passata attraverso le resistenze che incontra:

1 non trova resistenze 2 r 220 3 r 560 ... 6 r 1560 7 r 2000 8 r 2220 ... d r 3780 :sunglasses:

...senti, non è che ci puoi fare uno schema?!? Sennò qui nessuno ti può aiutare (a meno che non trovi un fan della Settimana Enigmistica) :)

Ciao!

ciao

Caste:
A1 misura la corrente che torna dopo essere passata attraverso le resistenze che incontra:

Assolutamente NO, A1 misura una tensione.

Per quanto riguarda il problema del tasto 7… mi sembra che hai invertito i valori.

if (880 <= val && val <= 902){return '6';}
  if (863 <= val && val <= 876){return 'b';}
  if (859 <= val && val <= 846){return '7';} // forse èif (846 <= val && val <= 859)  
  if (830 <= val && val <= 844){return '8';}
  if (810 <= val && val <= 822){return '9';}

ciao
pippo72

Grazie!!! Hai proprio ragione, misura una tensione (mostro tutta la mia ignoranza :-[ ) Grande Pippo hai risolto il problema, fra tutti quei numeri non avevo notato l'inversione per pura curiosità, come mai secondo te restituiva quei valori?

Grazie ancora

ciao

Caste: Grazie!!! per pura curiosità, come mai secondo te restituiva quei valori?

Forse (e sottolineo forse) perchè la funzione numero() restituisce un carattere ma tu non hai previsto un valore di "default" nel caso che nessuno degli if fosse vero quindi nel caso del tasto 7 (che non capitava mai) probabilmente restituiva un valore a caso.

... almeno credo.

[edit] no no, sono sicuro: è come se dichiarassi una variabile e poi non le assegni nessun valore quindi questa prende un valore a caso. [/edit] ciao pippo72

Bene!
un dubbio risolto e un’indicazione importante per i prossimi progetti :slight_smile:

Ciao