Der Arduino Uno wird mit dem 1602 LCD Shield mit 6 Tasten in ein Gehäuse aus dem 3D Drucker gesetzt und mit einer einfachen Software betrieben.
Das häufig verwendete 16×2 LCD Standard Shield wird auf den Arduino Uno gesetzt und dann dieses Gehäuse von Thingiverse eingebaut. Nach dem 3D Druck müssen die 3 Doppeltasten von dem Gehäuse getrennt werden. Dazu am besten mit einem scharfen Messer die Kanten entlang fahren und die Tasten mit Gefühl heraus drücken. Nach dem entgraten der Tasten funktionieren Sie dann auch gut als Wipptasten. Mit 2 Schrauben lässt sich das Gehäuse verschliessen. Die Anschlüsse für USB und Spannungsversorgung sind gut geschützt seitlich zu erreichen.
Hier das Ergebnis. Unten das offene Gehäuse und oben das Gehäuse mit eingebauter Elektronik.
Die 6 Tasten sind über ein Widerstandsnetzwerk zwischen VCC und GND angeschlossen. In A0 wird der Spannungswert eingelesen. Dieser Spannungswert ändert sich je nach Tastendruck und wird ausgewertet.
Ist keine Taste gedrückt, liegt VCC (1023) an A0 an.
Im Programm ist das größer 800.
Wird die RIGHT Taste gedrückt, liegt GND (0) an A0 an.
Im Programm wird kleiner 60 ausgewertet.
Die gedrückte UP Taste teilt die Spannung entsprechend der Widerstände auf.
330 / 2330 * 1023 = 145
Das kann etwas variieren je nach den Widerstandstoleranzen.
Im Programm wird kleiner 200 ausgewertet.
Die gedrückte DOWN Taste ergibt 950 / 2950 * 1023 = 329.
Im Programm wird kleiner 400 ausgewertet.
Die gedrückte LEFT Taste ergibt 1950 / 3950 * 1023 = 505.
Im Programm wird kleiner 600 ausgewertet.
Die gedrückte SELECT Taste ergibt 5250 / 7250 * 1023 = 740.
Im Programm wird kleiner 800 ausgewertet.
Je nach Shield und verwendeten Widerständen können die A0 Werte variieren, deshalb wird in dem unteren Programm der Wert als Val: ausgegeben. Darauf können Sie das Programm prima anpassen wenn nötig, sodass der A0 Wert mitten im Bereich der gedrückten Taste liegt.
Werden mehrere Tasten gleichzeitig gedrückt, kann das Programm immer nur die obere Taste erkennen (im Bild oben), da die unteren Tasten dann ohne Spannung sind. Denn die oberste gedrückte Taste legt Ihren Widerstand rechts über sich auf GND.
Dazu einfach die Software auf den Arduino spielen.
Hier die einfache Software Version 1.0 zum Verständnis:
// Arduino Uno mit 1602 LCD shield im Gehäuse // // Matthias Busse 31.12.2017 Version 1.0 #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int key, no=0; void setup() { lcd.begin(16, 2); lcd.setCursor(0,0); // start screen lcd.print("V 1.0 M.Busse"); lcd.setCursor(0,1); lcd.print(" shelvin.de "); delay(3000); lcd.setCursor(0,1); lcd.print("Press Key: "); } void loop() { key = analogRead (0); lcd.setCursor(0,0); lcd.print("Val: No: "); lcd.setCursor(4,0); lcd.print(key); lcd.setCursor(12,0); lcd.print(no); if(key < 800) { lcd.setCursor(10,1); if (key < 60) {lcd.print ("Right ");} else if (key < 200){lcd.print ("Up ");} else if (key < 400){lcd.print ("Down ");} else if (key < 600){lcd.print ("Left ");} else if (key < 800){lcd.print ("Select");} no++; delay(400); // 400ms + 100ms until next key is accepted } delay(100); }
Und die etwas veränderte Version 1.1 für eine verbesserte Tasten Funktionalität:
// Arduino Uno mit 1602 LCD shield im Gehäuse // Anzeige ändert sich nur wenn sich Werte ändern > ruhiger // Nach keydelay in ms werden erst neue Tasteneingaben akzeptiert // // Matthias Busse 31.12.2017 Version 1.1 #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int key, oldkey, no=0, oldno=1, keydelay=500; unsigned long keytime; void setup() { lcd.begin(16, 2); lcd.setCursor(0,0); // start screen lcd.print("V 1.1 M.Busse"); lcd.setCursor(0,1); lcd.print(" shelvin.de "); delay(3000); lcd.setCursor(0,1); lcd.print("Press Key: "); } void loop() { key = analogRead (0); // read key if((key != oldkey) || (no != oldno)) { // changes key or no? lcd.setCursor(0,0); lcd.print("Val: No: "); lcd.setCursor(4,0); lcd.print(key); lcd.setCursor(12,0); lcd.print(no); oldkey=key; oldno=no; } if(key < 800) { // print key keytime=millis(); lcd.setCursor(10,1); if (key < 60) {lcd.print ("Right ");} else if (key < 200){lcd.print ("Up ");} else if (key < 400){lcd.print ("Down ");} else if (key < 600){lcd.print ("Left ");} else if (key < 800){lcd.print ("Select");} no++; while( ((keytime+keydelay) > millis()) ){} // wait until next keypress is accepted } }
Die rechte Taste führt einen Arduino RESET aus und starte das geladene Programm neu. Wenn das vermieden werden soll, muß der Taster darunter elektrisch von GND oder RESET getrennt werden. Dazu können zwei zusammengehörige Beine unterbrochen werden. Die zwei Beine können mit dem Multimeter durchgepiept werden im geöffneten Zustand. Das heißt sie haben immer 0 Ohm.
Verwendet wurden:
Arduino Uno
1602 LCD Keypad Shield
Gehäuse von Thingiverse
3D Drucker
Arduino Software 1.8.0
von Matthias Busse