Сейчас почти все устройства управляются сенсорными экранами, и у многих возникает желание оборудовать свой arduino-проект дисплеем и GUI, чтобы даже убеждённые «мышатники» смогли разобраться.
Необходимые компоненты и цена вопроса
-
Arduino любой модели — Uno: 400p
-
Резистивный сенсорный дисплей/панель — мой с разборки: 80p
-
Светодиод — 10p
-
Компьютер с установленной Arduino IDE
Что такое резистивный сенсор и почему нельзя использовать дисплей от смартфона
Резистивный тачскрин состоит резисторов, количество которых определяется АЦП микроконтроллера. В случае Atmega328 это 10 бит — 1024 резистора. Они расположены сеткой:
![Сетка из резисторов, пользователь нажал в первую красную точку. Сетка из резисторов, пользователь нажал в первую красную точку.](https://habrastorage.org/getpro/habr/upload_files/151/202/642/151202642418ba1bc17ff7bbe9e7e7ee.png)
Одним из минусов этих тачскринов является отсутствие мультитача — ведь при замыкании сетки резисторов в нескольких местах результат будет один и не верный.
В телефонах используют другие сенсоры — емкостные. Контроллер дисплея измеряет заряд конденсатора и констатирует факт нажатия. Единственное, из МК AVR умеют работать с этими дисплеями Atmega серии PB. Atmega328PB стоит в одном нашем магазине 400р. Обычная Atmega328P — 360p. Возможно, когда-то расскажу и про этот тип сенсоров. Если вы всё-таки решите купить PB, учтите, что они физически несовместимы с обычной Atmega328P
Сборка
Резистивный сенсор — далее дисплей — имеет 4 контакта: X1, Y1, X2, Y2. Я вывел шлейфом эти контакты и припаялся к Arduino так:
![Схема дисплея Схема дисплея](https://habrastorage.org/getpro/habr/upload_files/25c/83f/a61/25c83fa6170c4d8b6eac1c1d46c3aaa5.png)
Для индикации нам нужен светодиод, который мы подключаем к любому ШИМ пину, в моём случае 11.
Код программы
Первое и самое важное — библиотека. Для таких дисплеев их есть великое множество. Например, от Adafruit. Но я рекомендую использовать KrokoTS из-за одной фишки, о которой я расскажу позднее. Для загрузки можно использовать Менеджер Библиотек Arduino IDE, или скачать с GitHub.
Начнём с примеров. Идём «Файл-Примеры-KrokoTS-attach».
Разберём код по блокам, которые выделил автор.
#include<KrokoTS.h> #define X1 A0 #define X2 A2 #define Y1 A1 #define Y2 A3 #define LED 11 KrokoTS Touch(X1, X2, Y1, Y2);
Здесь мы подключаем библиотеку, и задаём пины А0-А3 как контакты дисплея согласно схеме, создаем объект Touch, с которым будем работать далее.
void setup() { pinMode(LED, OUTPUT); Touch.attachClick(0, 1, 500, 1, 900, on); Touch.attachClick(1, 501, 900, 1, 900, off); }
Теперь инициализируем светодиод, и — главное отличие этой библиотеки от других — attachClick(). Вот её синтаксис:
Name.attachClick(id, xmin, xmax, ymin, ymax, function);
Таким образом, при обнаружении касания в пределах поля xmin-xmax-ymin-ymax будет вызвана функция function. В нашем примере клик в области 1-500-1-900 вызовет on. id должен быть уникальный и в пределах от 0 до MAX_FIELDS, если надо больше, измените MAX_FIELDS. Можно динамически менять область, пересоздавая блок с таким же id.
void loop() { Touch.tick(); } void on() { digitalWrite(LED, HIGH); } void off() { digitalWrite(LED, LOW); }
В loop’е вызываем метод tick, который проверяет касания. Соответственно, лучше не плодить задержки delay. В блоках on/off мы включаем и выключаем светодиод. Вы ведь поставили его? На этом разбор первого примера окончен. Открываем пример getPos. Нас интересует setup.
void setup() { pinMode(LED, OUTPUT); }
Тут мы просто инициализируем светодиод. Далее loop.
void loop() { int x = Touch.getX(); int y = Touch.getY(); if (x < 1000 && y < 1000) { if (y < 500) digitalWrite(LED, (x > 500) ? HIGH : LOW); else analogWrite(LED, map(x, 50, 950, 0, 255)); } }
Используя методы getX/getY мы получаем координаты касания, и условием обрезаем лишнее, ведь ввод у нас — INPUT_PULLUP. Если клик был в верхней части экрана, то мы через тернарный оператор выбираем уровень сигнала — высокий/низкий, а иначе — масштабируем x к значению 0-255, и пишем как ШИМ сигнал
Заключение
Надеюсь мой пост был вам полезен, и вы узнали что-то новое, а если у вас возникли вопросы, пишите в комментарии, я постараюсь ответить. Можете написать, что улучшить или подкинуть идею для следующего поста, а на этом я с вами прощаюсь, всем удачи и пока!
ссылка на оригинал статьи https://habr.com/ru/articles/589143/
Добавить комментарий