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.