Hilfe! Multifunktionstaster-Abfrage von jurs verstehen
hallo zusammen,
habe hier im forum eine multifunktionstaster-abfrage con jurs entdeckt und habe dabei noch ein paar verständniss probleme. um diese wissenslücken zu schließen würde ich euch gerne einige fragen zu stellen, wenn ich darf ;-))
in der boolean eingabe werden ja drei lolale vorzeichenlose long-variablen erstellt:
static unsigned long lastruntime;
static unsigned long buttondowntime[numbuttons];
gehe ich richtig in der annahme das diese beim erstellen den wert 0 haben
unsigned long now=millis();
startet das programm hier mit dem zählen der zeit?
bzw. wie funktioniert dann diese funktion?
if (now-lastruntime<prellzeit) return false; // prellzeit läuft noch
lastruntime=now;
gruß joe
habe hier im forum eine multifunktionstaster-abfrage con jurs entdeckt und habe dabei noch ein paar verständniss probleme. um diese wissenslücken zu schließen würde ich euch gerne einige fragen zu stellen, wenn ich darf ;-))
code: [select]
// tastenerkennung shortclick, doubleclick, longclick
#define inputmode input_pullup // 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 longclicktime 600 // mindestzeit für einen longglick
byte buttonpins[]={2,3,a3}; // 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, longclick};
byte buttonresult[numbuttons]; // aktueller klickstatus der buttons
none/shortclick/longclick
void setup() {
serial.begin(9600);
serial.println("button test");
(int i=0;i<numbuttons;i++) pinmode(buttonpins[i],inputmode);
}
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;
(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 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]>=longclicktime) buttonresult[i]=longclick;
}
}
else // kein flankenwechsel, up/down status ist unverändert
{
if (buttonresult[i]==firstup && now-buttondowntime[i]>doubleclicktime)
buttonresult[i]=shortclick;
}
buttonstate[i]=curstate;
} // for
return true;
}
void verarbeitung()
{
// dummy function
}
void ausgabe()
// klickstatus von geklickten buttons mit zeitstempel ausgeben
{
(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]==shortclick) serial.println(" click");
else if(buttonresult[i]==doubleclick) serial.println(" double click");
else if(buttonresult[i]==longclick) serial.println(" long click");
}
}
}
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();
}
}
void loop() {
if (eingabe())
{
verarbeitung();
ausgabe();
}
benchmark();
}
in der boolean eingabe werden ja drei lolale vorzeichenlose long-variablen erstellt:
static unsigned long lastruntime;
static unsigned long buttondowntime[numbuttons];
gehe ich richtig in der annahme das diese beim erstellen den wert 0 haben
unsigned long now=millis();
startet das programm hier mit dem zählen der zeit?
bzw. wie funktioniert dann diese funktion?
if (now-lastruntime<prellzeit) return false; // prellzeit läuft noch
lastruntime=now;
gruß joe
mein tipp:
leg den code weg, wenn er zu kompliziert ist.
es ist ein zeichen dafür, dass du erst andere, einfachere dinge lernen solltest.
programmierern lernen ist wie eine treppe.
vielleicht 2 stufen auf einmal, das mag gehen, aber keine 3, 4, oder gar 5 stufen, mit einem schritt.
also nochmal lesen.
leg den code weg, wenn er zu kompliziert ist.
es ist ein zeichen dafür, dass du erst andere, einfachere dinge lernen solltest.
programmierern lernen ist wie eine treppe.
vielleicht 2 stufen auf einmal, das mag gehen, aber keine 3, 4, oder gar 5 stufen, mit einem schritt.
quote
unsigned long now=millis();du hast blinkwihtoutdelay nicht gelesen, oder nicht verstanden.
startet das programm hier mit dem zählen der zeit?
bzw. wie funktioniert dann diese funktion?
if (now-lastruntime<prellzeit) return false; // prellzeit läuft noch
lastruntime=now;
also nochmal lesen.
Arduino Forum > International > Deutsch (Moderator: uwefed) > Hilfe! Multifunktionstaster-Abfrage von jurs verstehen
arduino
Comments
Post a Comment