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

Тачскрин дисплей станет украшением для любого проекта на 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.

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

Дисплей 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.
Можете выбрать любой цвет чтобы рисовать или писать на сенсорном экране.

В этой статье описывается схема подключения 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) ; }

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

Для Arduino есть очень много модулей, датчиков. Но все это скучно без дисплея)) В этой статье мы с вами подключим TFT дисплей с драйвером ILI9341 к контролеру.

В руки мне попал Китайский брат с маркировкой KMRTM24024-SPI. Это TFT дисплей с диагональю 2.4″ и SPI интерфейсом.

Характеристики:

  • Диагональ: 2,4 .
  • Цвет: 18-бит, 262 000 оттенков.
  • Разрешение: 320 х 240.
  • Соотношение сторон экрана: 4: 3 .
  • Питание: 3.3В/5 В.
  • Интерфейс: SPI .

Самое интересное, что логика работы драйвера 3.3 В . По этому нам потребуется согласовать наше Arduino с логикой 5 В и дисплей.

Выводы:

  • VCC = +5v (+5 вольт).
  • GND = GND (земля).
  • LED = +3.3v (подсветка дисплея).
  • SCK = SPI.
  • SDI/SD (MOSI) = SPI.
  • SDO(MISO) = SPI.
  • CS = выбор устройства.
  • D/C = Команда/Данные.

Схема подключения:

Так как логика работу у дисплея и контролера разная нам надо их согласовать. Тут есть два варианта:

Когда на вход A подается +5 вольт, на выходе G будет +3.3 В. Думаю принцип работы понятен.

Соединение дисплея с Arduino Nano:

SCK -- pin D8 (через делитель).
SDI (MOSI) -- pin D9 (через делитель).
D/C -- pin D10 (через делитель).
RESET -- pinD 11 (через делитель).
CS -- pin D12 (через делитель).
VCC -- +5v (+5 вольт,ВНИМАНИЕ ваш дисплей может питаться 3.3В)
GND -- GND (земля).
LED -- +3.3v (подсветка дисплея).

Кодинг:

Для работы с дисплеем есть много разных библиотек. Я использую библиотеку UTFT которую скачаем с GitHab или с нашего сайта . Загрузим готовый скетч из примеров с нашим разрешение:

// библиотека для работы с дисплеем #include // создаём объект класса UTFT // и передаём идентификатор модели дисплея и номера пинов // к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS // UTFT myGLCD(TFT01_22SP, SDI (MOSI),SCK ,CS ,RESET , D/C); UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10); // объявления встроенных шрифтов extern uint8_t SmallFont; extern uint8_t BigFont; extern uint8_t SevenSegNumFont; void setup() { } void loop() { // инициализируем дисплей с вертикальной ориентацией myGLCD.InitLCD(0); // очищаем экран myGLCD.clrScr(); // выбираем большой шрифт myGLCD.setFont(BigFont); // печатаем строку в центре верхней строки дисплея myGLCD.print("TFT01_22SP", CENTER, 0); // выбираем большой шрифт myGLCD.setFont(SmallFont); // печатаем строку в указанной строке позиции myGLCD.print("Hello from Amperka!", CENTER, 50); // выбираем сесисегментный шрифт myGLCD.setFont(SevenSegNumFont); // печатаем строку в указанной строке позиции myGLCD.print("12345", CENTER, 100); // ждём 1 секунду delay(10000); // инициализируем дисплей с горизонтальной ориентацией myGLCD.InitLCD(1); // очищаем экран myGLCD.clrScr(); // выбираем большой шрифт myGLCD.setFont(BigFont); // печатаем строку в центре верхней строки дисплея myGLCD.print("Hello, user!", CENTER, 0); // выбираем большой шрифт myGLCD.setFont(SmallFont); // печатаем строку в указанной строке позиции myGLCD.print("The screen is 2.2 diagonal", CENTER, 50); // выбираем сесисегментный шрифт myGLCD.setFont(SevenSegNumFont); // печатаем строку в указанной строке позиции myGLCD.print("67890", CENTER, 100); // ждём 1 секунду delay(10000); }

Этот пример поможет вам с конвертацией типа float в string:

Arduino-FloatToString #include // included for floatToString function String floatToString(float x, byte precision = 2) { char tmp; dtostrf(x, 0, precision, tmp); return String(tmp); } void setup() { float f = -17.06f; // some float number String str = floatToString(f); // conversion call // print over serial Serial.begin(9600); Serial.println(str); } void loop() { }

Эта статья посвящена работе с резистивными TouchScreen без встроенных контроллеров.
Координаты касания определяются по аналоговым данным полученным с TouchScreen.

Ознакомиться с процессом получения координат касания через контроллеры функций TouchScreen можно в разделе .

Некоторые дисплеи оснащены сенсорным экраном (TouchScreen - дословно переводится как трогать экран), который позволяет получать координаты точки прикосновения. Используя эти координаты, можно рисовать кривые или использовать их для имитации клавиатуры.

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

Общие сведения:

Резистивный TouchScreen состоит из двух прозрачных панелей. Одна панель - стеклянная (находится со стороны дисплея), вторая панель - из эластичного пластика (находится с внешней стороны, именно на неё мы и нажимаем), она выполняет роль мембраны. На внутренние поверхности обеих панелей (которые «смотрят» друг на друга) нанесён тонкий токопроводящий слой, имеющий однородное сопротивление. С противоположных сторон панелей присутствуют выводы, по два на каждую панель (см. рисунок ниже). Между панелями существует небольшой зазор заполненный микро-изоляторами (диэлектрическими микро-шариками), гарантирующими, что панели электрически не соединены. При касании мембраны, токопроводящие слои на мембране и на стекле соприкасаются друг с другом, электрически соединяясь. Сопротивление между выводами обеих панелей зависит от координат точки их соприкосновения.


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

Получение координат касания:

Для получения координат, нужно сконфигурировать два вывода Arduino подключённые к одной панели в режим входа, а два вывода Arduino подключённые к другой панели, в режим выхода. На выходы, подать разные логические уровни (на один LOW на другой HIGH), а с одного из входов, считать уровень напряжения.

Получение координаты по оси X:

  • Выводы Arduino к которым подключены выводы X+ и X- (с напыления на стекле) переводятся в режим выхода.
  • На вывод X+ (XP) подаётся уровень HIGH, а на вывод X- (XM) подаётся уровень LOW.
  • Выводы Arduino к которым подключены выводы Y+ и Y- (с напыления на мембране) переводятся в режим входа.
  • Данные полученные функцией analogRead, со входа Y+ (YP) будут обратно пропорциональны координате касания по оси X.
  • Вывод Y- (YM) находится в состоянии высокого импеданса, так как мы перевели его в режим входа, но данные с него читать не будем.

Получение координаты по оси Y:

  • Выводы Arduino к которым подключены выводы Y+ и Y- (с напыления на мембране) переводятся в режим выхода.
  • На вывод Y+ (YP) подаётся уровень HIGH, а на вывод Y- (YM) подаётся уровень LOW.
  • Выводы Arduino к которым подключены выводы X+ и X- (с напыления на стекле) переводятся в режим входа.
  • Данные полученные функцией analogRead, со входа X- (XM) будут обратно пропорциональны координате касания по оси Y.
  • Вывод X+ (XP) находится в состоянии высокого импеданса, так как мы перевели его в режим входа, но данные с него читать не будем.

Если на выводы пластины, к которой подаётся напряжение, вместо LOW подать HIGH, а вместо HIGH подать LOW (поменять местами уровни выводов), то считанное значение будет не обратно, а прямо пропорционально координате касания.

Читать данные можно с любого вывода той пластины, на которую не подавалось напряжение (уровни LOW и HIGH), но так как обычно один из выводов соединён с аналоговым выводом Arduino, а другой с цифровым, то и читать данные приходится только с того вывода, который подключён к аналоговому выводу Arduino.

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

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

Пример:

// Подключаем библиотеки: #include // Подключаем библиотеку для работы с дисплеем #include // Подключаем библиотеку для работы с TouchScreen // Определяем выводы используемые для управления дисплеем 2.8" TFT 320x240 UNO: const uint8_t RS = A2; // const uint8_t WR = A1; // const uint8_t CS = A3; // const uint8_t RST = A4; // const uint8_t SER = A0; // // Определяем выводы используемые для чтения данных с TouchScreen: const uint8_t YP = A2; // Вывод Y+ должен быть подключен к аналоговому входу const uint8_t XM = A3; // Вывод X- должен быть подключен к аналоговому входу const uint8_t YM = 8; // Вывод Y- const uint8_t XP = 9; // Вывод X+ // Определяем экстремумы для значений считываемых с аналоговых входов при определении точек нажатия на TouchScreen: const int tsMinX = 210; // соответствующий точке начала координат по оси X const int tsMinY = 205; // соответствующий точке начала координат по оси Y const int tsMaxX = 930; // соответствующий максимальной точке координат по оси X const int tsMaxY = 915; // соответствующий максимальной точке координат по оси Y const int mipPress = 10; // соответствующий минимальной степени нажатия на TouchScreen const int maxPress = 1000; // соответствующий максимальной степени нажатия на TouchScreen // Создаём объекты библиотек: UTFT myGLCD(TFT28UNO, RS, WR, CS, RST, SER); // Создаём объект для работы с дисплеем TouchScreen ts = TouchScreen(XP, YP, XM, YM); // Создаём объект для работы с TouchScreen // void setup(void){ // Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек myGLCD.InitLCD(); // Инициируем работу с TFT дисплеем myGLCD.clrScr(); // Чистим экран дисплея } // void loop(){ // // Считываем показания с TouchScreen: TSPoint p = ts.getPoint(); // Считываем координаты и интенсивность нажатия на TouchScreen в структуру p // Возвращаем режим работы выводов: pinMode(XM, OUTPUT); // Возвращаем режим работы вывода X- в значение «выход» для работы с дисплеем pinMode(YP, OUTPUT); // Возвращаем режим работы вывода Y+ в значение «выход» для работы с дисплеем // Если зафиксировано нажатие на TouchScreen, то... if(p.z>mipPress && p.zКалибровка:

Для калибровки в скетче предусмотрены 4 константы: tsMinX , tsMinY , tsMaxX и tsMaxY , хранящие экстремумы (крайние значения) читаемых уровней с аналоговых входов для осей X и Y.

Дело в том, что библиотека TouchScreen возвращает прочитанные уровни, а не значения координат. Для того чтоб они стали координатами, их нужно преобразовать от диапазона уровней к диапазону координат, что и происходит в скетче в разделе «Преобразуем значения полученные с TouchScreen в координаты дисплея». Диапазон координат нам известен: для оси X от 0 до ширины дисплея, для оси Y от 0 до высоты дисплея, в пикселях. А диапазон читаемых уровней зависит от типа TouchScreen. Для того чтоб узнать этот диапазон, нужно разкомментировать строку в разделе « Выводим «сырые» показания TouchScreen», загрузить скетч и открыть монитор последовательного порта.

Грубая калибровка:

При каждом нажатии на экран, в мониторе будут отображаться координаты нажатия X и Y. Понажимайте возле каждого края экрана, при этом запомните или запишите как самое максимальное, так и самое минимальное значение для каждой оси. После чего присвойте эти значения, в разделе «Определяем экстремумы» (в начале скетча), для каждой константы: tsMinX, tsMinY, tsMaxX и tsMaxY. И загрузите скетч заново.

Точная калибровка:

После того как TouchScreen был грубо откалиброван, может понадобиться более точная калибровка.

Расположите экран так, как это показано на самом первом рисунке данной статьи (начало координат обеих осей слева сверху).

  • Плавно проведите линию по экрану от центра влево.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMinX нужно уменьшить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMinX нужно увеличить.
  • Плавно проведите линию по экрану от центра вправо.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMaxX нужно увеличить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMaxX нужно уменьшить.
  • Плавно проведите линию по экрану от центра вверх.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMinY нужно уменьшить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMinY нужно увеличить.
  • Плавно проведите линию по экрану от центра вниз.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMaxY нужно увеличить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMaxY нужно уменьшить.

Описание функций библиотеки:

Подключение библиотеки:

#include // Подключаем библиотеку TouchScreen ts = TouchScreen(ВЫВОД_X+ , ВЫВОД_Y+ , ВЫВОД_X- , ВЫВОД_Y- [ , СОПРОТИВЛЕНИЕ ]); // Создаём объект ts для работы с TouchScreen, указывая номера его выводов // необязательный параметр СОПРОТИВЛЕНИЕ в Омах (между выводами Y+ и Y-) позволяет более точно определять степень нажатия

Функция getPoint();

  • Назначение: получение «сырых» данных о точке нажатия
  • Синтаксис: getPoint();
  • Параметры: Нет
  • Возвращаемые значения: Структура из трёх переменных типа int16_t
    • x - значение с аналогового входа, прямопропорциональное координате нажатия по оси X
    • y - значение с аналогового входа, прямопропорциональное координате нажатия по оси X
    • z - значение соответствующее степени нажатия на TouchScreen
  • Примечание: Каждое значение можно получить по отдельности, воспользовавшись функциями описанными ниже
  • Пример:
TSPoint p = ts.getPoint(); // Определяем структуру «p» с тремя переменными типа int16_t, которые хранят значение координат и интенсивность нажатия

Функция readTouchX();

  • Назначение: получение «сырого» значения соответствующего точке нажатия по оси X
  • Синтаксис: readTouchX();
  • Параметры: Нет
  • Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону ширины экрана
  • Пример:

Int i = ts.readTouchX(); // Получаем «сырое» значение соответствующее координате X

Функция readTouchY();

  • Назначение: получение «сырого» значения соответствующего точке нажатия по оси Y
  • Синтаксис: readTouchY();
  • Параметры: Нет
  • Возвращаемые значения: число типа int
  • Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону высоты экрана
  • Пример:

Int i = ts.readTouchY(); // Получаем «сырое» значение соответствующее координате Y

Функция pressure();

  • Назначение: получение значения соответствующего степени нажатия на TouchScreen
  • Синтаксис: pressure();
  • Параметры: Нет
  • Возвращаемые значения: число типа int
  • Пример:

Int i = ts.pressure(); // Получаем значение соответствующее степени нажатия на TouchScreen

Примечание:

Координаты сенсора должны совпадать с координатами дисплея. Если Вы будете выводить данные на дисплей библиотекой не UTFT .