Купил дешёвый IPS-экранчик 1.44" для того, чтобы выводить на нём значения CO2 у самодельного устройства управления вентиляцией. Экранчик оказался не совсем стандартным, и чтобы заставить его работать правильно, пришлось повозиться и применить волшебные костыли.
У этого экранчика разрешение 128x128 точек и последовательный интерфейс SPI. На пакетике написано «IC: ST7735S», но похоже это не правда — с драйвером для чипа ST7735S он не работает, а с драйвером для ST7735 работает, но кривовато: неправильно определяется размер и положение экрана.
Для начала я скачал с LCDWiki
набор софта для этого экрана, подключил его, как там написано, и проверил — работает.
Но такие страшненькие крупные шрифты меня не устраивают, поэтому задача была заставить работать этот экран с
библиотекой UTFT, позволяющей использовать свои шрифты любого размера.
Конкретно этого экрана в списке поддерживаемых библиотекой нет, но есть несколько других на ST7735 и ST7735S. Экранчик заработал при указании типа ST7735, но при его очистке снизу оставалось три строки мусора, а при выводе текста по центру всё смещалось влево и первый символ портился. Пришлось применять костыли: вместо очистки рисовать чёрный прямоугольник 160x130 точек (экран, напомню, 128x128), а текст выводить, жёстко указывая координаты (смещение 26 по оси X оказалось на самом деле первой точкой экрана).
Для того, чтобы выводить четыре максимально больших цифры, я сделал шрифт 32x60 точек.
Шрифт для этой библиотеки делается достаточно просто: создаётся вот такая картинка, на которой каждая цифра занимает ровно одну десятую ширины и обрабатывается
онлайн-инструментом на сайте автора библиотеки, в результате получается файл шрифта с расширением .c, который нужно положить в папку с библиотекой.
Цифры на экране получаются большие и красивые (в жизни они гораздо ровнее, чем на фото). Высота цифр 11 мм, ширина всех четырёх цифр 26 мм.
Вот весь скетч, выводящий на экран четыре цифры.
Пока датчик CO2 не пришёл, я ради эксперимента подключил к Arduino цифровой термодатчик DS1820 и сделал простейший термометр. Специально для него за пару минут создал огромный шрифт с размером символа 64x120 точек, на экран помещаются два таких символа.
Скетч термометра. Главное, не пытаться измерять им отрицательные температуры (символ «минус» отсутствует в шрифте и на экран не влезет) :)
Я подключил экранчик к Arduino Uno R3 просто потому, что она «попалась под руку». С тем же успехом этот экран можно подключить к Arduino Nano или любой другой плате.
На всякий случай я сохранил скетчи, все библиотеки, шрифты и схемы подключения в одном
архиве.
© 2020, Алексей Надёжин
Просто надо данные выводить в Кельвинах, там не бывает отрицательных температур.
от -9 до 99 F — это от -22 до +37 по-нашему. Для уличных температур средней полосы вполне норм :)
бонусом будет прокачивание скила устного счета для перевода значений в привычные Цельсии
*сарказм…
Да и лично я в Кельвинах не очень привык, не очень удобно будет…
На Ардуинах нужно делать только то, что невозможно купить или то, что стоит слишком дорого, если покупать готовое.
Там контроллер матричный, написать вывод туда чб битмапа по координатам X, Y, шириной W и высотой H и цветом C — час от силы, тем более что библиотека для работы есть — требуется выкинуть все кроме отрисовки из нее и запилить на этой основе свое. Можно ещё и с бэкбуфером.
И костыли были бы не нужны и знаний бы прибавилось.
Если вам действительно жалко своего времени и сил, вы бы купили готовый девайс (коих воз), а время его доставки посвятили бы чему-то другому. Время действительно стóит дороже денег.
А если уж вы решили что-то делать самостоятельно, вы по-любому тратите своё время и силы…
В любом проекте главное умение, которое приходит с опытом — это вовремя остановиться.
Да, именно это, заветное — «И так сойдёт!»
Потому что улучшать и дорабатывать почти любой проект можно бесконечно, и на определённом уровне это превращается в трату сил и времени жизни.
В любом проекте есть цель. И цель это не «добиться абсолютного идеала», сюрприз.
У меня много «проектов» по электронике. Иногда цель — просто убедиться что это работает, хоть на соплях. Иногда — получить конкретный числовой результат (например, посмотреть кривую микроколебаний атмосферного давления, измерить динамику какой-то механики), иногда — сделать прототип и даже упаковать в какой-то корпус для практического использования.
Я программист, и всегда использую принцип минимальной разумной достаточности. Не добавлять свистелки и мигалки без необходимости, решать проблемы предельно просто и понятно.
Жаль, что этого здесь почти никто не понимает. «што поделать, молодёжь. И что можно, что не можно — в наши дни не разберёшь».
Минусуйте.
Да, да. У меня джуны так себя ведут.
Не надо путать прототип — там да, многое позволительно, и прод. ТС выкатил это в прод на костылях.
Этот принцип не подразумевают использование костылей, не надо его коверкать.
Вот именно, что решать. А не обходить.
Придерживаться KISS-а — это верно и хорошо, только искажать этот принцип не надо.
Так что ваше «ваше высказывание — это глупость и наивность» возвращается обратно к вам, Dimon_ все верно написал.
Ну и «у меня много «проектов» по электронике» никак не коррелирует с тем, что Вы — нормальный разработчик.
«костыли» — define «костыли». По моему опыту в корпоративных серьёзных решений в коде — уйма «костылей». Временных заплаток, ставших постоянными, заглушек, обходных решений. Не всем проблемы даже и в программировании можно решить окончательно и бесповоротно здесь и сейчас, а приложение должно работать и в срок. Пример — повторный вызов db-link по таймеру несколько раз подряд. Никто не знает почему удалённое приложение не сразу отвечает, а иногда только на второй-третий раз. Ничего плохого в «костылях». Если «костыли» работают.
Еще пример — баг в серьёзном и большом сервере баз данных. Никто его устранять не собирается в разумное время. Значит, нужно писать обход этого бага, а не «разбираться».
«обход» проблемы это еще лучше чем «решение». Если проблему можно обойти, это не проблема, а пустая трата времени ©еврейский анекдот
Одно дело — обход того, что нет возможности вменяемо исправить, другое дело — сознательное использование костылей там, где их запросто избежать. Так гнкод и рождается. И это как раз и отличает джуна от сеньера.
Если проблему можно обойти, она потом обязательно вас догонит и ударит гораздо сильней.
Ну… я даже не знаю что сказать… в принципе, тут все уже сказали.
Вы даже для себя сделали «и так сойдет», ну ок, так и живем. Надеюсь, вы никаких производителей не ругаете?
Если ругаете — каждый раз вспоминайте себя и этот экранчик.
Все библиотеки с открытым исходным кодом, кода там — кот наплакал, т.е. даже разбираться-то особо не надо было — все на блюдечке лежит.
ТС не решил задачу — он подпер ее костылями — в этом и весь смысл.
Т.е. люди даже для себя родимого разбираться и решать не хотят, при этом хотят, чтобы что-то хорошо работало. А вот хз к чему такое приведет — может быть там в регистры что-то не то пишется или, например, выходит за пределы адресного пространства — запросто может что-то рано или поздно начать глючить.
Но главное — бац-бац и в продакшн — поколение одноразовых решений и таких-же людей.
Потом народ удивляется — а че так криво все реализовано :D
Делать то не ради себя буду, а под заказ.
На него есть подробный даташит.
Например за полчаса можно наваять нечто такое.
Сроки — вчера!
? :)
www.eran.io/the-dot-factory-an-lcd-font-and-image-generator/
любой виндовьій шрифт — у тебя на екране :)
А проблемы почти те же.
LCD_Write_COM(0x2a);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x7f); // прибавить +0x02 = 0x81
LCD_Write_COM(0x2b);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x9f); // прибавить +0x01 = 0xA0
Потом взял IPS экранчик 240x240 на ST7789, уже вторая библиотека завелась, но тоже с небольшим допилингом. С этими дисплеями постоянное ощущение лотереи.
Подключил этот экран к Arduino Nano