Делаем калькулятор Ардуино c клавиатурой и ЖК-дисплеем

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

О проекте

Этот калькулятор сможет выполнять простые операции, такие как сложение, вычитание, умножение и деление с целыми числами. Но как только вы поймете концепцию, вы сможете реализовать даже научные функции с помощью встроенных функций Arduino.

В конце этого проекта вы узнаете, как использовать ЖК-дисплей 16x2 и клавиатуру с Arduino, а также как легко программировать их с помощью доступных библиотек. Вы также поймете, как запрограммировать Arduino для выполнения определенной задачи.

Шаг 1. Комплектующие

Начинаем как всегда с самых основных комплектующих для нашего Ардуино калькулятора:

  • Arduino Uno (любая версия будет работать)
  • ЖК-дисплей 16 × 2
  • Клавиатура 4 × 4
  • Батарея 9V
  • Макет и соединительные провода

Шаг 2. Принципиальная схема

Вы можете соединить все комплектующие калькулятора согласно схеме ниже:

Шаг 3. Код проекта

Вы можете скачать код для нашего калькулятора в архиве ниже, либо скопировать его:

#include //Header file for LCD from https://www.arduino.cc/en/Reference/LiquidCrystal
#include //Header file for Keypad from https://github.com/Chris--A/Keypad

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

// Define the Keymap
char keys[ROWS][COLS] = {

    { '7', '8', '9', 'D' },

    { '4', '5', '6', 'C' },

    { '1', '2', '3', 'B' },

    { '*', '0', '#', 'A' }

};

byte rowPins[ROWS] = { 0, 1, 2, 3 }; // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 4, 5, 6, 7 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.

Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Create the Keypad

const int rs = 8,
    en = 9,
    d4 = 10,
    d5 = 11,
    d6 = 12,
    d7 = 13; //Pins to which LCD is connected
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

long Num1, Num2, Number;
char key, action;
boolean result = false;

void setup() {
    lcd.begin(16, 2); //We are using a 16*2 LCD display
    lcd.print("DIY Calculator"); //Display a intro message
    lcd.setCursor(0, 1); // set the cursor to column 0, line 1
    lcd.print("-CircuitDigest"); //Display a intro message 

    delay(2000); //Wait for display to show info
    lcd.clear(); //Then clean it
}

void loop() {

    key = kpd.getKey(); //storing pressed key value in a char

    if (key != NO_KEY)
        DetectButtons();

    if (result == true)
        CalculateResult();

    DisplayResult();
}

void DetectButtons() {
    lcd.clear(); //Then clean it
    if (key == '*') //If cancel Button is pressed
    { Serial.println("Button Cancel");
        Number = Num1 = Num2 = 0;
        result = false; }

    if (key == '1') //If Button 1 is pressed
    {
        Serial.println("Button 1");
        if (Number == 0)
            Number = 1;
        else
            Number = (Number * 10) + 1; //Pressed twice
    }

    if (key == '4') //If Button 4 is pressed
    {
        Serial.println("Button 4");
        if (Number == 0)
            Number = 4;
        else
            Number = (Number * 10) + 4; //Pressed twice
    }

    if (key == '7') //If Button 7 is pressed
    {
        Serial.println("Button 7");
        if (Number == 0)
            Number = 7;
        else
            Number = (Number * 10) + 7; //Pressed twice
    }


    if (key == '0') {
        Serial.println("Button 0"); //Button 0 is Pressed
        if (Number == 0)
            Number = 0;
        else
            Number = (Number * 10) + 0; //Pressed twice
    }

    if (key == '2') //Button 2 is Pressed
    {
        Serial.println("Button 2");
        if (Number == 0)
            Number = 2;
        else
            Number = (Number * 10) + 2; //Pressed twice
    }

    if (key == '5') {
        Serial.println("Button 5");
        if (Number == 0)
            Number = 5;
        else
            Number = (Number * 10) + 5; //Pressed twice
    }

    if (key == '8') {
        Serial.println("Button 8");
        if (Number == 0)
            Number = 8;
        else
            Number = (Number * 10) + 8; //Pressed twice
    }


    if (key == '#') {
        Serial.println("Button Equal");
        Num2 = Number;
        result = true;
    }

    if (key == '3') {
        Serial.println("Button 3");
        if (Number == 0)
            Number = 3;
        else
            Number = (Number * 10) + 3; //Pressed twice
    }

    if (key == '6') {
        Serial.println("Button 6");
        if (Number == 0)
            Number = 6;
        else
            Number = (Number * 10) + 6; //Pressed twice
    }

    if (key == '9') {
        Serial.println("Button 9");
        if (Number == 0)
            Number = 9;
        else
            Number = (Number * 10) + 9; //Pressed twice
    }

    if (key == 'A' || key == 'B' || key == 'C' || key == 'D') //Detecting Buttons on Column 4
    {
        Num1 = Number;
        Number = 0;
        if (key == 'A') { Serial.println("Addition");
            action = '+'; }
        if (key == 'B') { Serial.println("Subtraction");
            action = '-'; }
        if (key == 'C') { Serial.println("Multiplication");
            action = '*'; }
        if (key == 'D') { Serial.println("Devesion");
            action = '/'; }

        delay(100);
    }

}

void CalculateResult() {
    if (action == '+')
        Number = Num1 + Num2;

    if (action == '-')
        Number = Num1 - Num2;

    if (action == '*')
        Number = Num1 * Num2;

    if (action == '/')
        Number = Num1 / Num2;
}

void DisplayResult() {
    lcd.setCursor(0, 0); // set the cursor to column 0, line 1
    lcd.print(Num1);
    lcd.print(action);
    lcd.print(Num2);

    if (result == true) { lcd.print(" =");
        lcd.print(Number); } //Display the result

    lcd.setCursor(0, 1); // set the cursor to column 0, line 1
    lcd.print(Number); //Display the result
}

Полная программа Arduino для этого урока приведена выше. Код разбит на небольшие куски, которые мы объясним ниже. Как было сказано ранее, мы собираемся связать ЖК-дисплей и клавиатуру с Arduino, используя библиотеки. Итак, сначала добавляем их в нашу Arduino IDE.

Библиотека для LCD уже включена в ваш Arduino по умолчанию, поэтому нам не ней об этом беспокоиться, но её можно скачать по этой ссылке.

Чтобы скачать библиотеку клавиатуры - перейдите на Github. Вы получите ZIP-файл, затем добавите эту библиотеку в Arduino так:

Sketch -> Включить библиотеку -> Добавить .ZIP-файл

Укажете местоположение для этого загруженного файла. После того, как все готово, вы готовы к программированию.

Несмотря на то, что мы использовали библиотеку для использования клавиатуры, мы должны упомянуть несколько деталей о самой клавиатуре для Arduino. Переменные ROWS и COLS сообщают, сколько строк и столбцов имеет наша клавиатура, а раскладка клавиатуры показывает порядок, в котором присутствуют клавиши на клавиатуре. Клавиатура, которую мы используем в этом уроке, выглядит так, как показано выше. Мы также в коде упоминаем к каким контактам подключена клавиатура с помощью массива rowPins и colPins.

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = { 0, 1, 2, 3 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 4, 5, 6, 7 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.

После того, как мы упомянули, какой тип клавиатуры мы используем и как она подключена, мы можем создать клавиатуру, используя эти данные в строке:

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Create the Keypad

Точно так же мы должны обозначить к каким выводам Arduino подключен ЖК-дисплей. Согласно нашей принципиальной схеме всё определяется таким образом:

const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; //Pins to which LCD is connected
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //create the LCD

Внутри функции setup() мы просто отображаем имя проекта, а затем переходим к циклу loop, где лежит основной проект.

По сути, мы должны проверить, печатается ли что-нибудь на клавиатуре, если мы что-то набрали. Мы должны распознать то, что набирается и затем преобразовать это в переменную, а когда нажата «=», мы должны вычислить результат и, наконец, отобразить его на ЖК-дисплее. Это именно то, что делается внутри функции цикла, как показано ниже:

key = kpd.getKey(); //storing pressed key value in a char

if (key!=NO_KEY)
DetectButtons();

if (result==true)
CalculateResult();

DisplayResult(); 

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

Шаг 4. Работа калькулятора

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

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

«А» сложение (+)

«В» вычитание (-)

«C» умножение (*)

«D» деление (/)

«*» очистить (С)

«#» Равно (=)

Можно использовать маркер, чтобы подписать какие на самом деле действия выполняет каждая кнопка. После этого вы можете начать пользоваться калькулятором. Введите число и оно появится во второй строке, нажмите операнд и введите своё второе число, наконец нажмите клавишу «#», чтобы получить результат. Вы также можете попробовать создать этот калькулятор на основе сенсорного экрана Arduino, но это уже задача на будущее.

23 апреля 2019 в 19:40 | Обновлено 19 февраля 2020 в 23:41 (редакция)
Опубликовано:
Уроки,

1 комментарий

  1. Александр
    21 февраля 2021 в 17:34

    Для общего развития и понимания работы ардуино полезно. Но намного практичнее было бы построить калькулятор для расчёта ip сетей, перевода из 10чной системы в двоичную, шестнадцатиричную и обратно. Думаю для начинающих администраторов будет полезным подручным инструментом.

    Ответить

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *