Калькулятор на сенсорном TFT ЖК дисплее с использованием Arduino

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

Внешний вид калькулятора на сенсорном TFT ЖК дисплее с использованием Arduino

В этом проекте мы рассмотрим создание на основе платы Arduino калькулятора на сенсорном TFT ЖК дисплее, который сможет выполнять все основные математические операции, такие как сложение, вычитание, деление и умножение.

Необходимые компоненты

Плата Arduino Uno
2.4” TFT ЖК дисплей в виде платы расширения (шилда) для Arduino Uno (2.4” TFT LCD display Shield)
Батарейка на 9 В

Общие принципы работы TFT ЖК дисплеев

Прежде чем приступать к программированию проекта давайте сначала рассмотрим как работает модуль 2.4” TFT ЖК дисплея (2.4” TFT LCD Module). На следующем рисунке показано расположение контактов на таком дисплее.

Расположение контактов (распиновка) на 2.4” TFT ЖК дисплее

Как мы можем видеть, это модуль дисплея (шилд) содержит 28 контактов, которые в точности соответствуют расположению контактов на платах Arduino Uno/Arduino Mega. Краткая классификация назначения этих контактов приведена в следующей таблице:

Группы контактов на 2.4” TFT ЖК дисплее

Как видите, можно выделить 4 группы контактов на подобном TFT ЖК дисплее:

  • LCD Command Pins (контакты управления);
  • LCD Data Pins (контакты данных);
  • SD Card Pins (контакты для работы с SD картой);
  • Power Pins (контакты питания).

Нам в нашем проекте нет необходимости детально изучать назначение всех этих контактов потому что все основные функции по взаимодействию с TFT ЖК дисплеем возьмет на себя соответствующая библиотека Arduino.

На приведенной выше картинке обратной стороны TFT ЖК дисплея вы можете видеть слот для SD карт. С SD карт, вставляемых в этот слот, можно считывать, к примеру, файлы изображений (в формате bmp) и затем отображать эти изображения на экране дисплея с помощью платы Arduino.

Важным аспектом при взаимодействии с TFT ЖК дисплеями является правильный выбор драйвера для них. Сейчас в мире продается множество типов TFT ЖК дисплеев, начиная от оригинальных модулей TFT ЖК дисплеев от Adafruit до их дешевых китайский клонов. Программа, которая хорошо работает с оригинальным дисплеем Adafruit, может не работать с его дешевым клоном из Китая. Поэтому при проектировании подобных проектов всегда важно знать что за дисплей у вас в руках – эту информацию можно получить от поставщика (продавца).

В нашем проекте мы использовали дешевый китайский клон дисплея, для взаимодействия с которым хорошо подходит драйвер IC ili9341. Достаточно подробную информацию про подключение подобного TFT ЖК дисплея можно прочитать в этой статье. Также на нашем сайте проекте вы можете посмотреть другие проекты, рассматривающие взаимодействие с подобными дисплеями:

Калибровка сенсорного экрана TFT ЖК дисплея

Если вы планируете использовать функцию сенсорного экрана вашего модуля TFT ЖК дисплея, то вы должны откалибровать его, чтобы заставить его работать соответствующим образом. ЖК-экран без калибровки может работать не совсем корректно – вы коснетесь его в одном месте, а отклик получите в другом месте. Результаты калибровки для одного дисплея могут не подойти для другого дисплея, поэтому калибровку своего дисплея вам лучше всего делать самостоятельно.

Самый лучший способ откалибровать TFT ЖК дисплей – это использовать специальную калибровочную программу (часто идет вместе с библиотекой для ЖК дисплея) или использовать монитор последовательного порта для обнаружения ошибок в работе дисплея. Но в нашем проекте мы будем использовать достаточно большие кнопки в нашем калькуляторе, поэтому проблемы неправильной калибровки дисплея будут мало нас беспокоить. Но, тем не менее, элементарная калибровка дисплея для нашего проекта будет рассмотрена ниже в данной статье (в разделе про программирование Arduino).

Соединения TFT ЖК дисплея с платой Arduino

Поскольку используемый нами модуль TFT ЖК дисплея является шилдом (платой расширения) для Arduino, то вы можете просто разместить его сверху платы Arduino Uno и он в точности совпадет с нею по контактам. Тем не менее, в целях безопасности можно дополнительно прикрыть наиболее важные части платы Arduino изоляционной лентой чтобы предотвратить их повреждение. Размещенный сверху над платой Arduino шилд TFT ЖК дисплея будет выглядеть примерно следующим образом:

Размещенный сверху над платой Arduino шилд TFT ЖК дисплея

Программирование платы Arduino для работы с TFT ЖК дисплеем

В нашем проекте для взаимодействия с TFT ЖК дисплеем мы будем использовать библиотеку SPFD5408. Это модифицированная библиотека от Adafruit, которая сможет без проблем работать с нашим модулем TFT ЖК дисплея. Полный код программы будет приведен в конце статьи, здесь же мы обсудим наиболее важные его фрагменты.

Примечание: очень важно установить эту библиотеку в вашу Arduino IDE чтобы программа скомпилировалась без ошибок.

Для установки библиотеки скачайте ее по вышеприведенной ссылке с сервиса Github. На открывшейся странице выберите “clone or download” и затем “Download ZIP”. После этого скачайте zip файл с библиотекой.

Теперь откройте Arduino IDE и выберите Sketch -> Include Library -> Add .ZIP library. Их\з окна браузера загрузки выберите zip файл с библиотекой и кликните “OK”. После этого должна появиться надпись в левом нижнем углу Arduino IDE — “Library added to your Libraries” (библиотека успешно добавлена к вашим библиотекам). Более детальную информацию об установке данной библиотеки вы можете найти в этой статье.

После этого вы можете загружать приведенную в конце данной статьи программу в плату Arduino.

Для работы этого проекта нам понадобится 3 библиотеки – их все вы скачали по вышеприведенной ссылке. Затем просто подключим их в основную программу:

Как уже указывалось, для корректной работы с TFT ЖК дисплеем необходима его калибровка. Мы это сделаем с помощью указания в программе таких его параметров как TS_MINX, TS_MINY, TS_MAXX и TS_MAXY – это во многом решает проблему калибровки дисплея. Будьте уверены, что приведенные здесь значения хорошо подойдут для большинства TFT ЖК дисплеев, выпускаемых в качестве плат расширения для Arduino. Но если чувствуете что что то идет не так, то можете поэкспериментировать с этими значениями.

Как мы знаем, TFT ЖК дисплеи могут отображать множество цветов, все эти цвета должны быть введены в программе в шестнадцатеричном виде. Чтобы сделать код программы более читабельным, мы назначили для этих значений удобочитаемые переменные.

Примечание: The values are true only if the screen is rotate by 2. Это для удобства программирования.

Далее у нас в программе будет 3 части: одна для создания графического интерфейса калькулятора с кнопками и дисплеем, вторая для распознавания нажатых кнопок и третья для произведения вычислений и отображения их результата. Рассмотрим каждую из этих частей программы более подробно.

Создание графического интерфейса калькулятора

В этой части вы можете использовать свое воображение и свои креативные способности. Мы просто сделали 16 кнопок калькулятора и один блок экрана для отображения результатов вычислений. Вы можете конструировать дизайн калькулятора как будто вы рисуете его в MS paint. Добавленные вначале программы библиотеки позволяют вам рисовать на экране дисплея линии, прямоугольники, круги, символы, строки и многое другое.

Мы использовали линии и прямоугольники для создания графического интерфейса нашего калькулятора. Как видите, он выглядит как калькулятор из 90-х годов прошлого века. Каждый прямоугольник (точнее квадрат) имеет высоту и ширину 60 пикселов.

Внешний вид нашего калькулятора на экране TFT ЖК дисплея

Распознавание нажатий кнопок

Кроме создания графического интерфейса калькулятора другой не менее важной задачей является распознавание (детектирование) прикосновений пользователя к экрану дисплея. Мы можем определять координаты экрана (X и Y) где произошло прикосновение пользователя. Эти координаты мы можем выводить в окне монитора последовательной связи (serial monitor) с помощью функции println.

На следующем рисунке мы отобразили позиции (координаты) всех кнопок нашего калькулятора. Каждая кнопка имеет ширину и высоту 60 пикселов, всего в калькуляторе 4 строки и 4 столбца кнопок. Начало координат – в точке (0,0).

Позиции (координаты) всех кнопок нашего калькулятора

Но в реальности все не так гладко как показано на данном рисунке – координаты каждой кнопки не будут в точности такими как показано на рисунке из-за упомянутых проблем с калибровкой различных типов дисплеев.

Чтобы в точности определить позицию каждой кнопки на экране используемого вами дисплея, вы должны кликнуть на каждой линии в нашем интерфейсе и проверить координаты этой точки в окне монитора последовательной связи. Конечно, это нельзя назвать профессиональным подходом, но зато это отлично работает. Мы в нашем проекте измерили позиции всех линий и у нас получилась следующая картина:

Измеренные значения всех линий

Теперь мы точно будем знать позицию каждой кнопки нашего калькулятора на экране дисплея. Теперь, когда пользователь будет касаться какой-нибудь точки на экране, мы будем в программе сравнивать координаты этой точки (X,Y) с координатами каждой кнопки калькулятора.

Расчет и отображение результатов

Заключительный этап в написании программы для нашего калькулятора – это расчет результатов вычислений и отображение их на экране TFT ЖК дисплея. Наш калькулятор может выполнять операции только с 2 числами, обозначенными в программе переменными “Num1” и “Num2”. В переменной “Number” будет храниться результат вычислений.

Когда пользователь нажимает кнопку, в число добавляется одна цифра (разряд). Когда пользователь нажимает другую кнопку, предыдущая цифра умножается на 10 и к числу прибавляется новая цифра. К примеру, мы нажмем цифру 8, потом 5 и потом 7. Тогда сначала в переменную Number запишется число 8, затем (8*10)+5=85 и затем (85*10)+7 = 857. В результате переменная будет содержать число 857.

Когда мы будем нажимать кнопку какой-нибудь операции на калькуляторе (например, сложение), значение из переменной Number будет передаваться в переменную Num1 и затем в переменную Number будет записываться ноль чтобы подготовить ее к вводу второго числа.

Когда мы будем нажимать на калькуляторе “равно”, то значение из переменной Number будет переписываться в переменную Num2, будет производиться расчет выражения и результат расчета будет записываться в переменную “Number”. Затем это значение будет отображаться на экране ЖК дисплея.

Работа проекта

Загрузите приведенную программу в плату Arduino и вы увидите на экране TFT ЖК дисплея картинку интерфейса калькулятора.

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

Для очистки экрана калькулятора необходимо будет нажать кнопку «C». Надеемся, вы получите массу удовольствия от реализации данного проекта.

Исходный код программы

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

Видео, демонстрирующее работу калькулятора

(1 голосов, оценка: 5,00 из 5)
Загрузка...
80 просмотров

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

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