Kalkulačka

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?

  1. 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.
  2. Výpočet:
    • Stiskem tlačítka = kalkulačka provede výpočet podle zadané operace a zobrazí výsledek na LCD displeji.
  3. 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.

 

Další podobné články

Senzor oxidu uhelnatého MQ-9

Senzor reaguje nejvíce na oxid uhelnatý (CO) ale i na hořlavé plyny metan a propan. Aktivním prvkem tohoto senzoru je tenká vrstva SnO2, jejíž odpor se mění s koncentrací zmíněných plynů.

RFID Systém s LCD displejem, bzučákem a servomotorem

Tento projekt ukazuje, jak vytvořit jednoduchý přístupový systém pomocí RFID čtečky, LCD displeje, bzučáku a servomotoru. Systém umožňuje kontrolu přístupu pomocí RFID tagů – při správném tagu se servo otočí, zobrazí se zpráva, a systém se resetuje. Při špatném tagu bzučák vydá zvuk a zobrazí se zamítnutí přístupu.