mal angenommen ihr habt einen Sketch, der eine Funktion zur Auswertung von Tastenzuständen beinhaltet. Diese Funktion wird regelmäßig aus der Loop aufgerufen und ermittelt permanent den Zustand diverser Tasten.
Die ermittlelten Zustände sollen nun an unterschiedlichsten Stellen des Sketches als Basis für das Auslösen div. “Aktionen” dienen.
Wie würdet ihr in diesem Fall dem restlichen Sketch den Status der Tasten mitteilen/ übergeben, damit die o.a. Aktionen ausgelöst werden können?
Wäre das ein klassischer Fall für die Verwendung einer globalen Variablen, oder (falls nicht) wie würdet ihr das lösen?
Hallo,
ich hätte eine Funktion "byte tastenzustand = tastenlesen();" genommen, um diese einmal in Loop aufzurufen. Danach greife ich dann immer auf die Variable tastenzustand zu. Je nach Anwendung kann es sonst zu logischen Problemen führen, wenn sich der Zustand der Tasten innerhalb von Loop ändert.
Bin gespannt, was sonst noch für Vorschläge kommen.
Chris72622:
Also würdest Du es auch über eine globale Variable lösen.
Gruß Chris
Hallo Chris, nein, nicht unbedingt. Hier der Sketch, wie er in meinem Kopf herumspukt:
int g; // globale Variable, nicht verwendet
void setup() {
Serial.begin(9600);
pinMode(8, INPUT_PULLUP);
}
void loop() {
byte tastenzustand = tastenlesen(); // lokale Variable, daher am Anfang von loop mit Inhalt gefüllt
Serial.println(tastenzustand, HEX); // stellvertretend für das restliche Programm
delay(50);
}
byte tastenlesen() {
byte t = digitalRead(8); // bei vielen digitalen Eingängen würde ich die natürlich auf Bits verteilen
return t;
}
Anstelle bitRead verwende ich gerne boolsche Operatoren "if (tastenzustand && B00001000)". Wie so vieles ist das aber Geschmackssache.
was bringt das für einen. Vorteil? Da loop immer loopt, braucht die Variable tastenzustand den gleichen Speicher als wie wenn sie global wäre.
Und mit t in der sub hast du eine weitere Variable, die dynamisch immer Platz braucht.
Das mit bitread ist gut, wenn's wirklich ganz eng im Speicher wird. aber lediglich sieben Byte Ersparnis zu Ungunsten der Übersichtlichkeit und guten Lesbarkeit der Programmstruktur seh ich als doch etwas übertrieben an.
ElEspanol:
wie hast du denn so was seither gemacht?
Eigentlich genau so wie weiter oben von agmue beschrieben, jedoch nicht so platzsparend wie vom Eisbär beschrieben. Werde die Eisbärvariante nicht umsetzen können, da in meinem Fall auch Halteaktionen und Mehrfachtastenkombinationen erfasst werden sollen.
Ich werde somit mit einem globalen Byte und Enums arbeiten.
byte buttonAction; // Gibt an, was für eine Aktion ausgelöst wird.
enum {
NOACTION, // Index 0 = unbelegt/ keine Aktion
BUT1PUSH, BUT2PUSH, BUT3PUSH, BUT4PUSH, BUT5PUSH, BUT6PUSH, // Index 1 bis (NUMBUTTONS) = EinzeltastendruckAktionen
BUT1HOLD, BUT2HOLD, BUT3HOLD, BUT4HOLD, BUT5HOLD, BUT6HOLD, // Index (NUMBUTTONS + 1) - (NUMBUTTONS + NUMBUTTONS) = EinzeltastenHalteAktionen
BUT15HOLD // Tasten 1 + 5 werden gedrückt gehalten
};