Калькулятор на Arduino с мембранной клавиатурой и LCD
В этом проекте мы соберём простой калькулятор на базе Arduino Uno, который позволяет вводить числа и арифметические операции с помощью мембранной клавиатуры 4×4, а результат вычислений отображается на LCD‑дисплее. Такой калькулятор хорошо подходит для обучения работе с клавиатурой в виде матрицы и выводом информации на экран.
Где и зачем используется
Проект полезен как учебный пример для полных новичков в электронике и программировании. Он демонстрирует, как считывать нажатия клавиш из матрицы, накапливать выражение, выполнять арифметику с приоритетом операций и выводить результат на 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 |
Принцип работы
Мембранная клавиатура устроена в виде матрицы 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, но код и пины нужно подстроить.