Kleine Knopfklasse

Inhaltsverzeichnis

IR-Auslöser für Pentax-Kameras

Akku-Ladekurve

Wir bauen uns eine Piepliothek!

Ein Automat ohne delay()

Pimp my Code!

Toner-Transfer-Quetsche

Ein Länzchen für die Schönheit
Kleine Knopfklasse

Tipps + Tricks

Kleine Knopfklasse

Eine kleine, nicht blockierend programmierte Klasse, die doppelt belegte Tasten ermöglicht.

Hin und wieder steht man vor dem Problem, nur wenig Platz für Schalter und Tasten zu haben.

In meinem Fall sollte eine automatisch ablaufende Folge von Vorgängen entweder schnell durchgeschaltet oder angehalten werden können – eigentlich ein Fall für zwei Taster. Allerdings war nur Platz für einen Taster vorhanden.

Die Lösung des Problem bestand darin, lange und kurze Betätigungen zu unterscheiden: Ein kurzer Tastendruck schaltet weiter, ein langer Tastendruck schaltet die Pause-Funktion ein bzw. aus.

Da neben dem automatischen Ablauf immer wieder geprüft werden muss, ob die Taste gedrückt ist, muss „nicht blockierend“ programmiert werden.

„Nicht blockierend“ heißt, dass nicht gewartet wird, bis die Taste gedrückt ist, sondern dass nur geprüft wird, ob sie gedrückt ist. Wenn sie nicht gedrückt ist, wird fortgefahren.

Die Dateien:

// button.h

#ifndef BUTTON_H
#define BUTTON_H

#include <Arduino.h>

enum clicktype { NONE, SHORT, LONG };

class Button
{
  private:
    byte pin; // Pin, an den die Taste angeschlossen ist
    boolean state;
    boolean lastState;
    int timeout; // Zeit bis zum "lang gedrueckt"-Zustand
    long millisMem;
  public:
    Button(byte);
    clicktype check(); // Gibt zurueck, ob/wie gedrueckt wurde
    inline void init() { pinMode(pin, INPUT_PULLUP); };
};

// button.cpp

#include "button.h"

Button::Button(byte pin_)
{
  millisMem=millis();
  pin=pin_;
  state=LOW;
  lastState=LOW;
  timeout=500; // Zeit in ms, die zwischen langem und kurzem
               // Tastendruck unterscheidet (hier eine halbe Sekunde)
}

clicktype Button::check() // Regelmaessig aufgerufene Funktion zur
                          // Abfrage des Tasters
{
  if ((digitalRead(pin)==LOW) && (lastState==LOW)) // gedrueckt
  {
    millisMem=millis();
    lastState=HIGH;
  }

  if ((digitalRead(pin)==HIGH) && (lastState==HIGH)) // losgelassen
  {
    lastState=LOW;
    if(millis()-millisMem < timeout)
    { return(SHORT); } else { return(LONG); }
  }
  return(NONE);
}

Im eigentlichen Programm sieht das so aus:

#include "button.h" // Einbinden der Headerdatei

Button button(2); // Taste haengt an Pin D2
...
void setup()
{
  ...
  button.init();
  ...
}

void loop()
{
  ...
  switch(button.check())
  {
    case SHORT: // Hier Aktion fuer "kurz gedrueckt"
                break;
    case LONG:  // Hier Aktion fuer "lang gedrueckt"
                break;
    case NONE:
    default:    break;

  }
  ...
}

Weiter zu: Tipps + Tricks


Nach oben Inhaltsverzeichnis

Valid HTML 4.01 Transitional