Tasten von Keypad abfragen Arduino?

1 Antwort

#include <Keypad.h>

const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 12, 11, 10 };

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define ledpin 13

void setup()
{
pinMode(ledpin,OUTPUT);
digitalWrite(ledpin, HIGH);
Serial.begin(9600);
}

void loop()
{
char key = kpd.getKey();
if(key) // Check for a valid key.
{
switch (key)
{
case '*':
digitalWrite(ledpin, LOW);
break;
case '#':
digitalWrite(ledpin, HIGH);
break;
default:
Serial.println(key);
}
}
}
Bitte sehr :)

Flo61099 
Beitragsersteller
 11.01.2017, 18:26

Danke nochmal funktioniert super. Hätte aber noch eine Frage und zwar wie fragt man jetzt einen mehrstelligen Code ab?

0
Isendrak  18.10.2019, 11:57
@Flo61099

Zum Beispiel so:

#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = { 9, 8, 7, 6 };
byte colPins[COLS] = { 12, 11, 10 };
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const char *code = "0815";
const int buffer_len = 4;
char buffer[buffer_len];
int buffer_pos = 0;

void setup(){
  pinMode(LED_BUILTIN,OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  for(int i = 0; i < buffer_len; ++i) buffer[i] = 0;
}

void loop(){
  char key = kpd.getKey();
  if(key){
    switch(key){
      case '*':
        for(int i = 0; i < buffer_len; ++i) buffer[i] = 0;
        buffer_pos = 0;
        break;
      case '#':
        int ok = 0;
        for(int i = 0; i < buffer_len; ++i) ok += (buffer[i] == code[i]) ? 1 : 0;
        digitalWrite(ledpin, ok == buffer_len ? HIGH : LOW);
        for(int i = 0; i < buffer_len; ++i) buffer[i] = 0;
        buffer_pos = 0;
        break;
      default:
        if(buffer_pos < buffer_len)
          buffer[buffer_pos++] = key;
        break;
    }
  }
}

Müsstest halt nur noch den Countdown hinzufügen.

0
Flo61099 
Beitragsersteller
 10.01.2017, 17:19

Für was sted case, Break und Default?

0
anonsoju  10.01.2017, 18:13
@Flo61099

Wie if-Anweisungen, switch ... case steuert den Fluss von Programmen, indem Programmierer, um verschiedenen Code, der unter verschiedenen Bedingungen ausgeführt werden soll angeben. Insbesondere eine switch-Anweisung vergleicht den Wert einer Variablen mit den in case-Anweisungen angegebenen Werten. Wenn eine Case-Anweisung gefunden wird, deren Wert mit der der Variablen übereinstimmt, wird die Anweisung in diesem Fall ausgeführt.

Das break-Schlüsselwort beendet die switch-Anweisung und wird typischerweise am Ende eines jeden Falls verwendet. Ohne eine break-Anweisung wird die switch-Anweisung fortfahren, die folgenden Ausdrücke ("falling-through") bis zu einer Pause oder dem Ende der switch-Anweisung auszuführen.

Default steht für die Standardmäßige aktion innerhalb des switch case.

durch break verlässt du das switch case

0