В этой статье мы рассмотрим проектирование калькулятора на основе платы Arduino и клавиатуры (клавишной панели) 4х4. Результаты работы калькулятора будут показываться на жидкокристаллическом (ЖК) дисплее 16×2. Калькулятор будет способен выполнять простейшие математические операции: сложение, вычитание, умножение и деление с целыми числами. Но если вы поймете суть данного проекта, то вы на его основе в дальнейшем сможете реализовать и научный калькулятор, используя встроенные в Arduino математические функции.
Также вы можете прочитать статью про калькулятор на основе Arduino и сенсорного TFT ЖК дисплея.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress) (любая другая версия также подойдет).
- ЖК дисплей 16х2 (купить на AliExpress).
- Клавиатура 4х4 (купить на AliExpress).
- Батарейка на 9 В.
- Макетная плата и соединительные провода.
Работа схемы
Схема проектируемого нами калькулятора представлена на следующем рисунке.
ЖК дисплей подключен к плате Arduino в 4-битном режиме, то есть используются 4 его контакта данных. Клавиатура имеет 8 выходных контактов, которые подключены к контактам 0-7 платы Arduino. Для более детального изучения данного вопроса вы можете прочитать статью про подключение клавиатуры 4х4 к плате Arduino.
Необходимые соединения в представленной схеме показаны в следующей таблице.
Контакт Arduino | Куда подсоединен |
D0 | 1-й контакт клавиатуры |
D1 | 2-й контакт клавиатуры |
D2 | 3-й контакт клавиатуры |
D3 | 4-й контакт клавиатуры |
D4 | 5-й контакт клавиатуры |
D5 | 6-й контакт клавиатуры |
D6 | 7-й контакт клавиатуры |
D7 | 8-й контакт клавиатуры |
D8 | Register select pin of LCD (pin 4) |
D9 | Enable pin of LCD (pin 6) |
D10 | Data pin 4 (pin 11) |
D11 | Data pin 4 (pin 11) |
D12 | Data pin 4 (pin 11) |
D13 | Data pin 4 (pin 11) |
+5V | Vdd pin of LCD (pin 2) |
Ground | Vss,Vee and RW pin of LCD (pin 1,3 and 5) |
Некоторые платы Arduino могут выдавать ошибку при загрузке в них программы в то время когда что-либо подсоединено к их контактам 0 и 1. Поэтому если вы столкнулись с такой ошибкой, просто отключите клавиатуру на время загрузки программы.
Когда все соединения в схеме сделаны, ваша конструкция должна выглядеть примерно следующим образом:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы рассмотрим его наиболее важные фрагменты.
Вначале в программе для Arduino необходимо подключить библиотеки, которые мы будем использовать. Библиотека для работы с ЖК дисплеем по умолчанию присутствует в Arduino IDE. А библиотеку для работы к клавиатурой необходимо скачать с Github. По приведенной ссылке вы скачаете ZIP файл с библиотекой, добавьте ее в Arduino IDE с помощью инструкции Sketch -> Include Library -> Add .ZIP и укажите путь к файлу с библиотекой.
Перед началом работы с клавиатурой мы должны в программе с помощью переменных ROWS и COLS указать какое количество строк и столбцов имеет клавиатура, которую мы подключаем к плате Arduino. Также мы должны указать карту клавиатуры, то есть какие клавиши она имеет в своем составе и на каких местах.
1 2 3 4 5 6 7 8 9 10 11 12 |
const byte ROWS = 4; // четыре строки const byte COLS = 4; // четыре столбца // указываем карту клавиатуры (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 };//контакты платы Arduino, к которым подсоединены контакты строк клавиатуры (ROW0, ROW1, ROW2 и ROW3) byte colPins[COLS] = { 4, 5, 6, 7 }; // контакты платы Arduino, к которым подсоединены контакты столбцов клавиатуры (COL0, COL1, COL2 и COL3) |
После указания необходимых параметров клавиатуры нам необходимо создать объект клавиатуры, с которым мы дальше будем работать в программе.
1 |
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // создаем объект клавиатуры |
Также в программе мы должны указать к каким контактам Arduino подключен ЖК дисплей. В соответствии с соединениями на нашей схеме мы должны использовать следующие команды:
1 2 |
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // контакты Arduino, к которым подключен ЖК дисплей LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //создаем объект ЖК дисплея |
Внутри функции setup мы просто будем высвечивать на ЖК дисплее имя нашего проекта и после этого сразу переходить к функции loop.
В функции loop мы должны проверять печатается ли что либо на клавиатуре, если печатается, то мы должны распознать что печатается и поместить введенные числа в соответствующие переменные. А после нажатия клавиши “=” мы должны рассчитать результат операции и высветить его на экране ЖК дисплея.
1 2 3 4 5 6 7 8 9 |
key = kpd.getKey(); //сохраняем нажатую клавишу в переменной символьного типа if (key!=NO_KEY) DetectButtons(); if (result==true) CalculateResult(); DisplayResult(); |
Моделирование работы нашего калькулятора на Arduino
Мы смоделировали работу проектируемого нами калькулятора в симуляторе Proteus. По умолчанию данный симулятор не умеет работать с Arduino, но однако данный компонент можно легко скачать и добавить в его библиотеки. После установки компонента Arduino в Proteus просто добавьте на схему в нем алфавитно-цифровой ЖК дисплей, клавиатуру и сделайте соединения как показано на схеме.
Вид нашей схемы в симуляторе Proteus показан на следующем рисунке. Более подробно работа этой части проекта показана на видео, приведенном в конце статьи.
Работа проекта
После того, как все необходимые соединения сделаны, вы можете загружать программу в плату Arduino. После загрузки программы вы можете непосредственно приступать к тестированию работы проекта.
Поскольку используемая нами клавиатура не имеет клавиш математических операций и некоторых других нужных нам клавиш, то мы вместо них будем использовать клавиши с буквами как показано в следующей таблице.
Клавиша клавиатуры | Выполняемое действие |
“A” | Сложение (+) |
“B” | Вычитание (-) |
“C” | Умножение (*) |
“D” | Деление (/) |
“*” | Очистить экран (C) |
“#” | Равно (=) |
При необходимости вы можете подписать эти клавиши на клавиатуре маркером.
Принцип работы на данном калькуляторе заключается в следующем. Напишите число и оно появится на второй строчке дисплея, нажмите клавишу с видом операции, затем введите второе число. После этого нажмите клавишу “#” чтобы получить результат вычислений.
Исходный код программы
Если у вас есть вопросы по коду приведенной программы, то вы можете задать их в комментариях к данной статье.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
#include <LiquidCrystal.h> //библиотека для работы с ЖК дисплеем: https://www.arduino.cc/en/Reference/LiquidCrystal #include <Keypad.h> //библиотека для работы с клавиатурой: https://github.com/Chris--A/Keypad const byte ROWS = 4; // четыре строки const byte COLS = 4; // четыре столбца // указываем карту клавиатуры (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 };// контакты платы Arduino, к которым подсоединены контакты строк клавиатуры (ROW0, ROW1, ROW2 и ROW3) byte colPins[COLS] = { 4, 5, 6, 7 }; // контакты платы Arduino, к которым подсоединены контакты столбцов клавиатуры (COL0, COL1, COL2 и COL3) Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // создаем объект клавиатуры const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; //контакты, к которым подключен ЖК дисплей LiquidCrystal lcd(rs, en, d4, d5, d6, d7); long Num1,Num2,Number; char key,action; boolean result = false; void setup() { lcd.begin(16, 2); //мы используем ЖК дисплей 16х2 lcd.print("DIY Calculator"); //показываем приветственное сообщение lcd.setCursor(0, 1); // перемещаем курсор в столбец 0, строку 1 lcd.print("-CircuitDigest"); //показываем вторую часть приветственного сообщения delay(2000); //задержка на 2 секунды lcd.clear(); //очищаем экран ЖК дисплея } void loop() { key = kpd.getKey(); // сохраняем нажатую клавишу в переменной символьного типа if (key!=NO_KEY) DetectButtons(); if (result==true) CalculateResult(); DisplayResult(); } void DetectButtons() { lcd.clear(); // очищаем экран ЖК дисплея if (key=='*') //если нажата клавиша отмены {Serial.println ("Button Cancel"); Number=Num1=Num2=0; result=false;} if (key == '1') //если нажата клавиша 1 {Serial.println ("Button 1"); if (Number==0) Number=1; else Number = (Number*10) + 1; //если она нажата дважды } if (key == '4') // если нажата клавиша 4 {Serial.println ("Button 4"); if (Number==0) Number=4; else Number = (Number*10) + 4; // если она нажата дважды } if (key == '7') // если нажата клавиша 7 {Serial.println ("Button 7"); if (Number==0) Number=7; else Number = (Number*10) + 7; // если она нажата дважды } if (key == '0') {Serial.println ("Button 0"); // если нажата клавиша 0 if (Number==0) Number=0; else Number = (Number*10) + 0; // если она нажата дважды } if (key == '2') // если нажата клавиша 2 {Serial.println ("Button 2"); if (Number==0) Number=2; else Number = (Number*10) + 2; // если она нажата дважды } if (key == '5') // если нажата клавиша 5 {Serial.println ("Button 5"); if (Number==0) Number=5; else Number = (Number*10) + 5; // если она нажата дважды } if (key == '8') // если нажата клавиша 8 {Serial.println ("Button 8"); if (Number==0) Number=8; else Number = (Number*10) + 8; // если она нажата дважды } if (key == '#') // если нажата клавиша равно {Serial.println ("Button Equal"); Num2=Number; result = true; } if (key == '3') // если нажата клавиша 3 {Serial.println ("Button 3"); if (Number==0) Number=3; else Number = (Number*10) + 3; // если она нажата дважды } if (key == '6') // если нажата клавиша 6 {Serial.println ("Button 6"); if (Number==0) Number=6; else Number = (Number*10) + 6; // если она нажата дважды } if (key == '9') // если нажата клавиша 9 {Serial.println ("Button 9"); if (Number==0) Number=9; else Number = (Number*10) + 9; // если она нажата дважды } if (key == 'A' || key == 'B' || key == 'C' || key == 'D') //если нажата одна из клавиш в 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); // устанавливаем курсор в столбец 0, строку 0 lcd.print(Num1); lcd.print(action); lcd.print(Num2); if (result==true) {lcd.print(" ="); lcd.print(Number);} //отображаем результат lcd.setCursor(0, 1); // устанавливаем курсор в столбец 0, строку 1 lcd.print(Number); // отображаем результат } |
4 ответа к “Калькулятор с использованием клавиатуры 4х4 и Arduino”
Ошибка компиляции платы для ардуино уно! Капец!
Все, вера в окружающий мир для вас потеряна? ))
спасибо блин собирал пол часа а он не работает все проверил все по схеме
Что конкретно не работает? Возможно стоит начать с простого и проверить работу программы по небольшим частям. Начать хотя бы с проверки правильности обработки нажатий клавиш на клавиатуре. Проект сравнительно несложный, можно разбить его на части и таким образом найти где закралась ошибка