Kategorie: Anzeigemodule
Schlagwörter: LCD I2C

Ziel des Projekts
Das Tastenfeld soll dazu verwendet werden um Multiplikationen durchzuführen und das Ergebnis soll im Seriellen Monitor und auf einem LCD angezeigt werden.
Benötigte Bauteile
- ⇒4-zeiliges LCD mit I²C-Schnittstelle
- Lautsprecher
- ⇒Tastenpad 3×4
- Leitungsdrähte
Benötigte Bibliotheken


Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Das Programm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include "Adafruit_Keypad.h" #include "LiquidCrystal_I2C.h" int LAUTSPRECHER = 13; // Größe des Tastenfeldes // 3 Spalten const byte SPALTEN = 3; // 4 Zeilen const byte REIHEN = 4; // die Ziffern/Zeichen: // Array 3 x 4 char Tasten[REIHEN][SPALTEN] = { { '#', '0', '*' }, { '9', '8', '7' }, { '6', '5', '4' }, { '3', '2', '1' } }; // die Pins für die 3 Spalten byte SpaltenPins[SPALTEN] = { 3, 4, 5 }; // die Pins für die 4 Zeilen byte ReihenPins[REIHEN] = { 6, 7, 8, 9 }; // TastenFeld ⇒ Name des Keypads // -> Zuordnung der Pins zu den REIHEN und SPALTEN des Arrays Adafruit_Keypad Tastenfeld = Adafruit_Keypad(makeKeymap(Tasten), ReihenPins, SpaltenPins, REIHEN, SPALTEN); /* LCD initialisieren 0x27 -> I2C-ID 20 -> Anzahl der Zeichen pro Zeile 4 -> Anzahl der Zeilen */ LiquidCrystal_I2C lcd(0x27, 20, 4); // setzt die Position der Spalte auf dem LCD int PositionSpalte = 0; // char-Array für die eingegebenen Zeichen char Zeichen[50]; // Position des eingegebenen Zeichens im char-Array int Position = 0; // beinhaltet die vollständige Rechnung String Rechnung; |
Der setup-Teil:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { Serial.begin(9600); // Tastenfeld starten Tastenfeld.begin(); // LCD einschalten, Startbildschirm zeigen 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
void loop() { String GleichZeichen = " = "; lcd.setCursor(Position, 2); // Tastenfeld abfragen Tastenfeld.tick(); while (Tastenfeld.available()) { /* wenn eine Aufgabe ausgegeben 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); // char-Array Zeichen leeren for (int i = 0; i < sizeof(Zeichen); i++) { Zeichen[i] = NULL; } Position = 0; PositionSpalte = 0; } // gedrückte Taste lesen keypadEvent Taste = Tastenfeld.read(); // wenn die Taste losgelassen wurde // Wert abgefragter Taste zu char umwandeln if (Taste.bit.EVENT == KEY_JUST_RELEASED) { // eingegebenes Zeichen an der aktuellen Position speichern Zeichen[Position] = (char)Taste.bit.KEY; // Ton ausgeben tone(LAUTSPRECHER, 1000); delay(50); noTone(LAUTSPRECHER); // Zeichen anzeigen // # soll nicht angezeigt werden if (Taste.bit.KEY != 35) { Serial.print(Zeichen[Position]); lcd.print(Zeichen[Position]); } // nächstes Zeichen -> Position erhöhen Position ++; // Ausgabe LCD eine Position weiter PositionSpalte ++; // # (ASCII-Code = 35) gedrückt ⇒ Rechnung ausführen if (Taste.bit.KEY == 35) { // char-Array in String umwandeln Rechnung = String(Zeichen); // letztes Zeichen ist # ⇒ muss entfernt werden Rechnung = Rechnung.substring(0, Position - 1); // Position des Malzeichens bestimmen // Zählung beginnt mit 0 int MalZeichen = Rechnung.indexOf('*'); // erster Faktor: von 0 bis zur Position des Malzeichens String FaktorEins = Rechnung.substring(0, MalZeichen); /* zweiter Faktor: von der Position hinter dem Malzeichen bis zum vorletzten Zeichen das letzte Zeichen ist # ⇒ soll entfernt werden */ String FaktorZwei = Rechnung.substring(MalZeichen + 1, Rechnung.length()); /* 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(); } } } } |
Ergänze das Programm mit der Funktion RechnungAusgeben().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
void RechnungAusgeben() { // Ausgabe Serieller Monitor Serial.println("\n" + 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 Laenge < 20 Zeichen else lcd.print(Rechnung); } |
Ähnliche Projekte
Letzte Aktualisierung:

