Arduino Nano // gelöst

Also anbei mal das Programm:

Arduino Test

#define INPUTMODE INPUT  // INPUT oder INPUT_PULLUP
#define PRELLZEIT 5             // Prellzeit in Millisekunden
#define SHORTCLICKTIME 250      // Längste Zeit für einen SHORTCLICK
#define DOUBLECLICKTIME 400     // Längste Zeit für den zweiten Klick beim DOUBLECLICK
#define DimTIME 600       // Mindestzeit für einen LONGGLICK

byte buttonPins[]={2,3,4,5,6,7,8,9,10}; // Arduino Pins (mehrere als Array möglich)
#define NUMBUTTONS sizeof(buttonPins)
byte buttonState[NUMBUTTONS];  // Aktueller Status des Buttons HIGH/LOW

enum {NONE, FIRSTDOWN, FIRSTUP, SHORTCLICK, DOUBLECLICK, Dim, OUT};
byte buttonResult[NUMBUTTONS]; // Aktueller Klickstatus der Buttons NONE/SHORTCLICK/Dim

byte ledPins[]={11,12,13,A0,A1,A2,A4}; // Arduino Pins (mehrere als Array möglich)
#define NUMLEDS sizeof(ledPins)
byte ledState[NUMLEDS];





void setup() {
  
  Serial.begin(9600);
  Serial.println("Button test");
  for (int i=0;i<NUMBUTTONS;i++) pinMode(buttonPins[i],INPUTMODE);
  for (int j=0;j<NUMLEDS;j++)    pinMode(ledPins[j],OUTPUT);
  
  
}




void loop() {
  if (eingabe())
  {  
    SeriellerMonitor();
    ausgabe();
  }
  benchmark();
}

Tap LED´s schalten

//  Ausgabe hier LED´s schalten


void ausgabe()
// Klickstatus von geklickten Buttons mit Zeitstempel ausgeben
{
  for (int j=0;j<NUMLEDS;j++)
  for (int i=0;i<NUMBUTTONS;i++) 
    {
    if(buttonResult[i]==DOUBLECLICK) ledState[j]=LOW;
    if(buttonResult[0]==SHORTCLICK)
    ledState[0] = !ledState[0];
    if(buttonResult[1]==SHORTCLICK)
    ledState[1] = !ledState[1];
    if(buttonResult[2]==SHORTCLICK)
    ledState[2] = !ledState[2];
    if(buttonResult[3]==SHORTCLICK)
    ledState[3] = !ledState[3];
    if(buttonResult[4]==SHORTCLICK)
    ledState[4] = !ledState[4];
    if(buttonResult[5]==SHORTCLICK)
    ledState[5] = !ledState[5];
    if(buttonResult[6]==SHORTCLICK)
    ledState[6] = !ledState[6];
    if(buttonResult[7]==SHORTCLICK)
    ledState[7] = !ledState[7];
    if(buttonResult[8]==SHORTCLICK)
    ledState[8] = !ledState[8];
    digitalWrite(ledPins[0],ledState[0]); 
    digitalWrite(ledPins[1],ledState[1]); 
    digitalWrite(ledPins[2],ledState[2]);
    digitalWrite(ledPins[3],ledState[3]); 
    digitalWrite(ledPins[4],ledState[4]); 
    digitalWrite(ledPins[5],ledState[5]); 
    digitalWrite(ledPins[6],ledState[6]); 
    digitalWrite(ledPins[7],ledState[7]); 
    digitalWrite(ledPins[8],ledState[8]);  
    }
}

Tap Serieller Monitor

//  Serieller Monitor


void SeriellerMonitor()
// Klickstatus von geklickten Buttons mit Zeitstempel ausgeben
{
  for (int i=0;i<NUMBUTTONS;i++)
  {
    if (buttonResult[i]>=SHORTCLICK) // Ein Button wurde geklickt
    {
      Serial.print(millis()/1000.0,3); // Zeitstempel mit Millisekundenauflösung
      Serial.print("\tPin-");Serial.print(buttonPins[i]);
      
      //if (buttonResult[i]==FIRSTDOWN) Serial.println(" gedrückt");
      //else if (buttonResult[i]==FIRSTUP) Serial.println(" losgelassen");
      if (buttonResult[i]==SHORTCLICK) Serial.print(" CLICK");
      else if(buttonResult[i]==DOUBLECLICK) Serial.print(" DOUBLE CLICK");
      else if(buttonResult[i]==Dim) Serial.print(" Dimmen");
      //Serial.print("\tledState-");Serial.print(ledState[i]);
      Serial.print(" ledState-");Serial.println(ledState[i]);
          
    }
  }
}


void benchmark() {
  static unsigned long counterStartTime;
  static unsigned long counter;
  counter++;
  if (counter>=1000000L)
  {
    Serial.print("Average Time per loop(): ");
    Serial.print((micros()-counterStartTime)/1000000.0);
    Serial.println(" microseconds");
    counter=0;
    counterStartTime=micros();
  }
}

Tap Taster Abfrage

//  Taser Abfrage
//  Click
//  Longclick
//  Doppelclick


boolean eingabe()
// Rückgabewert false ==> Prellzeit läuft, Taster wurden nicht abgefragt
// Rückgabewert true ==> Taster wurden abgefragt und Status gesetzt
{
  static unsigned long lastRunTime;
  static unsigned long buttonDownTime[NUMBUTTONS];
  unsigned long now=millis();
  if (now-lastRunTime<PRELLZEIT) return false; // Prellzeit läuft noch
  lastRunTime=now;
  for (int i=0;i<NUMBUTTONS;i++)
  {
    byte curState=digitalRead(buttonPins[i]);    
    if (INPUTMODE==INPUT_PULLUP) curState=!curState; // Vertauschte Logik bei INPPUT_PULLUP
    if (buttonResult[i]>=SHORTCLICK) buttonResult[i]=NONE; // Letztes buttonResult löschen
    if (curState!=buttonState[i]) // Flankenwechsel am Button festgestellt
    {
      if (curState)   // Taster wird gedrückt, Zeit merken
      {
        if (buttonResult[i]==FIRSTUP && now-buttonDownTime[i]<DOUBLECLICKTIME)
          buttonResult[i]=DOUBLECLICK;
            
        else
        {  
          buttonDownTime[i]=now;
          buttonResult[i]=FIRSTDOWN;
        }
      }
      else  // Taster wird losgelassen
      {
        if (buttonResult[i]==FIRSTDOWN) buttonResult[i]=FIRSTUP;
        //if (now-buttonDownTime[i]>=DimTIME) buttonResult[i]=Dim;
      }
    }
    else // kein Flankenwechsel, Up/Down Status ist unverändert
    {
      if (curState==HIGH && now-buttonDownTime[i]>=DimTIME)
        buttonResult[i]=Dim;
      
        
     else  // Taster wird losgelassen

      
      if (buttonResult[i]==FIRSTUP && now-buttonDownTime[i]>DOUBLECLICKTIME)
        buttonResult[i]=SHORTCLICK;
    }
    buttonState[i]=curState;
  } // for
  return true;
  
}

Hab noch etwas weiter rum probiert, wenn ich also im byte ledPins[]={11,12,13,A0,A1,A2,A4} A3 weglasse kann ich 7 LED´s mit 7 Tastern schalten, mit A3 nur noch 5. Es lassen sich aber alle 9 Taster abfragen, seh ich m Seriellen Monitor.
Sollte ich jeweils noch einen LED Pin mehr hinzufügen leuchten alle Led´s mit dem jeweiligen Taster gedrückt nur kurz auf und gehen gleich wieder aus!
Im Seriellen Monitor sehe ich das sich bei allen 9 Tastern der ledState nicht mehr ändert, bleibt immer bei 0.