#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
LiquidCrystal_I2C lcd(0x27, 20, 4);
// 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;
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);
}
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;
}
// 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 ++;
// # (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();
}
}
}
}
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 < 20 Zeichen
else lcd.print(Rechnung);
}
Letzte Aktualisierung: