Универсальный дистанционный пульт |
Управление модулями через WiFi
Для управления WiFi модулями программа использует статические IP адреса для своих модулей.
Как прописать статический IP адрес
IPAddress ip(192,168,0,128); //Node static IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
...
...
void setup()
{
initHardware(); //инициализация железа в одном месте
...
...
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);
...
}
Закрепленные IP адреса прописаны в пультах для каждого WiFi модуля. В html страничке map:
<div id="ip" title="192.168.0.121"></div> ( это тэг в чистом виде).
Для пультов IR адреса не нужны и строки должны выглядеть так:
<div id="ip" title="#"></div>
чтобы легче эти строки отыскивать и с ними работать, я их располагаю непосредственно перед </body>
В программе есть два пульта, которые управляют через WiFi канал. Один - ESP8266, это управление непосредственно сервером, а второй - map, другим WiFi модулем (тоже ESP8266), хороший пример возможных коммуникаций между WiFi модулями. У меня такой ESP8266 подсвечивает карту мира.
Поскольку WiFi модуль "map" сам организован как сервер, то есть две возможности управления им:
- Через основной сервер (192.168.0.128), выбрав пульт "map";
- Открыв в браузере страничку самого модуля - 192.168.0.121.
Следует помнить, что когда вы отправляете команду с одного модуля на другой, то реакцию на команды можно увидеть на терминале COM порта, подключенному к модулю, который принимает команды
Можно управлять через браузер четырьмя каналами, например светодиодными лентами, изменяя их яркость и скорость мерцания.
Программа позволяет менять режимы на авто и ручной.
Из рисунка понятно, к каким ножкам следует подключиться, чтобы программа сразу заработала.
- avto – переключение режима (ползунок здесь лишний, можно убрать).
- temp – изменение скорости мерцания в режиме avto.
При выключенном режиме avto ,ползунками меняется яркость, а переключателями на выходы подается или минимум или максимум из возможного.
Организация запросов и обмена данными.
/не окончательный вариант - поиски/
Возможные варианты рассмотрены на отдельной странице.
На рисунке показан один из вариантов: со смартфона или компьютера подается запрос [1] с использованием статического адреса модуля. Модуль принимает, обрабатывает запрос и формирует ответ на "сервер" [2]. Сервер принимает информацию и готов как угодно ее обработать, чтобы передать данные [3], но тут вскрываются проблемы, по крайней мере, для меня.
Когда в вашем распоряжении более одного устройства с дистанционным управлением, то само собой возникает желание сделать макро команду из набора команд, а тем более, если устройства разные.
Для хранения макрокоманд я разместил на SD карте папку MAKRO, в которой можно хранить пять макрокоманд - по числу кнопок на пульте. Конечно, вы можете разместить столько кнопок, сколько необходимо и даже на нескольких пультах. Я показываю принцип организации.
Каждая макрокоманда для этого пульта представляет собой текстовый файл butn.txt, где n - номер кнопки (id). Так, при нажатии на вторую кнопку (КИНО), программа загрузит, если есть, файл MACRO/but2.txt и начнет его исполнять. Каждая строка в файле, это одна команда. Строка записывается в строгом формате:
Для IR команд | Для WiFi команд | |||
---|---|---|---|---|
пример | samsung:pwr;sec=3; | пример | À.168.0.121/?map:cb13=8;sec=3; | |
&# | признак начала строки | &# | признак начала строки | |
samsung | имя пульта и одноименной папки в директории IR | 192.168.0.121 | IP адрес устройства, куда направляется команда | |
: | обязательный разделитель | /? | обязательный разделитель | |
pwr | кнопка вкл/выкл, имя raw файла. | map | имя пульта | |
: | обязательный разделитель | |||
cb13=8 | специфичная команда для(GPIO13) | |||
; | обязательный разделитель | ; | обязательный разделитель | |
sec= | указатель времени | sec= | указатель времени | |
3 | примерное количество секунд до выполнения следующей команды | 3 | примерное количество секунд до выполнения следующей команды | |
; | обязательный разделитель | ; | обязательный разделитель |
Интересно, что после разделителя /? можно прописать необходимый запрос для любого WiFi устройства. Для этого нет надобности на сервере хранить образы его команд, просто их надо знать.
Пример макрокоманды 2.txt
À.168.0.121/?map:cb12=0;sec=3;
À.168.0.121/?map:cb16=0;sec=1;
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb0=1;sec=1;
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb0=1;sec=1;
&#samsung:pwr;sec=3;//один раз с задержкой 3 сек
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb0=1;sec=2;
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb0=1;sec=2; - синий цвет
À.168.0.121/?map:cb0=0;sec=1;
&#samsung:1;sec=1;
&#samsung:4;sec=2;//вкл 14 каналÀ.168.0.121/?map:cb0=1;sec=2;
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb0=1;sec=2;
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb0=1;sec=2;
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb0=1;sec=2;
À.168.0.121/?map:cb5=0;sec=1;
À.168.0.121/?map:cb4=0;sec=1;
À.168.0.121/?map:cb0=0;sec=1;
À.168.0.121/?map:cb13=8;sec=1;
À.168.0.121/?map:cd5=624;sec=1;
À.168.0.121/?map:cb12=1;sec=1; - включить автомат
Макрокоманды позволяют одним нажатием выполнять различные действия различных устройств IR и WiFI режимах.
Как будет ясно позже, число макрокоманд не ограничено количеством кнопок, их может быть столько, сколько требуется. Имена файлов макрокоманд могут быть произвольные, единственное ограничение - название файла не должно превышать 8 символов. Так, например, может выглядеть вызов макрокоманды test0: "macro:test0;". Вызов макрокоманд можно организовывать с любого пульта или устройства, например, из файлов расписания
Временные интервалы легко подстроить под себя. В проекте за единицу я взял примерно одну секунду. Таймером фактически является сама программа, вернее ее цикл loop. Уменьшая или увеличивая задержку в конце цикла, можно регулировать временные интервалы.
Программа содержит некоторые полезные находки, и собственные изощрения. Надеюсь, что это поможет вам сделать освоение техники более увлекательным.
Кстати, обратите внимание на тег meta name=viewport, позволяющий задавать оптимальный размер отображаемой страницы в смартфоне. Меняя значение initial-scale, вы можете достигнуть желаемого результата.