Folientastatur (4x4 Matrix)
Um bei einer Folientastatur (en. Keypad) mit 16 Tasten keine 16 Mikrocontroller Eingänge zu benötigen werden die einzelnen Taster in Reihen (R) und Spalten (S) zusammengeschlossen. So werden in Summe nur 8 Arduino Pins belegt. Zum Abfragen welche Taste gerade gedrückt ist, werden die 4 Reihen nacheinander bestromt. Bei jeder der Bestromungen wird dann bei den 4 Spalten geschaut ob der Pegel durchgeschaltet wurde. Ist das der Fall liegt die gedrückte Taste genau an der Schnittstelle der geraden bestromten Reihe und derjenigen Spalte an der das Signal detektiert wurde.
Schaltung und Programmcode
# include "Keypad.h"
// Pins in einem Array definieren
byte row[] = {9,8,7,6};
byte col[] = {5,4,3,2};
// Array mit den Tastenzeichen erstellen
char zeichen[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
//Instanz der Klasse Keypad erstellen mit
//... Pin Belegung und Angabe 4x4 Matrix
Keypad tastenfeld = Keypad(makeKeymap(zeichen), row, col, 4, 4);
void setup(){
Serial.begin(9600);
}
void loop(){
char taste = tastenfeld.getKey();
if (taste){
Serial.println(taste);
}
}
Programmcode ohne Bibliothek
// Ausgänge definieren
#define REIHE4 6
#define REIHE3 7
#define REIHE2 8
#define REIHE1 9
#define SPALTE1 5
#define SPALTE2 4
#define SPALTE3 3
#define SPALTE4 2
byte spalte = 0; byte reihe = 0;
char tastenfeld [4] [4] = {{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}};
void setup() {
Serial.begin(9600);
pinMode(SPALTE1, INPUT_PULLUP);
pinMode(SPALTE2, INPUT_PULLUP);
pinMode(SPALTE3, INPUT_PULLUP);
pinMode(SPALTE4, INPUT_PULLUP);
pinMode(REIHE1, OUTPUT);
pinMode(REIHE2, OUTPUT);
pinMode(REIHE3, OUTPUT);
pinMode(REIHE4, OUTPUT);
}
void loop() {
digitalWrite(REIHE1, LOW);
if (digitalRead(SPALTE1) == LOW) {
spalte = 1; reihe = 1;
}
if (digitalRead(SPALTE2) == LOW) {
spalte = 2; reihe = 1;
}
if (digitalRead(SPALTE3) == LOW) {
spalte = 3; reihe = 1;
}
if (digitalRead(SPALTE4) == LOW) {
spalte = 4; reihe = 1;
}
digitalWrite(REIHE1, HIGH);
digitalWrite(REIHE2, LOW);
if (digitalRead(SPALTE1) == LOW) {
spalte = 1; reihe = 2;
}
if (digitalRead(SPALTE2) == LOW) {
spalte = 2; reihe = 2;
}
if (digitalRead(SPALTE3) == LOW) {
spalte = 3; reihe = 2;
}
if (digitalRead(SPALTE4) == LOW) {
spalte = 4; reihe = 2;
}
digitalWrite(REIHE2, HIGH);
digitalWrite(REIHE3, LOW);
if (digitalRead(SPALTE1) == LOW) {
spalte = 1; reihe = 3;
}
if (digitalRead(SPALTE2) == LOW) {
spalte = 2; reihe = 3;
}
if (digitalRead(SPALTE3) == LOW) {
spalte = 3; reihe = 3;
}
if (digitalRead(SPALTE4) == LOW) {
spalte = 4; reihe = 3;
}
digitalWrite(REIHE3, HIGH);
digitalWrite(REIHE4, LOW);
if (digitalRead(SPALTE1) == LOW) {
spalte = 1; reihe = 4;
}
if (digitalRead(SPALTE2) == LOW) {
spalte = 2; reihe = 4;
}
if (digitalRead(SPALTE3) == LOW) {
spalte = 3; reihe = 4;
}
if (digitalRead(SPALTE4) == LOW) {
spalte = 4; reihe = 4;
}
digitalWrite(REIHE4, HIGH);
if (reihe > 0 && spalte > 0) {
char zahl = tastenfeld [reihe - 1] [spalte - 1];
Serial.print("Spalte: "); Serial.print(spalte); Serial.print(" - Reihe: "); Serial.print(reihe);
Serial.print(" - gewählter Buchstabe: "); Serial.println(zahl);
reihe = 0; spalte = 0;
}
delay(300);
}