4x4 Matrix, solange die Taste gedrückt wird

Hallo ich haben einen Code welcher mir eine Aktion ausführt sobald ich eine Taste auf der 4x4 Folientastertur drücke, jetzt möchte ich aber zusätzlich eine Aktion ausführen solange ich eine Taste drücke.

z.b. ich drücke die Taste 1 und der Pin 1 geht für 2 Sekunden auf HIGH.
aber wenn ich die Taste 2 drücke soll der Pin 2 High sein bis ich die Taste loslasse.

wie kann ich das machen, aktuell sieht mein code so aus

#include <Keypad.h>

const byte ROWS = 4; // Anzahl der Zeilen
const byte COLS = 4; // Anzahl der Spalten

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};  // Pins für die Zeilen
byte colPins[COLS] = {5, 4, 3, 2};  // Pins für die Spalten

Keypad keypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

const int outputPin = 1;  // Pin, der für 1 Sekunde auf HIGH gesetzt wird

void setup() {
  pinMode(outputPin, OUTPUT);
  digitalWrite(outputPin, LOW);
}

void loop() {
  char key = keypad.getKey();  // Taste auslesen

  if (key == '1') {  // Wenn Taste "1" gedrückt wurde
    digitalWrite(outputPin, HIGH);
    delay(1000);  // 1 Sekunde warten
    digitalWrite(outputPin, LOW);
  }
}

ich hoffe mein Problem ist verständlich und ich bedanke mich für eure Antworten.

Du merkst Dir, wenn die '2' gedrückt wurde und schaltest an. Dann prüfst bei jeder Abfrage, ob die Taste immer noch '2' ist. Wenn nicht, schaltest Du aus und setzt den Merker zurück.
Bedenke: Du bekommst immer nur 1 Taste geliefert.

Gruß Tommy

wenn du einen Ausgang für ein paar Sekunden schalten willst, dann sollst du andere Codeteile nicht mit delay blockieren.

Da habe ich ein Beispiel das in etwa machen soll was du suchst. Du triggerst den Ausgang halt mit deiner Matrix an. Das Prinzip bleibt das gleiche:
https://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais.htm

Danke, dass hätt ich schon probiert aber irgendwie klappt es bei mir nicht.

Dann hast Du etwas falsch gemacht.
Baue Dir Ausgaben auf den Seriellen Monitor ein und gib Dir Deine Variablen und den Ort, wo das Programm gerade ist, aus.

Gruß Tommy

Hast du schon rausgefunden, was zurücckgeliefert wird, wenn keine Taste gedrückt ist?
Setze in dem Fall den Pin 2 auf LOW. Du kannst immer nur eine Taste drücken, also muss dazwischen auch mal keine Taste gedrückt sein.

Dass das nicht funktioniert, während dein delay(1000); noch läuft, ist allen klar.
Wenn dir bewusst und gewollt ist, dass während eines delay nichts anderes passiert, lass es so.

Dann falls Du ein Model mit ATmega328 bzw ATmega2560 hast dann laß Pin 0 und Pin 1 unbeschaltet, sonst funktioniert die serielle Schnittstelle nicht.
Grüße Uwe

Bräuchtest Du gar nicht.
Ein einfaches
if (taste == 2) digitalWrite (Pin,HIGH); else digitalWrite (Pin,LOW);
genügt auch.
Grüße Uwe

Naja, nach meiner Meinung muss man schon unterscheiden, ob die 2 erstmalig kommt (Einschalten) oder wiederholt (nichts tun).
Erst eine andere Taste schaltet aus oder man muss "Keine Taste" schon als Abbruch auswerten, was ich ohne Zeitbetrachtung für nicht zielführend halte.
Da fehlen aber wieder Infos vom TO zum geplanten Verhalten.
(ich würde sowas nie mit einer Matrix realisieren wollen) :wink:

Gruß Tommy

Ich interpretiere das, daß man auch wiederholt HIGH schalten kann wenn die Taste beim loop() Zyklus gedrückt ist.

Deine Variante ist sicher eleganter.

Grüeß Uwe

Bei digitalWrite ist es völlig wurscht, wie oft man das wiederholt. Bei anderen Sachen ( z.B. Serial.print ) braucht man sehr wohl eine Änderungserkennung.
Welche Variante eleganter ist, lasse ich offen.

Hier haben wir ein Beispiel, wo sogar die Warnung vor dem bösen delay() übertrieben ist.
Mal sehen, wenn die Aufgabenstellung erweitert wird.

In der Ursprungsfassung der Aufgabe ist es sicher egal, ich ziehe aber Varianten vor, die für mögliche Erweiterungen offen sind, ohne alles umbauen zu müssen.
Aber das ist halt Gewohnheit, da meist die Erweiterung sowieso kommt.

Gruß Tommy

Meine Erfahrung ist, dass Unvorhergesehenes meist unvorhergesehen kommt, und Erweiterungen wofür man vorsorglich schon mal was eingebaut hat, auch gerne ungenutzt bleiben.
Aber "es gleich ordentlich machen" statt zu überlegen, ob Pfusch diesmal reicht, ist generell schon zu empfehlen.

Hi @hoefi ,

Soweit Du die Keypad-Abfrage nicht selbst im Sketch programmieren willst (was durchaus machbar ist), solltest Du Dir mal dieses Beispiel der keypad Library anschauen:

https://github.com/Chris--A/Keypad/blob/master/examples/EventKeypad/EventKeypad.ino

Die Funktion

keypad.addEventListener(keypadEvent);

erlaubt es, in der verknüpften Funktion keypadEvent() den Status des auslösenden Tasters auszuwerten: PRESSED, RELEASED und HOLD.

So kann man unterschiedliche Funktionen beim Schließen, Halten und Öffnen des Kontaktes für die einzelnen Tasten programmieren.

Das Beispiel sollte selbsterklärend sein ... sonst gerne nachfragen.

Viel Erfolg!
ec2021

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.