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.