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:

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// 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.

 

#include <LiquidCrystal_I2C.h>

#include <Keypad.h>

 

Další podobné články

Saimon říká:

Hra „Simon říká“ realizovaná pomocí Arduina je skvělým projektem, jehož cílem je spojit zábavu s učením a rozvojem technických dovedností. Hráč se snaží zapamatovat a správně zopakovat sekvenci světelných nebo zvukových signálů, čímž si trénuje paměť, koncentraci a rychlé reakce.

ROBOTICKÉ RAMENO

Stavebnice obsahuje všechny potřebné díly na sestavení robotnického ramene včetně spojovacího materiálu, pouze je nutné dokoupit čtyři kusy MIKRO SERV SG90. Dále je nutné dokoupit řídící jednotku já jsem použil domácí zásoby ARDUINO NANO a pro něho pak modul ARDUINO NANO IO SHIELD pro jednoduchost zapojení. Díly pro sestavení ramene jdou dobře tzv. vylamovat „vypadávají skoro sami. K servům pokud použijete nové tak doporučuji je před montáží odzkoušet zda jsou funkční v plném rozsahu tj. od 0° do 180°, po namontování a zjištění že servo nefunguje to pak opravdu dost zahýbá s nervy.