Последние статьи
- Твердотельный датчик направления и скорости ветра. Эксперимент
- iPhone на стене в качестве панели управления домом
- MegaD-16M-XT - подсветка выключателей и не только
- Переделка выключателей в кнопки и мини-обзор текущего рынка
- RadSens - модульный счетчик Гейгера с интерфейсом I2C
- "U" - значит универсальный. Обзор модуля MegaD-16U-XT
- SCD4x - современная альтернатива для измерения концентрации CO2
- HTU31D - новый датчик температуры и влажности с нагревательным элементом
- Измерение коэффициента пульсации ламп с помощью MegaD-2561
- Использование солнечных панелей в качестве датчика освещенности
- Согласование датчиков с выходом типа TTL со стандартными входами контроллера
- DPS368 - датчик атмосферного давления индустриального класса повышенной точности
- DS18B20 Waterpoof - импортзамещение
- TMP117 - высокоточный датчик температуры с интерфейсом I2C
- MegaD-16R-XT - расширитель на 16 релейных выходов
- MegaD-2561-RTC V3 - больше портов, зуммер и ИОН
Подключение к 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 секунды. Реализация поддержки в самом контроллере позволило бы значительно ускорить вывод данных. Однако, если говорить о выводе такой информации как температура или скорость ветра, то текущего быстродействия более чем достаточно.
Теперь осталость только вывести какие-то более осмысленные данные. Например, вот так.
Следующим этапом необходимо проверить, на каком расстоянии от контроллера может быть размещен ЖК дисплей. В качестве шлейфа я собираюсь использовать витую пару, в которой как раз 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 интерфейс, а как здесь быть?