Button Box - Domanda su switch e led

Ciao a tutti, sto per costruire una button box per simulatori di guida, sostanzialmente una tastiera con un aspetto più "racing" :slight_smile: e avrei alcune domande prima di iniziare la costruzione. Al momento il mio codice gestisce 30 pulsanti in una matrice usando la libreria "Keypad" più un segnale analogico, il tutto interfacciato tramite la libreria "Joystick" e sembra funzionare perfettamente. Per la button box volevo aggiungere alcuni interruttori on-off e degli switch momentanei a 3 posizioni e qui iniziano i miei dubbi.
Sugli switch on-off volevo collegare dei led che si accendano quando l'interruttore chiude il circuito, pensavo di metterli banalmente in serie prima o dopo l'interruttore. Sapreste dirmi se la disposizione è corretta e se serve un qualche tipo di resistenza?
Per quanto riguarda invece gli interruttori momentanei volevo sapere se fosse possibile avere un segnale "pulsato" tramite codice? (mi servirebbe per delle regolazioni della vettura su più livelli (tipo TC e ABS) e devo premere il pulsante per ogni livello di regolazione, mentre io vorrei tenerlo premuto e scorrere tra i livelli)
Capisco siano richieste abbastanza generiche ma purtroppo ho un'esperienza molto limitata su arduino e non ho trovato spiegazioni molto chiare online, soprattutto combinando queste due librerie.
Inserisco il mio codice (senza ancora nessuna modifica particolare per questo uso) giusto per rendere più chiaro il tutto.

#include <Keypad.h>   //libreria per la matrice di pulsanti
#include <Joystick.h>


#define ENABLE_PULLUPS
  //variabili
 #define ROWS  6    //6 righe
#define COLS  5    //5 colonne

int PinFAM = A3;      //Pin Freno a mano = A1
int FAM;
  char keys[ROWS][COLS] = {       // inserisco i nomi dei pulsanti, posso usare qualsiasi lettera/numero
    {0,1,2,3,4},                      // il programma funziona solo se parto da 0
    {5,6,7,8,9},
    {10,11,12,13,14},
    {15,16,17,18,19},
    {20,21,22,23,24},
    {25,26,27,28,29}
  };
  byte rowPins[ROWS] = {4,5,6,7,8,9};   //definisco i pin che compongono le righe della matrice a cui andrò a collegare gli interruttori
  byte colPins[COLS] = {A0,15,14,16,10};     // definisco i pin che compongono le colonne della matrice a cui andrò a collegare gli interruttori
  
  Keypad matrix = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // creo la tastiera
  
  Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_JOYSTICK,
  30, 0,                  // Button Count, Hat Switch Count
  false, true, false,     // X, Y, NO Z Axis
  false, false, false,   // No Rx, Ry, or Rz
  false, false,          // No rudder or throttle
  false, false, false);  // No accelerator, brake, or steering
  
 

void setup() {
            //Inizializzo il segnale del freno a mano a 0
        Joystick.begin(); //inizializzo la libreria
 
}
void loop() {
  // put your main code here, to run repeatedly:
  FAM= analogRead(PinFAM);          //Leggo il valore sul pin A1 per il freno a mano
  //Serial.println(FAM);
  //delay(1);
int FAM_MAP=map(FAM, 480, 670, 0, 1023);      //tramite lo sketch analogReadSerial leggo i valori in uscita dal potenziometro montato nella configurazione scelta, mappo il più basso (più una piccola zona morta) a 0 e il massimo a 1023
                                                //in questo modo evito di partire da un valore non nullo e utilizzo tutto il range del potenziometro. (POSSIBILE PERDITA DI RISOLUZIONE DOVUTA AL FATTO CHE FAM E FAM_MAP SONO int)
                                                
  {Joystick.setYAxis(FAM_MAP);}         //Mando il valore del pin A1

    
  CheckAllButtons();            //RIchiamo la funzione per controllare i pulsanti 
}
void CheckAllButtons(void) {        //Creo una funzione per controllare lo stato dei pulsanti
      if (matrix.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( matrix.key[i].stateChanged )   
            {
            switch (matrix.key[i].kstate) {  
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(matrix.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(matrix.key[i].kchar, 0);
                              break;
            }
           }   
         }
}

}

Tetuz:
Sugli switch on-off volevo collegare dei led che si accendano quando l'interruttore chiude il circuito, pensavo di metterli banalmente in serie prima o dopo l'interruttore. Sapreste dirmi se la disposizione è corretta e se serve un qualche tipo di resistenza?

Un led necessita sempre di una resistenza. Un led (quelli normali) deve lavorare tra i 10 e 20mA di corrente, senza resistenza non limiti la corrente e dopo un pò li bruci. A 5V un led rosso R di circa 330ohm
Qui immagine allegata con tabella valori: link
Qui spiegazione: link

Grazie per la risposta nid69ita, ora mi è più chiaro il concetto. Guardando su aliexpress ho trovato Grazie per la risposta nid69ita, ora mi è più chiaro il concetto. Guardando su aliexpress ho trovato [Led verdi 5V](http://Grazie per la risposta nid69ita, ora mi è più chiaro il concetto. Guardando su aliexpress ho trovato https://www.aliexpress.com/item/5pcs-3mm-5mm-5V-DC-Pre-Wired-diffused-LED-Chrome-Bezel-Holder-Light-red-yellow-blue/32824879901.html?spm=2114.search0104.3.79.32b17e59TGMqYl&ws_ab_test=searchweb0_0,searchweb201602_2_10152_10151_10065_10344_10068_5722815_10342_10343_10340_5722915_10341_5722615_10696_10084_10083_10618_10304_10307_10302_5722715_10059_100031_10103_10624_10623_10622_5722515_10621_10620,searchweb201603_2,ppcSwitch_5&algo_expid=8ad726b8-de58-43e5-9948-08ef4f3d59d7-11&algo_pvid=8ad726b8-de58-43e5-9948-08ef4f3d59d7&priceBeautifyAB=0) , a quanto ho capito hanno già una resistenza per avere una caduta di potenziale di 5V, dato che il mio pro micro funziona a 5V dovrebbero andare bene giusto? Purtroppo non ho idea di dove trovarli qua a Milano, e sinceramente non ho voglia di girare mezza città per 2 euro di led.

Per quanto riguarda il funzionamento "pulsato" di un interruttore sono riuscito modificando la funzione "CheckAllButtons()" usata nel codice originale, ma ora si pone un altro problema: vorrei avere questo risultato solo su determinati interruttori. Ho pensato di usare un "if" per verificare che "i", ossia l'indice della matrice di pulsanti (almeno credo di aver capito sia questa la sua funzione), sia uguale all'indice dell'interruttore azionato. Se uso il codice scritto sotto ogni volta che premo un pulsante mi restituisce uno "0" sul monitor seriale.

void CheckAllButtons(void) {        //Creo una funzione per controllare lo stato dei pulsanti
  if (matrix.getKeys())
  {
    for (int i = 0; i < LIST_MAX; i++)
    {
      if ( matrix.key[i].stateChanged )
      {
        int index = i;
        Serial.println(index);        //Mostra solo "0" per ogni pulsante che premo
        switch (matrix.key[i].kstate) {
          case PRESSED:
          case HOLD:                                        //Ora pulsa il segnale dell'interruttore su TUTTI gli interruttori, devo capire come identificare l'indice di quelli che mi interessano, in modo da non far pulsare anche gli altri
            Joystick.setButton(matrix.key[i].kchar, 1);
            if (index == 13)
            { delay(100);
              Joystick.setButton(matrix.key[i].kchar, 0);
              matrix.key[i].kstate = 0;
              delay(100);
            }
            break;
          case RELEASED:
          case IDLE:
            Joystick.setButton(matrix.key[i].kchar, 0);
            break;
        }
      }
    }
  }

Avete qualche idea su come risolvere?
Grazie mille