Простой калькулятор на Arduino + клавиатура 4×4 + LCD 1602 I2C
Полноценный калькулятор на четырёх действиях (+ − × ÷) с выводом на LCD 1602 и русским текстом. Отличный стартовый проект из серии «Уроки Arduino для новичков».
Что понадобится
- Arduino Uno/Nano
- Клавиатура матричная 4×4
- LCD 1602 с I2C-модулем
- Провода и макетки
Подключение
- Клавиатура → D2–D9 (по порядку 8 пинов)
- LCD I2C → A4 (SDA), A5 (SCL), VCC, GND
Готовый скетч
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27,16,2); // адрес найдите сканером I2C
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);
float num1 = 0, num2 = 0, result = 0;
char action = 0;
bool finished = false;
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Простой кальк.");
delay(2000);
lcd.clear();
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
if (!action) num1 = num1 * 10 + (key - '0');
else num2 = num2 * 10 + (key - '0');
showInput();
}
if (key == '+' || key == '-' || key == '*' || key == '/') {
action = key;
showInput();
}
if (key == '=') {
calculate();
finished = true;
showResult();
}
if (key == 'C') {
num1 = num2 = result = 0;
action = 0;
finished = false;
lcd.clear();
}
}
}
void showInput() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(num1);
if (action) lcd.print(action);
if (action) lcd.print(num2);
}
void calculate() {
switch(action) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/': result = num1 / num2; break;
}
}
void showResult() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(num1);
lcd.print(action);
lcd.print(num2);
lcd.print("=");
lcd.setCursor(0,1);
lcd.print(result, 2);
}
реализует простой калькулятор на LCD 16×2 и матричной клавиатуре 4×4.
поддерживает операции + − × ÷ с двумя числами.
показывает ввод и результат на экране.
кнопка C очищает всё.
Библиотеки
- Keypad
- LiquidCrystal_I2C
- Для русских букв — LiquidCrystal_I2C_Russian (или патч шрифтов)
Как работает
- Ввод первого числа → действие → второе число → = → результат
- C — полный сброс
- Поддержка дробных результатов при делении
Что добавить дальше
- Кнопку «.» для дробных чисел
- Пищалку на каждое нажатие
- Функции sin/cos/sqrt
- Переход на TFT-дисплей
Заключение
За 30 минут вы получаете полностью рабочий калькулятор — отличный проект для новичков. Освоили клавиатуру, LCD по I2C и базовую логику. Готово к установке в корпус или дальнейшему развитию!
FAQ — Простой калькулятор на Arduino + 4×4 + LCD 1602
Можно ли использовать Arduino Nano вместо Uno?
Да, проект одинаково хорошо работает на Arduino Nano и Uno. Nano удобнее для компактных конструкций, занимает меньше места и легко вставляется в макетку. Подключение клавиатуры и I2C-дисплея остаётся таким же.
Как узнать адрес LCD 1602 по I2C?
Используйте скетч I2C Scanner из стандартных примеров. Запустите его и откройте монитор порта — вы увидите адрес модуля, обычно это 0x27 или 0x3F. Этот адрес указывается в конструкторе LiquidCrystal_I2C.
Можно ли подключить клавиатуру к другим пинам, а не D2–D9?
Да, распиновку можно изменить. Важно сохранить порядок: сначала 4 строки, затем 4 столбца. Значения rowPins и colPins в коде нужно изменить под выбранные GPIO. Библиотека Keypad корректно адаптируется к любой конфигурации.
Поддерживает ли калькулятор отрицательные числа?
В базовой версии — нет. Проект рассчитан на ввод положительных значений. Однако поддержка отрицательных чисел легко добавляется: достаточно обработать знак перед num1 или num2 и реализовать логику ввода символа «−» как префикса.
Почему при делении результат получается с дробью?
Переменные num1, num2 и result имеют тип float. Поэтому деление выполняется в формате с плавающей точкой. Это позволяет получать точные результаты, например 7 ÷ 2 = 3.50. Количество знаков после запятой регулируется в функции showResult().
Можно ли добавить кнопку «.» для ввода дробных чисел?
Да, это реализуемо. Нужно добавить символ «.» в массив клавиш, модифицировать сбор чисел и хранить ввод как строку, а затем преобразовывать в float с помощью toFloat(). Такой режим увеличивает функциональность до полноценного инженерного калькулятора.
Можно ли вывести результат на второй строке LCD всегда?
Да. В стандартном коде вывод зависит от контекста ввода. Если требуется постоянное отображение результата — достаточно изменить функцию showInput() так, чтобы вторая строка очищалась и выводила промежуточное значение result.
Можно ли расширить калькулятор функциями sin, cos, sqrt?
Да, Arduino поддерживает математические функции из math.h. Нужно добавить новые клавиши, расширить парсер команды action и вызвать стандартные функции sin(), cos(), sqrt() и другие. LCD 1602 позволяет отображать результаты без ограничений.