Калькулятор на Arduino

Этот проект представляет собой калькулятор на базе Arduino, который использует матричную клавиатуру для ввода данных и LCD1602 дисплей для отображения результатов. Калькулятор может выполнять основные арифметические операции: сложение, вычитание, умножение и деление.

Проект демонстрирует, как легко создать полезное устройство с использованием Arduino, и может служить отличным учебным материалом для начинающих и опытных разработчиков.

В этом проекте мы создадим калькулятор на базе Arduino, который будет использовать матричную клавиатуру для ввода данных и LCD1602 для отображения результатов. Такой калькулятор может выполнять основные арифметические операции: сложение, вычитание, умножение и деление.

Необходимые компоненты

  1. Arduino (например, Arduino Uno)

  2. LCD1602 (с I2C интерфейсом)

  3. Матричная клавиатура (4x4)

  4. Соединительные провода

Подключение компонентов

Подключите компоненты согласно следующей схеме:

  • LCD1602:

  • VCC -> 5V

  • GND -> GND

  • SDA -> A4 (на Arduino Uno)

  • SCL -> A5 (на Arduino Uno)

  • Матричная клавиатура:

  • R1 -> D9

  • R2 -> D8

  • R3 -> D7

  • R4 -> D6

  • C1 -> D5

  • C2 -> D4

  • C3 -> D3

  • C4 -> D2

Калькулятор

Установка библиотек

Для работы с LCD1602 и матричной клавиатурой, нам потребуются библиотеки LiquidCrystal_I2C и AlashKeypadMatrix.

Шаги по установке библиотек:

  1. LiquidCrystal_I2C:

  • Скачайте библиотеку LiquidCrystal_I2C.

  • Откройте Arduino IDE и перейдите в меню Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку….

  • Выберите скачанный .zip файл и нажмите Открыть.

  1. AlashKeypadMatrix:

  • Скачайте библиотеку AlashKeypadMatrix.

  • Повторите те же шаги, что и для установки библиотеки LiquidCrystal_I2C.

Программирование Arduino

Полный код для проекта:

calculator.ino
#include <LiquidCrystal_I2C.h>      // Подключаем библиотеку для работы с LCD1602
#include <AlashKeypadMatrix.h>      // Подключаем библиотеку для работы с матричной клавиатурой

LiquidCrystal_I2C lcd(0x27, 16, 2); // Инициализируем LCD с адресом 0x27 и размером 16x2

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', '+'},
  {'4', '5', '6', '-'},
  {'7', '8', '9', '*'},
  {'C', '0', '=', '/'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

AlashKeypadMatrix keypad = AlashKeypadMatrix(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

String inputString = "";
double num1 = 0, num2 = 0;
char op = '\0';
bool resultDisplayed = false;
int cursorPosition = 0;

void setup() {
  lcd.init();
  lcd.backlight();
  displayReadyMessage();
}

void loop() {
  char key = keypad.getKey();
  if (key) {
    handleKeyPress(key);
  }
}

void displayReadyMessage() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Calc Ready:");
  lcd.setCursor(0, 1);
}

void handleKeyPress(char key) {
  if (key == 'C') {
    clearData();
  } else if (isDigit(key)) {
    handleDigit(key);
  } else if (isOperator(key)) {
    handleOperator(key);
  } else if (key == '=') {
    handleEquals();
  }
}

void handleDigit(char key) {
  if (resultDisplayed) {
    clearData();
    resultDisplayed = false;
  }
  if (cursorPosition < 16) {
    inputString += key;
    lcd.setCursor(cursorPosition, 1);
    lcd.print(key);
    cursorPosition++;
  }
}

void handleOperator(char key) {
  if (inputString.length() > 0 && !resultDisplayed) {
    num1 = inputString.toDouble();
    inputString = "";
    op = key;
    if (cursorPosition < 16) {
      lcd.setCursor(cursorPosition, 1);
      lcd.print(op);
      cursorPosition++;
    }
  } else if (resultDisplayed) {
    num1 = inputString.toDouble();
    inputString = "";
    op = key;
    lcd.clear();
    displayReadyMessage();
    lcd.setCursor(0, 1);
    lcd.print(num1);
    cursorPosition = String(num1).length();
    if (cursorPosition < 16) {
      lcd.setCursor(cursorPosition, 1);
      lcd.print(op);
      cursorPosition++;
    }
    resultDisplayed = false;
  } else {
    lcd.setCursor(cursorPosition - 1, 1);
    lcd.print(key);
    op = key;
  }
}

void handleEquals() {
  if (inputString.length() > 0 && op != '\0') {
    num2 = inputString.toDouble();
    lcd.setCursor(cursorPosition, 1);
    lcd.print("=");
    cursorPosition++;
    calculateResult();
  }
}

void clearData() {
  inputString = "";
  num1 = 0;
  num2 = 0;
  op = '\0';
  cursorPosition = 0;
  resultDisplayed = false;
  displayReadyMessage();
}

void calculateResult() {
  double result;
  switch (op) {
    case '+': result = num1 + num2; break;
    case '-': result = num1 - num2; break;
    case '*': result = num1 * num2; break;
    case '/':
      if (num2 != 0) {
        result = num1 / num2;
      } else {
        lcd.clear();
        lcd.setCursor(0, 1);
        lcd.print("Err: Div by 0");
        delay(2000);
        clearData();
        return;
      }
      break;
  }
  String resultString = formatResult(result);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Result:");
  lcd.setCursor(0, 1);
  lcd.print(resultString);
  resultDisplayed = true;
  cursorPosition = resultString.length();
  inputString = resultString;
}

String formatResult(double result) {
  String resultString = String(result, 5);
  if (resultString.length() > 16) {
    resultString = String(result, 1);
    if (resultString.length() > 16) {
      resultString = String(result, 0);
      if (resultString.length() > 16) {
        resultString = String(result, 1);
      }
    }
  }
  return resultString;
}

bool isDigit(char key) {
  return key >= '0' && key <= '9';
}

bool isOperator(char key) {
  return key == '+' || key == '-' || key == '*' || key == '/';
}

Заключение

Этот проект демонстрирует, как создать простой калькулятор на базе Arduino с использованием матричной клавиатуры и LCD дисплея. Такой калькулятор может быть полезен для изучения основ программирования и работы с Arduino, а также для создания различных DIY-проектов.