Libreria AnalogButtons

Salve a tutti sono novizio del mondo Arduino ho un problema con una tastiera analogica 4x3 in poche parole quando vado a verificare nel monitor seriale mi restituisce la risposta di 8 tasti soltanto al posto di tutti e 12 forse è un errore di programmazione il collegamento è questo

il codice è questo vi ringrazio per la disponibilità :slight_smile:

//Configurazione tastiera analogica 4x3

#include <AnalogButtons.h>

#define ANALOG_PIN A1

// funzione void richiama pulsante
// pulsante premuto
// pulsante mantenuto premuto
void b1Click() {
  Serial.print("pulsante 1");
}
void b1Hold() {
  Serial.print("pulsante 1 premuto");
}

void b2Click() {
  Serial.print("pulsante 2");
}
void b2Hold() {
  Serial.print("pulsante 2 premuto");
}

void b3Click() {
  Serial.print("pulsante 3");
}
void b3Hold() {
  Serial.print("pulsante 3 premuto");
}

void b4Click() {
  Serial.print("pulsante 4");
}
void b4Hold() {
  Serial.print("pulsante 4 premuto");
}

void b5Click() {
  Serial.print("pulsante 5");
}
void b5Hold() {
  Serial.print("pulsante 5 premuto");
}
void b6Click() {
  Serial.print("pulsante 6");
}
void b6Hold() {
  Serial.print("pulsante 6 premuto");
}

void b7Click() {
  Serial.print("pulsante 7");
}
void b7Hold() {
  Serial.print("pulsante 7 premuto");
}

void b8Click() {
  Serial.print("pulsante 8");
}
void b8Hold() {
  Serial.print("pulsante 8 premuto");
}

void b9Click() {
  Serial.print("pulsante 9");
}
void b9Hold() {
  Serial.print("pulsante 9 premuto");
}

void b10Click() {
  Serial.print("pulsante 10");
}
void b10Hold() {
  Serial.print("pulsante 10 premuto");
}
void b11Click() {
  Serial.print("pulsante 11");
}
void b11Hold() {
  Serial.print("pulsante 11 premuto");
}

void b12Click() {
  Serial.print("pulsante 12");
}
void b12Hold() {
  Serial.print("pulsante 12 premuto");
}

AnalogButtons analogButtons(ANALOG_PIN, INPUT);
Button b1 = Button(1023, &b1Click, &b1Hold);
Button b2 = Button(930,  &b2Click, &b2Hold);
Button b3 = Button(850,  &b3Click, &b3Hold);
Button b4 = Button(790,  &b4Click, &b4Hold);
Button b5 = Button(730,  &b5Click, &b5Hold);
Button b6 = Button(680,  &b6Click, &b6Hold);
Button b7 = Button(640,  &b7Click, &b7Hold);
Button b8 = Button(600,  &b8Click, &b8Hold);
Button b9 = Button(570,  &b9Click, &b9Hold);
Button b10 = Button(540,  &b10Click, &b10Hold);
Button b11 = Button(510,  &b11Click, &b11Hold);
Button b12 = Button(490,  &b12Click, &b12Hold);


void setup() {
  Serial.begin(9600);
  Serial.println("Verifica funzionamento Tastiera Analogica");

  analogButtons.add(b1);
  analogButtons.add(b2);
  analogButtons.add(b3);
  analogButtons.add(b4);
  analogButtons.add(b5);
  analogButtons.add(b6);
  analogButtons.add(b7);
  analogButtons.add(b8);
  analogButtons.add(b9);
  analogButtons.add(b10);
  analogButtons.add(b11);
  analogButtons.add(b12);
}

void loop() {
  // To check values when button are pressed
  analogButtons.check();

  // To configure the MAX/Min values for each button:
  // uncomment the following line and make sure you've called Serial.begin(9600)
  // Then in turn hold down each button, noting down the max/min values

  //configure();
}

void configure() {
  unsigned int value = analogRead(ANALOG_PIN);
  Serial.println(value);
  delay(300);
}

Ciao,
in qualità di temporaneo e parziale sostituto, senza portafoglio, del "Sommo moderatore" che si è concesso un po' di svago e di pazza gioia :wink:

come prima cosa ti do il benvenuto e poi ti devo chiedere di espletare una piccola formalità che aiuterà tutti i volenterosi che vorranno rispondere al tuo quesito, di farlo nel migliore dei modi.

Lo faccio citando le sue parole:

essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Presentazione fatta

citazione dalla libreria Link

By default max number of buttons per pin is limited to 8 to limit memory consumption, but it can be controlled defining the

ANALOGBUTTONS_MAX_SIZE

macro before including this library.

thank you so much

I tried to do what you said but it still doesn’t work

Allora fai una prova veloce veloce, tanto per eliminare qualche problema elettrico.

Scrivi un programma di poche righe dove fai la analogRead di A0, poi la mandi su seriale e te la guardi a video: dovresti vedere 12 valori differenti quando premi i 12 tasti.

Se ciò succede allora puoi andare avanti (magari scriviti i valori a parte), altrimenti hai un problema elettrico.

ciao steve-cr ho fatto come hai detto tu e effettivamente tutti e 12 pulsanti mi restituiscono dei valori che non si scostano di molto da quelli che ho inserito nel programma, anche modificandoli come mi sono apparsi nel monitor seriale non funziona ancora, non so più che fare :confused:

//Configurazione tastiera analogica 4x3

#define ANALOGBUTTONS_MAX_SIZE 12
#include <AnalogButtons.h>  //permette di utilizzare piu du 8 tasti per pin
#define ANALOG_PIN A1

// funzione void richiama pulsante
// pulsante premuto
// pulsante mantenuto premuto
void b1Click() {
  Serial.print("pulsante 1");
}
void b1Hold() {
  Serial.print("pulsante 1 premuto");
}

void b2Click() {
  Serial.print("pulsante 2");
}
void b2Hold() {
  Serial.print("pulsante 2 premuto");
}

void b3Click() {
  Serial.print("pulsante 3");
}
void b3Hold() {
  Serial.print("pulsante 3 premuto");
}

void b4Click() {
  Serial.print("pulsante 4");
}
void b4Hold() {
  Serial.print("pulsante 4 premuto");
}

void b5Click() {
  Serial.print("pulsante 5");
}
void b5Hold() {
  Serial.print("pulsante 5 premuto");
}
void b6Click() {
  Serial.print("pulsante 6");
}
void b6Hold() {
  Serial.print("pulsante 6 premuto");
}

void b7Click() {
  Serial.print("pulsante 7");
}
void b7Hold() {
  Serial.print("pulsante 7 premuto");
}

void b8Click() {
  Serial.print("pulsante 8");
}
void b8Hold() {
  Serial.print("pulsante 8 premuto");
}

void b9Click() {
  Serial.print("pulsante 9");
}
void b9Hold() {
  Serial.print("pulsante 9 premuto");
}

void b10Click() {
  Serial.print("pulsante 10");
}
void b10Hold() {
  Serial.print("pulsante 10 premuto");
}
void b11Click() {
  Serial.print("pulsante 11");
}
void b11Hold() {
  Serial.print("pulsante 11 premuto");
}

void b12Click() {
  Serial.print("pulsante 12");
}
void b12Hold() {
  Serial.print("pulsante 12 premuto");
}

AnalogButtons analogButtons(ANALOG_PIN, INPUT);
Button b1 = Button(1023, &b1Click, &b1Hold);
Button b2 = Button(933,  &b2Click, &b2Hold);
Button b3 = Button(857,  &b3Click, &b3Hold);
Button b4 = Button(790,  &b4Click, &b4Hold);
Button b5 = Button(735,  &b5Click, &b5Hold);
Button b6 = Button(687,  &b6Click, &b6Hold);
Button b7 = Button(643,  &b7Click, &b7Hold);
Button b8 = Button(606,  &b8Click, &b8Hold);
Button b9 = Button(573,  &b9Click, &b9Hold);
Button b10 = Button(541,  &b10Click, &b10Hold);
Button b11 = Button(514,  &b11Click, &b11Hold);
Button b12 = Button(490,  &b12Click, &b12Hold);


void setup() {
  Serial.begin(9600);
  Serial.println("Verifica funzionamento Tastiera Analogica");

  analogButtons.add(b1);
  analogButtons.add(b2);
  analogButtons.add(b3);
  analogButtons.add(b4);
  analogButtons.add(b5);
  analogButtons.add(b6);
  analogButtons.add(b7);
  analogButtons.add(b8);
  analogButtons.add(b9);
  analogButtons.add(b10);
  analogButtons.add(b11);
  analogButtons.add(b12);
}

void loop() {
  // To check values when button are pressed
  analogButtons.check();

  // To configure the MAX/Min values for each button:
  // uncomment the following line and make sure you've called Serial.begin(9600)
  // Then in turn hold down each button, noting down the max/min values

  //configure();
}

void configure() {
  unsigned int value = analogRead(ANALOG_PIN);
  Serial.println(value);
  delay(300);
}

Mah, ti dirò, io non uso una libreria per leggere solo 12 valori analogici… Mi sembra assurdo.

Di solito si fa così per leggere 5 tasti, tu poi lo puoi adattare ai 12 che hai:

void setup() {
  Serial.begin(9600);
  Serial.println("Verifica funzionamento Tastiera Analogica");
}

void loop() {
  int x;
  x = analogRead (1);
  if (x < 60) {
   Serial.println ("Right ");
  }
  else if (x < 200) {
   Serial.println ("Up    ");
  }
  else if (x < 400){
   Serial.println ("Down  ");
  }
  else if (x < 600){
   Serial.println ("Left  ");
  }
  else if (x < 800){
   Serial.println ("Select");
  }
}

Nel tuo caso puoi mettere l’istruzione “case” per fare quello che ti serve.

Mi sembra più veloce e più facile.

so che non è il massimo della programmazione ma almeno rileva i tasti il problema è che mi ripete la lettura del tasto per il tempo che lo premo mi appare tasto 1 per dieci volte e cosi via per ogni tasto premuto

void setup() {
  Serial.begin(9600);
  Serial.println("Verifica funzionamento Tastiera Analogica");
}

void loop() {
  int x;
  x = analogRead (1);
  if (x == 1023) 
   Serial.println ("Pulsante 1");
   if (x == 933) 
   Serial.println ("Pulsante 2");
   if (x == 857) 
   Serial.println ("Pulsante 3");
   if (x == 790) 
   Serial.println ("Pulsante 4");
   if (x == 735) 
   Serial.println ("Pulsante 5");
   if (x == 687) 
   Serial.println ("Pulsante 6");
   if (x == 643) 
   Serial.println ("Pulsante 7");
   if (x == 606) 
   Serial.println ("Pulsante 8");
   if (x == 573) 
   Serial.println ("Pulsante 9");
   if (x == 541) 
   Serial.println ("Pulsante 10");
   if (x == 514) 
   Serial.println ("Pulsante 11");
   if (x == 490) 
   Serial.println ("Pulsante 12");
   
  }

Banalmente ti puoi salvare il valore letto su una variabile globale e fare tutte le if solo se il nuovo valore è diverso da quello salvato in precedenza.
Occhio che alla fine del loop devi aggiornare questo valore con quello letto durante il loop.

Poi, visto che sono tutte if mutualmente esclusive, potresti usare un else if invece di un if, in questo modo salti tutti i test successivi a quello con la condizione vera.

Una cosa di questo tipo:

if (x == 1023)
   Serial.println ("Pulsante 1");
else if (x == 933)
   Serial.println ("Pulsante 2");
else if (x == 857)
   Serial.println ("Pulsante 3");
...
else if (x == 490)
 Serial.println ("Pulsante 12");

Allora, mettere il segno di uguaglianza su una lettura analogica è sbagliato!
Oggi il valore è 857, domani è 858 e dopodomani è 856.
Quindi, meglio fare x < 870 perchè tanto il prossimo tasto è a 933 (quindi meglio scrivere x < 950) in su e 490 in giù, quindi ho almeno 400 punti di distanza tra gli estremi e se me ne prendo 10 per essere sicuro che il pulsante l’ho schiacciato non succede nulla.
Bene lo else if, ma poi ci arriverai con l’esperienza.
E per fare in modo che il pulsante lo premi e te lo legge una volta sola, imparerai ad usare un altro paio di variabili tipo buttonState e precbuttonState (ma puoi dargli anche altri nomi) che userai così:

 if ((buttonState == HIGH) && (precbuttonState == LOW))  {             // pulsante da OFF a ON
      precbuttonState = buttonState;

In questo modo, al successivo ciclo macchina (dopo meno di un millesimo di secondo), se il programma trova ancora il pulsante premuto la condizione IF non viene più svolta ed il programma segue a fare altro.
Quindi meglio così:

bool buttonState;
bool precbuttonState;

void setup() {
  Serial.begin(9600);
  Serial.println("Verifica funzionamento Tastiera Analogica");
}

void loop() {
  int x;
  x = analogRead (1);
  if (x <= 1023) {
    buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
      Serial.println ("Pulsante 1");
      // qui vado dove devo andare....
    }
  }
  else if (x < 950) {
    buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
      Serial.println ("Pulsante 2");
      // qui vado dove devo andare....
    }
  }
  else if (x < 870)
    Serial.println ("Pulsante 3");
  else if (x < 810)
    Serial.println ("Pulsante 4");
  else if (x < 755)
    Serial.println ("Pulsante 5");
  else if (x < 700)
    Serial.println ("Pulsante 6");
  else if (x < 655)
    Serial.println ("Pulsante 7");
  else if (x < 615)
    Serial.println ("Pulsante 8");
  else if (x < 585)
    Serial.println ("Pulsante 9");
  else if (x < 555)
    Serial.println ("Pulsante 10");
  else if (x < 525)
    Serial.println ("Pulsante 11");
  else if (x < 505)
    Serial.println ("Pulsante 12");
    
  else if (x < 10) {
    buttonState = LOW;
    if (( precbuttonState == HIGH ) && ( buttonState == LOW ))  { // pulsante da ON a OFF
      precbuttonState = buttonState;
      Serial.println ("Nessun pulsante");
    }
  }
}

Come avrai notato esiste anche uno stato di NESSUN PULSANTE che deve essere visto.

Provalo (l’ho scritto senza provarlo ma dovrebbe andare…) e poi vedi.

steve-cr:
Allora, mettere il segno di uguaglianza su una lettura analogica è sbagliato!

Verissimo, io non so perchè ma avevo erroneamente assunto che fossero valori digitali di qualche tipo, non chiedermi perchè, forse troppi grappini... :wink:

grazie a tutti! quando torno dal lavoro metterò in pratica i vostri consigli

Ciao steve-cr ho provato ad inserire il tuo codice ma nel monitor seriale appena entro mi da già attivo il pulsante 1

Io ho messo AnalogRead (1) ma sul tuo schema è Zero...
Fai le letture di tutti i tasti e vedi come mai

oggi ho provato questo è sembra che funzioni

bool buttonState;
bool precbuttonState;
void setup() {
  Serial.begin(9600);
  Serial.println("Verifica funzionamento Tastiera Analogica");
}

void loop() {
  int x;
  x = analogRead (1);
  if ((x >= 990) && (x <= 1033))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState; 
   Serial.println ("Pulsante 1");
    }
  else if ((x >= 923) && (x <= 943))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState; 
   Serial.println ("Pulsante 2");
   }
  else if ((x >= 847) && (x <= 867))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 3");
   }
  else if ((x >= 780) && (x <= 800))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 4");
   }
  else if ((x >= 725) && (x <= 745))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 5");
   }
  else if ((x >= 677) && (x <= 697)) 
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 6");
   }
  else if ((x >= 633) && (x <= 653)) 
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 7");
   }
  else if ((x >= 596) && (x <= 616))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 8");
   }
  else if ((x >= 563) && (x <= 583))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 9");
   }
  else if ((x >= 531) && (x <= 551))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 10");
   }
  else if ((x >= 504) && (x <= 524))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 11");
   }
  else if ((x >= 480) && (x <= 500))
  buttonState = HIGH;
    if ((buttonState == HIGH) && (precbuttonState == LOW))  { // pulsante da OFF a ON
      precbuttonState = buttonState;
   Serial.println ("Pulsante 12");
   }
   
   else if (x < 10) {
    buttonState = LOW;
    if (( precbuttonState == HIGH ) && ( buttonState == LOW ))  { // pulsante da ON a OFF
      precbuttonState = buttonState;
      Serial.println ("Nessun pulsante");
   
     }
  }
}

Bravo, complimenti.