Frage zur Übergabe von Tastenzuständen an den restlichen Sketch

Hallo,

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?

Gruß Chris

Hallo,

das funktioniert nur mit globalen Variablen.

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.

Also würdest Du es auch über eine globale Variable lösen. :slight_smile:

Gruß Chris

hi,

falls das RAM knapp wird, kannst Du ja 8 werte in einem byte speichern.

gruß stefan

Ja, das hört sich gut an.

Und dann bitRead usw. :wink:

Gruß Chris

Ich wll ja nichts sagen, aber jemand der 738 Posts auf der Uhr hat, fragt sowas allen Ernstes??

Ja, warum nicht?

Oftmals führen ja bekanntlich viele Wege nach Rom und ich gehe noch immer davon aus, dass ich sie nicht alle kenne.

Gruß Chris

da hast du vollkommen echt. das sehe ich genauso.

wie hast du denn so was seither gemacht?

Chris72622:
Also würdest Du es auch über eine globale Variable lösen. :slight_smile:

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

Gruß Chris

ElEspanol:
Und mit t in der sub hast du eine weitere Variable, die dynamisch immer Platz braucht.

Stimmt, unter diesem Aspekt lieber global. Gerade für die von mir verwendeten ATtinys ein Thema.