Калькулятор на Arduino
Этот проект представляет собой калькулятор на базе Arduino, который использует матричную клавиатуру для ввода данных и LCD1602 дисплей для отображения результатов. Калькулятор может выполнять основные арифметические операции: сложение, вычитание, умножение и деление.
Проект демонстрирует, как легко создать полезное устройство с использованием Arduino, и может служить отличным учебным материалом для начинающих и опытных разработчиков.
В этом проекте мы создадим калькулятор на базе Arduino, который будет использовать матричную клавиатуру для ввода данных и LCD1602 для отображения результатов. Такой калькулятор может выполнять основные арифметические операции: сложение, вычитание, умножение и деление.
Необходимые компоненты
Arduino (например, Arduino Uno)
LCD1602 (с I2C интерфейсом)
Матричная клавиатура (4x4)
Соединительные провода
Подключение компонентов
Подключите компоненты согласно следующей схеме:
LCD1602:
VCC -> 5V
GND -> GND
SDA -> A4 (на Arduino Uno)
SCL -> A5 (на Arduino Uno)
Матричная клавиатура:
R1 -> D9
R2 -> D8
R3 -> D7
R4 -> D6
C1 -> D5
C2 -> D4
C3 -> D3
C4 -> D2

Установка библиотек
Для работы с LCD1602 и матричной клавиатурой, нам потребуются библиотеки LiquidCrystal_I2C и AlashKeypadMatrix.
Шаги по установке библиотек:
LiquidCrystal_I2C:
Скачайте библиотеку LiquidCrystal_I2C.
Откройте Arduino IDE и перейдите в меню Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку….
Выберите скачанный .zip файл и нажмите Открыть.
AlashKeypadMatrix:
Скачайте библиотеку AlashKeypadMatrix.
Повторите те же шаги, что и для установки библиотеки LiquidCrystal_I2C.
Программирование Arduino
Полный код для проекта:
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD1602
#include <AlashKeypadMatrix.h> // Подключаем библиотеку для работы с матричной клавиатурой
LiquidCrystal_I2C lcd(0x27, 16, 2); // Инициализируем LCD с адресом 0x27 и размером 16x2
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};
AlashKeypadMatrix keypad = AlashKeypadMatrix(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String inputString = "";
double num1 = 0, num2 = 0;
char op = '\0';
bool resultDisplayed = false;
int cursorPosition = 0;
void setup() {
lcd.init();
lcd.backlight();
displayReadyMessage();
}
void loop() {
char key = keypad.getKey();
if (key) {
handleKeyPress(key);
}
}
void displayReadyMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Calc Ready:");
lcd.setCursor(0, 1);
}
void handleKeyPress(char key) {
if (key == 'C') {
clearData();
} else if (isDigit(key)) {
handleDigit(key);
} else if (isOperator(key)) {
handleOperator(key);
} else if (key == '=') {
handleEquals();
}
}
void handleDigit(char key) {
if (resultDisplayed) {
clearData();
resultDisplayed = false;
}
if (cursorPosition < 16) {
inputString += key;
lcd.setCursor(cursorPosition, 1);
lcd.print(key);
cursorPosition++;
}
}
void handleOperator(char key) {
if (inputString.length() > 0 && !resultDisplayed) {
num1 = inputString.toDouble();
inputString = "";
op = key;
if (cursorPosition < 16) {
lcd.setCursor(cursorPosition, 1);
lcd.print(op);
cursorPosition++;
}
} else if (resultDisplayed) {
num1 = inputString.toDouble();
inputString = "";
op = key;
lcd.clear();
displayReadyMessage();
lcd.setCursor(0, 1);
lcd.print(num1);
cursorPosition = String(num1).length();
if (cursorPosition < 16) {
lcd.setCursor(cursorPosition, 1);
lcd.print(op);
cursorPosition++;
}
resultDisplayed = false;
} else {
lcd.setCursor(cursorPosition - 1, 1);
lcd.print(key);
op = key;
}
}
void handleEquals() {
if (inputString.length() > 0 && op != '\0') {
num2 = inputString.toDouble();
lcd.setCursor(cursorPosition, 1);
lcd.print("=");
cursorPosition++;
calculateResult();
}
}
void clearData() {
inputString = "";
num1 = 0;
num2 = 0;
op = '\0';
cursorPosition = 0;
resultDisplayed = false;
displayReadyMessage();
}
void calculateResult() {
double result;
switch (op) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/':
if (num2 != 0) {
result = num1 / num2;
} else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Err: Div by 0");
delay(2000);
clearData();
return;
}
break;
}
String resultString = formatResult(result);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Result:");
lcd.setCursor(0, 1);
lcd.print(resultString);
resultDisplayed = true;
cursorPosition = resultString.length();
inputString = resultString;
}
String formatResult(double result) {
String resultString = String(result, 5);
if (resultString.length() > 16) {
resultString = String(result, 1);
if (resultString.length() > 16) {
resultString = String(result, 0);
if (resultString.length() > 16) {
resultString = String(result, 1);
}
}
}
return resultString;
}
bool isDigit(char key) {
return key >= '0' && key <= '9';
}
bool isOperator(char key) {
return key == '+' || key == '-' || key == '*' || key == '/';
}
Заключение
Этот проект демонстрирует, как создать простой калькулятор на базе Arduino с использованием матричной клавиатуры и LCD дисплея. Такой калькулятор может быть полезен для изучения основ программирования и работы с Arduino, а также для создания различных DIY-проектов.