ФОРУМ КУПИТЬ

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

ВСЕ СТАТЬИ

Подключение к MegaD-328 ЖК-дисплея

08/01/2014 14:14:16

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

Простейший температурный датчик с ЖК дисплеем

И в каком-то смысле это ведь удобно! Потребляет мало, показывает исключительно то, что необходимо, небольшие габариты. Я всегда выступал за то, чтобы использовать для отображения данных Умного Дома что-то готовое в виде простеньких планшетов. Уже сейчас их можно купить менее, чем за 2000 руб. Это намного более функциональное решение, но вместе с тем и более сложное. Даже несмотря на автоподстройку яркости, дисплей планшета ночью вполне может выступать в роли ночника, а настройка автозапуска приложения/браузера без возможности случайно выйти в ОС не кажется таким уж простым делом. Неприятно, когда вместо информации о температуре, которую мы ожидаем получить за доли секунды, мы увидим на экране планшета какое-нибудь сообщение об обновлении системы.
Одним словом там, где требуется интерактивность, имеется разветвленное меню, графика и прочее - у планшета в роли интерфейса общения с системой Умного Дома просто нет конкурентов. Но в случаях, где требуется вывести краткую и вполне определенную информацию без необходимости какого-то диалога с пользователем, ЖК-дисплеи выглядят предпочтительнее, так как проще, дешевле, надежнее. Кроме того, габариты ЖК дисплеев позволяют врезать их в мебель, встраивать в стены, холодильники и другие специфические устройства.

И я подумал, а почему бы не попробовать подключить какой-нибудь ЖК дисплей к MegaD-328 ("Мегадевайсу"), чтобы получить возможность выводить информацию с центрального компьютера (сервера)? Где-то в запасниках, я раскопал дисплей MT-16S2H российской компании МЭЛТ, который полностью совместим с наиболее популярным дисплеем HD44780 фирмы Hitachi.

Подключить его к MegaD-328 ОЧЕНЬ просто. Для работы с дисплеем необходимо всего 6 портов, питание и земля, то есть 8 проводников.
Почему 6 портов? Для экономии ног микроконтроллера я решил использовать 4-битный режим общения с дисплеем, когда один байт передается как бы за 2 этапа. Таким образом схема подключения выглядит примерно так.

Пин LCD Назначение Пин шлейфа MegaD-328 Порт
1 GND GND  
2 Питание +5В (через стабилизатор!) Питание +12В  
4 A0 - адресный канал 9 / D0 P8
6 E - строб данных, обращение к LCD 11 / D1 P9
11 DB4 15 / D4 P11
12 DB5 17 / D5 P12
13 DB6 19 / D6 P13
14 DB7 21 / D7 P6

Здесь мы просто напрямую подключаем шлейф к пинам LCD-дисплея за исключением одного нюанса. Питание. Подсветка дисплея не заработала от +3,3В, которые присутствуют в шлейфе, поэтому пришлось взять из него же +12 и подключить к дисплею через KIA 7805A (греется умеренно). Думаю, можно найти дисплей, подсветка которых работает от +3,3В, тогда не потребуется вносить никаких изменений. Все задействованные порты MegaD-328 должны быть настроены как выходы (тип OUT).

А теперь самое интересное. Я решил, что не буду менять прошивку! В самом деле, зачем? Весь протокол общения с ЖК-дисплеем я реализую не в контроллере, а на сервере. Именно программа на сервере будет передавать данные на дисплей. MegaD-328 в этом смысле будет лишь посредником, принимающим команды и данные по Ethernet и передающим их через свои порты на дисплей. В этом-то вся сила идеологии MegaD как универсального исполнителя. Скорости Ethernet должно хватить для реализации этой задумки. Посмотрим.

Я написал простейший скрипт на PHP и чудо! Оно заработало!

Подключение к контроллеру ЖК-дисплея

А вот, собственно, и сам PHP-скрипт. В работе с ЖК-дисплеями есть только одна сложность, которая часто вызывает затруднения - инициализация. Я запрограммировал инициализацию согласно даташиту производителя и программа заработала. Алгоритм инициализации в точности совпадает с даташитом HD44780, поэтому код должен работать с широким набором других дисплеев.

<?
define("LCD_RS", 8);
define("LCD_E", 9);
// D4, D5, D6, D7
$ports = array("6", "13", "12", "11", "6", "13", "12", "11");

function send_data($cmd)
{
    file_get_contents("http://192.168.0.14/sec/?cmd=$cmd");
}

function megad_lcd($byte, $mode)
{
    global $ports;

    $bin = base_convert($byte, 16, 2);
    $test = 8 - strlen($bin);
    for ( $i = 0; $i < $test; $i++ )
    $bin = "0".$bin;

    $cmd = LCD_RS.":$mode;";

    for ( $i = 0; $i < 4; $i++ )
    {
        $cmd .= $ports[$i].":";
        if ( $bin[$i] == "1" )
        $cmd .= "1;";
        else
        $cmd .= "0;";
    }

    send_data($cmd.LCD_E.":1");
    send_data(LCD_E.":0");

    $cmd = "";

    for ( $i = 4; $i < 8; $i++ )
    {
        $cmd .= $ports[$i].":";
        if ( $bin[$i] == "1" )
        $cmd .= "1;";
        else
        $cmd .= "0;";
    }

    send_data($cmd.LCD_E.":1");
    send_data(LCD_E.":0");
            
}

function str2lcd($string)
{
    for ( $i = 0; $i < strlen($string); $i++ )
    megad_lcd(dechex(ord($string[$i])), 1);
}

$cmd = "7:0;8:0;9:0;10:0;11:0;12:0;13:0";
send_data($cmd);

# Инициализация дисплея
megad_lcd("33", 0);
megad_lcd("32", 0);
megad_lcd("2A", 0);
megad_lcd("0C", 0);
megad_lcd("01", 0);

str2lcd("Привет!");
megad_lcd("C0", 0);
str2lcd("http://ab-log.ru");
?>

И все! Никакого абстракционизма! Никакого модернизма! Спасает стены от сырости, вас от ревматизма! Никаких изменений со стороны прошивки контроллера не производилось. Согласитесь, код PHP-скрипта не выглядит страшным и ужасным. Да, в коде инициализации выбрана страница 1 знакогенератора и используется кодировка Win1251. Для UTF-8 следует воспользоваться функцией iconv() для конвертации текста в CP1251.

ЖК-дисплей в системе Умного Дома

Дисплей имеет поддержку кириллицы. Конечно, учитывая специфику передачи данных, информация на дисплее отображается не сразу. Отображение текста занимает примерно 2 секунды. Реализация поддержки в самом контроллере позволило бы значительно ускорить вывод данных. Однако, если говорить о выводе такой информации как температура или скорость ветра, то текущего быстродействия более чем достаточно.

Теперь осталость только вывести какие-то более осмысленные данные. Например, вот так.

Вывод информации о погоде на LCD дисплее

Следующим этапом необходимо проверить, на каком расстоянии от контроллера может быть размещен ЖК дисплей. В качестве шлейфа я собираюсь использовать витую пару, в которой как раз 8 проводников. Интересно, что к одному контроллеру MegaD-328 можно подключить 2 независимых ЖК дисплея и еще два порта останется! Подсветку дисплея по большому счету можно не включать. А можно включать и даже управлять ею, например, через порт с поддержкой ШИМ. Для этого в Мегадевайсе все есть. Думаю, прекрасно будет работать. Таким образом это позволит регулировать подсветку в зависимости от освещенности.

Естественно, вместо 2-х строчного 16-знакового дисплея можно взять любой покрупнее. Есть, например, модели с 4-я строками и 20 знаками.

В общем, страницу управления ЖК дисплеями по Ethernet пока оставляю открытой.

UPDATE: Новый контроллер MegaD-2561 умеет на аппаратном уровне работать с дисплеями для шины I2C: SSD1306 и LCD1602/PCF8574T

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



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

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


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

2014-01-14 09:08:55 | Александр
Андрей, спасибо за статью. Давно пытался найти вариант отображения информации на дисплеях. То есть, выходы с интерфейсого модуля, передают логические нули и единицы на дисплей? Тогда ведь можно реализовать вывод на дисплей через 1wire? Используя выходы DS2408S? И как организовать вывод на 4-х строчные дисплеи?
Поддерживаю Ваше предположение, что тему стоит развивать. Очень важная тема.


2014-01-14 17:14:24 | Andrey_B
Александр, 1-wire действительно давно уже используют для управления ЖК-дисплеями. С одной стороны, делать это на 1-wire проще в том смысле, дешевое и простое устройство для 1-wire (DS2408) можно разместить рядом с ЖК-дисплеем. В моем же варианте контроллер MegaD-328 не всегда возможно разместить рядом. В корпусе он достаточно велик. Поэтому я сейчас изучаю насколько далеко можно разместить ЖК-дисплей от MegaD-328. Какова будет максимальная длина шлейфа. С другой стороны 1-wire довольно медленная шина. И если через MegaD-328 заполнение дисплея текстом занимает 1-2 секунды, то через 1-wire это значительно дольше. Впрочем, применительно к нашим задачам, это не слишком важный аспект.


2014-01-16 20:33:53 | Александр
Андрей, согласен, 1-wire медленая шина, но ведь все дисплеи можно вывести на отдельный мастер, так по-быстрее будет, даже при 100, 300 метрах от мастера. Хотя, даже если вывод займет 4 сек. вместо 2-х, согласно Вашему примеру, - это всё равно неплохой результат. Можно выполнять шимирование дисплея используя 1-wire диммер постоянного тока. Который, я даже не представляю, как паять.
Конечно же, неоспоримым преимуществом, является подключение дисплея к MegaD-328 на длинном растоянии с реализацией поддержки в самом контроллере. Здесь мне очень понравилась идея с шимированием. Но как это шимирование выполнять, в MegaD-328 оно без обвязки не работает.

Да, и, конечно же должен заметить, мне нравятся Ваши фразы, вроде: "Я написал простейший скрипт на PHP.." :-). Этот скрипт, подскажите, как запускать, что б он выводил на дисплей информацию, регулярно, в режиме реального времени? И пойдет ли он для 4-х строчных дисплеев?


2014-01-16 23:24:35 | Andrey_B
Александр, данная статья - это своего рода демонстрация возможностей устройства. Она дает понять, что MegaD-328 не ограничивается морганием лампочками. На нем можно делать и более интересные штуки. А основная особенность заключается в том, что протокол общения с ЖК дисплеем зашит не в микроконтроллер, как это обычно делается, а реализован на стороне сервера. Это на мой взгляд очень интересно. То есть такой подход позволяет применять MegaD-328 в роли этакого шлюза, конвертера между различными интерфейсами, с программой на сервере.
Что касается скрипта, то есть всего лишь пример. Он выводит две строчки на ЖК-дисплей и завершает свою работу. Очень просто его переделать для работы в режиме реального времени. Но эта тема все же не для обучения языку программирования. Скрипт без проблем будет работать с любым количеством строк и символов. Для переключения на другую строку, используется определенная команда. Смотрите документацию на ЖК-дисплей.


2014-02-23 00:06:11 | Вадим
Вот как бы программить МЕГУ с этого дисплея. есть такой - 16х2 плюс кнопочки. Подет его прикрутить. ну или 4х20 можно попробывать.


2014-02-23 09:38:51 | Andrey_B
Вадим, учитывая философию и идеологию проекта "Мегадевайса", хочу уточнить - что вы понимаете под "программированием"?


2014-02-27 01:05:00 | Вадим
Под программированием понимаю установку входов и выходов в различные состояния с помощью ЖК дисплея и микрокнопок.


2014-02-27 12:57:39 | Andrey_B
Вадим, с помощью кнопки и сценариев по умолчанию "Action" можно менять состояние выходов. Не совсем понятно что такое "установка входов".


2014-07-17 11:20:46 | Андрей
Раз у нас остались 2 порта, то можно поставить 3 кнопки. Хватит, например, для "назад", "ввод" и "листать". При их помощи сервер даст нам список мегадевайсов в системе, мы его можем полистать, войти в нужный мегадевайс, полистать порты в нём, переключить их режимы листанием, поменять границы срабатывания уличного датчика освещённости (не сильно удобным способом, но примерно так же настраиваются часы в машине — циклически меняется значение часов и минут по кругу при нажатой кнопке).
Но будет мешать скорость обмена с сервером, получится не очень удобно. Выключить порт на мегадевайсе можно, а настраивать порог датчика уже неудобно, быстрее дойти до компьютера или достать из штанов смартфон.


2014-11-07 23:24:47 | -=мишка=-
Привет!
по поводу LCD я давно перестал замарачиваться с кучей проводов и занятых портов. есть отличная платка I2C. Стоит очень дорого $1.15 :) При этом управляет подсветкой дисплея и подстроечник с контрастность.....и так разведена что просто впаивается в диплейчик. Я обычно использую 20х4...они на пару долларов дороже но зато вещь!
сигнальный кабель на 4 провода. У меня на 4 метра отлично работала.
/www.ebay.com/itm/IIC-I2C-TWI-SP-I-Serial-Interface-Board-Module-Port-For-Arduino-1602LCD-Display-/310565362720?pt=LH_DefaultDomain_0&hash=item484f235c20

спасибо за клевый блог.
-=мишка=-


2014-11-21 10:38:13 | Станислав
А подключить более серьезную панель с хорошей визуализацией и управлением устройствами через тач-экран возможно? Для умного дома такая вещь почти не заменима.


2014-11-21 11:43:28 | Andrey_B
Станислав, естественно возможно. И даже намного проще.
Сервер - хороший Web-интерфейс с кодом, который работает у устройствами MegaD-328 - любой планшет. Вот и все дела. Именно такую идеологию я проповедую на этом сайте.
Здесь об этом много написано. Код Web-интерфейса тоже выложен. MegaD Panel в качестве начального уровня. Демо-интерфейс как моя текущая реализация.


2014-11-21 13:15:25 | Станислав
Андрей, спасибо, что вы это пропагандируете. Тогда для планшета удобнее было бы использовать готовое приложение, например, типа Irridium for IPad. Как с этим дела обстоят?


2014-11-22 11:10:39 | Andrey_B
Станислав, лично мне кажется, что управление системой через Web-интерфейс имеет больше возможностей и преимуществ, чем через приложение. Во-первых, нет никакой зависимости от операционной системы. Web-интерфейс будет работать везде, даже на какой-нибудь экзотической Baidu или в смарт-ТВ. Во-вторых, нет зависимости от поставщика приложения, который в один прекрасный момент может завершить разработку или попасть в бан владельца магазина приложений. В-третьих, Web дает максимальные возможности, не ограниченные рамками приложения.
В пользу приложения говорит уже готовый и возможно более удобный интерфейс и простота интеграции. Тут уж каждый выбирает свой путь. С точки зрения популяризации домашней автоматизации и снижения порога вхождению в тему, подобные приложения, конечно, имеет смысл пробовать.


2015-05-20 23:30:54 | Александр
По поводу платы на базе PCF8574, описанной внизу товарищем =mike=, не совсем понятно, как ее подключать к Меге? На Raspberry Pi пробовал. Но там уде есть готовые GPIO под I2C интерфейс, а как здесь быть?