Урок 6 – работа с дисплеем st7783

12.2 – Дисплей Nextion урок 2. Подключаем и передаем данные на Arduino.

Создавать проекты, и загружать картинки в Nextion Editor мы научились в предыдущем уроке. Сегодня продолжаем осваивать работу с дисплеем Nextion, также подключим данный устройство к Arduino.

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

Знание которых поможет вам сэкономить время при разработке проектов:

1. Команды заканчивается тремя байтами “0xff 0xff 0xff”
2. Все команды и параметры находятся в ASCII
3. Все команды написаны строчными буквами.

Любая электроника нуждается в корпусе, исполнительном механизме. Где же заказать изготовление деталей? Для данных работ отлично подойдет ООО «М-Техника».

Основные направления деятельности компании:

  • изготовление деталей и металлических изделий различной сложности;
  • нанесение защитных и декоративных покрытий гальваническим способом на металлоизделия заказчика;
  • термообработка металлоизделий;

Вернемся к нашему уроку. Первое что мы сделаем это добавим страницу в наш проект для этого воспользуемся областью вывода списка страниц.

Добавляем страницу с названием Button.

Сейчас у нас есть 2 страницы. Как же нам сделать переключения между страницами. Переключает между страницами можно командой:

Переключение происходит по имени страницы или по ее индикатору. Для меня проще по имении. Вы можете использовать и по индексу страница.

Куда же добавить данную команду?
В данном уроке мы сделаем переключение со страница Logo с задержкой в 3 сек на страницу Button.
Для этого нажмем на страницу Logo и в обработчике событий загрузки страницы добавим следующие строки.

Первая строка delay=3000 работает аналогично delay() в Arduino IDE. Задержка 3000 мс.

Все параметры и команды вы можете посмотреть в официальной документации. Здесь есть кое-какие ошибки в синтаксисе. Но описано все подробно.

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

Как поменять цвет прогресс бара, и прочие настройки расскажу в видео.

Из цикла видно, что мы добавляем по 1 к свойству j0.val. Это значение заполнения школы в свойствах прогресс бара.

Прогресс бар. Отображает заполненную на заданное значение процентов линейку.

  • Sta – возможные значения: solid color и image
  • dez – направление. Возможные значения:
    • horizontal – по горизонтали
    • vertical – по вертикали
  • bco – цвет при заполнении 0%. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • pco – цвет при заполнении 100%. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • bpic – индекс картинки кнопки при заполнении в 0%. Этот атрибут появляется при выборе значения image в атрибуте sta
  • ppic – индекс картинки при заполнении в 100%. Этот атрибут появляется при выборе значения image в атрибуте sta
  • val – наполнение. Возможные значения: от 0 до 100.
  • x и y – координаты вставки прогресс бара
  • w и h – ширина и высота прогресс бара.

Прогресс бар не будет обновляться если не добавить переменную

doevents //обновление экрана во время цикла

Приветственная страница готово.

Оформим страницу Button.

Добавим прогресс бар и кнопку с двумя состояниями.

-Кнопка с двумя положениями.

  • bco0 – цвет переключателя в положении 0. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • bco1 – цвет переключателя в положении 1. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • pic0 – индекс картинки переключателя в положении 0. Этот атрибут появляется при выборе значения image в атрибуте sta
  • pic1 – индекс картинки переключателя в положении 1. Этот атрибут появляется при выборе значения image в атрибуте sta
  • picс0 – индекс вырезанной картинки переключателя в положении 0. Этот атрибут появляется при выборе значения crop image в атрибуте sta
  • picс1 – индекс вырезанной переключателя в положении 1. Этот атрибут появляется при выборе значения crop image в атрибуте sta
  • val – положение переключателя. Возможные значения 0 и 1
  • x и y – координаты вставки кнопки
  • w и h – ширина и высота кнопки.

В атрибутах кнопки sta поменяем значение на image. И подгрузим картинки в поля: pic0 и pic1.

В свойствах кнопки добавим такой код, который отправится на Arduino при нажатии.

Просто я не использую стандартную библиотеку Nextion.h. Поэтому формировать команды нужно вручную. Но на мой взгляд это оправданно. Как вы считаете, пишите в комментариях.

С дизайном и подготовкой в Nextion Editor закончили. Сейчас нашу прошивку можно загрузить в дисплей.
Подключаем дисплей Nextion к Arduino NANO по схеме.

Подключение к Arduino UNO аналогично.

Скетч также подойдет для обоих плат. При желании можно использовать и на A rduino MEGA, ESP32, ESP8266 и пр.

У данной платы всего 1 аппаратный Serial Port. Будем использовать программный порт. Для этого нужно установить и подключить библиотеку SoftwareSerial.h.

Следующие две функции формируют и отправляют цифровые параметры на дисплей.

Здесь мы считываем полученные параметры и сравниваем, если пришла команда то выполняем.

Эта строчка отправляет состояние кнопки на дисплей. Для чего это нужно? Чтобы не получилось так, что на дисплее кнопка нажата, а светодиод не горит.

Эта функции отправляет процент заполнения прогресс бара.

Более подробно объясняю в видео. Если есть вопросы пишите на форум.

Если вам интересна данная тема пишите в комментарии.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

Понравилась статья? Поделитесь ею с друзьями:

Урок 6 SFML. Работа со временем – обязательная часть SFML

В прошлом уроке научились двигать героя с помощью клавиатуры. Но как то он “подлагивает”, вам не кажется ? А всё потому,

что окно SFML в данном случае зависит от процессора. Если он не загружен – скорость движения героя быстрая, в противном случае – медленная. Если запустить на мощной машине – всё будет летать слишком быстро, а на слабой – жутко тормозить. Даже если сейчас вы расширите или развернете окно – вы увидите увеличение “торможения”, оно пропорционально размеру окна. Нас такой вариант конечно же не устраивает и для этого в sfml есть “время”.

Итак, время – бесконечный таймер, который работает, пока открыто окно sfml.

Это тот период времени, который проходит между двумя событиями. Задаётся в микросекундах , миллисекундах и секундах.

Вверху три переменных времени и все они равны по значению. (Мы будем использовать микросекунды. ) Время так же можно конвертировать с микросекунд в секунды, производить сравнения, сложение и другие операции.

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

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

Итак, объявляем переменную в ф-ции main()

В цикле “пока окно открыто” (который while window.isOpen) пишем:

Скорость игры надо подобрать под свои нужды, нам нужно что-то среднее. Чем больше делитель (сейчас это 800) тем больше действий и плавности будет в игре, но тем требовательнее она будет к ресурсам ПК. Представьте, что это своего рода FPS (кол во кадров в сек), которое вы выставляете вручную. Если у вас тормозит – делите на число поменьше, я оставлю так.

Предварительно подключив вверху

Запустите программу и в целях большего понимания посмотрите на время в консоли. Посмотрели? Закрываем, кодим дальше Ах да – Сотрите строку с выводом времени в консоль, она нам больше не нужна.

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

Читайте также:  Как заменить проводку в доме своими руками?

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

Теперь, когда вы запустите игру – она будет более плавной.

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

На самом деле нам не нужно будет каждый раз писать “0.1*time” и тому подобное. Для этого для каждого класса пишется функция “update”, которая как бы заставляет класс “жить” в игре, благодаря бесконечному времени, от которого эта функция зависит. Кстати говоря, мы можем эту функцию наследовать, что говорит о том, что писать её придётся не для каждого класса. Всё будет зависеть от вашей текущей задачи.

А теперь рассмотрим пример как же извлечь пользу из этого времени, ведь эта “обязаловка” с уходом от мощности и загруженности процессора не даёт нам никакого удовольствия.

Представим , что у нас в игре есть движущаяся платформа. Как она меняет направление движения? Есть несколько вариантов решения – например при столкновении с какой-то стеной у нее меняется состояние с “ехать влево” на “ехать вправо”, или по расстоянию – пройденный путь больше расстояния-> разворот. Но и по таймеру тоже может – мы можем менять направление движения платформы каждые 3 секунды. Хочется заметить, что таких решений нужно избегать поскольку лишние таймеры очень грузят игру. Но это как пример, где время нам пригодилось бы.

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

Или к примеру ваш персонаж взял бонус – ускорение, который действует 5 секунд. Аналогичным образом – взял бонус->скорость+20-> 5 секунд таймер отсчитывает и как только >5 секунд – возвращает нормальную скорость игроку.

И таких примеров целая kychka :))

Я приведу такой обобщенный пример, который поможет понять логику таких действий. Платформ у нас еще нет, игрок умереть тоже пока не может, бонуса на ускорения тоже нету. Ну .. Давайте будем телепортировать игрока в определенное место каждые 3 секунды. =)

Полный список

Раньше мы для View-компонентов использовали OnClickListener и ловили короткие нажатия. Теперь попробуем ловить касания и перемещения пальца по компоненту. Они состоят из трех типов событий:

– нажатие (палец прикоснулся к экрану)
– движение (палец движется по экрану)
– отпускание (палец оторвался от экрана)

Все эти события мы сможем ловить в обработчике OnTouchListener, который присвоим для View-компонента. Этот обработчик дает нам объект MotionEvent, из которого мы извлекаем тип события и координаты.

На этом уроке рассмотрим только одиночные касания. А мультитач – на следующем уроке.

Project name: P1021_Touch
Build Target: Android 2.3.3
Application name: Touch
Package name: ru.startandroid.develop.p1021touch
Create Activity: MainActivity

strings.xml и main.xml нам не понадобятся, их не трогаем.

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

В onCreate мы создаем новый TextView, сообщаем ему, что обработчиком касаний будет Activity, и помещаем на экран.

Интерфейс OnTouchListener предполагает, что Activity реализует его метод onTouch. На вход методу идет View для которого было событие касания и объект MotionEvent с информацией о событии.

Методы getX и getY дают нам X и Y координаты касания. Метод getAction дает тип события касания:

ACTION_DOWN – нажатие
ACTION_MOVE – движение
ACTION_UP – отпускание
ACTION_CANCEL – практически никогда не случается. Насколько я понял, возникает в случае каких-либо внутренних сбоев, и следует трактовать это как ACTION_UP.

В случае ACTION_DOWN мы пишем в sDown координаты нажатия.

В случае ACTION_MOVE пишем в sMove координаты точки текущего положения пальца. Если мы будем перемещать палец по экрану – этот текст будет постоянно меняться.

В случае ACTION_UP или ACTION_CANCEL пишем в sUp координаты точки, в которой отпустили палец.

Все это в конце события выводим в TextView. И возвращаем true – мы сами обработали событие.

Теперь мы будем водить пальцем по экрану (курсором по эмулятору) в приложении, и на экране увидим координаты начала движения, текущие координаты и координаты окончания движения.

Все сохраним и запустим приложение.

Ставим палец (курсор) на экран

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

Если же рука дрогнула, то появится еще и координаты перемещения.

Продолжаем перемещать палец и видим, как меняются координаты Move.

Теперь отрываем палец от экрана и видим координаты точки, в которой это произошло

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

Если вы уже знакомы с техникой рисования в Andro >

На следующем уроке:

– обрабатываем множественные касания

Присоединяйтесь к нам в Telegram:

– в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

– в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

– ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

– новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Программирование дисплея на контроллере ST7920

Хочу рассказать о программировании дисплея на контроллере ST7920 с использованием ATtiny2313 контроллера.

Этот дисплей имеет 2 режима работы:

И имеет 3 режима подключения:

  1. Подключение по 8 битной шине
  2. Подключение по 4 битной шине
  3. Подключения по SPI (3 или 2 битной шине)

В данном посте я расскажу о:

  • Работе в текстовом режиме
  • Подключения и программирование по 8 битной шине
  • Подключения и программирование по SPI

Для того что бы подключить дисплей к контроллеру нам понадобится:

  1. Дисплей на контроллере ST7920
  2. 2 подстрочных резистора на 320 Ом.
  3. Для 8 битного режима резистор на 4.7 кОм (или больше)
  4. Контроллер ATtiny2313
  5. Источник питание на 5В.

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

Подключение по 8 битной шине данных


Распиновка контактов:
GND — Земля
VCC — +5В
V0 — Настройка контрастности
RS — Определяет режим передачи данных (1 — это данные, 0 — это команда)
RW — Запись или чтения (1 — чтения, 0 — запись)
E — Строб
D0-D7 — Шина данных
PSB — Определяет какой протокол передачи данных будет использоваться ( 1 — 8/4 бит шина, 0 — SPI)
BLA — Анод подсветки (+)
BLK — Катод подсветки (-)

Подключение по SPI


Распиновка контактов:
GND — Земля
VCC — +5В
V0 — Настройка контрастности
RS — (CS) Разрешает и запрещает дисплею принимать данные (1 — Запрещает, 0 — Разрешает)
RW — (SID) Шина данных
E — (SCLK) Строб
PSB — Определяет какой протокол передачи данных будет использоваться ( 1 — 8/4 бит шина, 0 — SPI)
BLA — Анод подсветки (+)
BLK — Катод подсветки (-)

Подстроечные резисторы

RP1 — Регулятор контрастности
RP2 — Регулятор яркости

Описание протоколов программирования дисплея

8 битный режим

И так, с начало я расскажу о том как в общих чертах происходит работа с дисплеем.
Для того что бы работать с дисплеем нам нужно отправлять команды и данные на дисплей.
К командам относится: Включения/выключение дисплея, отображение курсора, перемещение курсора и т.д. К данным относятся например символы которые вы хотите видеть на дисплее.

Давайте рассмотрим пример того как производится инициализация для 8 битного режима.
Давайте рассмотрим пример того как производится инициализация:

  • Задержка в 50 мкс.
  • Отправляем команду установки 8 битного режима.
  • Задержка 120 мкс.
  • Отправляем команду включения дисплея ( в ней же указывается, включить ли курсор, и мигать ли курсором)
  • Задержка в 50 мкс.
  • Повторно отправляем функцию установки 8 битного режима
  • Задержка 120 мкс.
  • Отправляем команду отчистить экран
  • Задержка 20 мкс.
  • Устанавливаем ENTRY MODE (эта команда говорит о том в какую сторону сдвигать курсор после написания символа, нам соответственно нужно вправо)

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

Рассмотрим как отправить одну команду на дисплей в 8 битном режиме:

  • Устанавливаем низкий уровень E
  • Устанавливаем низкий уровень RS
  • Устанавливаем низкий уровень RW
  • Задержка 1 мкс.
  • Устанавливаем высокий уровень E
  • Отправляем в порт данных байт команды
  • Задержка 1 мкс.
  • Устанавливаем низкий уровень E
  • Задержка 50 мкс.

Для отправки одного байта данных выполняется абсолютно то же самое, только в начале устанавливается высокий
уровень RS.
RS = 0 Команда
RS = 1 Данные

Вот как отправляется один байт данных:

  • Устанавливаем низкий уровень E
  • Устанавливаем высокий уровень RS
  • Устанавливаем низкий уровень RW
  • Задержка 1 мкс.
  • Устанавливаем высокий уровень E
  • Отправляем в порт данных байт команды
  • Задержка 1 мкс.
  • Устанавливаем низкий уровень E
  • Задержка 50 мкс.
Читайте также:  Замыкание проводов

Давайте рассмотрим код отправки команды
Для начала установим константы что бы было удобнее:

Функция отправки команды:

Функция отправки данных:

В коде был использован макрос LCD8_MACRO_DELAY, вот его код

Теперь рассмотрим команды инициализации дисплея в текстовом, 8 битном режиме:

Команда FUNCTION SET: 0 0 1 DL 0 RE 0 0
DL:

  • Если установлено 1 то устанавливаем 8 бит передачу данных
  • Если установлено 0 то устанавливается 4 бита передача данных
  • Если установлено 1 то устанавливается набор расширенных команд
  • Если установлено 0 то устанавливается набор базовых команд

Следующая команда это DISPLAY STATUS: 0 0 0 0 1 D C B
D:

  • Если установлено 1 то дисплей включен
  • Если установлено 0 то дисплей выключен
  • Если установлено 1 то курсор включен
  • Если установлено 0 то курсор выключен
  • Если установлено 1 то курсор будет мигать
  • Если установлено 0 то курсор не будет мигать

Следующая команда простая CLEAR – отчистка экрана: 0 0 0 0 0 0 0 1

И последняя команда это ENTRY MODE SET – установка направления движения курсора: 0 0 0 0 0 1 I/D S

  • Если I/D = 1 то курсор сдвигается вправо
  • Если I/D = 0 то курсор сдвигается влево

На основе этих четырех функций можно написать функцию инициализации дисплея:

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

Режим SPI

Теперь о функции приема передачи команды/данных по SPI.
В этом режиме участвуют 2 линии:

  • SID это контакт передачи данных, на дисплее он же RW
  • SCLK – это линия строб, на дисплее он же E

В SPI режиме передача одной команды или 1 байта данных происходит при передачи 24 бит
Протокол передачи данных таков:

  • Передаем 4 единицы подряд
  • Передаем 1 бит RW – чтения или запись
  • Передаем 1 бит RS – Команда или данные
  • Передаем 0
  • Передаем 4 бита старшей половины байта данных
  • Передаем 4 нуля
  • Передаем 4 бита младшей половины байта данных
  • Передаем 4 нуля подряд

На этом передача одного байта завершена.

После каждого переданного бита делается строб, то есть:

  • Задержка 1 мкс.
  • Устанавливаем высокий уровень SCLK
  • Задержка 1 мкс.
  • Устанавливаем низкий уровень SCLK
  • Задержка 1 мкс.

Рассмотрим функцию передачи команды/данных в режиме SPI, но сперва объявим константы:

А теперь сама функция:

Текстовый режим

Теперь после того как вы научились инициализировать дисплей вы можете выводить любые символы на экран, например вывести букву A:

И на дисплее вы увидите букву A.

И так, теперь о том как устроенно адресное пространство в текстовом режиме:
Экран делится на 8 столбцов и 4 строки, в каждый столбец вы можете записать по 2 обычных символа или 1 иероглиф.
Адресное пространство находится от 0 до 31.

1234567
1617181920212223
89101112131415
2425262728293031

Как видите первая строчка это адреса от 0 до 7
Вторая же строчка от 16 до 23
Третья строчка от 8 до 15
То есть если вы напишете 16 букв подряд с адреса 0, то они будут в первой строчке,
но если вы напишите 17 символов, то последний символ будет не на второй строчке, а на третей!

Есть специальная функция установки адреса курсора: 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0
С помощью этой команды можно поставить курсор в нужное место вписав за место AC0-AC6 адрес от 0 до 31.

Графический режим

И напоследок, для тех кто хочет использовать графический режим, есть такая статья: LCD 12864 на контроллере ST7920. Параллельный режим (8 бит)

Урок 6 – работа с дисплеем st7783

Плата расширения Arduino TFT

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

Расположение внешних выводов платы расширения соответствует специальным разъемам на Arduino Esplora и Arduino Robot, что облегчает подключение экрана к этим устройствам. Однако, TFT-дисплей можно использовать с любой моделью Ардуино.

Библиотека TFT включается в состав среды разработки Ардуино. начиная с версии 1.0.5.

Библиотека

Библиотека Arduino TFT разработана на основе библиотек Adafruit GFX и Adafruit ST7735, и значительно расширяет их возможности. Библиотека GFX в основном содержит процедуры отрисовки графики, в том время, как ST7735 – функции для взаимодействия с TFT-экраном. Те дополнения библиотек, которые касаются Ардуино, спроектированы таким образом, чтобы максимально соответствовать API языка Processing.

Библиотека имеет обратную совместимость, что позволяет вам использовать в программах функции Adafruit (подробнее о них см. здесь).

Методы библиотеки TFT опираются на функции библиотеки SPI, поэтому во всех программах, работающих с TFT-экраном, должна быть объявлена библиотека SPI. Соответственно, при работе с SD-картой памяти – необходимо объявить библиотеку SD.

Организация экрана

По умолчанию экран имеет горизонтальную ориентацию, соответственно, его ширина – больше, чем высота. Верхняя часть экрана находится с той стороны платы, где указана надпись “SD CARD”. При такой ориентации, разрешение экрана составляет 160 х 128 пикселей.

Систему координат дисплея лучше всего представить в виде сетки, каждая ячейка которой является отдельным пикселем. Местоположение пикселя задается парой координат. Точка в левом верхнем углу экрана будет иметь координаты 0,0. Если эта точка сместится в верхний правый угол, то ее координаты будут равны 0, 159; в левый нижний угол – 127,0; в правый нижний – 127, 159.

Дисплей можно использовать и в вертикальном положении (также известном как “портретная ориентация”). Для этого достаточно вызвать функцию setRotation(0), после чего оси x и y поменяются местами. После вызова этого метода, функции screen.width() и screen.right() станут возвращать уже другие значения.

Цвета

Экран позволяет передавать цвет глубиной 16 бит. Красная и синяя составляющие цвета могут принимать 32 различных значения (разрядность 5 бит), а зеленая составляющая – 64 значения (разрядность 6 бит). Однако, с целью совместимости с другими программами, библиотека все равно работает с 8-битными значениями красного, зеленого и синего каналов (0 – 255), пропорционально масштабируя их в необходимый диапазон.

Аппаратный и программный интерфейс SPI – что лучше?

Организовать работу с TFT-экраном можно двумя способами. Первый способ – использовать аппаратную шину SPI Ардуино, второй – вручную объявить расположение необходимых выводов. С точки зрения функциональности экрана, нет никакой разницы между первым и вторым способом. Однако скорость работы аппаратного интерфейса SPI значительно выше.

Если на TFT-модуле планируется использование SD-карты памяти, то взаимодействовать с модулем необходимо только через аппаратный интерфейс SPI. Он используется во всех примерах к данной библиотеке.

Подключение экрана

Подключение к Arduino Esplora

На лицевой стороне Arduino Esplora есть специальный разъем для подключения экрана. Вставьте экран Ардуино в этот разъем так, чтобы синяя надпись “SD Card” была расположена возде порта USB.

Подключение к другим платам Ардуино

Чтобы узнать, как подключать экран к другим моделям Ардуино, прочтите это руководство.

Пишем первую программу

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

В примерах вначале будут приведены листинги программ для Arduino Uno, Leonardo и др. моделей. Листинги для Arduino Esplora будут приведены ниже.

Итак, в начале программы, объявим выводы Ардуино, которые будут использоваться для взаимодействия с экраном, импортируем необходимые библиотеки и создадим экземпляры основных классов библиотеки TFT:

В блоке setup() необходимо запустить библиотеку функцией begin() и очистить экран, установив черный цвет фона с помощью функции background().

В блоке loop(), для отрисовки прямой линии на экране необходимо вызвать функцию line(). Функция line() принимает четыре аргумента: начальные координаты x и y, конечные координаты x и y. Чтобы нарисовать прямоугольник, необходимо вызвать функцию rect(), которая также принимает четыре параметра: координаты x и y левого верхнего угла, ширина и высота прямоугольника в пикселях. Между вызовами этих функций можно изменить цвет выводимой фигуры с помощью функций stroke() или fill(). Функция stroke() изменяет цвет линии или контура геометрической фигуры, а функция fill() – изменяет цвет заливки фигуры. После вызова функции noStroke() библиотека не будет отрисовывать границы выводимых фигур. Чтобы отменить действие этой функции, достаточно вызвать метод stroke().

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

Именно поэтому в программе не нужно указывать выводы Ардуино, которые будут взаимодействовать с экраном; эта информация автоматически содержится внутри создаваемого объекта:

Перемещения по экрану

Иллюзия движения или анимация создается путем быстрого стирания и отрисовки изображения на экране. При использовании языка Processing на мощном компьютере, для очистки экрана и отрисовки картинки в новой позиции можно вызывать функцию background() перед каждым вызовом функции draw(). Однако производительность Arduino, по сравнению с настольным ПК, весьма ограничена, поэтому выполнение функции background() из библиотеки TFT занимает определенное время.

Читайте также:  Какой кабель и автомат нужен для проводки в дачном доме?

В условиях ограниченного быстродействия, для создания иллюзии движения лучше проверять положение объекта в цикле loop(). Если положение объекта изменилось, то необходимо закрасить его фоновым цветом, а затем перерисовать объект в новой позиции. Благодаря тому, что в данном случае обновляется не весь экран, а лишь некоторые его пиксели, процесс обновления картинки ускоряется и создается иллюзия движения.

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

В цикле loop() мы вначале обновляем позицию точки, добавляя к переменным x и y величину направления движения. После этого проверяем, отличается ли текущее и предыдущее положение точки. Если отличается, то стираем предыдущую точку, закрашивая ее фоновым цветом, а затем рисуем новую точку в необходимой позиции. Если точка “долетает” до границы экрана – инвертируем направление движения.

Версия этой программы для Arduino Esplora приведена ниже:

Выводим текст

В библиотеке TFT содержится базовый шрифт для вывода текста на экран. По умолчанию, размер символов составляет 5х8 пикселей (5 – в ширину, 8 – в высоту). В библиотеке предусмотрена возможность изменения размера шрифта на 10×16, 15×24 или 20×32. Для получения дополнительной информации о шрифтах см. страницу Adafruit о работе с графическими примитивами.

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

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

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

Тот же самый код для Arduino Esplora:

Выводим изображение из файла, находящегося на SD-карте памяти

Библиотека TFT позволяет считывать .bmp-файлы с SD-карты памяти и выводить их содержимое на экран. Причем отображаемые картинки могут не соответствовать разрешению TFT-экрана (160×128). Следует иметь ввиду, что Ардуино не может модифицировать изображения, поэтому все необходимые манипуляции с графическими файлами (такие, как масштабирование, обрезка и т.д.) необходимо сделать до их “заливки” на SD-карту.

В следующем примере показана работа с графическим файлом “arduino.bmp”, расположенном в корне SD-карты памяти, и содержащим изображение размером 160×128 пикселей. В программе осуществляется считывание файла и вывод его на экран с помощью библиотеки TFT.

Помимо уже знакомых вам библиотек, в этом примере понадобится подключить еще одну библиотеку – SD. Также необходимо объявить вывод CS, связанный с разъемом SD-карты.

Класс PImage используется для загрузки изображения (этот класс может также использоваться для проверки формата графического файла на предмет его совместимости с библиотекой TFT).

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

Тот же самый код для Arduino Esplora: :

Что дальше?

Теперь, когда вы разобрались с принципами работы дисплея, загляните в справку по библиотеке TFT – там вы найдете информацию об API библиотеки, а также дополнительные примеры кода. Для получения дополнительной технической информации, см. страницу с описанием платы расширения Arduino TFT. Также не помешает посетить страницу с описанием графической библиотеки Adafruit – там можно найти дополнительную информацию о функциях, не освещенных в данном руководстве.

VST-719 обзор и разборка электронных часов-будильника

У меня эти часы валяются давно, пора описать и полностью разобрать их. Это светодиодные настольные часы будильник VST-719, довольно таки распространенная модель. Мне они достались в несколько покалеченном состоянии. Но рабочие.

Обычно после названия модели часов через дефис ставится еще одна цифра, она обозначает цвет дисплея. У меня это VST-719-4, или ярко-зеленый цвет, а может быть и VST-719-2, значит просто зеленый. а есть еще и с красным и синим, и белым дисплеями. В зависимости от пожелания покупателя, а стоят они (или стоили) примерно что-то в районе 1 тысячи рублей. На Алиэкспрессе за 19$.

+ Щелкайте по фото, чтобы увеличить!

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

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

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

Под крышкой одна батарейка типа “крона”. по информации из интернета, вместо Кроны используют две батарейки формата АА – наверное, через адаптер.

Размеры часов-будильника VST-719, измерено мною: ширина 210 мм, высота 85 мм, глубина 65 мм. Вес – очень легкие.

Так примерно светится дисплей в этих часах.

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

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

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

Вот вся начинка часов VST-719. Трансформатор небольших размеров, на выходе он дает двухполярное питание. Опишем все по отдельности.

Основная или системная плата. На плате неизвестный мне логотип, в основе микросхема LM8560 – даташит есть в интернете. На плате также распаян элементы питания – диодный мост, резисторы, конденсаторы. Один транзистор C8050D.

Обратная сторона платы – одни дорожки, маркировка на плате: CHQ738B 080908.

Следующая плата – светодиодный дисплей. На текстолите маркировка CHQ-SG18051F. Текстолит односторонний.

На обратной стороне пластмассовая пластина с квадратными вырезами под светодиоды.

Вот плата, на ней бескорпусные светодиоды. Маркировка платы: ST-18021A1.

Сами светодиоды крупным планом.

Плата управления или плата кнопок, на ней маркировка CHQ719-1 100620. На плате четыре купольные кнопки и четыре площадки для двух ползунковых переключателей. С обратной стороны платы только один диод.

Еще одна маленькая плата с такой же кнопкой – выключатель сигнала будильника, на ней маркировка: CHQ719-2 050902, и еще один неведомый логотип.

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

Ну и обычный стандартный разъем для подключения батарейки Крона.

Фото взято в интернете.

На этом все – разборка окончена. В заключение несколько обобщающих выводов о VST-719: в общем и целом часы работают точно, надежно и вполне долговечные. Дисплей с огромными цифрами удобен, но в ночное время он слишком яркий, что иногда мешает. Звонок будильника очень громкий, и звонит без остановки целый час, если его не выключить кнопкой сверху. Следующий момент, для меня неудобный – это их вес, часы очень легкие и их легко смахнуть с полки (ну или где они там стоят) неловким движением руки. а падать им противопоказано (как и всяким прочим подобным китайским изделиям).

Мой вердикт – часы годные.

Михаил Дмитриенко, специально для PRETICH.ru

· Опубликовал Pretich May 10 2019 · В Часы – механические и электронные · 0 Комментариев · 2487 Прочтений ·
Комментарии
Нет комментариев.
Добавить комментарий
Пожалуйста, авторизуйтесь для добавления комментария.
Реклама
Последние комментарии
Новости
[b][big]Кстати, насчет.
Там тоже все разные. М.
Не все – но большинств.
Не все в Болгарии пред.
Статьи
Помню эту книжку – мне.
Возьмем на заметку – д.
Контакты золотом намаз.
🙂
Я эту штуку никак не м.
Фотогалерея
Lexa-SU не уподобляйте.
А еще были ништяк – бл.
Так это уже после разв.
А сейчас казаки – одна.
Сперва не понял. ока.
Отдельные страницы
Dying Light – достойна.
Китайские колонки 2.1 .
Потому что игры создаю.
Авторизация

Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector