Ich habe genug Produkte mit eingebetteten Mikrocontrollern und nicht reagierenden Benutzeroberflächen verwendet, um zu wissen, dass dadurch ein Produkt hergestellt oder beschädigt werden kann. Selbst eine geringfügige Verzögerung oder Verzögerung zwischen dem Drücken der Taste und der Aktualisierung der Anzeige oder das Ignorieren oder doppelte Zählen der Tastendrücke kann äußerst frustrierend sein.
Welche Entwurfsmuster können verwendet werden, um Benutzereingaben (über Schaltflächen) zu verarbeiten und Anzeigen zu aktualisieren, ohne diese Probleme zu verursachen?
Ich verwende derzeit die folgende Art von Muster (dies wird auf das Nötigste vereinfacht):
#include <Bounce.h>
#define GREEN_LED 6 // Pin for green LED
#define BUTTON_PIN 15 // Pin for button - uses external pull down so active high
#define DISPLAY_REFRESH_INT 100 // How many MS between display updates
Bounce button = Bounce(BUTTON_PIN, 5);
// To signal between the button read and the display update
bool ledState = false;
// Used to keep track of last display update
long displayUpdate = 0;
void setup()
{
pinMode(GREEN_LED, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
}
void loop()
{
// Read the button status
if (button.update())
{
if (button.risingEdge())
{
ledState = !ledState;
}
}
// Update the display periodically
if (millis() - displayUpdate > DISPLAY_REFRESH_INT)
{
displayUpdate = millis();
digitalWrite(GREEN_LED, ledState);
}
}
Welche anderen Möglichkeiten gibt es? Lohnt es sich jemals, Pin-Interrupts zum Lesen von Tasten zu verwenden (wenn wir die Akkulaufzeit nicht berücksichtigen!)?