Автоматическая система контроля насосов — необычное решение необычной задачи с микроконтроллером ESP8266. Часть 4. Используем OLED-дисплей от Digole.

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

digole.com, serial color oled, 160x120-v2, RoHS, дисплей, диголе, ардуино,arduino

Оборотная сторона OLED-дисплея Digole

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

А мне хотелось цветной экран. И максимально большой, дабы заполнить всю полезную площадь бокса. А поменять сам бокс я не могу, так как он идеально вписывается в пространство других приборов в точно таких же корпусах. Если прошерстить AliExpress, то становится совсем грустно. Весь маркет завален непонятными дисплеями, которые, либо слишком мелкие, либо не могут похвастаться присутствием цвета. Я уже было совсем впал в уныние, и морально подготовился взять одноцветный OLED-экран, который хоть как-то согласуется с размерами бокса. Но тут добрые люди подсказали, что существует на свете и некая альтернативная компания, производящая интересные дисплеи. Зовется она Digole.

Как выяснилось, Digole производит целую номенклатуру «умных» дисплеев. Это и отличает ее от большинства других производителей, выпускающих только сами экраны, которые не обладают достаточным уровнем «сообразительности» и программисту приходится изощряться, стараясь передать требуемые данные из микроконтроллера на дисплей. В своей линейке Digole в чем-то повторяет усилия Nextion. У Digole есть просто дисплеи, предназначенные для спаривания их с микроконтроллерами, но есть и настоящие комбайны с сенсорным вводом и собственной flash-памятью.

Для реализации в проекте я выбрал дисплей, который имеет номенклатурный номер «1.8" Serial: UART/I2C/SPI True Color OLED 160x128 Display Module». Устройство достаточно простое, в нем нет ни привода для карты памяти, нет и сенсорного ввода. Впрочем, все мне это и не требуется. Достаточно только того, что экран способен выводить до 262 тысяч цветов, а также его очень просто подключить к микроконтроллеру, даже такому как WeMos D1 на ESP8266. Но, помимо простоты сам дисплей обладает такими незаурядными характеристиками как:

  • Способность работать как полностью самостоятельно, когда требуемое изображение записывается во внутреннюю память контроллера, так и с возможностью сопряжения с любыми вменяемыми микроконтроллерами на 4, 8, 16 или же 32 бита. Хотя от разрядности тут мало что зависит, большее значение имеют протоколы, которыми можно связать микроконтроллер с дисплеем.
  • А самих протоколов у дисплеев Digole изрядное количество: UART, I2C и SPI. Причем все они конфигурируются программно-аппаратным способом.
  • Прошивку дисплея можно обновлять. И с течением времени получать новые и новые функции, улучшения.
  • В качестве питания устройство может работать в диапазоне от 3.0 и до 9.0 вольт. А логика способна обрабатывать сигналы от схем на 2.7, 3.3 и на 5 вольтах.

Другими словами, дисплей от Digole — настоящий комбайн, который можно применить в любом проекте и с любым микроконтроллером. Причем общаться с ним можно как на «родном» языке через команды, отправляемые по протоколам, а можно подключить библиотеку для экосистемы Arduino, и использовать функции библиотеки для отрисовки графических примитивов или же картинок.

digole.com, дисплей, wemos, mini, d1, breadboard, плата, прототип, стабилизатор, power, 5v/3.3v

Дисплей Digole на прототипной плате подключенный к WeMos D1 Mini Pro. В качестве источника питания используется отдельный стабилизатор на 5V.

В моем случае я изначально нацеливался на использование микроконтроллера WeMos D1 Mini или же его модификации Pro. У данного микроконтроллера не так уж и много свободных пинов, чтобы ими можно было бы распоряжаться с излишней неосмотрительностью. Поэтому мой выбор, для работы с дисплеем, пал с самого начала на протокол I2C. У Digole существует как минимум семь схем для подключения по поддерживаемым протоколам, все они перечислены в документации. Среди них, в том числе, есть вариант для подключения по SPI всего по двум проводам. Но, я, все же, решил двигаться с использованием более стандартного варианта с I2C, для которого так же требуется только два сигнальных подключения для передачи данных: проводник с данными (DATA) и проводник с импульсами синхронизации (CLK). При использовании всего двух пинов для подключения к микроконтроллеру, не считая питания и земли, такой дисплей можно подключить к уже существующему проекту.

Микроконтроллеры WeMos D1 потребляют 5 вольт постоянного тока, хотя сами работают от напряжения в 3.3 вольта. Простые опыты, проведенные с контроллером WeMos D1 Mini Pro, показали, что запитывать ESP8266 можно как через стандартный Micro-USB разъем 5-ю вольтами, так и подавать прямиком напряжение 3.3 вольта или 5 вольт на соответствующие пины платы микроконтроллера. Устройство работает нормально, проблем, как в оригинальном Arduino Uno не возникает. У Digole для дисплея 1.8" максимальное потребление указывается в 110 мА на 5 вольтах при полностью залитом белым дисплее (потребление OLED зависит от того, что отображается на экране). Мне не удалось найти достоверные характеристики стабилизатора на плате WeMos, но при подключении дисплея к пину 3.3 вольта все работало. Встроенный стабилизатор не нагревался, никаких нестабильностей не наблюдалась, даже при первоначальной загрузке дисплея, где все его поле заливается однородной окраской. Тем не менее, позже я перевел питание дисплея на 5 вольт, во избежание перегрузки встроенного стабилизатора другими потребителями. Никакого дополнительного согласования уровней между WeMos и Digole не потребовалось.

Для начала работы с экраном в среде Arduino необходимо подключить соответствующую библиотеку. На официальном форуме доступны библиотеки не только под Arduino, но и под другие экосистемы, поэтому разработчикам будет из чего выбрать. Библиотека устанавливается привычным способом. Скачивается zip-архив, затем он подключается в Arduino IDE. Хотя, как я уже упоминал выше, с дисплеем можно работать и без дополнительной библиотеки. Нужно только отправлять соответствующие команды дисплею по выбранному коммуникационному протоколу. А поскольку у Digole используется высокоуровневый язык управления, где команды передаются понятными мнемоническими инструкциями, то вариант прямого управления не так уж и плох.

SPI/I2C, 75k, serial, digole.com, 100u

Перемычка выбора протокола, по-умолчанию используется I2C.

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

Поскольку я использую микроконтроллер на основе ESP8622, то у него, в отличие от традиционного Arduino, нет выделенных пинов для подключения по I2C. Соответственно при работе с ESP8266 в среде Arduino придется дополнительно проинициализировать библиотеку Wire с явным указанием пинов для DATA и CLK:

#define _Digole_Serial_I2C_
#include <DigoleSerial.h>
#define ScreenSDA D2
#define ScreenSDL D1
#if defined(_Digole_Serial_I2C_)
#include <Wire.h>
// \x27 is I2C display address
DigoleSerialDisp mydisp(&Wire,'\x27');
#endif
void SetupScreen(){
  Wire.begin(ScreenSDA, ScreenSDL);
  mydisp.begin();
  mydisp.clearScreen();
}

Соответственно для работы по I2C у меня используются пины D1 и D2. Тут же в коде видно, что при инициализации объекта дисплея ему в явном виде передается еще и его адрес I2C. Да, к одному микроконтроллеру можно подключить несколько дисплеев, разнеся их по разным адресам. Что весьма удобно. Кстати, некоторые пользователи, работающие с I2C под ESP8266, отмечают, что при работе с сенсорным экраном может возникать проблема из-за слишком высокой скорости работы ESP. Для такого случая был разработан простенький fix.

digole, диголе, экран, дисплей, display, line, thingspeak, RAM free

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

Пожалуй, код, приведенный выше, единственное, с чем могут возникать проблемы при работе с дисплеем по I2C. Система весьма стабильна, а данные передаются шустро. Разобраться, как работать с дисплеем поможет не только приведенная выше документация, но и множество примеров из официальной библиотеки. В дисплей можно дополнительно загружать картинки, в том числе и для начального экрана, а можно загрузить свои шрифты, если вдруг захотелось получить русский или молдавский язык на экране. Но… Я попробовал только загружать картинки и в моем проекте действительно используется несколько растровых изображений. Однако, следует заметить, что передаются большие изображения по I2C существенное время. Поэтому их использовать следует только при начальной инициализации дисплея, либо же записать их во внутреннюю память экрана.

const unsigned char WiFiFull[] = {
  0,3,0,0,0,0,0,0
 ,0,3,0,2,0,0,0,0
 ,0,3,0,2,0,2,0,0
 ,0,3,0,2,0,2,0,0
 ,0,3,1,3,0,2,1,3
 ,0,3,1,3,0,2,1,3
};

Выше я привел кусочек определения растровой картинки в коде, картинка небольшая, поэтому со скоростью ее вывода проблем не возникает. Подготавливать и конвертировать изображения в правильный формат можно при помощи онлайн утилиты от Digole. И она действительно производит рекодировку качественно и без дефектов. Тем не менее, все мои попытки использовать графику в моем проекте, за исключением показометра уровня сигнала Wi-Fi, провалились с треском. Во-первых, я не смог нарисовать что-то достойное для воплощения. Насосы и вода у меня никак не получались. А, во-вторых, у OLED дисплея слишком уж низкое разрешение.

digole, экран, дисплей, display, oled, pixels, пиксели

Экран Digole крупным планом. Видны отдельные пиксели (sub-пиксели).

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

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

Полезные ссылки:

  1. Производитель дисплеев Nextion.
  2. Производитель дисплеев Digole.
  3. Инструкция по командам дисплея Digole для версий прошивок, начиная с 4-й.
  4. Библиотеки дисплея Digole для различных сред.
  5. Конвертация картинок в код при помощи онлайн утилиты от Digole.
  6. Инструкция по обновлению прошивки и сами прошивки для дисплеев Digole.

Читайте предыдущую часть: Автоматическая система контроля насосов — необычное решение необычной задачи с микроконтроллером ESP8266. Часть 3. Колдуем над прошивкой.



Добавить комментарий