Калькулятор на Arduino с LCD 16×2 и матричной клавиатурой 4×4 (обучение работе с Proteus)

В данной статье рассматривается создание простого калькулятора на Arduino с использованием матричной клавиатуры 4×4 и ЖК-дисплея 16×2.
Проект разработан специально для обучения работе с симулятором Proteus и демонстрирует обработку пользовательского ввода, отображение математического выражения и пошаговое вычисление результата.

Arduino с датчиком дождя и LCD

Скетч реализует полноценный калькулятор с поддержкой операций сложения, вычитания, умножения и деления. Верхняя строка дисплея используется для отображения вводимого выражения, а нижняя — для текущего числа или результата. Такой подход делает работу калькулятора наглядной и удобной для пользователя.

Назначение проекта

Цель проекта — показать практическую реализацию калькулятора на Arduino без использования сторонних библиотек для клавиатуры:

  • опрос матричной клавиатуры 4×4 вручную;
  • обработка цифровых и управляющих клавиш;
  • вывод выражения и результата на LCD 16×2;
  • пошаговое вычисление без приоритета операций;
  • структурированная и понятная логика программы.

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

Используемые компоненты

  • Arduino UNO;
  • Матричная клавиатура 4×4;
  • ЖК-дисплей 16×2 (HD44780);
  • Соединительные провода;
  • Proteus 8 или 9 с поддержкой Arduino.

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

Клавиатура подключена напрямую к цифровым пинам Arduino. Четыре строки настроены как выходы, а четыре столбца — как входы с INPUT_PULLUP. При опросе очередная строка притягивается к LOW, после чего проверяется состояние столбцов.

Каждое нажатие клавиши возвращает символ: цифру, оператор или управляющую команду. Программа обрабатывает ввод поэтапно, не используя сложный парсер выражений.

  • цифры формируют текущее число;
  • операторы применяют предыдущее вычисление;
  • кнопка C полностью сбрасывает состояние;
  • кнопка = завершает вычисление и выводит результат.

Вычисления выполняются последовательно, в порядке ввода, что упрощает алгоритм и делает код максимально наглядным.

Организация вывода на LCD

Для удобства пользователя дисплей разделён логически:

  • верхняя строка — отображение вводимого выражения;
  • нижняя строка — текущее число или итоговый результат.

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

Arduino-скетч

#include <LiquidCrystal.h>
#include <ctype.h>

// === KEYPAD ===
#define r1 0
#define r2 1
#define r3 2
#define r4 3
#define c1 4
#define c2 5
#define c3 6
#define c4 7

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

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

// === СОСТОЯНИЕ ===
String expr = "";      // верхняя строка (ВВОД)
long acc = 0;          // аккумулятор
long num = 0;          // текущий ввод
char op = 0;
bool first = true;

// === SETUP ===
void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
    pinMode(i + 4, INPUT_PULLUP);
  }

  lcd.begin(16, 2);
  lcd.clear();
}

// === ЧТЕНИЕ КЛАВИШ ===
char getKey() {
  for (int r = 0; r < 4; r++) {
    digitalWrite(r, LOW);
    for (int c = 0; c < 4; c++) {
      if (!digitalRead(c + 4)) {
        while (!digitalRead(c + 4));
        digitalWrite(r, HIGH);
        return keys[r][c];
      }
    }
    digitalWrite(r, HIGH);
  }
  return 0;
}

// === ПЕРЕРИСОВКА ===
void draw() {
  lcd.setCursor(0,0);
  lcd.print("                ");
  lcd.setCursor(0,0);
  lcd.print(expr);

  lcd.setCursor(0,1);
  lcd.print("                ");
  lcd.setCursor(0,1);
  lcd.print(num);
}

// === ВЫЧИСЛЕНИЕ ===
void apply() {
  if (first) {
    acc = num;
    first = false;
  } else {
    switch (op) {
      case '+': acc += num; break;
      case '-': acc -= num; break;
      case '*': acc *= num; break;
      case '/': if (num) acc /= num; break;
    }
  }
}

void loop() {
  char k = getKey();
  if (!k) return;

  // ЦИФРЫ
  if (isdigit(k)) {
    num = num * 10 + (k - '0');
    expr += k;
    draw();
    return;
  }

  // СБРОС
  if (k == 'C') {
    expr = "";
    acc = 0;
    num = 0;
    op = 0;
    first = true;
    draw();
    return;
  }

  // ОПЕРАТОР
  if (k == '+' || k == '-' || k == '*' || k == '/') {
    apply();
    op = k;
    num = 0;
    expr += k;
    draw();
    return;
  }

  // РАВНО
  if (k == '=') {
    apply();
    num = acc;
    draw();

    // подготовка к новому выражению
    expr = "";
    acc = 0;
    op = 0;
    first = true;
  }
}

Работа проекта в Proteus

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

Запуск проекта в Proteus

  • распакуйте архив с проектом;
  • откройте файл .pdsprj;
  • проверьте путь к файлу .hex в свойствах Arduino;
  • нажмите Run Simulation;
  • используйте клавиатуру для ввода выражений.

Если что-то не работает

Если возникают проблемы с запуском проекта или непонятен принцип работы, рекомендуется пройти базовый урок по Proteus.

Подробно разобран первый проект в Proteus:
Первый проект в Proteus — мигание светодиода

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