Hallo,
ich möchte ein Keypad einlesen. Es hat 4 Zeilen und 3 Spalten (4x3 Keypad). Bei Tastendruck wird ein Kontakt geschlossen. Wenn ich mir die gedrückten Tasten im Serial Monitor anzeigen lasse wird ein durcheinander von allen möglichen Zeichen des Keypads eingelesen wenn ich noch garnichts drücke. Wenn ich dann alle Tasten des Keypads gleichzeitig drücke wird nichts mehr eingelesen. Ich habe auch schon in der Library die Zustände HIGH mit LOW vertauscht weil ich gedacht habe das es daran liegen könnte, aber ohne Erfolg. Hat einer von euch eine Idee??
Ich benutze folgenden Code zum Testen der Funktion (Arduino Mega):
#include <MyKeyPad.h>
int rowArray[] = {28, 29, 26, 27}; // Array mit Zeilen Pin-Nummern initialisieren
int colArray[] = {24, 25, 22}; // Array mit Spalten Pin-Nummern initialisieren
MyKeyPad myOwnKeyPad(rowArray, colArray); // Instanziierung eines Objektes
void setup(){
Serial.begin(9600); // Serielle Ausgabe vorbereiten
myOwnKeyPad.setDebounceTime(500); // Prellzeit auf 500ms setzen
}
void loop(){
char myKey = myOwnKeyPad.readKey(); // Abfragen des gedrückten Tasters
if(myKey != KEY_NOT_PRESSED) // Abfrage, ob irgendein Taster gedrückt
Serial.println(myKey); // Ausgabe des Tastenzeichens
}
Das ist die Header Datei:
#ifndef MYKEYPAD_H
#define MYKEYPAD_H
#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif
#define KEY_NOT_PRESSED '-' // Wird benötigt, wenn keine Taste gedrückt wird
#define KEY_1 '1'
#define KEY_2 '2'
#define KEY_3 '3'
#define KEY_4 '4'
#define KEY_5 '5'
#define KEY_6 '6'
#define KEY_7 '7'
#define KEY_8 '8'
#define KEY_9 '9'
#define KEY_0 '0'
#define KEY_STAR '*'
#define KEY_HASH '#'
class MyKeyPad{
public:
MyKeyPad(int rowArray[], int colArray[]); // Parametrisierter Konstruktor
void setDebounceTime(unsigned int debounceTime); // Setzen der Prellzeit
char readKey(); // Ermittelt die gedrückte Taste auf dem KeyPad
private:
unsigned int debounceTime; // Private Variable für die Prellzeit
long lastValue; // Letzte Zeit der millis-Funktion
int row[4]; // Array für die Zeilen
int col[3]; // Array für die Spalten
};
#endif
Das ist die CPP Datei:
#include "MyKeyPad.h"
// Parametrisierter Konstruktor
MyKeyPad::MyKeyPad(int rowArray[], int colArray[]){
// Kopieren der Pin-Arrays
for(int r = 0; r < 4; r++)
row[r] = rowArray[r];
for(int c = 0; c < 3; c++)
col[c] = colArray[c];
// Programmieren der digitalen Pins
for(int r = 0; r < 4; r++)
pinMode(row[r], OUTPUT);
for(int c = 0; c < 3; c++)
pinMode(col[c], INPUT);
// Initialwert für debounceTime auf 300ms festlegen
debounceTime = 300;
}
// Methode zum Setzen der Prellzeit
void MyKeyPad::setDebounceTime(unsigned int time){
debounceTime = time;
}
// Methode zum Ermitteln des gedrückten Tasters auf dem KeyPad
char MyKeyPad::readKey(){
char key = KEY_NOT_PRESSED;
for(int r = 0; r < 4; r++){
digitalWrite(row[r], HIGH);
for(int c = 0; c < 3; c++){
if((digitalRead(col[c]) == HIGH)&&(millis() - lastValue) >= debounceTime){
if((c==2)&&(r==3)) key = KEY_1;
if((c==1)&&(r==3)) key = KEY_2;
if((c==0)&&(r==3)) key = KEY_3;
if((c==2)&&(r==2)) key = KEY_4;
if((c==1)&&(r==2)) key = KEY_5;
if((c==0)&&(r==2)) key = KEY_6;
if((c==2)&&(r==1)) key = KEY_7;
if((c==1)&&(r==1)) key = KEY_8;
if((c==0)&&(r==1)) key = KEY_9;
if((c==2)&&(r==0)) key = KEY_STAR; // *
if((c==1)&&(r==0)) key = KEY_0;
if((c==0)&&(r==0)) key = KEY_HASH; // #
lastValue = millis();
}
}
digitalWrite(row[r], LOW); // Zurücksetzten auf Ursprungspegel
}
return key;
}
Gruß,
Tobi