Das Tastenfeld soll dazu verwendet werden um Multiplikationen durchzuführen und das Ergebnis soll im Seriellen Monitor und auf einem LCD angezeigt werden.
So sieht es aus:
Schließe das LCD an:
➨LCD
Normalerweise wäre eine komplexe Verkabelung zum Betrieb eines LCDs nötig. Der ➨I2C-Bus regelt über einen eigenen Mikroprozessor die Kommunikation der Datenleitungen untereinander. Es werden deshalb nur vier Anschlüsse benötigt.
Auf der Rückseite befindet sich ein Drehpotentiometer, mit dem die Helligkeit des LCDs eingestellt wird.
Bevor du starten kannst musst du eine Bibliothek installieren:
Sketch → Bibliothek einbinden → Bibliotheken verwalten
Benötigte Bauteile:
- LCD 1602
- Lautsprecher
- Tastenpad 3×4
- Leitungsdrähte
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Neben der Bibliothek und den Variablen des ➨Tastenfelds musst du die Bibliothek LiquidCrystal_I2C einbinden:
// Keypad einbinden und Arrays definieren
# include <Keypad.h>
/*
Größe des Tastenfeldes
3 Spalten
da Arrays immer statisch sind, muss SPALTEN/REIHEN als statisch (const) definiert werden
*/
const byte SPALTEN = 3;
// 4 Zeilen
const byte REIHEN = 4;
// die Pins für die 3 Spalten
byte SpaltenPins[SPALTEN] = {2, 3, 4};
// die Pins für die 4 Reihen
byte ReihenPins[REIHEN] = {8, 9, 10, 11};
/ die Ziffern/Zeichen:
// Array 3 x 4
char Tasten[REIHEN][SPALTEN] = {
{'#', '0', '*'},
{'9', '8', '7'},
{'6', '5', '4'},
{'3', '2', '1'}
};
// TastenFeld → Name des Keypads
// → Zuordnung der Pins zu den REIHEN und SPALTEN des Arrays
Keypad TastenFeld = Keypad(makeKeymap(Tasten), ReihenPins, SpaltenPins, REIHEN, SPALTEN);
# include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
0×27 ist die ID des I2C-Busses, 20 bestimmt die Anzahl der Zeichen pro Zeile, 4 nennt die Anzahl der Zeilen.
Wenn dir die ID des verwendeten Displays nicht bekannt ist, kannst du sie mit folgendem ➨Programm herausfinden.
Jetzt kann die eigentliche Programmierung beginnen.
Lege zusätzliche Variable fest:
// setzt die Position der Spalte
int Position = 0;
// beinhaltet die vollständige Rechnung
String Rechnung;
// temporäre Speicherung der gedrückten Tasten
String Eingabe;
char gedrueckteTaste;
int LAUTSPRECHER = 13;
void setup()
{
Serial.begin(9600);
// LCD einschalten
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Mal-Rechner");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(0, 2);
}
Der loop-Teil: Beachte die Kommentare
void loop()
{
String GleichZeichen = " = ";
lcd.setCursor(Position, 2);
// gedrückte Taste abfragen
gedrueckteTaste = TastenFeld.getKey();
// wenn eine Taste gedrückt wurde
if (gedrueckteTaste)
{
tone(LAUTSPRECHER, 1000);
delay(50);
noTone(LAUTSPRECHER);
/*
wenn eine Aufgabe gerechnet wurde ...
LCD löschen
Anzeige neu aufbauen
*/
if (Rechnung != "")
{
Rechnung = "";
lcd.clear();
Position = 0;
lcd.setCursor(0, 0);
lcd.print("Mal-Rechner");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(0, 2);
}
// Ausgabe eine Position weiter
Position ++;
// # soll nicht angezeigt werden
if (gedrueckteTaste != '#') lcd.print(gedrueckteTaste);
// gedrueckteTaste dem String Eingabe hinzufügen
Eingabe = Eingabe + gedrueckteTaste;
// oder Kurzform: Eingabe += gedrueckteTaste;
// # gedrückt → Rechnung ausführen
if (gedrueckteTaste == '#')
{
// letztes Zeichen ist # → muss entfernt werden
Rechnung = Eingabe.substring(0, Eingabe.length() - 1);
// Position des Malzeichens bestimmen
// Zählung beginnt mit 0
int MalZeichen = Eingabe.indexOf('*');
// erster Faktor: von 0 bis zur Position des Malzeichens
String FaktorEins = Eingabe.substring(0, MalZeichen);
/*
zweiter Faktor: von der Position hinter dem Malzeichen
bis zum vorletzten Zeichen
das letzte Zeichen ist # → soll entfernt werden
*/
String FaktorZwei = Eingabe.substring(MalZeichen + 1, Eingabe.length() - 1);
/*
Produkt berechnen
damit dürfen die beiden Faktoren nicht größer als
32768 sein
long Produkt = FaktorEins.toInt() * FaktorZwei.toInt();
Zahlen nach long umwandeln
*/
long ErsterFaktor = FaktorEins.toInt();
long ZweiterFaktor = FaktorZwei.toInt();
long Produkt = ErsterFaktor * ZweiterFaktor;
// String Rechnung "zusammenbauen"
Rechnung = FaktorEins + " * " + FaktorZwei + GleichZeichen + String(Produkt);
// Rechnung anzeigen
RechnungAusgeben();
Eingabe = "";
}
}
}
Ergänze das Programm mit der Methode RechnungAusgeben().
void RechnungAusgeben()
{
// Ausgabe Serieller Monitor
Serial.println(Rechnung);
// Ausgabe LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.noCursor();
lcd.print("Mal-Rechner");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(0, 2);
/* Länge der Rechnung bestimmen
das LCD hat nur 20 Zeichen
wenn es mehr als 20 sind → Zeilenumbruch beim =-Zeichen
*/
int Laenge = Rechnung.length();
if (Laenge > 20)
{
// Position des =-Zeichen bestimmen
int GleichZeichen = Rechnung.indexOf('=');
// Rechnung bis =-Zeichen anzeigen
lcd.print(Rechnung.substring(0, GleichZeichen + 1 ));
// Zeilenumbruch
lcd.setCursor(0, 3);
lcd.print(Rechnung.substring(GleichZeichen + 2, Rechnung.length()));
}
// wenn < 20 Zeichen ...
else lcd.print(Rechnung);
}
Verwandte Aufgaben:
- Countdown mit einer einstelligen Anzeige
- Countdown mit einem OLED-Display
- DHT22 - Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- Farbenspiele mit einer RGB-Matrix
- Labyrinthspiel mit Joystick und TFT
- Länder-Info
- LED-Matrix - Countdown
- LED-Matrix - Joystick-Spiel
- LED-Matrix - Lauflicht
- LED-Matrix - Würfeln
Letzte Aktualisierung: