ESP8266 E-12 управление через WiFi. |
Шаг второй - проект R_ESP8266_Control
R_ESP8266_Control v1.5 /последняя версия одним архивом/
Итак, поверхностное знакомство состоялось, теперь захотелось освоить модуль до такой степени, чтобы можно было обходиться без облачных сервисов типа Blynk, а управлять либо напрямую, либо в своей локальной сети. Пока я не ставлю задачи управлять чем-либо конкретно, а наоборот - сделать универсальную программу, для управления ESP8266 и получения с этого модуля различных данных.
Чем я располагаю: ESP 8266 E-12 Motor shield для ESP 8266 особой необходимости нет, просто с ним удобнее работать Arduino IDE 1.6.5 с подключенными библиотеками для ESP8266 (см. Подготовка) Из предложенных образцов программ в Arduino IDE, мне наиболее приглянулась: И на сайте https://www.sparkfun.com/ |
При работе с примерами я столкнулся с одной проблемой: каждый раз, когда идет запрос от сервера (клиента), html страница полностью обновляется. Мне удалось решить эту и другие проблемы, чтобы получить устойчивую картинку без перезаписи и перезагрузки страницы.
В процессе разработки я столкнулся с еще одной проблемой - объем загрузочного файла оказался слишком большим. Пока удалось решить эту проблему с помощью функции PROGMEM, хотя могут быть и более элегантные решения. С реализацией проблем не было, разве что пришлось поискать саму библиотеку pgmspace.h и найти, куда ее вставить c:\Documents and Settings\Admin\Application Data\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\cores\esp8266\
В основном, работа закончена. Можно, конечно, завести массив данных на сервере, чтобы хранить состояние всех выводов и по запросу передавать клиенту исчерпывающую информацию о состоянии модуля. Но это, мне кажется, другой уровень и потребность в нем не так велика, как требование к рачительному использованию памяти модуля.
Что мне хотелось сделать, но пока не удалось - это осуществить передачу данных от сервера клиенту по инициативе сервера. Пришлось временно, а может и навсегда, реализовать таймер на html страничке и посылать ложные запросы на сервер, чтобы тот начал передавать данные. Все работает, конечно, но мне это не совсем нравится. На форуме ESP8266.ru мой вопрос остался без внимания. Но я надеюсь, что решение будет найдено.
В общем, это пока в работе, а в остальном я очень доволен, поскольку с помощью этой программы открыл для себя некоторые особенности поведения ESP8266 - очень интересно поработать с прерываниями.
Комментарии по программе (скетчу)R_Server_v1_3R_mDNS_Web_Server_v1_3 /проверено: работают!/
Проект я назвал R_ESP8266_Control, хотя названия скетчей оставил ближе к источникам, на базе которых и работал. Оба скетча, практически, идентичны. Они отличаются только организацией самого WiFi соединения. Я не буду касаться этого вопроса, тем более что не очень-то еще в этом разбираюсь, но R_Server_v2 для прямого соединения через WiFi, то есть можно смартфон напрямую соединить с модулем; а вторая программа, R_mDNS_Web_Server_v2, позволяет работать с модулем в локальной сети. Не сложно сделать общий скетч с переключателем режима, но память модуля не бесконечна и лучше ее не перегружать.
Рассмотрим скетч на примере R_Server_v2.ino. Первое, html файл разбит на 26 строковых констант const static char file0[] ... [25], размер каждой около одно килобайта. Обратите внимание на строковую переменную String file4a = ""; в нее программа впишет IP адрес, который необходим для формирования запросов.
Думаю, что те, кому это интересно, смогут разобраться в прилагаемых программах. Замечу, что аналоговый вывод в ESP8266 обозначен особо "A0", поэтому в программе и в запросах я условно ему присвоил номер 20. Вот, пока все. Будут вопросы или пожелания, пишите.
И последнее. В Arduino IDE я пробовал разные начальные условия для разных устройств.
Чтобы развеять, может быть, ваши сомнения, я привожу варианты начальных условий, при которых все работает стабильно.
Все обновления или изменения будут отображаться на этой странице и на форуме:
http://esp8266.ru/forum/resources/r_esp8266_control-1-0.23/
Дополнена возможность отслеживания состояния выводов.
Такой режим возможен только при запуске таймера. При этом выводы с цифровых выводов модуля может считываться или 1 или 0. Поэтому в режиме PWM положение переключателей таких выводов не предсказуемо, так как потенциал на выводе может быть 1 или 0. Однако, в скетче можно исключить или заменить digitalRead(pin);
Для правильного отображение в мобильном телефоне вставьте в блоке <head> метатег viewport:
<meta name=viewport content="width=device-width, initial-scale=1">
изменяйте величину scale под свои требования.
Вспомогательная программа Form_convert
Попутно, для облегчения работы, я написал программку Form_convert для преобразования html файлов в формат для Arduino IDE.
Чтобы html файл разместить в скетче для Arduino IDE, необходимо над "чистым" html файлом произвести некоторые действия:
- перед каждой двойной кавычкой должен стоят обратный слеш ( \")
- каждая строка должна начинаться с двойной кавычки (")
- каждая строка должна заканчиваться набором символов ( \n\r")
- если это строковая переменная, то она должна заканчиваться точкой с запятой ( ;)
Все эти действия выполняет данная программа в ручном или автоматическом режиме, освобождая вас от рутинной работы. Программ написана под Windows и не требует инсталляции.
Я доволен, что не поленился и написал ее - она очень оказалась удобной в работе и сберегла мне кучу времени.