ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

OLED дисплей SSD1306 в интерьере

08/05/2017 15:56:30

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

В своем доме для подключения датчиков температуры и влажности я использую коробочки от Supertronic. Они сделаны весьма аккуратно и не портят интерьер своим видом. В то же время контроллер MegaD-2561 поддерживает работу с недорогим OLED-дисплеем SSD1306. Поэтому я решил засунуть этот дисплей в корпус для датчиков и подключить к MegaD-2561.


Нож, напильник, 15 минут свободного времени и... готово

Дисплей закрепил в корпусе с помощью двухстороннего скотча для приклеивания линолеума. Подключение дисплея к контроллеру никакого труда не составляет. Для этого используется два порта для линий SCL и SDA (всего для подключения дисплея необходимо 4 провода: питание, земля и две цифровых линии данных). Я подключил дисплей непосредственно к модулю контроллера, к клемме XT2 (куда выведено 6 "цифровых" портов), с которой удобно взять питание 3,3В (см. распиновку разъема XT2).

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


Примечательно, что если к контроллеру подключены другие I2C-устройства, например, датчик HTU21D, то для линии SCL можно использовать один и тот же порт. Таким образом можно сэкономить порты контроллера. Значение яркости/контрастности по умолчанию 127 (максимальное 254), но я установил 80. Дисплей обладает очень высокой контрастностью, поэтому даже при значении 80 цифры светятся довольно ярко даже в солнечный день. Интересно, что яркостью можно управлять с помощью стандартных команд. Например, 33:80. Это даже позволяет серверу менять яркость дисплея в зависимости от времени суток или освещенности комнаты. Более того, дисплей можно включать/выключать с помощью команд 33:1 и 33:0, прописав соответствующие действия (Act) на сервере или прямо в контроллере для порта, к которому подключен, к примеру, датчик движения.


Как приколхозить дисплей в корпус для датчиков своими руками ;)

Кажется, что для выбранного дисплея корпус великоват. Но необходимо отметить, что в этом же корпусе можно разместить, например датчик температуры или углекислого газа (да, MH-Z14 в корпус вполне помещается). А можно просверлить пару отверстий и разместить в нем кнопки. Ведь дисплей у меня подключен с помощью "витой пары", которую я предусмотрительно заложил в стену. В кабеле UTP 8 проводников. Четыре из них заняты для подключения SSD1306. Остается еще 4. А так как "землю" допустимо использовать общую, в корпусе совершенно спокойно можно разместить 4 кнопки, которыми, например, переключать отображаемые значения или давать иные команды серверу.

Я решил, что на дисплее будет крупно отображаться температура за бортом. Если бы датчик температуры DS18B20 у меня был подключен к тому же контроллеру MegaD-2561, что и дисплей, то задача решалась бы очень просто. Необходимо было просто в поле Disp указать номер порта, к которому подключена линия SDA. В этом случае не нужен никакой сервер. Но я до сих пор получаю информацию о температуре на улице от недорогой китайской метеостанции, которая передает данные на сервер через внутренний блок, подключенный посредством USB. Значит, отображением данных на дисплее должен заниматься сервер. Какую же команду должен отправить сервер контроллеру для отображения температуры?

Вот такую (прошивка 3.15b2 и выше): http://192.168.0.14/sec/?pt=33&text=25.8:

Здесь (особенно для тех, кто уже использует контроллер) все интуитивно понятно.
pt=33 - порт, к которому подключена SDA-линия дисплея
text=25.8: - значение, которое нужно вывести.

В текущий момент (3.15b2) поддерживается отображение цифр, точки, плюса, минуса и значка градуса. Двоеточие после температуры ":" как раз и дает понять контроллеру, что необходимо отобразить значок градуса. Это упрощает ситуацию, ведь в отличие от символа градуса двоеточие присутствует на клавиатуре, а для передачи этого символа в GET-запросе нет необходимости в дополнительном кодировании.

Когда для отображения температуры используется сервер, есть только одна маленькая хитрость - форматирование отображаемого значения. Дело в том, что количество символов в значении температуры может быть разным: 0.0 (3 символа), 25.8 (4 символа), -22.7 (5 символов). Чтобы любое значение в диапазоне от -99.9 до +99.9 отображалось по центру дисплея, я написал простенький скрипт на PHP.

<?php
$my_temp = number_format("25.82", 1); // Получаем значение из базы и форматируем его
if ( strlen($my_temp) < 4 && $my_temp > 0 )
$my_temp = "s+$my_temp";
elseif (strlen($my_temp) < 4 )
$my_temp = "ss$my_temp";
elseif (strlen($my_temp) < 5 )
$my_temp = "s$my_temp";

file_get_contents("http://192.168.0.110/sec/?pt=33&text=$my_temp:");
?>

Здесь мы видим, что скрипт в зависимости от количества цифр добавляет символ "s", который означает "space" (пробел). Шрифт, который заложен в контроллер моноширинный, поэтому температура отображается всегда ровно, цифры не прыгают и не смещаются.

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

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



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

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2020-06-04 14:59:50 | Andrey_B
Александр, можно. В документации описано, как это делается. С конкретным примером аналогичным вашему.


2020-06-04 12:12:53 | Александр
Добрый день, подскажите как релизовать вывод температуры с датчика температуры DS18B20 на OLED экран SSD1306 ?

Имеется контроллер MEGAD-2561, к которому подключены через шину XT2 датчик температуры на порт P35 и экран SSD1306 на порты P30(SCL) и P31(SDA). Можно ли настроить так, чтобы показания с датчика температуры выводился на OLED экран ?


2018-12-16 16:08:27 | Andrey_B
Владислав, на обычном дешевом двухстороннем скотче из ближайшего строительного магазина. Прекрасно держится уже какой год и дисплей всегда можно легко снять для замены.


2018-12-16 14:37:07 | Владислав
Добрый день. Попал на вашую статью в поиске решения корпуса для ssd1306. Очень понравилось. Но хотелось бы ещё фото изнутри. На чем держится дисплей?


2018-07-18 11:47:32 | Andrey_B
Алексей, вручную, при помощи Dremel. Конечная доводка с помощью острого ножа для резьбы по дереву от "Татьянки".
Сейчас в принципе есть возможность попробовать делать подобные отверстия на станке.


2018-07-18 09:52:28 | Алексей
Андрей, подскажите, чем выпиливали отверстие? У этих коробочек очень вязкий пластик...


2017-07-30 11:39:31 | Andrey_B
Михаил, с помощью сервера можно вывести любую информацию.
Средствами только контроллера в данный момент нет, так как такая функция не заложена в прошивку.


2017-07-24 13:30:03 | Михаил
А часы можно вывести на этом экране?