Tento projekt demonstruje vytvoření jednoduché kalkulačky s LCD displejem a 4x4 maticovou klávesnicí. Kalkulačka umožňuje základní aritmetické operace jako sčítání, odčítání, násobení a dělení.
Jak to funguje?
- Vyhodnocení vstupu:
- První zadané číslo je uloženo jako první operand.
- Po stisknutí operace a zadání druhého čísla se kalkulačka připraví na výpočet.
- Výpočet:
- Stiskem tlačítka = kalkulačka provede výpočet podle zadané operace a zobrazí výsledek na LCD displeji.
- Reset:
- Tlačítko C vymaže aktuální vstupy a resetuje kalkulačku.
Co potřebuji?
- Arduino Uno R3 (může být i klon)
- 4x4 maticovou klávesnici
- I2C LCD displej (16x2)
- Dráty
Zapojení: (Viz schéma):
- I2C LCD displej:
- SDA → Pin A4, SCL → Pin A5, VCC → 5V, GND → GND
- Klávesnice:
- Řádky (R1–R4): Piny 9, 8, 7, 6
- Sloupce (C1–C4): Piny 5, 4, 3, 2
Kód pro Arduino:
// Nastavení I2C LCD displeje
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Nastavení 4x4 klávesnice
const byte RADKY = 4; // Počet řádků
const byte SLOUPCE = 4; // Počet sloupců
char klavesy[RADKY][SLOUPCE] = {
{'7', '8', '9', '/'},
{'4', '5', '6', '*'},
{'1', '2', '3', '-'},
{'C', '0', '=', '+'} // Znak "C" pro mazání
};
byte pinRadky[RADKY] = {9, 8, 7, 6}; // Piny pro řádky
byte pinSloupce[SLOUPCE] = {5, 4, 3, 2}; // Piny pro sloupce
Keypad klavesnice = Keypad(makeKeymap(klavesy), pinRadky, pinSloupce, RADKY, SLOUPCE);
// Proměnné pro ukládání stavu kalkulačky
String vstup = ""; // Uložený vstup
float prvniCislo = 0.0; // První číslo
float druheCislo = 0.0; // Druhé číslo
char operace = ' '; // Operátor (+, -, *, /)
bool pocitam = false; // Indikace, zda se právě počítá
void setup() {
lcd.init(); // Inicializace LCD
lcd.backlight(); // Zapnutí podsvícení
lcd.setCursor(0, 0);
lcd.print("Kalkulacka"); // Úvodní zpráva
delay(2000);
lcd.clear();
}
void loop() {
char stisk = klavesnice.getKey();
if (stisk) { // Pokud je stisknuta klávesa
if (stisk >= '0' & stisk <= '9') {
zpracujCislo(stisk); // Zpracování čísla
} else if (stisk == '/') {
zpracujOperaci('/'); // Dělení
} else if (stisk == '*') {
zpracujOperaci('*'); // Násobení
} else if (stisk == '-') {
zpracujOperaci('-'); // Odečítání
} else if (stisk == '+') {
zpracujOperaci('+'); // Sčítání
} else if (stisk == '=') {
vypocti(); // Výpočet výsledku
} else if (stisk == 'C') {
vycisti(); // Vymazání kalkulačky
}
}
}
// Funkce pro zpracování čísel
void zpracujCislo(char cislo) {
if (vstup.length() < 16) { // Kontrola, že vstup nepřekročí šířku displeje
vstup += cislo;
lcd.setCursor(0, 0);
lcd.print(vstup);
}
}
// Funkce pro zpracování operátorů
void zpracujOperaci(char oper) {
if (!pocitam & vstup.length() > 0) {
prvniCislo = vstup.toFloat(); // Převedení vstupu na číslo
operace = oper; // Uložení operátoru
pocitam = true;
vstup = ""; // Vymazání vstupu pro druhé číslo
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(vstup); // Zobrazení aktuálního vstupu
lcd.setCursor(0, 1);
lcd.print(operace); // Zobrazení operace na novém řádku
}
}
// Funkce pro výpočet
void vypocti() {
if (pocitam & vstup.length() > 0) {
druheCislo = vstup.toFloat(); // Převedení vstupu na druhé číslo
float vysledek = 0.0;
switch (operace) {
case '+': vysledek = prvniCislo + druheCislo; break;
case '-': vysledek = prvniCislo - druheCislo; break;
case '*': vysledek = prvniCislo * druheCislo; break;
case '/': vysledek = (druheCislo != 0) ? prvniCislo / druheCislo : NAN; break;
}
lcd.clear();
if (String(vysledek).length() > 16) { // Kontrola přetečení
lcd.print("Chyba: Prilis");
lcd.setCursor(0, 1);
lcd.print("dlouhy vysledek");
} else {
lcd.print("Vysledek:");
lcd.setCursor(0, 1);
lcd.print(vysledek, 4); // Výsledek s přesností na 4 desetinná místa
}
}
}
// Funkce pro vymazání kalkulačky
void vycisti() {
vstup = "";
prvniCislo = 0.0;
druheCislo = 0.0;
operace = ' ';
pocitam = false;
lcd.clear();
lcd.print("Vymazano");
delay(1000);
lcd.clear();
}
Využití v praxi:
- Prototypy: Základní logiku lze rozšířit na složitější aplikace, například finanční nebo vědecké výpočty.
- Kalkulačka: Lze použít jako normální kalkulačka.