В этом уроке мы создадим наш собственный калькулятор на основе 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, но это уже задача на будущее.
21 февраля 2021 в 17:34
Для общего развития и понимания работы ардуино полезно. Но намного практичнее было бы построить калькулятор для расчёта ip сетей, перевода из 10чной системы в двоичную, шестнадцатиричную и обратно. Думаю для начинающих администраторов будет полезным подручным инструментом.