Arduino Mikrocontroller Tutorials - Module

Folientastatur (4x4 Matrix)

Funktion Folientastatur Funktion Folientastatur

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

Folientastatur Schaltplan
# 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); }