Arduino подключение сенсорного дисплея 2.4. Подключение универсального дисплейного модуля TE-ULCD к Arduino

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

Ни для кого не секрет, что прогресс не стоит на месте. Постоянно появляются новые технологии, совершенствуются старые. Сенсорные экраны появились совсем недавно (по меркам человечества), но уже прочно вошли в нашу повседневную жизнь. Телефоны, телевизоры, терминалы и прочие в большинстве своём используют «беcкнопочные» технологии. В кавычках это слово по той причине, что они всё-таки используют кнопки, только сенсорные. О них в данной статье как раз и пойдёт речь, а если точнее, о Touch module для Arduino.

Принцип работы сенсорных кнопок

Модули с сенсорными кнопками в большинстве своём используют проекционно-ёмкостные сенсорные экраны (https://ru.wikipedia.org/wiki/Сенсорный_экран). Если не вдаваться в пространственные объяснения их работы, для регистрации нажатия используется вычисление изменения ёмкости конденсатора (электрической цепи), при этом важной особенностью является возможность выставлять различную начальную ёмкость, в чём мы убедимся далее.

Человеческое тело обладает некоторой электрической емкостью, а следовательно, и невысоким реактивным сопротивлением для переменного электрического тока. Если прикоснуться пальцем либо каким-либо электропроводящим объектом, то через них потечет небольшой ток утечки от устройства. Специальный чип определяет эту утечку и подаёт сигнал о нажатии кнопки. Плюсами данной технологии являются: относительная долговечность, слабое влияние загрязнений и устойчивость к попаданию воды.

Сенсорные или механические кнопки

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

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

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

Из минусов можно отметить следущее:

  • Сенсорные кнопки плохо работают при минусовых температурах, поэтому они непригодны для использования за пределами помещений.
  • Высокое потребление электричества, вызванное необходимостью постоянно поддерживать одинаковую ёмкость.
  • Сенсорная кнопка не работает при нажатии её рукой в перчатке либо плохо проводящим электричество объектом

Обзор сенсорных кнопок

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

1. Troyka touch sensor

Время отклика: 80мс (в режиме энергопотребления) и 10мс (в высокоскоростном режиме)

4 мм

Размер: 25Х25 мм

Напряжение питания : 3–5 В

Время отклика: 220 мс и 80 мс

Максимальная толщина диэлектрика для нормальной работы: 2 мм

Размер: 20Х20 мм

Напряжение питания : 2–5 В

Время отклика : 220 мс и 60 мс

Размер: 24Х24 мм

Напряжение питания : 2–5 В

Размер : 30Х20 мм

Напряжение питания : 3.3–5 В

Подключение сенсорной кнопки к Ардуино

Для использования сенсорной кнопки, как, впрочем, и всех остальных модулей и датчиков, её необходимо подключить к какой-либо плате arduino. В большинстве случаев используются стандартные модули с тремя контактами: питание, сигнал и земля. Их расположения от модели к модели меняются, на схеме они отображены согласно недавнему перечислению (сенсорная кнопка заменена переключателем по причине её отсутствии в Tincercad):

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

Сенсорный модуль, по своей сути аналогичен цифровой кнопке. Пока кнопка нажата, датчик отдаёт логическую единицу, а если нет, то логический ноль.

Проекты с использованием сенсорной кнопки

Начнём с простого: при нажатии на кнопку загорается встроенный светодиод.

Const int buttonPin = 7; // Выставляем значения порта, подсоединённого с сигнал-портом кнопки void setup() { pinMode(LED_BUILTIN, OUTPUT); // Команда для адекватного реагирования светодиода pinMode(buttonPin, INPUT); // Открываем порт для считывания } void loop() { buttonState = digitalRead(buttonPin); // Считываем статус кнопки (нажата / не нажата) if (digitalRead(buttonPin)) { // Если кнопка нажата... digitalWrite(LED_BUILTIN, HIGH); // Подаём напряжение на LED_BUILTIN - значение для встроенного светодиода } else { // Иначе... digitalWrite(LED_BUILTIN, LOW); // Не подаём напряжение } }

Теперь усложним задачу: Нажатием на кнопку изменяется режим работы светодиода.

Const int buttonPin = 7; // Выставляем значения порта, подсоединённого с сигнал-портом кнопки int count = 0; // Переменная, предназначенная для выбора режима работы void setup() { pinMode(LED_BUILTIN, OUTPUT); // Команда для адекватного реагирования светодиода pinMode(buttonPin, INPUT); // Открываем порт для считывания } void loop() { if(digitalRead(buttonPin)){ // При нажатии кнопки... count = count + 1; // Изменяем режим кнопки if(count > 2){ //В случае превышения значения count начинаем отсчет сначала count = 0; } while(digitalRead(buttonPin)){ // Пустой цикл для ожидания, пока пользователь отпустит кнопку } } if(count == 0) { // 3 режима по переключению кнопки: digitalWrite(LED_BUILTIN, LOW); // 1: Выключенный светодиод } else if(count == 1) { digitalWrite(LED_BUILTIN, HIGH); // 2: Включенный } else { digitalWrite(LED_BUILTIN, HIGH); // 3: Мигающий delay(100); digitalWrite(LED_BUILTIN, LOW); delay(100); } }

Заключение

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

Рассматриваемый шилд представляет собой плату с встроенными модулями индикации и управления. Индикация осуществляется с помощью LCD-дисплея TC1602, управление – через встроенные кнопки. Есть возможность регулировки яркости дисплея прямо на плате с помощью подстроечного резистора. Плата снабжена разъемами, в которые могут быть подключены другие устройства, например, датчики. Для работы с экраном используются пины 4-10, для определения нажатия кнопок – только один аналоговый пин A0. Свободными являются цифровые пины 0-3, 11-13 и аналоговые пины A1-A5.

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

Технические характеристики

  • Тип дисплея: LCD 1602, символьный, 4-х битный режим.
  • Разрешение: 16×2 (две строки по 16 символов каждая). Знакоместо 5×8 точек.
  • Цвет дисплея: синий (возможны варианты с желтым и зеленым цветом). Буквы белого цвета.
  • Технология: STN, Transflective, Positive.
  • Контроллер дисплея: HD44780U.
  • Предельная частота обновления экрана: 5Гц
  • Питание дисплея: 5 Вольт
  • Кнопки: 6 кнопок (5 кнопок управления и Reset).
  • Дополнительные элементы: регулировка яркости подсветки (потенциометр).
  • Рабочая температура экрана: от -20 °С до +70 °С;
  • Температура хранения экрана: от -30 °С до +80 °С.

Распиновка LCD shield для подключения к Arduino

Контакт дисплея LCD 1602 Описание Контакт на LCD Shield
Пины LCD экрана
GND Земля
VDD Питание 5В
Contrast Управление контрастом Потенциометр
RS Команды/Данные 8
R/W Чтение/Запись
Enable Включение (активирование) 9
DB0 Не используется
DB1 Не используется
DB2 Не используется
DB3 Не используется
DB4 Дата 1 4
DB5 Дата 2 5
DB6 Дата 3 6
DB7 Дата 4 7
Back LED + Включение подсветки 10
Back LED – Питание подсветки
Пины для кнопок
Кнопка UP Управляющая кнопка A0
Кнопка DOWN Управляющая кнопка A0
Кнопка LEFT Управляющая кнопка A0
Кнопка RIGHT Управляющая кнопка A0
Кнопка SELECT Управляющая кнопка A0
Reset Reset
ICSP ICSP для перепрошивки встроенного микроконтроллера HD44780U
UART Контакты для UART соединения 0, 1

Дополнительные элементы шилда

  • Индикаторный светодиод (включается при подключении питания к плате).
  • Контактные площадки для подключения аналоговых устройств (GND, VSS, пин данных).
  • Потенциометр для регулирования контрастностью экрана.

Подключение платы LCD Shield к Arduino

Подключение шилда очень простое – нужно попасть ножками в соответствующие разъемы платы ардуино и аккуратно совместить их. Ничего дополнительно подсоединять или припаивать не надо. Нужно помнить и учитывать тот факт, что часть пинов зарезервированы для управления дисплеем и кнопками и не может быть использована для других нужд! Для удобства подключения дополнительного оборудования на плате выведены дополнительные разъемы 5В и GND к каждой контактной площадке аналоговых пинов. Это, безусловно, упрощает работу с датчиками. Также можно подключать цифровые устройства через свободные пины 0-3 и 11-13. Подключив шилд, мы можем работать с экраном и кнопками на нем так же, как с отдельными устройствами, учитывая только номера пинов, к которым припаяны соответствующие контакты.

Скетч для экрана на Arduino LCD shield

Для работы с LCD экранами обычно используют популярную библиотеку LiquidCrystal . На этапе инициализации создается объект класса LiquidCrystal, в конструкторе которого мы указываем пины с подключенными контактами экрана. Для нашего шилда требуется использовать такой вариант: LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Последовательность аргументов конструктора:

  • RS (8)
  • Enable (9)
  • data(4)
  • data(5)
  • data(6)
  • data(7)

Ничего сложного в работе с объектом нет. В setup() мы инициализируем объект, указывая ему количество символов и строк:

Lcd.begin(16, 2);

Для вывода информации на дисплей используем метод print():

Lcd.print (“Arduino Master!”);

Текст выведется в место текущего нахождения курсора (в начале работы скетча это первая строка и первый символ). Для указания произвольного положения курсора можно использовать функцию setCursor(<столбец>, <строка>):

Lcd.setCursor(0, 0); // Первый символ первой строки lcd.setCursor(0, 1); // Первый символ второй строки lcd.setCursor(2, 1); // Третий символ второй строки

Кнопки LCD Keypad Shield

На плате присутствуют пять управляющих кнопок, работа с которыми ведется через один аналоговый пин A0. В шилде использован достаточно распространенный способ простого кодирования сигнала, при котором каждая кнопка формирует определенное значение напряжения, которое после АЦП преобразуется в соответствующее значение от 0 до 1023. Таким образом, мы можем передавать информацию о нажатии разных кнопок через один пин, считывая его при помощи функции ;

Значения уровня сигнала на пине A0 в зависимости от выбранной кнопки:

Нажатие кнопки Значение на аналоговом пине
RIGHT 0-100
UP 100-200
DOWN 200-400
LEFT 400-600
SELECT 600-800
Клавиша не нажата 800-1023

Пример скетча работы с кнопками LCD Keypad Shield:

Int keyAnalog = analogRead(A0); if (keyAnalog < 100) { // Значение меньше 100 – нажата кнопка right // Выполняем какое-то действие для кнопки вправо. } else if (keyAnalog < 200) { // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP // Выполняем какое-то действие для кнопки вверх } else if (keyAnalog < 400) { // Значение больше 200, но меньше 400 – нажата кнопка DOWN // Выполняем действие для кнопки вниз } else if (keyAnalog < 600) { // Значение больше 400, но меньше 600 – нажата кнопка LEFT // Выполняем действие для кнопки влево } else if (keyAnalog < 800) { // Значение больше 600, но меньше 800 – нажата кнопка SELECT // Выполняем действие для кнопки выбора пункта меню } else { // Все остальные значения (до 1023) будут означать, что нажатий не было }

В выбранном методе кодирования есть два главных недостатка:

  • Нельзя отслеживать одновременное нажатие нескольких кнопок;
  • Возможные искажения сигнала могут привести к ложным срабатываниям.

Нужно учитывать эти ограничения, выбирая этот шлд в своих проектах, если вы планируете использовать устройство в системах с большим количеством помех, которые могут искажать сигнал на входе A0, из-за чего АЦП может сформировать ошибочное значение и скетч в результате выполнит другие инструкции.

Пример скетча для работы с экраном и кнопками меню

В данном примере мы определяем текущую нажатую кнопку и выводим ее название на экран. Обратите внимание, что для удобства мы выделили операцию определения кнопки в отдельную функцию. Также в скетче мы выделили отдельный метод для вывода текста на экран. В ней мы показываем сообщение (параметр message) и очищаем его через секунду. Нужно помнить, что в течение этой секунды нажатия кнопок не обрабатываются

#include LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #define BTN_UP 1 #define BTN_DOWN 2 #define BTN_LEFT 3 #define BTN_RIGHT 4 #define BTN_SELECT 5 #define BTN_NONE 10 int detectButton() { int keyAnalog = analogRead(A0); if (keyAnalog < 100) { // Значение меньше 100 – нажата кнопка right return BTN_RIGHT; } else if (keyAnalog < 200) { // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP return BTN_UP; } else if (keyAnalog < 400) { // Значение больше 200, но меньше 400 – нажата кнопка DOWN return BTN_DOWN; } else if (keyAnalog < 600) { // Значение больше 400, но меньше 600 – нажата кнопка LEFT return BTN_LEFT; } else if (keyAnalog < 800) { // Значение больше 600, но меньше 800 – нажата кнопка SELECT return BTN_SELECT; } else { // Все остальные значения (до 1023) будут означать, что нажатий не было return BTN_NONE; } } void clearLine(int line){ lcd.setCursor(0, 1); lcd.print(" "); } void printDisplay(String message){ Serial.println(message); lcd.setCursor(0, 1); lcd.print(message); delay(1000); clearLine(1); } void setup() { Serial.begin(9600); lcd.begin(16, 2); lcd.print("Arduino Master"); delay(3000); lcd.setCursor(0, 0); lcd.print("Arduino Master"); } void loop() { int button = detectButton(); switch (button) { case BTN_UP: printDisplay("UP"); break; case BTN_DOWN: printDisplay("DOWN"); break; case BTN_LEFT: printDisplay("LEFT"); break; case BTN_RIGHT: printDisplay("RIGHT"); break; case BTN_SELECT: printDisplay("SELECT"); break; default: //printDisplay("Press any key"); break; } }

Краткие выводы по плате расширения LCD keypad shield

Плата расширения LCD Keypad достаточно популярная, она проста и удобна для использования в проектах Arduino. Сегодня ее можно легко купить практически в любом интернет-магазине.

Плюсы LCD Shield:

  • Упрощает подключение жидкокристаллического экрана.
  • Уменьшает общие размеры устройства, т.к. убирает выступающие провода и монтажные платы.
  • Сокращает количество ошибок, связанных с неправильным монтажом и подключением.
  • Добавляет функциональность кнопочного управления, если на плате установлены кнопки (LCD Keypad shield).

Недостатки:

  • Стоимость шилда выше, чем стоимость отдельного экрана.
  • Не всегда нужна дополнительная функциональность в виде кнопок.
  • Шилд потребляет больше энергии, чем отдельные элементы платы.

Тачскрин дисплей станет украшением для любого проекта на Arduino.

В этой статье мы рассмотрим touchscreen display shield со встроенным слотом для microSD карты. TFT дисплей имеет диагональ 2.8", подсветку, в которой используется 4 белых светодиода, и возможность отображения 262000 оттенков цветов (18 бит)! Дисплей имеет разрешением 240х320 пикселей с индивидуальным управлением. Обратите внимание, что это гораздо больше, чем, например, у черно-белого LCD дисплея 5110. На шилде встроен резистивный тачскрин, что позволяет определяеть положение пальца при нажатии на экран.

Общая информация и техническые характеристики TFT LCD шилда 2.8"

TFT shield продается в полностью собранном виде, готовый к запуску. Достаточно его просто установить сверху на вашу Arduino и подключить необходимую библиотеку в Arduino IDE . Процедура установки-наладки-первого заруска займет не больше 10 минут!

На TFT шилде есть встроенный контроллер с буферизацией RAM. В результате большинство операций передается имнно шилду, а не грузят контроллер на Arduino . Для подключения шилда TFT дисплея достаточно несколько пинов: 12 пин отвечает за дисплей, 13 - за работу SD карты, если вы ее используете.

Конечно, производители не оставили нас наедине с даташитом и пожеланием "Удачи!". Есть библиотеки, которые значительно облегчат вашу работы с TFT шилдом.

Есть отличная open-source графическая библиотека, которая дает возможность рисовать пиксели, линии, прямоугольники, окружности и текст: Скачать на Github .

Кроме того, написана тач-скрин библиотека: Скачать на Github , которая определяет координаты x, y и z (давление), в которой есть пример скетча для демонстрации указанных возможностей. Данный скетч написандля Arduino, но может быть адаптирован для других микроконтроллеров!

Технические характеристики TFT дисплея:

  • Диагональ LCD TFT дисплея составляет 2.8"
  • Разрешение 240x320 пикселей, 18-bit (262000) цветовая гамма
  • Контроллер ILI9325 или ILI9328 со встроенным буфером оперативной памяти
  • Цифровой интерфейс на 8 бит, плюс 4 линейки управления
  • Использует цифровые пины 5-13 и аналоговые 0-3. Это значит, что можно использовать цифровые пины 2, 3 и аналоговые 4 и 5. Пин 12 тоже доступен, если вы не используете microSD карту
  • Совместим с любой платой Arduino "328 или Mega
  • Совместим с 5В! Может использовать питание логики 3.3 В и 5 В
  • Есть встроенный LDO регулятор 3.3 В @ 300 мА LDO regulator
  • Подсветка из 4 белых светодиодов. По умолчанию включена. Для управления можно подключить транзистор к цифровому пину с подсветкой
  • 4-х проводниковый резистивный сенсорный экран

Дополнительные вопросы и ответы

Я ознакомился с даташитом и обнаружил, что доступен SPI интерфейс. Почему вы используете параллельный интерфейс? SPI ведь лучше, будет задействовано меньше пинов!

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

Задействованы все пины! Как я могу подключить еще что-то к Arduino?

Пример рисования на сенсорном дисплее

Данный LCD TFT шилд имеет встроенный 2.8" 4-х проводниковый резистивный дисплей. Его можно использовать для определения места контакта пальца, стилуса и т.п. Для работы с сенсорным дисплеем вам понадобится 4 пина на Arduino.

Скачать пример вы можете здесь: Github repository . Не забудьте разархивировать скачанный файл и переместить его в папку с библиотеками Arduino IDE.

Сенсорный дисплей подключается к Arduino следущим образом:

  • Y+ подключается к аналоговому пину 1
  • Y- подключается к цифровому пину 7
  • X+ подключается к цифровому пину 6
  • X- подключается к аналоговому пину 2

После подключения загрузите пример tftpaint_shield, который находится в библиотеке TFTLCD library. С правой стороны на экране появятся "боксы с цветами". Вы можете нажать на один из боксов для выбора цвета, которым будете рисовать. Нажав на левую часть экрана вы можете его очистить.

Сенсорный дисплей сделан из тонкого стекла. Он очень хрупкий. Малейшая трещина или повреждение выведет его из строя. Будьте аккуратны при переносе дисплея, особенно с его углами. Для взаимодействия с резистивным экраном можно использовать не только пальцы, но и стилусы. Понятное дело, слишком сильно давить на поверхность дисплея тоже не стоит.


Загрузка рисунков

На TFT LCD дисплее 2.8" дюйма есть встроенный слот для micoSD карты. Этот слот можно использовать для загрузки изображений! Предварительно отформатируйте карту в FAT32 или FAT16 (более детально особенности работы SD карты с Arduino отображены здесь).

В большинстве скетчей-примеров SD карта не будет работать. Необходимо ее предварительно инициализировать.

Для увеличения скорости обмена данных можно загрузить дополнительную библиотеку здесь: Fixes & Updates to the Arduino SD Library . Не забудьте скопировать распакованную библиотеку в соответствующую папку в Arduino IDE.

Если вы пользуетесь Arduino Mega, внесите некоторые правки в файл SD/utility/Sd2Card.h. Надо снять тег комментария со строки #define MEGA_SOFT_SPI 1. Благодаря этому для обмена данными с SD картой, Arduino Mega сможет использовать те же пины, что и классические Arduino. Для тестировки можете загрузить это изображение тигра: Download this tiger bitmap and save it to the microsd card!

Запустите Arduino IDE и выберите скетч tftbmp_shield. Загрузите его на Arduino и вуаля! На экране отобразится следующее:


Для загрузки подойдут изображения, размер которых меньше 240х320 пикселей. Рисунки надо сохранять в 24-битном BMP формате. Даже если изначально рисунок не имел 24 бита, пересохраните его, так как это самый легкий формат для чтения с помощью Arduino. Можно поворачивать рисунки с использованием процедуры setRotation().

Управление подсветкой

По умолчанию разработчики шилда считают, что вы постоянно будете использовать подсветку. Однако вы можете управлять ее яркость с помощью ШИМ выходов или вообще выключать для экономии энергии. Для этого вам понадобится немного потрудиться. Найдите на задней стороне TFT LCD шилда 2.8" два коннектора подсветки. С помощью ножа уберите дорожку между клемами VCC и соедините два квадрата, обозначенных Pin3. После этого вы сможете управлять подсветкой с использованием цифрового пина 3.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

В этой статье описывается схема подключения TE-ULCD к Arduino и его совместное использование с платой расширения Ethernet Shield v2. В процессе изучения модуля получилась библиотека и небольшой скетч получающий из сети Internet и отображающий время в формате UTC, состояние дорожного траффика в Москве, с помощью сервиса Яндекс.пробки, и погоду, с использованием сервиса информеров GisMeteo.

Данный модуль выбран мной как одно из немногих доступных в РФ готовых решений на базе SPI интерфейса, т. е. не требующее много (16-32) пинов для управления.

TE-ULCD выпускается ООО “Терраэлектроника”. Модуль выполнен на основе 3,5” (или 5,6”) цветного графического дисплея с сенсорным экраном и 32-разрядного ARM-7 микроконтроллера. Обслуживание цветного графического дисплея с помощью специализированного микроконтроллера позволяет разделить функции отображения информации и управления и дает возможность обеспечить интерфейс «человек-машина» в различных информационно-управляющих системах. В память программ микроконтроллера на этапе изготовления загружается библиотека графических функций. Функции могут быть вызваны из прикладной программы при помощи SPI-команд. Это значительно упрощает формирование изображения на TFT-дисплее, а также обслуживание сенсорного экрана. Предусмотрена возможность обновления загруженной библиотеки. Для хранения картинок в формате BMP используется карта памяти microSD.

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

Подключение

Питание дисплейного модуля осуществляется от 5 вольт постоянного тока, в руководстве пользователя производитель указывает номинальный ток 0,2 А. Я измерил потребляемый ток с помощью цифрового блока питания получилось стабильно 0,299 А, так что стоит ориентироваться на 0,3 А. При питании TE-ULCD от ардуино, преобразователь напряжения установленный на плате грелся довольно сильно, поэтому на всякий случай я запитал дисплейный модуль от USB персонального компьютера взяв шнурок от старой мышки. Разъем Х8 TE-ULCD предназначен для подачи питания и имеет следующую распиновку: PIN 1, 3, 7 и 9 - вход 5 В, PIN 2, 4, 6, 8, 10 - GND, PIN5 используется как ключ для контроля правильности подключения. Подавать питание можно на один любой пин +5 В и GND.
Подключение ардуино выполняется к разъему Х6 дисплейного модуля, согласно схеме представленной на рисунке. SPI TE-ULCD функционирует с уровнем 3,3 В, поэтому следует согласовать уровни дисплейного модуля и ардуино с помощью простого делителя на резисторах .
Так как планируется использовать TE-ULCD и плату расширения Ethernet Shield совместно, для выбора управляемых (ведомых) устройств будут использоваться PIN9 и PIN10 соответственно. PIN9 выбран изходя из удобства подключения и можно использовать любой другой свободный поменяв значение slaveSelectPin в скетче.

Команды записи и чтения TE-ULCD соответствуют настройкам SPI CPOL=1 и CPHA=1, что соответствует SPI_MODE3 для ардуино. Для платы расширения Ethernet Shield v2 настройки SPI соответствуют SPI_MODE0. Эти настройки понадобятся для обращения к соответствующему модулю.

Описание программы

Программа описанная в статье использует специально подготовленную для ардуино библиотеку ULCD . Картинки для TE-ULCD следует записать на microSD.

Описание команд, регистров и сообщений графического модуля TE-ULCD использованные в библиотеке ULCD взяты мной из руководства оператора на модули TE-ULCD35/56. Модуль TE-ULCD поддерживает два режима работы: терминальный и режим работы с использованием библиотеки графических функций (представлен в данном примере).

В настоящее время набор встроенных виджетов (примитивов графического интерфейса пользователя) TE-ULCD включает в себя:

    Frame (0х01). Является обязательным, используется для размещения виджетов.

    Window (0х00). Предназначено для размещения виджетов, обладает заданным набором свойств.

    Panel (0х06). Предназначена для размещения виджетов, обладает заданным набором свойств.

    StaticLine (0х12). Представляет собой линию с тенью, может быть использован для отделения одних компонентов от других.

    Button (0х0А). Позволяет разместить кнопку и выполнить какие-либо действия при нажатии на нее.

    Text (0х07). Служит для отображения текста на экране.

    Bitmap (0х05). Предназначен для вывода на экран изображения в формате bmp.

    RotateControl (0х0В). Предназначен для вывода на экран изображения регулятора в виде вращающегося "колесика".

    Slider (0х0С). Предназначен для вывода на экран изображения регулятора в виде "ползунка".

Использование библиотеки ULCD

В библиотеке ULCD для ардуино реализованы следующие процедуры для работы с универсальным дисплейным модулем TE-ULCD:

    ULCD() - конструктор;

    void RESET() - программный сброс модуля;

    void digitalPortWrite(byte value) - отправка одного байта от ардуино к TE-ULCD;

    void LOAD_FONT(byte R, String FileName) - загрузка шрифта из флеш-памяти TE-ULCD в регистр TE-ULCD;

    void LOAD_PICTURE(byte R, String FileName) - загрузка картинки в формате BMP с microSD карты в регистр TE-ULCD;

    void LOAD_TEXT(byte R, String Text) - загрузка текстовой строки из ардуино в регистр TE-ULCD;

    void LOAD_SCRIPT(byte R, byte Number) - загрузка скрипта из ардуино в регистр TE-ULCD;

    void SET_SIZE(int X, byte Y) - установка размера виджета;

    void SET_POS(int X, byte Y) - установка позиции (левого нижнего угла) виджета;

    void SET_BACK_COLOR(byte R, byte G, byte B) - установка цвета фона виджета;

    void SET_FONT_COLOR(byte R, byte G, byte B) - установка цвета шрифта виджета;

    void SET_FONT(byte R) - установка шрифта виджета из регистра TE-ULCD;

    void SET_MAIN(byte R) - установка виджета главным (применяется только для фрейма);

    void SET_SCALE(byte min, byte max, byte pos) - задание минимального, максимального и значения по умолчанию виджета (для слайдера и "колесика");

    void SET_SCRIPT(byte R) - установка скрипта для виджета (действия которое будет выполнено TE-ULCD при заданном событии) из регистра TE-ULCD;

    void SET_TEXT(byte R) - установка строки для виджета из регистра TE-ULCD;

    void SET_PICTURE(byte R) - установка картинки в формате BMP для виджета из регистра TE-ULCD;

    void SEND_REG(byte R1, byte R2) - переслать содержимое регистра R2 в R1;

    void WRITE_REG(byte R, byte value) - запись значения в указанный регистр TE-ULCD;

    void CR_WID(byte WidType) - создание виджета указанного типа (из списка встроенных виджетов TE-ULCD);

    byte READ(byte R) - чтение содержимого регистра TE-ULCD;

    void REPAINT_TEXT(byte R1, byte R2, String Text) - заменить (перерисовать) текст виджета хранящегося в регистре R1, на текст передаваемый в переменной Text, сохранить текст в регистре R2;

    void REPAINT_BMP(byte R1, byte R2) - перерисовать картинку виджета хранимого в регистре R1 на картинку хранимую в регистре R2;

Например фоновый рисунок в программе устанавливается следующим образом:

#include ULCD lcd; // ... lcd.LOAD_PICTURE (1 , "back.bmp" ) ; //Загружаем картинку с microSD в регистр R1 lcd.CR_WID (5 ) ; //Создаем виджет BitMap (для фона) lcd.SET_SIZE (320 , 240 ) ; //Устанавливаем размер BitMap равным размеру экрана TE-ULCD35 lcd.SET_POS (0 , 0 ) ; //Устанавливаем позицию BitMap lcd.SET_PICTURE (1 ) ; //устанавливаем картинку для виджета из регистра R1

Для удобства пользователя TE-ULCD располагает 32-мя регистрами (R0-R31) общего назначения для хранения указателей на виджеты (картинки, текст, скрипты). При желании указатели можно хранить в ардуино.

Получение состояния дорожного траффика

Сделать свой светофор захотелось сразу после того как увидел подобный в Яндексе, только там он управлялся с ПК, а хочется все таки автономный - только ардуино и Ethernet Shield. Напрямую запрос о состоянии трафика с сервера Яндекс.пробки получить нельзя. Письмо в техподдержку команду Я.пробки тоже не помогло: “Благодарим за внимание к нашему сервису. Мы не поставляем такую информацию. Попробуйте, подключить модуль пробок и использовать элемент управления "Пробки".”

Для получения состояния дорожного трафика я воспользовался информером, точнее картинкой которая передается в нем. Алгоритм действий следующий:

    Подключаемся к серверу (info.maps.yandex.net);

    Анализируем полученную картинку, она передается в стандарте PNG (0xFF 0xA4 0x00 желтый, 0x3F 0xBB 0x00 зеленый, 0xFF 0x2A 0x00 красный), наличие цветов уникально для каждого состояния зеленый-желтый-красный (даже более того, считая количество пикселей каждого цвета можно определить балл пробок, а не только цвет);

    Отображаем картинку на экране TE-ULCD.

Запрос картинки информера имеет следующий вид:

GET http://info.maps.yandex.net/traffic/moscow/current_traffic_88.gif HTTP/1.1 Accept: image/gif Accept-Language: en-US; Cache-Control: max-age=0 Host: info.maps.yandex.net User-Agent: Chrome

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

Получение времени

Самый простой и легкий способ получения времени в формате UTC - послать запрос на какой либо сервер (сначала я использовал гугл, но потом для экономии памяти перешел на сервер яндекс.пробки) и разобрать ответ, получаемая таким образом строка имеет вид:

В настоящий момент запрос для получения времени выглядит так:

GET http://info.maps.yandex.net/traffic/moscow HTTP/1.1

Точность такого времени не высока - до минут, но для простых часов подходит.

Получение прогноза погоды

Для получения прогноза погоды на ближайшие сутки я использовал сервис получения информера от GisMeteo в XML формате . Данные о погоде представляют из себя подробную сводку по всем метеопараметрам, с шагом 6 часов и заблаговременностью одни сутки. Тут все просто, указываем в запросе город и получаем в ответ для него прогноз погоды, разбираем его и отображаем на экране прогноз на ближайшие 6 часов.

int freeRam () { extern int __heap_start, * __brkval; int v; return (int ) & v - (__brkval == 0 ? (int ) & __heap_start : (int ) __brkval) ; }

Если кто то подскажет как можно улучшить программу буду благодарен:), для обсуждений есть

Дисплей 2.4 TFT 240х320 сенсорный + MicroSD

Модуль является бескорпусным цветным ЖКИ монитором QVGA с сенсорным экраном, имеющим диагональ 2,4 дюйма. Он предназначен для работы совместно с микроконтроллерами разных типов и процессорными системами. Несмотря на возможность отображения полноцветных фотографий, основное применение – отображение простой графики и символьных данных с использованием 16 цветов. На экран можно выводить анимацию:

Графических возможностей монитора достаточно для создания изображения клавиатуры работающей благодаря сенсорным поверхностям. Одновременно с обработкой нажатий дисплей 2.4 TFT 240х320 сенсорный + MicroSD отображает результаты выполнения команд оператора и индицирует значения контролируемых параметров. Применение значительно упрощает устройства ввода-вывода прибора. ЖКИ индикатор имеет постоянно включенную подсветку. Есть одна кнопка. На плате расположен контейнер для SD карты.

Характеристики 2.4 TFT 240х320

Питание
Напряжение 5 В
Ток 300 мА
Напряжение входных сигналов 5 или 3,3 В
Диагональ 2,4 дюйма
Разрешающая способность 320 X 240 точек с индивидуальным контролем
Максимальное количество оттенков 262144
Подсветка белая
Интерфейс 8080
Максимальный объем microSD карты 32 Гб
Размеры 71 x 52 x 7 мм

Контакты

ЖКИ индикатор использует 8 контактов модуля для передачи данных и 4 контакта для сигналов управления. Сенсорная часть дисплея использует 4 контакта совместно с ЖКИ. Работа с Micro SD картой требует 4 контакта.

Контакт
3.3V Питание
5V Питание
GND Питание
J4-1 Кнопка

ЖКИ индикатор и сенсорная поверхность

LCD_RD управление ЖКИ, чтение
LCD_WR TOUCH_YP управление ЖКИ, запись или данные сенсорной поверхности
LCD_RS TOUCH_XM управление ЖКИ, команда/данные или данные сенсорной поверхности
LCD_CS управление ЖКИ, выбор устройства
LCD_RST сброс
LCD_D2 данные ЖКИ
LCD_D3 данные ЖКИ
LCD_D4 данные ЖКИ
LCD_D5 данные ЖКИ
LCD_D6 / TOUCH XP данные ЖКИ / данные сенсорной поверхности
LCD_D7 / TOUCH YM данные ЖКИ / данные сенсорной поверхности
LCD_D0 данные ЖКИ
LCD_D1 данные ЖКИ

SD_CS выбор
SD_DI SD вход данных
SD_DO выход данных
SD_SCK тактирование данных

Дисплей 2.4 TFT 240х320 сенсорный + MicroSD может устанавливаться в соединители Arduino.

Подключение к Arduino UNO:

Контакты модуля Arduino
LCD_CS A3
LCD_RS A2
LCD_WR A1
LCD_RD A0
LCD_ RST A4, можно присоединить LCD_RESET к линии RESET Arduino UNO как описано ниже.
LCD_D0 DIO 8
LCD_D1 DIO 9
LCD_D2 DIO 2
LCD_D3 DIO 3
LCD_D4 DIO 4
LCD_D5 DIO 5
LCD_D6 DIO 6
LCD_D7 DIO 7
SD SS DIO 10
SD DI DIO 11
SD DO DIO 12
SD SСK DIO 13
3.3V 3.3V
5V 5V
GND GND


При установке в контакты Arduino UNO перед включением следует проверить отсутствие касания контактами платы разъема USB и при необходимости на плату приклеить изолятор.

Схема

Дисплей 2.4 TFT 240х320 сенсорный + MicroSD.

Питание 5 вольт поступает на цепи схемы и микросхему U1 стабилизатор напряжения 3,3 вольта. Информационные сигналы проходят через микросхемы 74xx541 – буферы шин данных. IC1 микросхема ADS7843 – контроллер сенсорных экранов. Это 12 битный АЦП с устройством выборки-хранения, синхронным последовательным интерфейсом и низкоомными ключами управления сенсорными контактами.
Основной компонент модуля – TFT1 совмещенный со специализированным контроллером жидкокристаллический экран. Ссылки на описание ЖКИ и различных типов контроллеров в конце страницы.

Кнопка

На краю платы модуля расположена кнопка. Кроме сенсорной клавиатуры дисплей 2.4 TFT 240х320 сенсорный + MicroSD имеет механическую кнопку. Ее контакты соединяют с общим проводом контакт 1 соединителя J4. Это расположенный с краю соединителя J4 возле контакта 3V3 неподписанный контакт. Кнопка может использоваться для нужд компонуемого прибора. При работе совместно с Arduino контакт 1 соединителя J4 подключается к линии сброс. Нажатие кнопки вызывает сброс Arduino.

Начало работы

Большая часть обеспечения работы модуля принадлежит программе микроконтроллера. Для этого удобно использовать опубликованные в интернете существующие программные решения. За основу берут написанные для Arduino программы и модифицируют их под аппаратные средства разрабатываемого прибора.
Когда мы пытаемся обуздать дисплей 2.4 TFT 240х320 сенсорный + MicroSD можно получить неожиданные результаты: белый экран, весь экран с шумом, сенсорные функции не работают или инвертируется позиция по координате Y, инвертируются цвета. Дело в том, что в дисплей различные производители устанавливают различные типы основного контроллера ЖКИ: ST7781, Spfd5408, IL9341, Sitronix ST7783262K, S6D0154 и другие. Их описания в конце страницы. Прежде всего нужно определить какой тип контроллера дисплея применен в вашем модуле. Микросхема и ЖКИ экран это одно устройство. Установить тип можно только программным путем. Для этого используют микроконтроллерный модуль Arduino UNO и программу LCD_ID_Reader Version 1.2 , которая читает идентификатор микросхемы. LCD_ID_Reader не требует установки дополнительных библиотек. Также есть программа определения типа контроллера в библиотеке самурай, речь о ней пойдет далее.

Программное обеспечение Arduino

Для различных контроллеров ЖКИ разработаны различные библиотеки.

JoaoLopesF . По сути это доработанная для SPFD5408 библиотека от Adafruit. В ней есть возможность калибровки сенсорного экрана.

Для контроллеров
S6D0154 диагональ 2,8 дюйма
ILI9488 диагональ 3,95 дюйма 320 x 480 точек
ILI9327 диагональ 3,6 дюйма
ILI9341
NT35702, совместим с ILI9327
Библиотека самурай
По умолчанию эта библиотека предназначена для экранов с диагональю 2,8 дюйма. На меньших пропадает часть изображения. Для диагонали 2,4 дюйма в файле TFTLCD-Library/Adafruit_TFTLCD.cpp надо нейтрализовать строки:

//#define TFTWIDTH 320
//#define TFTHEIGHT 480

И убрать символы комментария в строках:

#define TFTWIDTH 240
#define TFTHEIGHT 320

Программа определения типа контроллера ЖКИ – graphicstest. В монитор последовательного порта будет выведен тип контроллера ЖКИ.
Для работы сенсорного экрана измените #define YP A1 #define XM A2 #define YM 7 #define XP 6

Для контроллеров
ILI9325
ILI9328
И для контроллера с кодом идентификации 0xC505
Библиотека adafruit/TFTLCD-Library

Для контроллера ST7781 установить:
Smoke-And-Wires/TFT-Shield-Example-Code
adafruit/Adafruit-GFX-Library
adafruit/Touch-Screen-Library

Установка библиотеки, тестирование, описание библиотеки, шрифты, о пределение координат нажатия, работа с микроSD картой, конвертирование из формата 24-bit в 16-bit

Сенсорная поверхность

Дисплей 2.4 TFT 240х320 сенсорный + MicroSD передает программе три величины: координаты нажатия (X и Y) и давление Z. Используется резистивная технология сенсорного экрана.

Поверхность состоит из двух полимерных слоев, покрытых резистивным материалом, выступающим в качестве электродов. Слои склеиваются по краям. Под управлением программы данные поступают из микросхемы IC1 для обнаружения нажатия. Микроконтроллер прибора получает 10-битное число (0..1023) для каждой оси. Программно эта величина масштабируется в соответствии с размерами экрана.

Пять проводов сенсорной поверхности (четыре сигнальных и один общий) подключены через тонкий шлейф к контроллеру ЖКИ.

Для контроллера SPFD5408 используется библиотека 4-wire resistive touchscreens . Скопируйте разархивированные и переименованные папки:

Для контроллера ЖКИ ST7781 применяется библиотека контроля нажатия . Также установите . Скачайте и разархивируйте демонстрационный код . Скопируйте папку SWIFT-Shield из извлеченного архива в папку библиотек Arduino.

Графический тест

Для модуля с контроллером IL9341.

Подключите дисплей 2.4 TFT 240х320 сенсорный + MicroSD к Arduino UNO. Загрузите библиотеки adafruit/TFTLCD-Library и Adafruit-GFX-Library .

Попробуйте пример graphictest в библиотеке adafruit/TFTLCD. На экране должно быть изображение как показано выше. Если дисплей 2.4 TFT 240х320 сенсорный + MicroSD ничего не отображает или показывает только статическую картинку, то можно попробовать изменить программу graphictest. Модификация программы заключается в жесткой установке типа контроллера дисплея. Строку 60 замените на:

Uint16_t identifier = 0x9341; //Need hardcode here (IC)

Для контроллера ЖКИ SPFD5408.

Создайте два графических файла формата BMP со следующими параметрами: 320 точек ширина картинки, цвет 24 бит и объем не превышающий 250 Кбайт. Имя файла должно состоять из восьми латинских букв. Скопируйте файл в корневой каталог карты microSD. Если эксперимент пройдет удачно, то на карту можно записать много картинок. Тест будет выводить их на экран поочередно.

Скачать следующие библиотеки:
TFT-Shield-Example-Code
Распакуйте и скопируйте в папку SWTFT-Shield в библиотеки Arduino.

Подключите USB-кабель к ПК и откройте Arduino IDE. Далее откройте Under File->Examples –> SWTFT-Shield.

Результаты работы программных примеров.

Graphicstest

Rotationtest.
Откройте последовательный монитор Arduino IDE и выберите скорость 9600 и New Line в нижней части окна. При нажатии на кнопку Send будут появляться различные изображения.

Ttfbmp.
Файлы BMP записанные на micro SD карту будут выводится на экран.

Ttfpaint.
Можете выбрать любой цвет чтобы рисовать или писать на сенсорном экране.