Калькулятор на Arduino с мембранной клавиатурой и LCD

В этом проекте мы соберём простой калькулятор на базе Arduino Uno, который позволяет вводить числа и арифметические операции с помощью мембранной клавиатуры 4×4, а результат вычислений отображается на LCD‑дисплее. Такой калькулятор хорошо подходит для обучения работе с клавиатурой в виде матрицы и выводом информации на экран.

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

Где и зачем используется

Проект полезен как учебный пример для полных новичков в электронике и программировании. Он демонстрирует, как считывать нажатия клавиш из матрицы, накапливать выражение, выполнять арифметику с приоритетом операций и выводить результат на LCD дисплей. Такой калькулятор можно использовать в прототипах, на уроках электроники, или как базовый интерфейс для более сложных устройств.

Что понадобится для проекта

  • Arduino Uno (или аналог)
  • Мембранная клавиатура 4×4 (16 кнопок)
  • 16×2 LCD с I2C‑модулем
  • Бредборд и перемычки
  • Arduino IDE для загрузки скетча

Назначение пинов

Компонент Пин Arduino Описание
Row 0 клавиатуры D9 Первая строка матрицы клавиш
Row 1 D8 Вторая строка
Row 2 D7 Третья строка
Row 3 D6 Четвёртая строка
Col 0 D5 Первая колонка клавиш
Col 1 D4 Вторая колонка
Col 2 D3 Третья колонка
Col 3 D2 Четвёртая колонка
LCD SDA A4 Данные I²C
LCD SCL A5 Тактовый I²C
Калькулятор на Arduino

Принцип работы

Мембранная клавиатура устроена в виде матрицы 4×4. Сканирование осуществляется путём опроса строк и колонок: при нажатии кнопки соединяется соответствующая строка и колонка, что позволяет библиотеке Keypad определить конкретную клавишу.

Клавиши включают цифры 0–9 и арифметические символы ‘+’, ‘-‘, ‘*’ и ‘/’. Когда пользователь вводит выражение, символы добавляются к строке, которая отображается на первых 16 символах LCD. При нажатии ‘=’, выражение оценивается функцией с поддержкой приоритета операций (умножение и деление выполняются раньше сложения и вычитания). После вычисления результата он выводится под вводимой строкой.

Пример скетча Arduino

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

// Настройка клавиатуры
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};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String expression = "";

void setup() {
  lcd.begin(16, 2, LCD_5x8DOTS);
  lcd.backlight();
  lcd.clear();
  lcd.print("Calculator Ready");
  delay(1500);
  lcd.clear();
}

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

  if (key != NO_KEY) {
    if ((key >= '0' && key <= '9') || key == '+' || key == '-' || key == '*' || key == '/') {
      if (expression.length() < 16) {
        expression += key;
        lcd.setCursor(0, 0);
        lcd.print(expression);
      }
    } else if (key == '=') {
      float result = evaluateWithPrecedence(expression);
      lcd.setCursor(0, 1);
      lcd.print("= ");
      lcd.print(result);
      expression = "";
    } else if (key == 'C') {
      expression = "";
      lcd.clear();
    }
  }
}

// Оценка выражения с приоритетом операций
float evaluateWithPrecedence(String expr) {
  float numbers[10];
  char operators[10];
  int numIndex = 0, opIndex = 0;
  String temp = "";

  for (int i = 0; i < expr.length(); i++) {
    char c = expr.charAt(i);
    if (c >= '0' && c <= '9') {
      temp += c;
    } else {
      numbers[numIndex++] = temp.toFloat();
      temp = "";
      operators[opIndex++] = c;
    }
  }
  numbers[numIndex] = temp.toFloat();

  // Сначала *, /
  for (int i = 0; i < opIndex; i++) {
    if (operators[i] == '*' || operators[i] == '/') {
      float a = numbers[i];
      float b = numbers[i+1];
      float r = (operators[i] == '*') ? a * b : (b != 0 ? a / b : 0);
      numbers[i] = r;
      for (int j = i + 1; j < numIndex; j++) numbers[j] = numbers[j+1];
      for (int j = i; j < opIndex - 1; j++) operators[j] = operators[j+1];
      numIndex--;
      opIndex--;
      i--;
    }
  }

  // + и -
  float total = numbers[0];
  for (int i = 0; i < opIndex; i++) {
    if (operators[i] == '+') total += numbers[i + 1];
    else if (operators[i] == '-') total -= numbers[i + 1];
  }
  return total;
}
  

Заключение

Калькулятор с мембранной клавиатурой на Arduino — отличный проект, который объединяет ввод данных, обработку выражений и вывод на экран. Он развивает навыки работы с библиотеками, матрицами кнопок и простыми алгоритмами интерпретации арифметики.

FAQ — Arduino калькулятор с мембранной клавиатурой

Почему некоторые кнопки не регистрируются?

Часто проблема в неправильном подключении строк и колонок к Arduino; убедись, что ряды и колонки совпадают с теми пинами, что указаны в коде.

Что делает функция evaluateWithPrecedence?

Она вычисляет арифметическое выражение, учитывая приоритет умножения и деления перед сложением и вычитанием.

Можно ли использовать другой LCD?

Да, можно использовать любой 16×2 LCD, важно правильно указать адрес I2C и инициализировать его в setup().

Клавиатура требует библиотеку?

Да — библиотека Keypad упрощает работу с матричной клавиатурой и позволяет обрабатывать нажатия.

Можно ли расширить клавиши?

Да — можно использовать любую матричную клавиатуру 4×3 или 4×4, но код и пины нужно подстроить.

Вам также может понравиться: