Простой калькулятор на Arduino + клавиатура 4×4 + LCD 1602 I2C

Полноценный калькулятор на четырёх действиях (+ − × ÷) с выводом на LCD 1602 и русским текстом. Отличный стартовый проект из серии «Уроки Arduino для новичков».

Калькулятор 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 позволяет отображать результаты без ограничений.

📁 Скачать примеры