Die Funktionsweise der Tastatur
Da man normalerweise Texte oder Eingaben nur braucht, wenn man sie weiterverarbeitet, war es mein Ziel so wenige Pins wie möglich zu verwenden. Deshalb verwende ich die analog Eingänge des Arduino, da diese nicht so universell einsetzbar sind, wie die digital Pins. Deshalb besitzt die Tastatur 6 Buttons für die Buchstabenauswahl. Ich verwende dasselbe Prinzip, wie die T9 Tastaturen aber nur mit 6 Buttons(die Tastaturen an alten Handys). Wenn man also auf den ersten Button drückt erhält man erst ein A, dann ein B, ein C und ein D. Durch diese Aufteilung kann ich alle Buchstaben mit nur 6 Buttons eintippen. Um das Eingetippte zu sehen, verwende ich ein LCD Display. Zusätzlich benötigt die Tastatur zwei Potentiometer. Das Eine, um das Display zu leeren, und das Andere, um einzelne Zeichen zu löschen.Die Verkabelung
Wie gesagt, verwende ich für die Buttons die analogen Eingänge. Das bedeutet die Beine des Buttons werden an den Ground und an den analogen Eingang angeschlossen. Wenn ihr genau wissen wollt, wie man Buttons ansteuert, solltet ihr euch meinen Artikel dazu durchlesen. Zusätzlich schließe ich die beiden Potentiometer an zwei digital Pins an. Auch dazu habe ich bereits einen ausführlichen Artikel geschreiben. Kurzform: Ground, Data, 5V. Das LCD Display muss auch an die digital Pins angeschlossen werden, ausführlicher Artikel dazu. Insgesamt sind die Buttons an den analogen Eingängen 0 bis 6, die Potentiometer an Pin 6 und 7 und das LCD Display an Pin 0 bis 5. Wichtig ist: Natürlich könnt ihr das Programm anpassen. Ihr könnt jedoch nicht die digital Pins 0 und 1 verwenden und gleichzeitig eine serielle Verbindung "unterhalten", da diese Pin 0 und 1 verwendet und sich dann mit eurem Programm stört. Ihr müsst euch also für eine Möglichkeit entscheiden: serielle Verbindung oder Pin 0 und 1 fürs Programm.
Der Sketch
Im Sketch wird laufen überprüft, ob ein Button gedrückt ist, wenn ja werden im Array pressed die Zeichen des Buttons gespeichert (z.B. 0 = A, 1 = B, 2 = C, 3 = D). Dann wird überprüft, ob das letzte Zeichen vom selben Button ist, also man das zweite oder dritte Zeichen eines Buttons will. Ist dem so und, wenn die vergangene Zeit unter 2 Sekunden ist, wird das zweite, dritte oder vierte Zeichen auf dem Display aktualisiert, indem man den Cursor mit lcd.setCursor auf exakt die gleiche Position setzt und dann das Zeichen schreibt. Wenn das Zeichen von einem anderen Button war, wird einfach das Zeichen auf dem nächsten Displayfeld ausgegeben. Abschließend wird noch überprüft, ob eines der Potentiometers aufgedreht wurde. Wenn das erste auf an gestellt ist, wird das aktuelle Zeichen durch eine Leerzeichen ersetzt und die Variable erase auf 1 gesetzt. Dadurch wird beim nächsten Zeichen nicht die Position vorgestzt, wodurch man das Leerzeichen durch einen Buchstaben ersetzt, und insgesamt die Buchstaben austauscht. Falls das zweite Potentiometer auf an ist, wird die Funktion lcd.clear() aufgerufen, wodurch alle Zeichen auf dem Display gelöscht werden. Der gesamte Sketch sieht dann so aus:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <LiquidCrystal.h> //nachladen der LCD Bibliothek | |
LiquidCrystal lcd(5,4,3,2,1,0); //festlegen der Pins fuer das Display | |
unsigned long last; | |
unsigned long akt; | |
unsigned long dif; | |
char* pressed[5]; | |
String last_letter; | |
String letter; | |
int number = 0; | |
int position_1 = 0; | |
int erase = 0; //definieren der Variablen fuer das Programm | |
void setup() { | |
pinMode(6, INPUT); | |
pinMode(7, INPUT); //definieren der Inputs fuer die Potentiometer | |
pinMode(13, OUTPUT); //LED zeigt an, ob das Display gerade geleert wird(Arduino Board LED) | |
lcd.begin(20,4); //festlegen der Displaygroesse 20 Spalten, 4 Reihen | |
} | |
void loop() { | |
if(analogRead(0) < 20) | |
{ | |
pressed[0] = "A"; | |
pressed[1] = "B"; | |
pressed[2] = "C"; | |
pressed[3] = "D"; | |
pressed[4] = ""; | |
} | |
if(analogRead(1) < 20) | |
{ | |
pressed[0] = "E"; | |
pressed[1] = "F"; | |
pressed[2] = "G"; | |
pressed[3] = "H"; | |
pressed[4] = ""; | |
} | |
if(analogRead(2) < 20) | |
{ | |
pressed[0] = "I"; | |
pressed[1] = "J"; | |
pressed[2] = "K"; | |
pressed[3] = "L"; | |
pressed[4] = ""; | |
} | |
if(analogRead(3) < 20) | |
{ | |
pressed[0] = "M"; | |
pressed[1] = "N"; | |
pressed[2] = "O"; | |
pressed[3] = "P"; | |
pressed[4] = ""; | |
} | |
if(analogRead(4) < 20) | |
{ | |
pressed[0] = "Q"; | |
pressed[1] = "R"; | |
pressed[2] = "S"; | |
pressed[3] = "T"; | |
pressed[4] = "U"; | |
} | |
if(analogRead(5) < 20) | |
{ | |
pressed[0] = "V"; | |
pressed[1] = "W"; | |
pressed[2] = "X"; | |
pressed[3] = "Y"; | |
pressed[4] = "Z"; | |
} //jeweils Abfragen, ob ein Button gedrueckt ist, also der Eingang mit dem Ground verbunden ist und dann speichern der Buchstaben in Array pressed | |
if(pressed[0] != "") //wenn Button gedrueckt | |
{ | |
akt = millis(); | |
dif = akt - last; | |
if(last_letter == pressed[0] && number < 4 && dif < 2000) //wenn selber Knopf zweimal gedrueckt, aber unter 5 mal und vergangene Zeit kleiner 2 Sekunden | |
{ | |
number = number + 1; | |
letter = pressed[number]; //aktueller Buchstabe ist der naechst auf einem Button (z.B. B nach A) | |
last = millis(); //neues festlegen des letzten Drueckens auf den aktuellen Button | |
lcd.setCursor(position_1, 0); //Position zum ueberschreiben des aktuellen Zeichens | |
} | |
else { //wenn neuer Button gedrueckt einfach ausgeben auf Display auf naechster Stelle und zuruecksetzten der Zeit/zuletzt gedrueckter Button | |
letter = pressed[0]; | |
number = 0; | |
last = millis(); | |
if(erase != 1) //wenn das Loeschen des letzten Zeichens war, dann kein Vorruecken zur naechsten Stelle | |
{ | |
position_1 = position_1 + 1; | |
} | |
else { | |
erase = 0; | |
} | |
lcd.setCursor(position_1, 0); | |
} | |
lcd.print(letter); | |
last_letter = pressed[0]; | |
pressed[0] = ""; | |
pressed[1] = ""; | |
pressed[2] = ""; | |
pressed[3] = ""; | |
pressed[4] = " "; //ausgeben des Zeichens und zuruecksetzten | |
} | |
int status_poti = digitalRead(6); | |
if(status_poti == 1) | |
{ | |
lcd.setCursor(position_1, 0); | |
lcd.print(" "); | |
erase = 1; | |
} //ueberpruefen, ob das letzte Zeichen geloescht werden soll, wenn ja speichern in Variable loeschen und speichern in Variable fuer erase | |
if(digitalRead(7) == HIGH) | |
{ | |
digitalWrite(13, HIGH); //LED an | |
lcd.clear(); //loeschen aller Zeichen auf dem Display | |
lcd.setCursor(0,0); | |
position_1 = 0; | |
delay(10); | |
digitalWrite(13, LOW); //LED aus | |
} | |
delay(110); //kurze Pause | |
} |
Das ist eine gute Möglichkeit, um mit einem autonomen Arduino zu kommunizieren. Durch den EEPROM könnte man einen Text auch speichern und ein anderes Mal wieder aufrufen. Man kann sich mit dem Arduino also einen "kleinen PC" bauen.
Keine Kommentare:
Kommentar veröffentlichen
Mit dem Veröffentlichen eines Kommentars erklären Sie sich mit unserer Datenschutzerklärung einverstanden.
https://michaelsarduino.blogspot.de/p/datenschutzerklarung.html