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!)?
Für die Programmsteuerung habe ich für eines meiner Projekte ein Menü-Handling-Framework erstellt und die Quelle auf Github geteilt . Beachten Sie, dass dies für chipKIT gilt, der Menübehandlungscode jedoch generisch ist. Nachdem ich meine 3. oder 4. große If-else-If- und Switch-Struktur aufgebaut hatte, entschied ich, dass es einen besseren Weg geben musste. Gutschrift für die Quelle der statischen Menüstrukturen.
Ich benutze nur die Hauptschleife, um den Knopf zu überprüfen.
Ich möchte sagen, dass der erste Schritt darin besteht, einen TFT zu bekommen. Wenn Sie es versuchen, werden Sie nie zurückkehren ... Ich liebe besonders den Adafruit 1.8 "TFT mit Joystick. Arduinos sind langsam genug, dass ich mich nicht erinnern kann, Benutzereingaben entprellt zu haben.
quelle
Sie können unterbrechen, anstatt abzufragen, wenn Sie die Schaltflächen in der Hardware entprellen können. Andernfalls werden Sie viel mehr Interrupts als beim Drücken von Tasten ausführen und müssen diese dennoch in der Software entprellen.
Bei der Hauptfrage kann eine Sammlung von Zustandsautomaten jedoch zumindest für die Benutzeroberfläche sehr nützlich sein und Ihnen die meisten Vorteile von Multitasking ohne den erforderlichen AM / T-Kernel bieten. kann in RAM-begrenzten Geräten leider sein, weil
Die Technik könnte auf diesen kleinen Geräten besonders nützlich sein, aber angesichts der strengen RAM-Einschränkungen ist es eine Herausforderung, die Daten Ihrer Zustandsmaschine zwischen Flash und RAM aufzuteilen, um sie anzupassen.
quelle
Als Chris K habe ich auch eine statische Menübibliothek mit einer Vielzahl von Ausgabeoptionen wie Seriell, LCD, TFT usw. implementiert. Ich habe sie gestartet, um in einem Freundeprojekt zu helfen, und ich teile sie auch für Open Source Leute, die mit ähnlichen Problemen hoffen, dass Sie es nützlich finden können.
https://github.com/neu-rah/ArduinoMenu
quelle