Оглавление:

Калькулятор сенсорного экрана Arduino: 7 шагов
Калькулятор сенсорного экрана Arduino: 7 шагов

Видео: Калькулятор сенсорного экрана Arduino: 7 шагов

Видео: Калькулятор сенсорного экрана Arduino: 7 шагов
Видео: Подключение I2C дисплея к ардуино. Русификация текста. 2024, Ноябрь
Anonim
Калькулятор сенсорного экрана Arduino
Калькулятор сенсорного экрана Arduino

Привет! Это проект по созданию калькулятора с сенсорным экраном с использованием Arduino Uno и экрана TFT LCD. Я придумал концепцию своего урока программирования на дому, и опыт создания этого проекта был очень интересным. Этот калькулятор может выполнять четыре простых математических операции (сложение, вычитание, умножение и деление). Он также отображает до двух десятичных знаков для ответов деления, в которых они есть. Давайте нырнем прямо сейчас! Расходные материалы для этого проекта перечислены ниже.

Запасы

- Ардуино Уно

- 2.4 TFT LCD Shield (вот где я его купил:

- Кабель USB A - B (шнур для подключения Arduino к компьютеру)

- Компьютер с установленной Arduino IDE

- Вам также необходимо загрузить две библиотеки: MCUFRIEND_kbv и Touchscreen. Первый вы можете найти на github (ссылка: https://github.com/prenticedavid/MCUFRIEND_kbv) или вы можете использовать zip-файл библиотеки, который я включил ниже. Второй находится в диспетчере библиотек Arduino для установки.

Шаг 1. Аппаратные подключения

Аппаратные соединения
Аппаратные соединения
Аппаратные соединения
Аппаратные соединения
Аппаратные соединения
Аппаратные соединения

Подключение сенсорного экрана к Arduino Uno выполняется просто и быстро. Все, что вам нужно сделать, это совместить самые низкие контакты на щите с самыми низкими контактами на Arduino и вставить щит в контакты. Верхний вывод 5V и немаркированный вывод на стороне питания не должны иметь контактов от экрана, с теми же параметрами, что и для контактов с маркировкой SCL и SDA на другой стороне платы. Теперь мы готовы писать код!

Шаг 2: Код: общие определения и настройка

#включают

MCUFRIEND_kbv tft; // в любом случае жестко подключены к экранам UNO

#включают

#define YP A3

#define XM A2

#define YM 9

#define XP 8

TouchScreen ts = TouchScreen (XP, YP, XM, YM, 300);

#define МИН. ДАВЛЕНИЕ 10

Это начало кода, в который мы включаем библиотеки (MCUFRIEND_kbv и Touchscreen), определяем выводы X и Y, настраиваем параметры сенсорного экрана и определяем минимальное давление, необходимое для Arduino для регистрации нажатия пользователем.

int ID;

int user_selection;

float saved_number = 0;

float term1;

int op_num;

результат с плавающей точкой;

int cursorLocX = 5;

int cursorLocY = 20;

Прямо перед настройкой нам нужно настроить некоторые глобальные переменные. ID помогает настроить сенсорный экран и запустить его. user_selection содержит число, которое соответствует клавише, которую пользователь выбирает при нажатии на сенсорный экран. saved_number - это переменная, которую мы выводим на экран после ввода пользователя (подробнее об этом в цикле). Это число с плавающей запятой, поэтому оно может содержать как десятичные, так и целые числа. term1 - это переменная, в которой сохраняется первое число уравнения после выбора операнда. op_num сохраняет операнд как число (1 для сложения, 2 для вычитания, 3 для умножения и 4 для деления). Результат - это переменная, которая выводится на экран после того, как пользователь нажал знак равенства. Это тоже поплавок. cursorLocX и cursorLocY - это точки сопоставления на сенсорном экране, где курсор устанавливается несколько раз (он находится в серой полосе вверху, иначе известной как поле результатов).

void setup () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

квадраты ();

числа ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Наша функция настройки сначала содержит инициализацию экрана сенсорного экрана (строки 1-3). Ориентация экрана устанавливается с помощью команды tft.setRotation (), где 0 - вертикальное положение. Весь экран окрашен в темно-серый цвет с помощью команды tft.fillScreen (), которую мы напишем поверх (за исключением поля результатов). Функции squares () и numbers () рисуют квадраты калькулятора, окрашивают квадраты в черный и белый цвета в виде шахматной доски и записывают числа / операнды на квадратах синим цветом. Мы вернемся к ним на следующем шаге. Команда tft.setTextSize () устанавливает размер текста поля результатов равным 3, что является средним шрифтом. Команда tft.setTextColor () устанавливает синий цвет текста поля результатов, который отображается поверх темно-серого поля.

Шаг 3. Код: цикл

недействительный цикл () {numberSelect ();

задержка (100);

if (user_selection == 16) {

;

}еще{

if (user_selection <10) {

сохраненное_число = сохраненное_число * 10 + выбор_пользователя;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (сохраненное_число);

} else if (user_selection> 10) {

switch (user_selection) {

case 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = сохраненное_число;

сохраненное_число = 0;

перерыв;

case 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = сохраненное_число;

сохраненное_число = 0;

перерыв;

case 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = сохраненное_число;

сохраненное_число = 0;

перерыв;

case 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = сохраненное_число;

сохраненное_число = 0;

перерыв;

case 15:

сохраненное_число = 0;

term1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

перерыв;

}

tft.setCursor (cursorLocX, cursorLocY);

Это много для пережевывания, поэтому я объясню, что выше. Мы начинаем с вызова функции numberSelect (), которая присваивает номер каждому квадрату на сенсорном экране. Когда пользователь нажимает на один из этих квадратов, функция устанавливает переменную user_selection равной номеру квадрата. Первый оператор if должен выполняться через цикл только в том случае, если был сделан правильный выбор пользователя. Если это так, следующий оператор if спрашивает, сохранено ли в user_selection число меньше 10 (числа 0-9). Если это так, значение saved_number умножается на 10, а число в user_selection добавляется к saved_number, который печатается в поле результатов на сенсорном экране. Если это не так, следующий оператор if спрашивает, сохранено ли в user_selection число больше 10 (номера операндов: 11 для +, 12 для -, 13 для X, 14 для / и 15 для чистого квадрата экрана.). Функция переключения заботится о каждом случае (определяется user_selection). Переменной op_num присваивается номер, соответствующий выбранному операнду (1 для +, 2 для -, 3 для X и 4 для /). Значение в saved_number сохраняется в переменной term1, так что переменную saved_number можно использовать для второй половины уравнения. Символ операнда печатается на экране вместе с очищением любых чисел в поле результатов. Единственное исключение - это чистый квадрат экрана, который сбрасывает все расчетные переменные и очищает поле результатов от чего-либо на нем.

}еще{

switch (op_num) {

Дело 1:

результат = термин1 + сохраненное_число;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (double (результат));

перерыв;

случай 2:

result = term1 - сохраненное_число;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (double (результат));

перерыв;

случай 3:

результат = термин1 * сохраненное_число;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (double (результат));

перерыв;

случай 4:

результат = float (term1) / float (сохраненное_число);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (результат);

перерыв;

}

tft.setCursor (cursorLocX, cursorLocY);

сохраненное_число = результат;

term1 = 0;

op_num = 0;

задержка (1000);

}

}

}

Последняя часть цикла имеет дело с событием, когда пользователь выбирает знак равенства (user_selection == 10). Другая функция переключения работает через четыре математические функции (определяемые op_num). Случай сложения (случай 1) складывает term1 и saved_number вместе и сохраняет число в переменной результата. Результат печатается в поле результатов в виде двойного числа. В случае вычитания (случай 2) вычитается значение saved_number из term1 и сохраняется число в переменной результата. Результат печатается в поле результатов в виде двойного числа. Случай умножения (случай 3) умножает term1 на saved_number и сохраняет число в переменной результата. Результат печатается в поле результатов в виде двойного числа. Случай деления (случай 4) делит термин1 на сохраненное_число вместе и сохраняет число в переменной результата. Результат печатается в поле результатов как число с плавающей запятой (поскольку ответы деления могут быть десятичными числами). После того, как на экран выводится событие числа, операнда или результата, курсор сбрасывается, значение saved_number устанавливается на предыдущий результат, а term1 и op_num сбрасываются.

Несколько примечаний: пользователь не может вводить десятичные числа в калькулятор из-за отсутствия квадрата десятичной точки. Кроме того, пользователь может выполнять только одно уравнение за раз. Вы не можете рассчитать результат, а затем сложить / вычесть / умножить / разделить этот результат. В функции numberSelect () есть функция, которая очищает экран после того, как результат был напечатан, если пользователь нажал другой квадрат.

Шаг 4: Код: функция квадратов

void squares () {

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

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // начало первого ряда квадратов, от черного к белому tft.fillRect (60, 60, 60, 65, TFT_WHITE);

tft.fillRect (120, 60, 60, 65, TFT_BLACK);

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // заканчивается первый ряд квадратов

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // начало второго ряда квадратов, от белого к черному tft.fillRect (60, 125, 60, 65, TFT_BLACK);

tft.fillRect (120, 125, 60, 65, TFT_WHITE);

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // заканчивается второй ряд квадратов

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // начало третьего ряда квадратов, от черного к белому tft.fillRect (60, 190, 60, 65, TFT_WHITE);

tft.fillRect (120, 190, 60, 65, TFT_BLACK);

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // заканчивается третий ряд квадратов

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // четвертый ряд квадратов начинается от белого к черному tft.fillRect (60, 255, 60, 65, TFT_BLACK);

tft.fillRect (120, 255, 60, 65, TFT_WHITE);

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // четвертый ряд квадратов заканчивается

}

Функция squares () довольно проста. Команда tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) рисует прямоугольник в соответствии с переданными ей параметрами: первые позиции x и y, вторые позиции x и y и цвет, которым прямоугольник заполнен. Эта функция рисует все четыре ряда квадратов (технически прямоугольников) и заполняет каждый квадрат переданным ему цветом.

Шаг 5: Код: функция чисел

void numbers () {

tft.setTextColor (TFT_BLUE); // устанавливает синий цвет числа / символа

tft.setTextSize (5); // устанавливает размер числа / символа равным 5

tft.setCursor (18, 75); // устанавливает курсор на первую строку цифр / символов

tft.print ("7 8 9 /"); // печатает первую строку цифр / символов

tft.setCursor (18, 140); // устанавливает курсор на вторую строку цифр / символов

tft.print («4 5 6 X»); // выводит вторую строку цифр / символов

tft.setCursor (18, 205); // устанавливает курсор на третью строку цифр / символов

tft.print ("1 2 3 -"); // выводит третью строку цифр / символов

tft.setCursor (18, 270); // устанавливает курсор на четвертую строку цифр / символов

tft.print ("C 0 = +"); // печатает четвертую строку цифр / символов

}

Функция numbers () также проста. Первые две строки устанавливают размер текста больше и цвет синего цвета. Команда tft.setCursor () устанавливает курсор в позицию в каждой строке, с которой начинается запись чисел. Затем команда tft.print () печатает числа / символы над квадратами.

Шаг 6: Код: функция NumberSelect

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, ВЫХОД);

pinMode (YP, ВЫХОД);

if (p.z> MINPRESSURE) {

p.x = карта (p.x, 250, 845, 0, 239);

p.y = карта (p.y, 245, 860, 0, 319);

if (результат! = 0) {

результат = 0;

сохраненное_число = 0;

tft.print («ЧИСТЫЕ ЗНАЧЕНИЯ»);

задержка (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Чтобы запустить функцию numberSelect (), мы запрашиваем ввод данных пользователем с сенсорного экрана с помощью команды ts.getPoint (). После сбора этих данных мы проверяем, не было ли превышено минимальное давление (или, другими словами, нажал ли пользователь где-нибудь на сенсорном экране). Если это так, координаты x и y преобразуются из декартовых координат в координаты сенсорного экрана. (0, 0) - это верхний левый угол сенсорного экрана, ось x проходит поперек, а ось y - вниз. Следующая часть проверяет, сохранено ли число в результате. Если есть, результат и сохраненное_число сбрасываются в 0. Сообщение «ОЧИСТИТЬ ЗНАЧЕНИЯ» печатается над полем результатов, и экран очищается, и курсор возвращается в исходное положение.

if (p.y 60) {// первая строка квадратов

если (p.x <60)

user_selection = 7;

иначе, если (p.x <120)

user_selection = 8;

иначе, если (p.x <180)

user_selection = 9;

иначе user_selection = 14;

} else if (p.y 125) {// вторая строка квадратов

если (p.x <60)

user_selection = 4;

иначе, если (p.x <120)

user_selection = 5;

иначе, если (p.x <180)

user_selection = 6;

иначе user_selection = 13;

} else if (p.y 190) {// третий ряд квадратов

если (p.x <60)

user_selection = 1;

иначе, если (p.x <120)

user_selection = 2;

иначе, если (p.x <180)

user_selection = 3;

иначе user_selection = 12;

} else if (p.y> 255) {// четвертый ряд квадратов

если (p.x <60)

user_selection = 15;

иначе, если (p.x <120)

user_selection = 0;

иначе, если (p.x <180)

user_selection = 10;

иначе user_selection = 11;

}

}еще{

user_selection = 16; // user_selection установлен на 16 (ничего не переменная)

}

}

Это часть, которая определяет, какая кнопка была выбрана. Начиная с верхнего ряда квадратов и заканчивая нижним рядом, Arduino ищет, где на самом деле был нажат экран. Затем он присваивает квадрату номер и сохраняет это число в user_selection. Цифры 0-9 соответствуют числовым квадратам, числа 11-15 соответствуют квадратам операндов и пустому квадрату, а число 10 соответствует квадрату со знаком равенства. Если квадрат не был выбран, тогда user_selection устанавливается в 16, что заставит цикл снова начинаться (см. Функцию цикла).

Шаг 7: Наслаждайтесь завершенным проектом

Вот и все! Теперь у вас есть калькулятор с сенсорным экраном, который может выполнять сложение, вычитание, умножение и деление. Этот проект полностью изменил то, как я думал, как работает калькулятор. Когда я работал над этим проектом, я помню, как сказал своему преподавателю на уроке: «Я больше никогда не буду смотреть на калькулятор так же!» Функции, которые вы как пользователь считаете легкими, несколько трудны, когда вы за компьютером пытаетесь подражать своей идее. Я надеюсь, что вам понравился проект, и я надеюсь, что ваше представление о том, как работает калькулятор, также изменилось!

Вот весь код для вашего удобства. Он заполнен комментариями, поэтому, если у вас есть какие-либо проблемы, они должны показать вам, что делает каждая строка.

Рекомендуемые: