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 ;-))

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.

quote
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;
du hast blinkwihtoutdelay nicht gelesen, oder nicht verstanden.
also nochmal lesen.


Arduino Forum > International > Deutsch (Moderator: uwefed) > Hilfe! Multifunktionstaster-Abfrage von jurs verstehen


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts