Текст
                    Белов А.В.
УПРАВЛЕНИЕ МОДУЛЕМ
ARDUINO
ПО WI-FI С МОБИЛЬНЫХ УСТРОЙСТВ
Наука и Техника, Санкт-Петербург


УДК 621.314:621.311.6 ББК 32.816 Белов А.В. Управление модулем ARDUINO по Wi-Fi с мобильных устройств. - СПб.: Наука и Техника, 2О2О.-496с.,илл. ISBN 978-5-94387-892-3 Перед вами ИНТЕРАКТИВНЫЙ САМОУЧИТЕЛЬ с QR-кодами для перехода к приложениям и не- обходимым ресурсам. Сканер QR-кодов, установленный на смартфон или планшет, позволит при наведении гаджета на QR-код по ходу чтения книги перейти по необходимой ссылке. Это облег- чает освоение программирования ARDUINO, позволяет устанавливать нужные Приложения и пр. Сегодня уровень развития микроэлектроники, накопленный опыт программирования и широкое распространение готовых программных библиотек позволяет широкому кругу начинающих конструкторов легко и быстро освоить приемы и методы разработки электронных устройств на базе ARDUINO. В книге доступным языком от простого к сложному раскрываются все секреты схемотехники и программирования в данной области. Изучение материала происходит на конкретных при- мерах, специально разработанных автором для данной книги. В качестве основы для примеров выбраны популярные и широко распространенные микро- контроллерные модули: универсальный модуль широкого применения ARDUINO и популярный Wi-Fi модуль ESP-O1, использующий самую удачную и недорогую на данный момент микро- схему ESP8266EX. Книга предназначена для начинающих программистов и радиолюбителей,желающих научиться создавать полезные устройства.управляемые по сети Wi-Fi при помощи смартфона или планшета. На ВИРТУАЛЬНОМ ДИСКЕ размещены тексты всех программных примеров из книги, наборы видео презентаций и файлов для скачивания, ссылки на необходимые компьютерные про- граммы, QR-ссылки на все важные для книги мобильные приложения, справочная информация. 9 " 785943 " 878923 ISBN 978-5-94387-892-3 Автор и издательство не несут ответственности за возможный ущерб, причиненный в ходе использования материалов данной книги. Контактный телефон издательства (812) 412-70-26 Официальный сайт: www.nit.com.ru Белов А.В. Наука и Техника (оригинал:макет) 000 «Наука и Техника». Лицензия № 000350 от 23 декабря 1999 года. 198097, г. Санкт-Петербург, ул. Маршала Говорова, д. 29. Подписано в печать 05.11.2019. Формат 70*100 1/16. Бумага офсетная. Печать офсетная. Объем 31 п. л. Тираж 1200 экз. Заказ №11303 . Отпечатано с готовых файлов заказчика в АО «Первая Образцовая типография» филиал «УЛЬЯНОВСКИЙ ДОМ ПЕЧАТИ» 432980, Россия, г. Ульяновск, ул. Гончарова, 14
СОДЕРЖАНИЕ Уважаемые читатели! 11 Чем будут полезны QR-коды в этой книге 15 О чем эта книга и для кого она написана 16 Глава вводная. ARDUINO - это очень просто 21 Кем создан и почему так назван модуль ARDUINO 22 Как удалось избежать использования программатора в ARDUINO 23 Первые варианты модуля ARDUINO 25 Модуль ARDUINO UNO 27 Полезные упрощения в модуле 29 Группа аналоговых входов 30 Команда аналогового вывода 31 Контакты питания POWER 33 Поддерживаемые языки программирования 33 Среда разработки IDE 35 Команды и функции языка ARDUINO 36 Внешние библиотеки 37 Варианты установочных пакетов для Windows 39 Запуск программы 40 Основное окно среды разработки 41 Панель инструментов 43 Выбор номера СОМ порта в настройках программы 43 Выбор типа используемой платы ARDUINO 45 Скетч: открытие, сохранение, загрузка 46 Организация обмена информацией между программой на ARDUINO и компьютером 47 Подводим итоги и готовимся читать новую главу 49 Глава 1. Микросхема ESP8266EX 51 1.1. Знакомство с микроконтроллером ESP8266EX 52 Стандартные интерфейсы 52 Характеристики микросхемы 53 Назначение выводов микросхемы, 53 1.2. Линии ввода-вывода 57 Интерфейс ввода-вывода общего назначения (GPIO) 57 Управление светодиодом и кнопкой 58
АЦП - цифро-аналоговый преобразователь (ADC) 59 Линии ввода-вывода с Широтно-импульсной модуляцией (PWM) 59 Инфракрасный пульт дистанционного управления 60 Защищенный цифровой интерфейс ввода/вывода (SDIO) 61 Последовательный периферийный интерфейс (SPI / HSPI) 62 Интерфейс 12С 63 Интерфейс I2S 63 Универсальный асинхронный интерфейс UART 64 1.3. Технические характеристики микросхемы ESP8266EX 66 1.4. Основы программирования для микроконтроллера ESP8266EX 67 Аппаратная и программная часть 67 Проект 69 Подготовка оборудования и программного обеспечения 70 Загрузка Non-OS SDK 72 Загрузка RTOS SDK 73 1.5. Инструментальные программы для SDK 75 Загрузка компилятора 75 Загрузка образа виртуальной машины 75 1.6. Заключение главы, или «Не все так страшно!» 76 Глава 2. Модули на основемикроконтроллера ESP8266 77 2.1. Краткое описание модулей ESP 78 Как модули ESP выглядят 78 Модуль ESP-01 79 Модуль ESP-02 79 Модуль ESP-03 80 Модуль ESP-04 80 Модуль ESP-05 81 Модуль ESP-06 81 Модуль ESP-07 82 Модуль ESP-08 82 Модуль ESP-09 82 Модуль ESP-10 83 Модуль ESP-11 83 Модуль ESP-12 84 Модуль ESP-13 85 Модуль ESP-14 85 2.2. Готовимся к использованию модуля ESP-01 86 Почему выбрали именно модуль ESP-01? 86 Как устроен модуль ESP-01 87 Управление модулем ESP-01 с помощью набора АТ-команд 89 Питание модуля ESP-01 90 Подключение модуля ESP-01 к компьютеру 92
Выбор источника исполняемой программы 94 Адаптеры для согласования модуля ESP-O1 с компьютером 96 2.3. Программирование модуля ESP-O1 на ARDUINO IDE 98 2.4. Подключение модуля ESP-O1 к модулю ARDUINO 99 Особенности подключения к модулю ARDUINO 99 Соединение двух каналов UART и согласование уровней сигналов 100 Схемы переходников 101 Кабели для ARDUINO 102 Как можно обойтись и без проводов? 103 2.5. Обновление и восстановление прошивки ESP-модуля 107 Подготовка к практической части курса 107 Что еще нужно приобрести для успешной работы 108 Поговорим о прошивке 109 Подключение модуля ESP-01 к компьютеру для прошивки 110 Для чего желательна кнопка сброса? 111 Установка среды разработки IDE 112 Настройка IDE на компьютере 113 Загрузка SDK 114 Определение конфигурации модуля ESP-01 116 Структура папки bin и правила использования ее содержимого.. 117 Программа-программатор 120 Приступаем к программированию 123 Глава 3. Работа с модулем ESP-01 при помощи АТ-команд 125 3.1. Система АТ-команд ESP-модуля 126 Принцип функционирования системы АТ-команд 126 Режимы, управляемые АТ-командами 127 Приобретаем модуль ESP-01 и переходник 128 Начинаем работу с Wi-Fi модулем, ставим программное обеспечение 129 Устанавливаем программное обеспечение на компьютер 131 Особенности АТ-команд 132 Запускаем монитор порта 133 3.2. Запуск Wi-Fi точки доступа 137 Основные принципы работы современных Wi-Fi сетей 137 Создание Wi-Fi сети низкого уровня 138 Переводим ESP-модуль в режим точки доступа 139 Подключаемся к точке доступа 142 3.3. Запуск TCP-сервера 146 Создаем канал связи по протоколу TCP 146 Переходим к передаче данных со смартфона на модуль 151 Переходим к передаче данных от ESP-модуля на смартфон 152 Почему соединение периодически обрывается? 154
3.4. Запуск TCP-клиента 155 Развернем TCP-сервер в смартфоне, используя приложение «TESTTOOL» 155 Настраиваем ESP-модуль в режим TCP-клиента 156 Работа TCP-клиента в однопользовательском режиме 157 Работа TCP-клиента в многопользовательском режиме 160 3.5. Работа ESP-модуля в режиме Wi-Fi клиента 161 3.6. Работа ESP-модуля с протоколом UDP 167 Что такое протокол UDP? 167 Разница между протоколами TCP и UDP 167 Организация обмена данными по протоколу UDP 169 Режим смены IP-адреса 174 Широковещательный режим передачи данных 176 Глава 4. Управление ESP-01 при помощи ARDUINO 177 4.1.Учимся управлять модулем ESP-01 при помощи ARDUINO 178 Порядок изучения данной главы 178 Вспомогательные программные средства 179 4.2. Осваиваем приложение «WIFI Controller ESP8266» 181 Органы управления приложением 181 Первый запуск приложения 182 Главное окно 184 Настройка кнопок 190 Поле вывода принятых сообщений 192 Дополнительные функции 193 4.3. Проблема с IP адресом учебного модуля 194 Особенности работы модуля ESP-01 как Wi-Fi клиента 194 Приложение «Network Utilities» 196 4.4. Подключение модуля ESP-01 к ARDUINO 198 Создаем учебный модуль 198 Подключение учебного модуля 200 Как самостоятельно собрать переходную плату 200 Подключаем плату ARDUINO UNO 202 Питание учебного модуля 204 4.5. Настройка параметров ESP-01 под управлением ARDUINO 204 Задачи и возможности создаваемой программы 204 Способы создания Wi-Fi соединения 205 Установка параметров настройки ESP-01 206 Команды, которые нужно подать вручную 209 4.6. Простейшая программа для управления ESP-01 210 Немного теории 210 Постановка задачи 212 Алгоритм 213 Программа 213
Трансляция и проверка работоспособности программы 215 4.7. Программа «ЭХО» 220 Что сделали и что предстоит сделать 220 Постановка задачи 220 Алгоритм 221 Программа: создаем вспомогательные функции 222 Функция SetupESPO 225 Первый вариант функции sLinelnputO 226 Второй вариант функции sLinelnputO 230 Функция PrintWIFlO 235 Функция waitOKO 241 Программа: основная часть 242 4.8. Особенности отладки программ в связке двух модулей 248 Немного о возможных ошибках и отладке программы 248 Программный способ контроля ответа ESP-модуля 249 Аппаратный способ контроля ответа ESP-модуля 263 Общие вопросы отладки программ 267 4.9. Программа управления светодиодами 269 Как научится управлять светодиодами и не только 269 Схема 269 Алгоритм 271 Программа 272 4.10. Программа регулировки яркости светодиодов 282 Учимся использовать слайдеры 282 Схема 284 Программа 284 4.11. Не забывайте согласовать нагрузку с выходами микроконтроллера 292 Глава 5. Конструктор графических интерфейсов 293 5.1. Вместо приложения с универсальным интерфейсом - конструктор интерфейсов 294 Универсальные приложения типа «WIFI Controller» 294 Альтернативный вариант решения проблемы - конструктор интерфейсов 295 Редактор интерфейсов системы Blynk 295 Редактор интерфейсов системы RemoteXY 296 5.2. Конструктор интерфейсов RemoteXY 298 Приглашаем на сайт remotexy.com 298 Редактор интерфейсов: начинаем освоение 300 Особенности выбора канала связи 302 Совместимые и доступные соединения 303 Полезные возможности помощника 304 Подключение модуля 305
Настройка экрана 308 Поговорим о скрытой группе «Элемент» 309 Обмен данными между смартфоном и учебным модулем 310 5.3. Подготовка модуля ESP-01 для проекта RemoteXY 311 Разбираемся с версиями прошивки модуля 311 Выполняем две очень важные манипуляции 313 5.4. Простой проект - тест элементов управления 315 Начало работы в графическом редакторе 315 Постановка задачи 317 Схема 317 Алгоритм 317 Создание образа панели управления 318 Создание программы 326 5.5. Простой проект - доработка исходного кода 343 5.6. Мобильное приложение RemoteXY 352 С какой версией лучше начинать работать: с бесплатной или коммерческой? 352 Установка приложения «RemoteXY Free» 354 Первый запуск приложения 354 Повторные запуски приложения 355 Загружаем коммерческую версию 358 Несколько полезных советов 359 5.7. Проверка элементов индикации: разработка проекта 361 Постановка задачи 361 Начинаем работать с новым проектом 362 Элемент «Индикатор» -. 363 Элемент «Уровень линейный» 365 Элемент «Шкала дуговая стрелочная» 366 Элемент «Текстовая строка» 368 Элемент «Онлайн график» 369 5.8. Проверка элементов индикации: схема и программа 373 Готовимся к созданию программы 373 Постановка задачи 374 Схема 375 Программа 375 Как это работает 379 Пересчет значений 380 Запуск и использование программы 383 Глава 6. Использование ESP-01 без ARDUINO 385 6.1. Начинаем действовать без ARDUINO 386 Модули на основе микросхемы ESP8266EX - самостоятельные микроконтроллерные устройства 386 Загрузка и установка плагина 386
Подключение модуля к компьютеру 388 Загрузка программы в программную память модуля ESP-O1 390 6.2. Выбор программных примеров 390 Загрузка программного примера 390 Проверка работы оттранслированной программы 393 6.3. Программа ндстройки ESP-01, режим Wi-Fi клиента 394 Начнем с конфигурации Wi-Fi подсистемы микроконтроллера... 394 Постановка задачи 395 Программа 395 Первый листинг: основной текст программы 396 Второй листинг: текст функции SetupSTAO 399 Проверка работы программы 402 6.4. Программа настройки ESP-01, режим Wi-Fi точки доступа 404 Особенности новой программы 404 Постановка задачи 404 Первый листинг: основной текст программы 405 Второй листинг: функция начальной настройки Wi-Fi подсистемы SetupAPO 406 6.5. Программа обмена данными между смартфоном и ESP-01 409 Переходим к созданию практических прикладных программ 409 Постановка задачи 410 Программа 410 Проверка работы программы 415 6.6. Программа управления реле при помощи ESP-01 417 Учимся управлять мощной нагрузкой 417 Схема 421 Постановка задачи 422 Алгоритм 423 Листинг первый: содержимое заголовочного файла 426 Листинг второй: основной текст программы 428 6.7. Управление модулем реле при помощи браузера 434 Рассмотрим способ удаленно управлять модулем ESP-01 434 Постановка задачи 435 Схема 436 Алгоритм 436 HTML код управляющей страницы 438 Программа 441 6.8. Программа управления климатическим модулем 449 Учимся использовать климатический модуль 449 Схема 451 Постановка задачи 452 Алгоритм 453 Дополнительные библиотеки 453 Программа 455
6.9. Управление метео-модулем при помощи браузера 461 Постановка задачи 461 HTML текст страницы 462 Программа 463 Некоторые выводы 467 Приложение 1. Список литературы и использованных ресурсов сети Интернет 468 Литература и ссылки на литературу в Интернет 468 Ссылки в Интернет на страницы установки мобильных приложений 468 Интернет-ссылки, на которые в книге сгенерированы QR-коды .. 470 Приложение 2. Обзор сайтов в Интернет, рекомендуемых автором книги как источник дополнительного материала по теме книги.. .471 Сайт Esp8266 - Сообщество разработчиков 471 Сайт All Arduino (Все про Ардуино) 471 Сайт RobotChip 472 Сайт Arduino + 472 Официальный сайт Ардуино 472 Официальный сайт фирмы Epressif 472 Группа ESP8266 на сайте «Вконтакте» 473 Группы ESP8266 на FaceBook 473 Приложение 3. Полный список ESP8266 AT команд на русском языке для версии AT v0.22 SDK vl.0.0 474 Приложение 4. Программирование в ARDUINO IDE для ESP8266: краткий обзор реализованных в настоящее время функций 485 Приложение 5. Подводя итоги, или о виртуальном диске 493
УВАЖАЕМЫЕ ЧИТАТЕЛИ! Сканер QR-кодов | и интерактивный самоучитель II Данная книга широко использует технологию QR-кодов, которая превращает этот САМОУЧИТЕЛЬ в РШТЕРАКТИВНЫЙ ПРОДУКТ. С помощью QR-кода можно считывать информа- цию сканером мобильного устройства (смартфона, планшета). Отмечу, что стандартные программы-сканеры, входящие в исходный набор ПО смартфона, не очень удобны в работе по следующим причинам: ♦ работают недостаточно быстро; ♦ могут не распознать код при низком качестве изображения; ♦ обычно автоматически не переходят на изображение в интернете, требуюя дополнительного нажатия ссылки на экране. СОВЕТ. Для работы с QR-кодами рекомендуем установить на ваш смартфон (планшет) СПЕЦИАЛЬНОЕ более КАЧЕСТВЕННОЕ ПРИЛОЖЕНИЕ - сканер QR-кодов. Автор книги получил хорошие результаты, применив прило- жение [4]: «Сканер QR и штрих-кодов (русский)» TeaCapps.
12 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Вы можете установить это приложение на смартфон, отсканиро- вав своим мобильным устройством OR-код, размещенный на этой странице. Или вручную найти программу в Google Play или Арр Store. /* ^ Для перехода по ссылке [4], указанной в тексте, запустите на смартфоне (планшете) приложение для сканирова- ния QR-кодов и наведите камеру смарт- фона (планшета) на расположенное v справа изображение QR-кода. Приложение представляет собой современный сканер QR- и штрих-кодов со всеми необходимыми вам функциями. Приложение поддерживает все распространенные форматы штрих-кодов: QR (примененный в данной книге), а также Data Matrix, Aztec, UPC, EAN, Code 39 и многие другие, которые могут пригодиться в дальнейшем. Приложение дополнительно позволяет при помощи QR-кода: ♦ открывать URL- адреса; ♦ подключаться к точкам доступа Wi-Fi; ♦ добавлять события в календарь; ♦ считывать карты VCards; ♦ искать информацию о товарах и др. СОВЕТ. Включайте фонарик для надежного сканирования в условиях недостатка света и используйте мас- штабирование для чтения штрих-кодов даже с больших расстояний. QR-коды, поддерживаемые программой: ссылки на веб- сайты (URL); контактные данные (MeCard, vCard, vcf); события календаря; данные доступа к Wi-Fi; географические расположения; сведения о телефонных звонках; электронная почта, SMS и MATMSG. Приложение «Сканер QR и штрих-кодов (русский)» TeaCapps., доступно для смартфонов и планшетов под управле- нием Android 6.0 или выше. После установки на смартфон, запустите приложение, перей- дите в раздел «Настройки» (иконка в верхнем правом углу экрана) и
Уважаемые читатели! 13 поставьте «птичку» напротив пункта «Открывать веб-сайты автома- тически». При такой настройке сайты при сканировании QR-кодов в книге будут открываться немедленно после сканирования. Для того чтобы так же при сканировании соответствующих QR-кодов открывались цветные копии картинок, нужно выпол- нить следующую настройку: ♦ войдите в раздел «Пользовательские параметры поиска». Ссылка для входа в этот раздел находится тут же в окне на- строек приложения; ♦ создайте пользовательский параметр. Для этого щелкните по оранжевому кружочку с символом «+» в нижней части окна. От- кроется окно ввода пользовательских параметров (см. рис. А1). Заполните поля параметров: ♦ В поле «Ярлык» наберите название создаваемого набора па- раметров. Мы назвали набор «Книга». ♦ В поле URL наберите точно как в книге следующую строку: http://book.mirmk.ru/wdisk2/il/il__{code}.jpg книга Гоеэры и текст Puc.Al. Настройка пользовательских параметров QR-сканера
14 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ Переключатель «Выполнять автоматически» переведите в положение «Включено» (движок вправо). ♦ Измените значение параметра «Режим активации». По умол- чанию он имеет значение «Все». Щелкните по параметру и выберите из списка пункт «Товары и текст». Заполнив значения всех параметров, выйдите из окна ввода параметров, нажав стрелку в верхнем левом углу экрана. Вы уви- дите, что в окне пользовательских параметров появится запись с именем «Книга». Под именем вы увидите набранную вами строку параметра URL. Проверьте правильность ввода этого пара- метра. Затем можете выйти из окна пользовательских параме- тров при помощи той же стрелки в верхнем левом углу окна. Теперь все картинки при сканировании их QR-кодов будут появляться на экране смартфона. При желании вы можете изме- нить и другие установки в окне настроек согласно своим вкусам. Затем закройте окно настроек и можете пользоваться сканером. В процессе сканирования вы можете масштабировать изо- бражение на экране стандартными жестами на экране смартфона (раздвигая и сдвигая двумя пальцами). Для включения подсветки используйте иконку «Свет» в верхней части окна.
ЧЕМ БУДУТ ПОЛЕЗНЫ QR-КОДЫ В ЭТОЙ КНИГЕ В этой книге при помощи QR-кодов вы сможете устано- вить на свое мобильное устройство (смартфон, планшет) ВСЕ МОБИЛЬНЫЕ ПРИЛОЖЕНИЯ, необходимые для усвоения мате- риала. Эти коды расположены прямо по тексту для комфорт- ной работы с материалом. Кроме того, наиболее важные коды с кратким описанием приложения вы найдете в конце книги в Приложении 1 «Список литературы и используемых ресурсов сети Интернет». И еще... В тексте книги возле некоторых иллюстраций, вы также увидите QR-коды. Наведя на эти QR-коды камеру смарт- фона (с открытым приложением СКАНЕР QR-кодов), вы увидите на экране своего мобильного устройства цветное изображение той же иллюстрации. QR-коды помогут также работать и с ВИРТУАЛЬНЫМ ДИСКОМ, которым сопровождается данная книга.
О ЧЕМ ЭТА КНИГА И ДЛЯ КОГО ОНА НАПИСАНА Новичок: Я с интересом читаю книги по микроконтроллерам Александра Белова, т. е. Ваши. Жду всегда с нетерпе- нием новинки. А в чем новизна этой книги? Данная книга задумана как продолжение СЕРИИ КНИГ ПО МИКРОКОНТРОЛЛЕРАМ, выпущенной в издательстве НАУКА И ТЕХНИКА. Надеюсь, ты их прочел. Эти книги представлены для продажи в книжных магазинах (см. перечень в конце книги) и на сайте издательства [29]. ■ Для перехода по указанной в тексте ссылке [29] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Новичок: А как с авторской поддержкой проекта по микро- электронике? Авторская поддержка этой серии книг традиционно представ- лена на сайте «Мир книг по микроэлектронике» [9]. Новичок: Смело могу сказать, что за два десятилетия выхода книг Александра Белова на них выросло много поко- лений специалистов-электронщиков.
О чем эта книга и для кого она написана 17 Для перехода по указанной в тексте ссылке [9] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. В предыдущих моих книгах [1] и [3], вышедших в 2018 году, читатели, освоили основы микроэлектроники, цифровой тех- ники, передачи цифрового сигнала. Узнали принципы построе- ния микропроцессорных систем и микроконтроллеров и научи- лись работать на примере микроконтроллеров AVR. А затем на примере модуля ARDUINO стали строить схемы и составлять программы для самых разных практических задач. Для перехода по указанной в тексте ссылке [1] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Для перехода по указанной в тексте ссылке [3] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Новичок: А о чем вы рассказываете в этой книге? В этой книге мы сделаем СЛЕДУЮЩИЙ ШАГ — научимся создавать устройства, умеющие взаимодействовать друг с дру- гом. При этом мы затронем очень актуальную и перспективную в настоящее время тему: будем создавать устройства, которыми будем управлять дистанционно при помощи смартфона или план- шета. А в качестве канала связи мы будем использовать Wi-Fi.
18 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Представь себе электронный дверной замок, открываемый при помощи смартфона. Или систему «умный дом», управляю- щую отоплением, освещением, сигнализацией и т. п., которую можно контролировать со смартфона или планшета. Новичок: Еще один вариант—авто-, авиа- или судомодели суправ- лением по Wi-Fi. Но самые перспективные возможности открываются при подключении разрабатываемых вами устройств через Wi-Fi к Интернету, что позволяет управлять ими через всемирную сеть из любой точки мира. Тут уже можно говорить о новом уровне взаимо- действия между электронными устройствами. Совершенно верно! Для такого уровня взаимодействия воз- ник даже новый, модный ныне, термин: «Интернет вещей». В английской транскрипции это звучит как «Internet of Things», сокращенно IoT. Ты, наверное, уже встречал это сокращение в новостях или литературе. Новичок: Что же такое Интернет вещей? Для тех, кто слы- шит это словосочетание впервые, кажется, что тут какая-то проблема с падежами. Все просто. Есть Интернет людей — привычный для нас спо- соб общения людей посредством Интернета, а вот теперь поя- вился и постепенно развивается Интернет вещей. Интернет в обоих случаях конечно один и тот же. Речь идет о способе исполь- зования Интернета. Когда говорят «Интернет вещей», имеется в виду инженерные решения, в которых: ♦ два или несколько электронных устройств объединяются в единую интегрированную систему; ♦ в качестве канала связи между ними используется всемирная сеть Интернет. Разработчики подобных систем мечтают, что в недалеком будущем даже привычные для нас домашние приборы (телевизор, холодильник, пылесос и т. д.) будут подключены к сети Интернет. Новичок: Смею утверждать, что системы, которые можно отнести к категории «Интернет вещей» уже
О чем эта книга и для кого она написана 19 успешно работают, и многие с ними сталкивались в жизни. Правильно! Запусти хотя бы приложение «Яндекс транс- порт». Эта система работает в настоящее время во многих горо- дах России. С ее помощью можно: ♦ в режиме реального времени наблюдать на экране смартфо- на или планшета за движением транспорта в вашем городе; ♦ получать информацию, скоро ли придет ваш троллейбус или автобус. Новичок: Как такая система работает? На современных троллейбусах и автобусах устанавливаются GPS системы контроля местоположения. Такие системы решают несколько задач. В частности, GPS используется автоматом, объяв- ляющим остановки. Остановки объявляются голосом и при помощи бегущей строки. Автомат, объявляющий остановки, использует информацию о местоположении транспортного средства. Одновременно по Интернет-каналу данные о местонахожде- нии каждого автобуса и троллейбуса передаются на централь- ный сервер. Это позволяет мобильному приложению на осно- вании данных сервера отображать на карте ситуацию по движе- нию общественного транспорта в любом из городов, входящих в систему. При этом ваше мобильное устройство также получает информацию через Интернет. По принципу «Интернета вещей» работают: ♦ платежные терминалы, которые мы можем видеть сейчас по всему городу; ♦ терминалы расчета по банковским картам на кассах в ма- газинах. К системам, работающим по принципу «Интернет вещей» можно отнести автоматические камеры ГИБДД, контролирующие превышение скорости автотранспортом. А также интегрирован- ные системы видеонаблюдения и сигнализации, контролирую- щие сразу несколько площадок одной организации, территори- ально расположенных далеко друг от друга.
20 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Новичок: И всему этому мы научимся в этой книге? Все это наша перспектива, наша стратегическая цель. А эта книга для начинающих. Она для тех, кто делает первые шаги в области взаимодей- ствия электронных устройств по Wi-Fi и через Интернет. В качестве примера мы будем устанавливать связь между получившим в последнее время широкую популярность модулем ARDUINO и любым современным мобильным устройством, таким как смартфон или планшет. Новичок: А для тех, кто не смог приобрести и прочитать пре- дыдущие Ваши книги по основам работы с ARDUINO, давайте проведем небольшой ликбез. Чтобы начина- ющие радиолюбители смогли во всеоружии подойти к освоению основной части книги. Основная часть этой книги построена таким образом, чтобы материал был понятен не только тем, кто читал предыдущие книги. По ходу изложения материала раскрывается в достаточ- ной степени информация и по архетиктуре, и устройству модуля Ардуино, а также основные сведения по командам языка про- граммирования для Ардуино. Так что изучение книги не должно вызвать затруднений даже для тех, кто использует только эту книгу. Но если вы настаиваете, проведем небольшой курс с использованием материалов из пре- дыдущей книги. Те же читатели, которые прочитали предыдущие книги ([1], [2] и [3]), могут пропустить вводную главу.
ГЛАВА ВВОДНАЯ ARDUINO - ЭТО ОЧЕНЬ ПРОСТО Данная глава призвана напомнить читателю основные сведе- ния о модуле ARDUINO. Те читатели, кто приобрел и прочитал предыдущую книгу автора [1] или ее упрощенный вариант [3], могут пропустить данную главу Тем более, что в основной части книги в тех главах, в которых описывается работа с ARDUINO, повторно напоминаются все основные понятия и особенности архитектуры модуля, а при описании программ объясняется работа каждой команды.
22 Управление модулем ARDUINO по Wi-Fi с мобильных устройав |Кем создан и почему так назван модуль ARDUINO Новичок: А где был создан модуль ARDUINO? Модуль ARDUINO придумали пятеро друзей из маленького итальянского городка Ивреа, стоящего на реке Дора Балтея. Тебе знаком этот итальянский город? Новичок: Я читал об этом городе, расположенном в Северной Италии. Он был основан для защиты одного из тра- диционных торговых путей через северную часть Италии в Альпы, появился как пост римской армии. В IX веке Ивреа стала столицей одноименного франкского маркграфства. Из Иврейского дома происходили некоторые сред- невековые короли. В их числе и АРДУИН, правивший в Ивреа с 990 года в сане маркграфа, а с 1002 по 1015 года (правда, с пере- рывами) в сане короля. АРДУИН умер своей смертью в 1015 году. Итальянцы почи- тали короля как святого. Прах АРДУИНА покоится в стене кре- постной часовни костела Ди Мазино. Сегодня в городе Ивреа работает бар, названный в честь этого короля ДИ РЕ АРДУИНО. Стоит бар на том самом месте, где, по преданию, родился король АРДУИН. Бар принадлежит Массимо Банци (Massimo Banzi), итальянскому соучредителю уникального проекта в сфере электроники ARDUINO, который был назван в честь этого места. В этом баре собирались все создатели ARDUINO! Их звали так: Дэвид Куартиллье (David Cuartielles); Джанлука Мартино (Gianluka Martino); Том Иго (Tom Igoe); Дэвид Мелис (David Mellis); Массимо Банци (Massimo Banzi). Появился модуль ARDUINO в 2005 году. Эта компания из пяти единомышленников разработала учебное пособие для студен- тов Института проектирования взаимодействий города Ивреа. При помощи этого модуля студенты изучали микроэлектронику. Модуль получился настолько удачным, что моментально стал известен во всем мире!
Глава вводная. ARDUINO - это очень просто 23 Новичок: ARDUINO — недорогая микроконтроллерная плата, которая позволяет даже новичку делать по-настоящему удивительные вещи. Поэтому модуль ARDUINO стал таким популярным? Да, по этому. Модуль ARDUINO — это небольшая плата, собранная на микроконтроллере AVR, которая служит основой для создания любых электронных устройств управления, сигна- лизации и автоматики, которые могут применяться в самых раз- ных областях электронной техники. ПРИМЕЧАНИЕ. ARDUINO является отличной альтернативой для начинающих разработчиков благодаря тому, что в модуле использован ряд оригинальных решений упрощающих разработку как схем, так и программ. Как удалось избежать использования | программатора в ARDUINO II Важно отметить, что модуль ARDUINO не требует отдельного программатора и предоставляет разработчику простые средства обмена информацией с компьютером по последовательному USB каналу. ARDUINO оказался настолько удачной разработкой и получил настолько широкое распространение во всем мире, что теперь именно он считается самой удачной основой для изучения азов микроконтроллерной техники. Новичок: Давайте начинать знакомить читателей с модулем поближе. Давай поговорим обо всем по порядку! Прежде всего, раз- работчики ARDUINO решили упростить процесс прошивки про- грамм в программную память микроконтроллера. Традиционно, для прошивки микроконтроллеров использовались отдельные устройства — программаторы. Он подключался к компьютеру, а уже к программатору подключался микроконтроллер.
24 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Разработчики решили избавиться от такого вспомогатель- ного устройства, как программатор. Решение напрашивалось само собой. Большинство выпускаемых микроконтроллеров к тому времени уже имело такую полезную функцию, как возмож- ность самопрограммирования. Новичок: Как это реализовывалось? Программная память микроконтроллера разбивалась на две области соответствующими настройками (точнее установкой его битов конфигурации FUSE-переключателями): ♦ часть памяти выделялась под область загрузчика; ♦ оставшаяся же память использовалась для размещения туда основной рабочей программы. Новичок: А что такое область загрузчика? ЧТО ЕСТЬ ЧТО. 1 N Область загрузчика - это защищенная область программной памяти. Программный код, записан- ный в эту область, не может быть переписан само- программированием. Такая конфигурация программной памяти позволяла про- граммисту поместить в область загрузчика программу, которая в нужный момент, используя любые внешние каналы связи микро- контроллера, будет: ♦ получать извне коды нового варианта рабочей программы; ♦ прошивать эти коды в основную часть программной памяти. Новичок: Я понял! Программа-загрузчик разрабатывается самим программистом, и ее алгоритм зависит от его квалификации и фантазии! Абсолютно верно! В настоящее время технология самопро- граммирования широко используется в самых разных элек- тронных устройствах. Она позволяет заливать обновленные
Глава вводная. ARDUINO - это очень просто 25 версии программ, используя самые разные источники данных. Например, Интернет, компьютер и т. п. Первые варианты | модуля ARDUINO II Новичок: На какой базе построены модули ARDUINO? Самые первые варианты ARDUINO представляли собой плату, на которую был установлен микроконтроллер (использовались микроконтроллеры AVR) и элементы самой необходимой внеш- ней обвязки: ♦ цепи сброса; ♦ внешний кварцевый резонатор; ♦ стабилизатор напряжения; ♦ несколько светодиодов для индикации питания и сигналов канала связи. Новичок: А как связывались модули ARDUINO с ПК? С компьютером первые ARDUINO связывались при помощи последовательного порта. В микроконтроллере для этого исполь- зовался встроенный канал UART, а в компьютере — СОМ порт. ПРИМЕЧАНИЕ. Оба этих стандарта основаны на едином протоко- ле RS-232. Но UART отличается от СОМ уровнями сигнала. Последовательный канал в микроконтроллере работает с сиг- налом, принимающим два значения: О В и +5 В. В стандарте СОМ используются уровни плюс 12 В и минус 12 В. Поэтому на плате ARDUINO присутствовала схема преобразования уровней. На рис. В.1 изображен один из первых вариантов ARDUINO, использующих СОМ порт для связи с компьютером.
26 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. В.1. Модуль ARDUINO для СОМ порта ПРИМЕЧАНИЕ. Как известно, СОМ порты в настоящее время уже полностью вытеснены таким универсальным стандартом, как USB. Поэтому и ARDUINO при- шлось приспосабливаться. На платах ARDUINO появились микросхемы с адаптерами USB-COM. В одном из вариантов маленький модуль с преобразова- телем USB-COM выполнялся как отдельный модуль, который после загрузки и отладки программы в основную плату снимался и мог быть использован для отладки и прошивки в других разработках. В настоящее время все модели ARDUINO снабжены USB пор- тами. На сегодняшний день в мире разработано и производится большое количество самых различных моделей ARDUINO. На рис. В.2 изображена плата одного из вариантов модуля, который носит название «ARDUINO UNO». Это довольно удачная модель, которая получила довольно широкое распространение по всему миру, в том числе и в России. Ее мы и будем использовать в каче- стве примера для нашей книги.
Глава вводная. ARDUINO - это очень просто 27 Модуль II ARDUINO UNO II Новичок: Какие преимущества дает начинающему разработ- чику электронных устройств архитектура модуля ARDUINO? Для ответа на этот вопрос рассмотрим модель ARDUINO UNO. Существует несколько версий ARDUINO UNO. Они отличаются по: ♦ схеме; ♦ размещению некоторых деталей на плате; ♦ типу корпуса микросхем. Но все они полностью совместимы между собой и взаимоза- меняемы. На рис. В.2 показан внешний вид одного из вариантов ARDUINO UNO^ В основе этой модели модуля лежит микрокон- троллер ATmega328P. При этом существует две разновидности: ♦ вариант на микросхеме в DIP корпусе (как раз его мы видим на рис. В.2); ♦ вариант на микросхемах в SMD корпусе. Разные модели также отличаются типом преобразователя USB-COM: Рис. В.2. Модуль ARDUINO UNO
28 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ в одних вариантах используется специализированная микро- схема CH340G; ♦ в других же (как на рис. В.2) в качестве преобразователя ис- пользуется микроконтроллер Atmegal6U2 с соответствующей программой, зашитой в ее программную память. Новичок: А какие параметры в модуле всегда остаются неиз- менными? Во-первых, это установочные и габаритные размеры модуля. Во-вторых, расположение и функциональное назначение всех его выводов. Выводы ARDUINO UNO выполнены в виде разъемов, выстро- енных в две цепочки гнезд, расположенные по краям платы. К таким разъемам удобно подключать внешние элементы. При желании, например, светодиод можно просто вставить в нужные гнезда разъема. На своих строго определенных местах установлены: ♦ разъем внешнего питания; ♦ разъем USB. Чаще всего в модулях ARDUINO (в том числе и в ARDUINO UNO) используются аппаратные USB розетки, такие же, какие используются в современных принтерах. Поэтому для подклю- чения модуля ARDUINO к компьютеру можно использовать USB кабель от принтера. Кроме разъемов всегда находятся на стандартных местах сле- дующие элементы: ♦ кнопка сброса (RESET); ♦ светодиоды, предназначенные для индикации. Новичок: Расскажите о назначении светодиодов, расположен- ных на модуле ARDUINO. На плате ARDUINO UNO имеется четыре светодиода. Светодиод индикации питания загорается всегда, когда на шине питания модуля появляется напряжение +5 В. Напряжение может поступать как от порта USB, так и от разъема внешнего питания. Два светодиода (второй и третий) подключены параллельно линиям внутреннего СОМ порта, то есть к линиям, идущим от пре- образователя USB-COM к основному микроконтроллеру модуля:
Глава вводная. ARDUINO - это очень просто 29 ♦ один из этих светодиодов индицирует процесс передачи ин- формации от компьютера в модуль ARDUINO; ♦ второй светодиод индицирует процесс передачи информа- ции от микроконтроллера в компьютер. Четвертый светодиод подключен к выводу РВ5 порта РВ основного микроконтроллера ATmega323 и предназначен для использования программистом по своему усмотрению. Полезные упрощения | в модуле II Как уже говорилось выше, главным преимуществом проекта ARDUINO является его простота в понимании и использовании. Для того чтобы работа с ARDUINO стала доступнее, авторами был придуман целый ряд упрощений. И одно из них — сквозная нумерация линий ввода-вывода. Так, все цифровые контакты объединены в одну общую группу и пронумерованы, как контакт 0, контакт 1 и так далее до кон- такт 13 (см. рис. В.2). ПРИМЕЧАНИЕ. На самом деле к контактам 0...7подключены разря- ды D0...D7 порта PD микроконтроллера, а к контак- там 8...13 - разряды В0...В5 порта РВ. Однако на языке программирования, который используется для создания программ в модуле ARDUINO, обращение к любому цифровому контакту производится по его номеру. ПРИМЕР. Для чтения входного уровня сигнала на цифро- вом контакте используется команда digitalkead (НомерКонтакта), например: а = digitalRead(O); b = digitalRead(13).
30 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Вывод уровней на любой цифровой контакт тоже очень прост. Для перевода контакта в режим вывода информации использу- ется команда: pinMode (НомерКонтакта, OUTPUT); Второй параметр этой функции имеет значение OUTPUT. Служебное слово OUTPUT настраивает контакт на вывод инфор- мации. Затем, для вывода на контакт нужного цифрового уровня, используется команда: digitalWrite (НомерКонтакта, Значение); Параметр «Значение» может принимать величину: ♦ или HIGH (высокий логический уровень); ♦ или LOW (низкий логический уровень). ПРИМЕЧАНИЕ. Также можно задавать значение и в цифровом виде: 1 или 0. I Группа аналоговых входов Кроме группы цифровых контактов («пинов») в ARDUINO имеется группа так называемых аналоговых входов. Это шесть контактов, расположенных на противоположном «борту» модуля. В ARDUINO аналоговые входы называются АО, А1,... А5 (рис. В.2). ПРИМЕЧАНИЕ. На самом деле аналоговыми эти входы можно на- звать условно. В качестве аналоговых входов ис- пользуются разряды РС0...РС5 порта PC микрокон- троллера. То есть, это обычные разряды порта, которые могут служить и цифровыми входами, и цифровыми выходами.
Глава вводная. ARDUINO - это очень просто 31 Но альтернативной функцией именно этих шести выводов микроконтроллера ATmega328P является то, что они могут служить входами внутреннего АЦП. Для упрощения эти входы объявлены аналоговыми. И это в ARDUINO основной режим их работы. В языке программирования ARDUINO для того, чтобы про- читать уровень аналогового сигнала с любого аналогового входа, нужно всего лишь дать одну простую команду: analogRead(); Например, следующая строка программы прочитает уровень аналогового сигнала с входа АО: с = analogRead (АО); Очевидно, что любой аналоговый вход всегда можно исполь- зовать как цифровой вход или выход. Это позволяет архитектура микроконтроллера. Новичок: В языке ARDUINO учитывается и эта возможность? Да! На этот случай выводы А0...А5 имеют альтернативную нумерацию. В командах цифрового ввода и цифрового вывода к ним можно обращаться как к контактам 14... 19. Например, ты можешь прочитать цифровой уровень (HIGH или LOW) с «анало- гового входа» АО командой: d = digitalRead(14); Команда | аналогового вывода II Еще одной интересной находкой, упрощающей программи- рование на языке ARDUINO, является команда аналогового вывода. Выглядит эта команда следующим образом: analogWrite (НомерКонтакта, Значение); Несмотря на то, что команда выводит некий уровень, называ- емый аналоговым, выводимый этой командой сигнал не совсем аналоговый. И выводить «аналоговый сигнал» можно как раз только на цифровые выводы, и то не на все.
32 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Дело в том, что «аналоговый» сигнал выводит- ся при помощи широтно-импульсной модуляции (ШИМ). На плате ARDUINO контакты, при помощи которых можно производить «аналоговый» вывод информации, обозначены значком «-». Это тоже связано с архитектурой микроконтроллера ATmega328P. ПРИМЕЧАНИЕ. Подобный «аналоговый» вывод возможен только на те разряды портов ввода/вывода, которые поддер- живают ШИМ. Поэтому параметр НомерКонтакта в модуле ARDUINO UNO может принимать только следующие значения 3,5,6,9,10,11. В более ранних версиях аналоговый выход был возможен только на контактах 9,10,11. Параметр «Значение» может лежать в диапазоне 0...255. Как уже говорилось, команда analogWrite() вызывает на выходе «НомерКонтакта» появление прямоугольных импульсов. Частота импульсов приблизительно равна 490 герц. Длительность зависит от параметра ЗНАЧЕНИЕ. Новичок: Получается, что чем больше значение, тем больше длительность импульса? Да, именно так. Кроме того, при крайних значениях импульсы исчезают. Если ЗНАЧЕНИЕ = 0, импульсы прекращаются (импульсы нулевой длины), и на выходе устанавливается логический ноль. Если ЗНАЧЕНИЕ = 255, то ширина импульсов становится равной их периоду. Поэтому импульсов также не будет, и на выходе уста- новится постоянное значение логической единицы.
Глава вводная. ARDUINO — это очень просто 33 Контакты питания II POWER I Кроме вышеописанных контактов, на плате ARDUINO есть группа контактов под общим названием POWER (питание). Сюда выведены: ♦ шина питания +5 В; ♦ опорное напряжение 3,3 В; ♦ контакт общего провода; ♦ сигнал сброса. Так как большинство контактов модуля ARDUINO напря- мую подключены каждый к своему выводу микроконтроллера ATmega328P, для каждого из контактов модуля дублируются все альтернативные функции, характерные для соответствующего вывода микроконтроллера. Поддерживаемые | языки программирования II Новичок: А какие языки программирования поддерживает ARDUINO? Разработчики предусмотрели возможность при необходимо- сти использовать все возможности микроконтроллера. Для этого, кроме специализированного языка программирования ARDUINO, модуль поддерживает и классический язык C++. Для тех, кто изу- чил язык СИ, не составит труда перейти на язык C++ ARDUINO. Эти языки очень похожи. На рис. В.З изображена схема распиновки модуля ARDUINO UNO, где для каждого контакта указаны все поддерживаемые им функции. Это поможет нам в дальнейшем разобраться с дополни- тельными функциями каждого контакта.
34 Управление модулем ARDUINO no Wi-Fi с мобильных устройств и о I I I I I I т Yfi ТТГПТТ I I I I I I I I I I I I I 1 i i I сз и\ s I ?????? I I I I I I I I I I I I' I I 1 I I I I I <
Глава вводная. ARDUINO - это очень просто 35 Среда разработки I IDE II Новичок: Для чего нужно специальное приложение «Среда раз- работки ARDUINO IDE»? Специальное приложение для компьютера, которое называ- ется «Среда разработки ARDUINO IDE», позволяет: ♦ составлять программы для ARDUINO; ♦ сохранять программы на компьютере; ♦ транслировать и загружать программы в программную па- мять модуля. ПРИМЕЧАНИЕ. Это приложение полностью бесплатно, и его можно свободно скачать с сайта разработчика (https://www.arduinoxc). Существуют версии для всех основных операционных систем (Windows, Mac X, Linux). Среда разработки включает в себя специализированный тек- стовый редактор, при помощи которого вы можете писать про- граммы для ARDUINO. Для написания программ используется специальная версия языка программирования, которую мы будем называть далее «Язык ARDUINO». ЧТО ЕСТЬ ЧТО. Программа, написанная на этом языке в среде IDE, называется Скетч и записывается на жест- кий диск компьютера в виде файла с расширени- ем то. Программа может состоять из нескольких файлов ino, состав- ляющих проект. Один из файлов проекта считается главным.
36 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ВНИМАНИЕ. Все файлы проекта (даже если в проекте один файл) должны размещаться в отдельной директо- рии, имя которой должно совпадать с именем глав- ного файла проекта. I Команды и функции языка ARDUINO Мы уже познакомились с несколькими командами и функ- циями языка ARDUINO. Простота обучения и использования ARDUINO в значительной степени обусловлена эффективностью его языка программирования. Язык ARDUINO является клоном языка СИ, и его синтаксис максимально приближен к синтаксису этого популярного языка программирования. СОВЕТ. В том случае, когда при программировании вам не хватает набора команд языка ARDUINO, вы можете использовать команды языка C++. При трансляции разработанной вами программы, созданной в среде разработки AJIDUINO, создается машинный код, который, кроме команд заложенных программистом, содержит ряд систем- ных процедур. Одна из таких процедур — внутренние системные часы. При запуске на ARDUINO любой вашей программы параллельно запу- скаются эти часы. Они работают все время, пока работает ваша программа, и постоянно отсчитывают количество миллисекунд, прошедших с момента запуска программы. Для этого используется системный таймер 0 микроконтрол- лера и прерывание по переполнению этого таймера. Этот таймер используется, например, для работы функций millis() или micros(), возвращающих значение счетчика вре- мени в миллисекундах и в микросекундах, соответственно.
Глава вводная. ARDUI NO - это очень просто 37 Кроме системного таймера, программа на ARDUINO органи- зует еще несколько вспомогательных процессов. Например, ТАЙМЕР 1 микроконтроллера используется для команд аналогового вывода на контакты 3,5,6, а ТАЙМЕР 2 — для аналогового вывода на контакты 9,10,11 и для формирования зву- ковых сигналов. Для этого таймеры переводятся в режим ШИМ. Некоторые ресурсы микроконтроллера система програм- мирования самостоятельно использует для своих системных нужд. Поэтому программист, создающий программы на языке ARDUINO, уже не может распоряжаться ресурсами микроконтрол- лера так же свободно, как он может это делать в программах на классическом языке СИ. Зато такое решение облегчает програм- мирование для начинающих программистов. Язык ARDUINO позволяет не утруждать себя подробным изу- чением всех сложных режимов работы таймеров, прерываний, выбором нужных режимов, определением того, какие коды и в какие системные регистры записать для того, чтобы правильно выбрать нужный режим. Язык ARDUINO все это делает сам. ПРИМЕЧАНИЕ. Главный минус подобного решения состоит в том, что это сужает гибкость готовой программы. Допуская вольное использование ресурсов нужно всегда пом- нить, что тем самым вы мешаете языку ARDUINO выполнять те либо иные команды. Например, используя самостоятельно для своих нужд ТАЙМЕР 1, вы уже не сможете осуществлять аналоговый вывод для контактов 3,5,6. Внешние | библиотеки II Набор стандартных команд ARDUINO можно существенно расширить применением внешних библиотек. Пакет среды разра-
38 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ботки ARDUINO имеет довольно большой набор внешних библио- тек для самых различных задач. ПРИМЕР. Существует Библиотека для работы с внутренней долговременной памятью данных, или библиотека для работы с последовательным каналом CPI. Есть библиотека для работы с Ethernet, Wi-Fi, GSM, внеш- ним SD модулем памяти и многое другое. СОВЕТ. Если нужная библиотека отсутствует в стан- дартном пакете среды разработки, можно ис- пользовать библиотеку сторонних разработчиков. Огромное количество таких библиотек доступны для свободного скачивания из сети Интернет. Например, существует библиотека, позволяющая использо- вать прерывания по таймеру. Набор внешних библиотек в про- екте ARDUINO просто огромен. Совместными усилиями разра- ботчиков и энтузиастов проекта разработаны библиотеки на все случаи жизни. После присоединения к программе нужной библиотеки в рас- поряжении пользователя появляется набор новых функций, кото- рые дают новые нужные вам возможности. Новичок: Понял, можно самостоятельно разработать свою собственную библиотеку и применять ее в своих программах. Круто! А как скачать программный пакет с сайта разработчика? Для установки среды программирования ARDUINO на ваш компьютер нужно сначала скачать программный пакет с сайта разработчика (arduino.cc). Сайт англоязычный. Его удобно про- сматривать при помощи браузера с переводчиком. Например, в Яндекс-браузере.
Глава вводная. ARDUI NO - это очень просто 39 Находясь на сайте, выбери в главном меню пункт Software (Программное обеспечение). На открывшейся по этой ссылке странице ты увидишь раздел «Download the ARDUINO IDE» (Скачать ARDUINO IDE). Справа от описания последней версии в синем прямоуголь- нике вы увидите набор ссылок на разные варианты пакета для разных операционных систем. Варианты установочных пакетов | для Windows II Для Windows, например, на сайте имеется три варианта уста- новочных пакетов. Вариант №1. Windows Installer — пакет с инсталлятором. Представляет собой исполняемую программу (с расширением .ехе). При запуске инсталлятора он сам автоматически устанав- ливает все компоненты на ваш компьютер. В том числе и драйвер USB интерфейса для платы ARDUINO. Вариант №2. Windows ZIP file for non admin install — цакет в виде ZIP архива. В архиве находится папка с именем «arduino- х.х.х», где х.х.х — это номер версии программного пакета. Папка содержит все файлы, составляющие пакет среды разра- ботки IDE. Для установки среды вам нужно извлечь папку со всем ее содержимым из ZIP-архива и поместить в любом удобном для вас месте на жестком диске вашего компьютера. После этого придется вручную установить драйвер USB интер- фейса. Для этого ты просто подключаешь модуль ARDUINO к USB порту компьютера. Компьютер обнаружит USB устройство и попытается установить драйвер самостоятельно. Ему это не удастся, и он выведет на дисплей стандартное окно, сообщающее, что драйвер установить не удалось. В этом окне нужно: ♦ выбрать команду «Установить драйвер с известного устройства»; ♦ выбрать и указать файл драйвера и нажать кнопку «Устано- вить».
40 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Драйвер вы найдете в папке «arduino-x.x.x» в под- папке «drivers». Там вы увидите несколько вариан- тов драйвера. Выберите тот, который подходит для вашей системы. Программа установки «увидит» только тот вари- ант, который подходит для вашего случая. Вариант №3. Windows app Get — версия для Windows 10. Эта версия также выполнена в виде ZIP-архива и устанавливается аналогично предыдущей. I Запуск программы После установки драйверов запустите программу. Если ты использовал для установки ZIP-архив, то на рабочем столе у тебя будет отсутствовать иконка для запуска программы. В этом случае ты должен знать, что запускать нужно файл arduino.exe в папке arduino-x.x.x. СОВЕТ. Для удобства дальнейшей работы рекомендуется самостоятельно создать иконку для запуска этой программы на рабочем столе. Для этого проще всего сначала щелкнуть правой кнопкой мышки по файлу программы (arduino.exe) и выбрать пункт меню «Копировать». А затем щелкнуть правой кнопкой мыши в любом месте рабочего стола и выбрать пункт «Вставить ярлык».
Глава вводная. ARDUINO - это очень просто 41 Основное окно | среды разработки II После запуска программы откроется основное окно среды раз- работки (см. рис. В.4). Основное окно имеет два встроенных окна: ♦ строка меню; ♦ панель инструментов. В центре основного окна программы находится окно редак- тора для написания текста программ. Текст программы пишется на белом фоне. Редактор имеет подсветку синтаксиса. Поэтому разные эле- менты текста автоматически раскрашиваются разными цветами. Например, выделяются элементы текста такими цветами: ♦ управляющие слова языка программирования — красным; ♦ зарезервированные константы — голубым; ♦ тексты примечаний — серым; ♦ основной текст программы — темно-синим. Примеры для книги Белова Александра Пример 1 Простейшая программа Включение и выключение светодиода (LED), подключенного к цифровому контакту 8, при нажатии на кнопку, подключенную к контакту 2. Схема: * Последовательное соединение светодиода и резистора 270 Ом подключается между выв« * Кнопка подключается между контактом 2 и общим проводом */ Рис. В.4. Основное окно среды разработки IDE
42 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Как уже говорилось, файл с текстом программы называется «скетч». Сразу под окном редактора программ находится другое узкое окошко, предназначенное для вывода системных сообщений. Сюда выводятся сообщения при трансляции программы и записи ее в модуль ARDUINO. Сюда же выводятся все сообщения об ошибках. Сообщения в этом окне выводятся белым цветом на черном фоне. Сообщения об ошибках выделяются красным. В верхней части окна системных сообщений можно видеть поле заголовка. ПРИМЕЧАНИЕ. В обычном состоянии поле заголовка голубого цвета. В поле заголовка в процессе работы выводится сообщение о текущем режиме работы IDE (проверка, трансляция, загрузка и т. д.). ВНИМАНИЕ. Если процесс трансляции программы закончится ошибкой, то поле заголовка становится желтым. В нем появляется сообщение о том, что произошла ошибка, а также появится кнопка, при помощи ко- торой вы можете распечатать все содержимое из окна системных сообщений на принтере. Содержимое окна будут содержать как сообщения, обычно выводимые при трансляции, так и все сообщения об ошибках. Полный текст сообщений значительно больше, чем то, что вы видите в окне сообщений. Весь текст вы можете просмотреть также, пролистав это окно при помощи полосы прокрутки. В самой верхней части основного окна среды разработки рас- положено главное меню программы. При помощи этого меню можно производить все операции управления средой IDE.
Глава вводная. ARDUI NO - это очень просто 43 Панель II инструментов II Сразу под строкой основного меню расположена панель инструментов. На этой панели расположено несколько иконок, которые дублируют самые важные функции основного меню. При наведении курсора мыши на любую из этих иконок, справа сразу за последней иконкой появляется подсказка с пояснением функ- ции, на которую указывает мышь. В табл. В.1 приведено назначе- ние всех элементов панели управления. Назначение элементов панели инструментов Таблица ВЛ Иконка ! ■■!«• Название Проверить Загрузить Новый Открыть Сохранить Монитор порта Команда меню Скетч/Проверить Скетч/Загрузить Файл/Новый Файл/Открыть Файл/Сохранить Инструменты/ Монитор порта Описание Проверка синтаксиса программы Загрузка программы в память модуля ARDUINO Создание нового файла программы (новый скетч) Открыть файл программы (скетч) Записать файл программы (скетч) на диск Открыть окно монитора порта Выбор номера СОМ порта I в настройках программы I Прежде чем начать работу в среде разработки, нужно пра- вильно выбрать номер СОМ порта в настройках программы.
44 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Драйвер USB модуля ARDUINO работает в режиме эмуляции СОМ порта. При установке драйвера он создает в списке устройств компьютера вирту- альный СОМ порт. Номер создаваемого порта вы- бирается автоматически в процессе установки. В зависимости от конфигурации системы номер может быть разный. По умолчанию среда разработки настроена на порт СОМ1. Для того чтобы узнать правильный номер порта, нужно открыть диспетчер устройств Windows (Компьютер/Свойства/ Диспетчер устройств). Откроется окно диспетчера (рис. В.5). В списке устройств откройте ветку «Порты СОМ и LPT». Среди СОМ портов должен появиться порт ARDUINO. На рис. В.5 я обвел эту запись серой линией. Рис. В.5. Порт ARDUINO в окне диспетчера устройств
Глава вводная. ARDUINO - это очень просто 45 ВНИМАНИЕ. Учти, что порт в этом списке виден только при подключенном к компьютеру модуле ARDUINO. При отключении ARDUINO порт в окне диспетчера ис- чезает. Запомни номер СОМ порта. Затем зайди в настройки среды разработки: меню «Инструменты/Порт». При выборе этого пункта меню ты увидишь список всех имеющихся в вашем компьютере последовательных портов. Выберите нужный порт из списка. Выбор типа используемой | платы ARDUINO II Кроме номера порта, нужно выбрать тип твоей платы ARDUINO. Для этого выбери пункт меню «Инструменты/Плата». Появится список всех поддерживаемых плат. Выбери из списка свою плату. Например, «ARDUINO Uno». После того как ты выберешь порт и плату, в самой нижней части окна среды разработки (в строке состояния основного окна) увидишь надпись: «ARDUINO/Genuino Uno на СОМ1». Теперь все готово к работе. ЧТО ЕСТЬ ЧТО. GENUINO - это проект, аналогичный ARDUINO. Он разработан другим производителем, но эти два про- екта совместимы на уровне среды разработки IDE.
46 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Скетч: открытие, сохранение, загрузка Новичок: А какой файл загружается при очередном запуске среды разработки? При каждом последующем запуске среды разработки в окно редактора программ загружается последний редактируемый при предыдущем запуске программы скетч. Если среда разра- ботки запускается впервые, в окне редактора программ создается новый пустой не именованный скетч. ПРИМЕЧАНИЕ. После написания или редактирования текста про- граммы скетч можно записать на жесткий диск при помощи команды меню «Файл/Сохранить» или «Файл/Сохранить как». Прочитать уже записанный файл можно при помощи команды «Файл/Открыть». Когда программа написана, ее можно оттранслировать и загрузить в память модуля ARDUINO. Для этого нужно просто выбрать пункт меню «Скетч/Загрузка» или щелкнуть по соответ- ствующей иконке на панели инструментов. При выборе команды ЗАГРУЗКА скетч сначала записывается на жесткий диск, затем начнется процесс проверки и трансляции программы. По окончании транслирования среда IDE сразу же начинает передавать оттранслированную программу в модуль ARDUINO посредством USB интерфейса. ПРИМЕЧАНИЕ. При этом модуль ARDUINO должен быть подключен 1 к компьютеру и готов к работе. I Процесс трансляции идет достаточно продолжительное время. Если все пройдет нормально, то по окончании трансляции
Глава вводная. ARDUINO - это очень просто 47 и загрузки в заголовке окна системных сообщений вы увидите надпись: «Загрузка окончена». А в самом окне увидишь сообщение о результатах трансляции. ВНИМАНИЕ. При заливке программ из компьютера в модуль ARDUINO используются цепи, связанные с цифровы- ми контактами 0 и 1. Поэтому в момент загрузки на эти контакты нельзя подавать никакие сигна- лы, нельзя замыкать их или как-то по-другому ме- шать прохождению сигналов. СОВЕТ. [ Лучше всего, по возможности, вообще не использо- вать цифровые контакты 0 и 1. Сразу после загрузки программы в модуль ARDUINO она автоматически начинает выполняться. При этом выполнение программы тут же прекращается, как только вы начнете новый процесс заливки программы из компьютера в модуль. Главное не забывать, что цифровые контакты 0 и 1 модуля не должны быть заблокированы. Организация обмена информацией 1 между программой на ARDUINO и компьютером II Удобной особенностью ARDUINO является простой спо- соб организации обмена информацией между программой на ARDUINO и компьютером с использованием USB интерфейса. Ряд несложных команд позволяют нашей программе переда- вать результаты своей работы в компьютер и принимать данные из компьютера. При этом среда разработки IDE имеет специаль-
48 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ные средства для того, чтобы принимать и отображать информа- цию, поступающую по каналу USB от модуля ARDUINO, а также, наоборот, передавать данные в ARDUINO. Эти средства называются «Монитор порта» и «Плоттер по последовательному соединению». Рассмотрим работу этих двух функций среды IDE по порядку. МОНИТОР ПОРТА. Отображает поступающие через USB порт данные в текстовом виде. Запускается монитор из меню «Инструменты/Монитор порта» или при помощи соответствую- щей иконки на панели инструментов. После запуска монитора открывается специальное окно. В окне два поля. Верхнее поле — узкое в одну строку. В него вы можете ввести с клавиатуры данные для передачи в модуль ARDUINO. В конце этого поля имеется кнопка ОТПРАВИТЬ. При нажатии на эту кнопку все набранные данные отправляются по каналу USB. ПРИМЕЧАНИЕ. Разработанная нами программа, работающая в мо- дуле ARDUINO, должна принять эти данные и обра- ботать так, как ты задумал. Второе большое поле в окне монитора порта сразу после запуска монитора работает на прием данных. Все поступившие от модуля ARDUINO данные сразу же отображаются на экране. Монитор порта предполагает, что передаваемые и принимаемые данные — это символьные строки. ПЛОТТЕР ПО ПОСЛЕДОВАТЕЛЬНОМУ СОЕДИНЕНИЮ. Плоттер вызывается аналогично монитору при помощи команды меню: «Инструменты/ Плоттер по последовательному соединению». Окно плоттера похоже на окно монитора, но в нем имеется только одно большое поле. И это поле отображает поступающие из ARDUINO no USB порту данные в графическом виде.
Глава вводная. ARDUINO - это очень просто 49 ПРИМЕЧАНИЕ. МОНИТОРПОРТАиПЛОТТЕРПО ПОСЛЕДОВАТЕЛЬНОМУ СОЕДИНЕНИЮ предназначены лишь для отладки ал- горитмов передачи и приема данных. Для практического применения нам придется разработать специализированные программы для компьютера, которые будут работать в паре с программами, загруженными в модуль ARDUINO. Это позволит, например, создавать на ARDUINO систему сбора информации с разных датчиков (один из вариан- тов — пункт метеонаблюдения), и передавать эту информацию в компьютер. А компьютер сможет обрабатывать и систематизиро- вать полученные данные. ПРИМЕЧАНИЕ. В среде разработок IDE можно создать только ту часть программного пакета, которая будет рабо- тать в самом модуле ARDUINO. Приложение для компьютера нам придется создавать при помощи других систем программирования. Рассмотрение этого вопроса не входит в задачу данной книги. Подводим итоги II и готовимся читать новую главу II Новичок: Материалы предыдущей книги мы вспомнили. Пора приступать к основному повествованию. Проект ARDUINO в настоящее время получил широкое распро- странение и развитие. Современная промышленность выпускает не только большое количество разных модификаций ARDUINO, но и множество дополнительных плат расширения для него, реа- лизующих самые разные дополнительные функции.
50 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Среди прочего выпускаются также и модули расширения для создания соединений по Wi-Fi. ПРИМЕЧАНИЕ. Самой удачной разработкой в этой области в на- стоящий момент считаются устройства на ос- нове микросхемы ESP8266EX китайской фирмы Espressif. Существует множество модулей, выпол- ненных на основе этой микросхемы. Но особой по- пулярностью пользуется линейка модулей компа- нии Al-Thinker. Компания AI-Thinker также родом из Китая. Родо- начальником этой линейки стал модуль ESP-01. Он имеет удоб- ную конструкцию, но использует далеко не все возможности микросхемы ESP8266EX. Модификации модуля получили назва- ния ESP-02, ESP-03 и так далее... до ESP-13. ПРИМЕЧАНИЕ. Именно эту линейку модулей мы будем изучать далее. Мы научимся использовать данные модули как в качестве внешних Wi-Fi адаптеров для модуля ARDUINO, так и в качестве самостоятельного контроллера, работающего уже без ARDUINO. Микросхема ESP8266EX представляет собой полноценный и достаточно мощный микроконтроллер, способный справляться с широким кругом задач. Поэтому используя всего лишь один модуль (любой из линейки ESP-01...ESP-13), можно собрать пол- ноценное электронное устройство с Wi-Fi интерфейсом, управля- ющее различными внешними нагрузками.
ГЛАВА 1 МИКРОСХЕМА ESP8266EX Производитель микросхемы ESP8266EX - китайская фирма Espressif.MaHHafl микросхема получила широкое распростране- ние благодаря своей невысокой стоимости. Не смотря на это, микросхема представляет собой полноценный микроконтрол- лер с широким набором свойств, достаточно мощными вычис- лительными возможностями. Она может самостоятельно выполнять достаточно обширный круг задач. Единственным недостатком микросхемы ESP8266EX можно считать отсут- ствие встроенной памяти программ. Микросхема рассчитана на использование внешней Flash- памяти для хранения управляющей программы. Внешняя память подключается по SPI интерфейсу. Микросхема рассчитана на частоту тактового генера- тора 80 МГц с возможностью разгона до 160 МГц. Правда, ста- бильная работа с увеличением частоты не гарантирована. На кристалле кроме основного процессора также расположена подсистема Wi-Fi работающая в стандарте IEEE 802.11 b/g/n. Поддерживается стандарты шифрования WEP и WPA/WPA2.
52 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 1.1. Знакомство с микроконтроллером ESP8266EX I Стандартные интерфейсы Микроконтроллер имеет 17 линий ввода-вывода. Так же, как и в любом другом контроллере, каждый контакт линии ввода- вывода имеет альтернативные функции. Ряд контактов в качестве альтернативных функций реализуют следующие стандартные интерфейсы: SPI, I2S, I2C, UART, Ю-bit АЦП. ПРИМЕЧАНИЕ. Интерфейс PC реализован программно, с использо- ванием метода bit-banging (программная реализа- ция протокола путем манипуляций с битами линий ввода-вывода). E5PRE55IF Рис. 1.1. Логотип фирмы Espressif Рис. 1.2. Внешний вид микросхемы ESP8266EX
Глава 1. Микросхема ESP8266EX 53 Характеристики | микросхемы II Ток потребления микросхемы ESP8266EX составляет: ♦ в режиме передачи — до 215 мА; ♦ в режиме приема — до 100 мА; ♦ в режиме ожидания — до 70 мА. Поддерживаются три режима пониженного потребления, все без сохранения соединения по Wi-Fi: ♦ Modem sleep (режим сна для модема) — до 15 мА; ♦ Light sleep (режим легкого сна) — до 0,4 мА; ♦ Deep sleep (режим глубокого сна) — до 15 мкА. Назначение | выводов микросхемы II Микроконтроллер ESP8266EX выполнен в QFN корпусе, квадратной формы, размером 5х5 мм. Микросхема имеет 32 пла- нарных вывода (на каждой из четырех сторон корпуса по 8 выво- дов). Планарные выводы расположены под микросхемой. Еще один вывод (GND — общий провод) выполнен в виде пло- щадки, расположенной посредине нижней стороны корпуса. Она занимает пространство между планарными выводами. То есть всего микросхема суммарно имеет 33 вывода. Назначение выводов микросхемы ESP8266EX приведены в табл. 1.1. ПРИМЕЧАНИЕ. Условно все выводы можно разделить на три ос- новных типа плюс один синтетический. В табл. 1.1 тип вывода обозначен в колонке «Тип»: Р - выводы питания; I - информационный вход; О - информационный выход; I/O - вход/выход. Каждый контакт микросхемы может иметь одну или несколько функций. В графе «Наименование контакта»
54 Управление модулем ARDUINO по Wi-Fi с мобильных устройств табл. 1.1 указано название основной или дополнительной функ- ции каждого вывода микросхемы. В графе «Назначение» расшифровано назначение каждого контакта. Для наглядности приводим два рисунка, на которых показано взаиморасположение выводов на корпусе микросхемы: ♦ на рис. 1.3 показано размещение всех контактов; ♦ на рис. 1.4 отдельно показано расположение линий ввода/вы- вода. GND - контакт в виде площадки снизу VDDA § LNA VDD3P3 VDD3P3 VDD_RTC TOUT CHIP EN XPDJ)CDC ESP8266EX SDJQATAJ SD_DATAJ> SD_CLK SD_CMD SD_DATA_3 SD_DATA_2 VDDPST 24 22 21 2<L JJL 17 О H C4| COl «<J-| Рис. 1.З. Распиновка выводов микросхемы ESP8266EX й|й[ CO r~ о о ESP8266EX GPIO16^ см со in GPIO5 GPIO8 GP1O7 GPIO6 GPIO11 GPIO10 GPIO9 24 23 22 21 20 19 18 17 О -г- CM CO Рис. 1.4. Размещение линий ввода/вывода микроконтроллера ESP8266EX
Глава 1. Микросхема ESP8266EX 55 Назначение выводов микросхемы ESP8266EX Таблица 1.1 Номер контакта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Линии ввода/ вывода GPI016 GPI014 GPI012 GPI013 GPI015 GPI02 GPIO0 GPI04 Наименование контакта VDDA LNA VDD3P3 VDD3P3 VDD.RTC TOUT CHIP_PU XPD.DCDC MTMS MTDI VDDPST MTCK MTDO GPI02 GPIOO GPI04 Тип P I/O P P P 1 1 I/O I/O I/O p I/O I/O I/O I/O I/O Назначение, альтернативная функция Питание аналоговой части 2,5 ~ 3,6 В Антенный интерфейс. Комплексное сопротивление ВЧ=39 + J6 Q. Необходимо обеспечить согласование ПИ-типа, соответствующего антенне Питание усилителя 2,5 ~ 3,6 В Питание усилителя 2,5 - 3,6 В Питание часов реального времени Вход АЦП. Он может быть использован для проверки напряжения на выводах VDD3P3 (контакты 3 и 4) и входного напряжения питания на TOUT (контакт 6). Однако эти две функции нельзя использовать одновременно Включение микросхемы. Высокий уровень: микросхема работает. Низкий уровень: режим сна Вход пробуждения из глубокого сна (необходимо подключение к EXT_RSTB) HSPI.CLK HSPI.MISO Питание цифроинтерфейса ШИМ- выходов (1,8 - 3,6 В) HSPI_MOSI; UARTO.CTS HSPI.CS; UARTO_RTS UARTTx в режиме быстрого программирования SPI_CS2 -
56 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Таблица 1.1 (продолжение) Номер контакта 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Линии ввода/ вывода GPI09 GPI010 GPI011 GPI06 GPIO7 GPI08 GPI05 GPI03 GPI01 Наименование контакта VDDPST SDIO_DATA_2 SDIO_DATA_3 SDIO.CMD SDIO.CLK SDIO_DATA_0 SDIO_DATA_1 GPIO5 UORXD UOTXD XTAL_OUT XTALJN VDDD VDDA RES12K EXT_RSTB Тип P I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O p p 1 1 Назначение, альтернативная функция Питание цифровых входов- выходов (1,8 - 3,6 В) Подключается к SD D2 (через резистор 200 Q); SPIHD; HSPIHD Подключается к SD D3 (через резистор 200 Q); SPIWP; HSPIWP Подключается к SD_CMD (через резистор 200 Q); SPI_CSO Подключается к SD CLK (через резистор 200 Q); SPI_CLK Подключается к SD DO (через резистор 200 Q); SPI_MISO Подключается к SD DO (через резистор 200 Q); SPI_MOSI - UART Rx при программировании flash; UARTTx при программировании flash; Выход на внешний кварцевый резонатор; Вход внешнего тактового сигнала Вход с внешнего кварцевого резонатора Питание аналоговой части 2,5 - 3,6 В Питание аналоговой части 2,5 - 3,6 В Через резистор 12 кОм подключается к общему проводу Внешний сигнал сброса (низкий логический уровень: микросхема активна)
Глава 1. Микросхема ESP8266EX 57 1.2. Линии ввода-вывода Интерфейс ввода-вывода 1 общего назначения (GPIO) II Выше отмечалось, что микросхема ESP8266EX имеет 17 линий ввода-вывода GPIO (GPIO0...GPIO16). ПРИМЕЧАНИЕ. 1 N Аббревиатура GPIO расшифровывается как «General-Purpose Input/Output» (Универсальная ли- ния ввода/вывода). При помощи этих линий микроконтроллер может: ♦ управлять различными внешними цифровыми устройства- ми; ♦ получать от внешних устройств цифровую информацию в ви- де логических уровней. Фирма-производитель при разработке интерфейса ввода- вывода использовала новые подходы и снабдила линии GPIO новыми потребительскими свойствами. Каждая линия GPIO может быть настроена в один из следую- щих режимов: ♦ простой вход; ♦ вход с внутренним подтягивающим резистором (с входа на плюс питания); ♦ вход с внутренним заземляющим резистором (с входа на об- щий провод); ♦ выход; ♦ режим с высоким Импедансом (линия отключена). Входные и выходные данные сохраняются в специальных программно-доступных регистрах. Кроме того, каждая линия может работать в режиме прерывания по фронту или прерывания по уровню входного сигнала.
58 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Но эти дополнительные свойства поддерживают | не все линии. Как минимум, каждая линия — это двунаправленный вход- выход, не инвертирующий с третьим состоянием, имеет буфер входного сигнала и выход с возможностью перевода в третье состояние. Программным путем определенные линии ввода-вывода можно переключить на их альтернативную функцию (графу «Назначение, альтернативная функция» в табл. 1.1). ПРИМЕЧАНИЕ. Для операций с низким энергопотреблением линии GPIO можно настроить на удержание их состояния. Например, можно сделать так, что при переходе микросхемы в режим сна, все линии, настроенные на выход будут продолжать удерживать низкий ло- гический уровень. I Управление светодиодом и кнопкой Любая из 17 линий ввода-вывода микроконтроллера ESP8266EX может быть переведена в режим управления све- тодиодным индикатором, либо в режим для подключения кнопки. Есть несколько контактов, за которыми принято закреплять определенные часто используемые функции. Программирование этих функций уже заложены в тексте программы демонстрацион- ного примера, предлагаемого фирмой-производителем. Таких интерфейсов, имеющих стандартное назначение, всего три: ♦ один —для кнопки; ♦ два других — для светодиодных индикаторов.
Глава 1. Микросхема ESP8266EX 59 Линия МТСК обычно используется для управления кнопкой сброса. Линия GPIO0 используется в качестве сигнала индикации рабочего состояния Wi-Fi. Линия MTDI используется в качестве индикатора состояния обмена информации между контроллером и сервером. АЦП - цифро-аналоговый | преобразователь (ADC) II Микроконтроллер ESP8266EX содержит встроенный 10-бит- ный АЦП последовательного приближения (SAR ADC). Вход АЦП выведен как альтернативная функция на контакт 6 и называется TOUT (табл. 1.1). При помощи АЦП может быть реализована одна из двух описанных ниже функций: ♦ контроль напряжения питания интегрированного усилителя микросхемы на одном из контактов VDD3P3 (контакт 3 или контакт 4). Этот режим используется для калибровки мощ- ности радиопередатчика подсистемы Wi-Fi в полосе частот; ♦ измерение внешнего напряжения на входе TOUT (контакт 6). ВНИМАНИЕ. Невозможно использовать одновременно сразу обе функции аналого-цифрового преобразователя. Он всегда работает только в одном из режимов. Линии ввода-вывода | с Широтно-инпульсной модуляцией (PWM) II Микроконтроллер ESP8266EX имеет четыре выходных интер- фейса ШИМ (PWM). Список контактов, на которых реализован ШИМ, приведен в табл. 1.2.
60 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Контакты, поддерживающие ШИМ (PWM) Таблица 1.2 Номер контакта 10 13 9 16 GPIO GPIO12 GPI015 GPI014 GPI04 Наименование контакта MTDI MTDO MTMS GPI04 Имя ШИМ канала PWM0 PWM1 PWM2 PWM3 Все функции ШИМ интерфейсов выбираются программно. Например, для управления яркостью светодиода PWM работает в режиме прерывания по времени. Минимальный шаг изменения ширины импульса в этом режиме 44 наносекунд. Период следования импульсов может изменяться от 1000 мкс до 10000 мкс. ПРИМЕЧАНИЕ. То есть диапазон частот импульсов ШИМ лежит в пределах от 100 Гц до 1 кГц. При частоте импульсов ШИМ, равной 1 кГц, минимальная скважность составляет 1/22727. I Инфракрасный пульт дистанционного управления Микросхема имеет встроенную функцию приемника инфра- красного пульта дистанционного управления. Список контак- тов пульта ДУ приведен в табл. 1.3. Контакты интерфейса ДУ Таблица 1.3 Номер контакта 9 24 GPIO GPI014 GPI05 Наименование контакта MTMS GPI05 Имя ШИМ канала IRTx IRRx
Глава 1. Микросхема ESP8266EX 61 Режимы работы инфракрасного интерфейса дистанционного управления могут быть выбраны программным путем. Для моду- ляции и демодуляции сигнала интерфейс использует систему кодирования фирмы NEC. Несущая частота модулированного сигнала составляет 38 кГц при коэффициенте заполнения прямоугольной волны 1/3. Дальность действия сигнала ДУ составляет около 1 м. Это определяется двумя факторами: ♦ во-первых, максимальным значением номинального тока; ♦ во-вторых, значением сопротивления, ограничивающего ток, в инфракрасном приемнике. ПРИМЕЧАНИЕ. Чем больше значение сопротивления, тем ниже сила тока и мощность, и наоборот. Сектор обзора составляет от 15° до 30°. Это зависит от параме- тров выбранного инфракрасного датчика. Защищенный цифровой интерфейс II ввода/вывода (SDIO) II Микроконтроллер ESP8266EX имеет в своем составе интер- фейс для подключения внешних карт памяти формата SD (интер- фейс SDIO). Список линий ввода/вывода, используемых этим интерфейсом, приведен в табл. 1.4. Интерфейс поддерживает стандарт SDIO vl.l (4-бита 25 МГц), а также стандарт SDIO v2.0 (4-бита 50 МГц). Контакты интерфейса SDIO Таблица 1.4 Номер контакта 21 22 23 GPIO GPI06 GPI07 GPI08 Наименование контакта SDIO CLK SDIO DATAO SDIO DATA1
62 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Таблица 1.4 (продолжение) Номер контакта 18 19 20 GPIO GPI09 GPI010 GPI011 Наименование контакта SDIO DATA 2 SDIO DATA 3 SDIO CMD Последовательный периферийный интерфейс (SPI / HSPI) Микросхема ESP8266EX имеет три интерфейса SPI: ♦ один полный SPI (Slave/Master); ♦ один ведомый SDIO / SPI; ♦ один полный HSPI (Slave/Master). Функции первых двух вариантов интерфейса реализуются при помощи одних и тех же контактов. Описания контактов при- ведены в табл. 1.5 и табл. 1.6. Полный интерфейс SPI (Master/Slave) Таблица 1.5 Номер контакта 21 22 23 18 19 26 15 GPIO GPI06 GPI07 GPI08 GPI09 GPIO10 GPI01 GPIO0 Наименование контакта SDIO CLK SDIO DATAO SDIO_DATA1 SDIO DATA 2 SDIO DATA 3 UOTXD GPIOO Функция SPICLK SPIQ/MISO SPID/MOSI SPIHD SPIWP SPICS1 SPICS2 Подчиненный интерфейс HSPI (Slave) Таблица 1.6 Номер контакта 9 10 12 13 GPIO GPI014 GPI012 GPI013 GPI015 Наименование контакта MTMS MTDI MTCK MTDO Функция HSPICLK HSPIQ/MISO HSPID/MOSI HPSICS Примечание: Режим SPI также реализован программно. Максимальная тактовая частота интерфейса составляет 80 МГц.
Глава 1. Микросхема ESP8266EX 63 Интерфейс 12С Микросхема ESP8266EX имеет один 12С интерфейс, исполь- зуемый для соединения с другими микроконтроллерами и дру- гим периферийным оборудованием, таким как датчики, внешняя флэш-память. Интерфейс реализуется программно в стандартной прошивке микроконтроллера. При этом интерфейс использует для своей работы две линии ввода-вывода. Список контактов 12С интерфейса приведен в табл. 1.7. Список контактов интерфейса PC Таблица 1.7 Номер контакта 9 14 GPIO GPIO14 GPIO2 Наименование контакта MTMS GPIO2 Функция I2C.SCL I2C.SDA Поддерживаются как PC Master, так и PC Slave. Так как прото- кол 12С интерфейса реализован программно, максимальная так- товая частота составляет 100 кГц. ВНИМАНИЕ. Тактовая частота I2C Master интерфейса должна быть выше тактовой частоты того из подклю- ченных к нему подчиненных (Slave) устройств, ко- торое имеет самую низкую тактовую частоту. Интерфейс I2S Микросхема ESP8266EX имеет: ♦ один интерфейс ввода данных I2S; ♦ один интерфейс вывода данных I2S.
64 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Интерфейсы PS в основном используются в таких приложе- ниях, которые осуществляют: ♦ сбор данных; ♦ обработку и передачу цифровых аудио сигналов; ♦ просто для ввода и вывода последовательных данных. ПРИМЕР. Этот протокол поддерживает светодиодный ин- дикатор со встроенным контроллером управления яркостью (серии WS2812). Описание линий ввода-вывода интерфейса I2S приведено в табл. 1.8. Функция PS также реализована программным путем. Для этого используются: ♦ переключаемые линии GPIO; ♦ механизм прямого доступа к памяти (DMA) со связанным списком. Список контактов интерфейса I2S Таблица 1.8 Номер контакта 10 12 9 13 25 14 GPIO GPI012 GPI013 GPI014 GPI015 GPI03 GPI02 Наименование контакта MTDI МТСК MTMS MTDO UORXD GPI02 Функция I2SI DATA I2SI ВСК I2SI WS I2SO ВСК I2SO DATA I2SO WS I Универсальный асинхронный интерфейс UART Микросхема ESP8266EX имеет в своем составе два интер- фейса UART (расшифровывается как Универсальный асинхронный интерфейс ввода-вывода). Они имеют названия UART0 и UART1. Описание контактов этих интерфейсов приведено в табл. 1.9.
Глава 1. Микросхема ESP8266EX 65 Список контактов интерфейса PS Таблица 1.9 Интерфейс UART0 UART1 Номер контакта 25 26 13 12 14 23 GPIO GPIO3 GPIO1 GPIO15 GPIO13 GPIO2 GPIO8 Наименование контакта UORXD U0TXD MTDO МТСК GPIO2 SD D1 Функция U0RXD U0TXD U0RTS U0CTS U1TXD U1RXD Передача данных через интерфейс UART может быть осу- ществлена исключительно аппаратными средствами (без допол- нительной программы). Скорость передачи данных через интер- фейсы UART достигает 115200 * 40 (4,5 Мбит/с). UART0 может использоваться для внешних коммуникаций. Таким способом осуществляется текущее внешнее управление. В заводской документации утверждается, что интерфейс UART1 имеет только сигнал передачи данных (Тх), он обычно исполь- зуется для печати журнала. Хотя в том же документе в таблице контактов указан контакт с функцией U1RXD (табл. 1.9). ПРИМЕЧАНИЕ. По умолчанию UART0 в момент начальной загрузки сразу после включения питания выводит некото- рую справочную информацию, предназначенную для печати. Скорость передачи этой информации зави- сит от частоты внешнего кварцевого генератора. Если частота кварцевого генератора равна 40 МГц, то скорость передачи для печати равна 115200 бод. Если частота кварцевого генератора составля- ет 26 МГц, то скорость передачи в бодах для печа- ти составляет 74880. Если вывод печатной информации мешает работе устройства, к которому подключен контроллер, мож- но заблокировать функцию печати по включению пи- тания, поменяв (UOTXD, U0RXD) на (MTDO, МТСК).
66 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 1.3. Технические характеристики микросхемы ESP8266EX Основные технические характеристики микросхемы ESP8266EX: ♦ допустимый диапазон температур хранения .. .-4О...+125°С; ♦ максимальная рабочая температура + 260°С; ♦ напряжение питания 3,3 В (2,5... 3,6) В. Токи потребления в различных режимах работы: ♦ в режиме передачи 120... 170 мА; ♦ в режиме приема 50... 56 мА; ♦ в режиме Modem-sleep 15 мА; ♦ в режиме Light-sleep 0,9 мА; ♦ в режиме Deep-sleep 20 мкА; ♦ в режиме Power Off 0,5 мкА. Частоты радиоканала микросхемы соответствуют стандарту IEEE802.11b/g/n. Микросхема может работать в одном из 14 стан- дартных каналов. Рабочие частоты всех каналов приведены в табл. 1.10. Частоты каналов Wi-Fi микросхемы ESP8266EX Номер канала 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Таблица 1.10 Частота, МГц 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472 2484
Глава 1. Микросхема ESP8266EX 67 1А Основы программирования для микроконтроллера ESP8266EX ПРИМЕЧАНИЕ. Сведения, приведенные в разделах 1.4 и 1.5, взя- ты из фирменной документации производителя и предназначены для программистов высокой квали- фикации, работающих над серьезными проектами. В данной книге они приведены для информации. Аппаратная и программная часть ВНИМАНИЕ. Фирма EspressifHe публикует, как это обычно приня- то, систему команд микроконтроллера ES38266EX. Вместо этого фирма предлагает комплект про- граммно аппаратных средств для разработки схе- мы, конфигурации и программного обеспечения с ис- пользованием данного микроконтроллера. Рис. 1.5. Отладочная плата ESP-LAUNCHER
68 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 1.6. Два варианта модуля ESP-WROOM-02 Аппаратная часть включает в себя два варианта специ- ально разработанных плат: ♦ большая профессиональная плата для разработчика ESP- LAUNCHER (рис. 1.5); ♦ малогабаритный модуль, ESP-WROOM-02 (рис. 1.6). Плата ESP-WROOM-02 содержит микроконтроллер ESP8266EX и минимальную периферию. Этот малогабаритный модуль уже готов к работе, достаточно только подать питание. Его можно использовать как основу для более сложных конструкций. ПРИМЕЧАНИЕ. Более сложный модуль ESP-LAUNCHER предназначен для серьезных разработок. Программная часть представлена готовым программным комплектом SDK (software development kit), что в переводе озна- чает: набор средств разработки программ. Существует два варианта базовой SDK. Они называются Non-OS SDK и RTOS-SDK. Каждый из этих вариантов может слу- жить основой для ваших собственных разработок. Оба варианта предоставляют разработчику широкий набор функций управле- ния работой всех систем микросхемы ESP8266EX.
Глава 1. Микросхема ESP8266EX 69 Проект Каждый из вариантов SDK представлен в виде проекта. ЧТО ЕСТЬ ЧТО. Проект - это набор готовых скомпилированных программных модулей, библиотек, а также стан- дартный вариант программы, использующий все эти компоненты. ПРИМЕЧАНИЕ. Отличие между вариантами SDK в том, что пер- вый из них (Non-OS SDK) представляет собой набор утилит, управляющих всеми функциями микросхе- мы в соответствии с командами, получаемыми из- вне по последовательному каналу UART. Второй же вариант (RTOS-SDK) представляет собой специализированную операционную систему, специально заточенную под задачи управления ми- кроконтроллером ESP8266EX. Разработчику предлагается выбрать один из двух вариантов SDK. Далее при желании вы можете изменить программу под свои задачи, слинковать и откомпилировать весь проект и прошить в программную память, подключенную к микроконтроллеру. На практике редактированием и перекомпиляцией проектов занимаются лишь опытные программисты при разработке очень серьезных проектов. Большинство же программистов используют уже откомпилированный стандартный вариант, который в виде бинарных файлов (файлов с расширением bin) обязательно вхо- дит в каждый комплект SDK. На рис. 1.7, взятом из заводской документации, в графиче- ском виде показана схема использования SDK. Как видно из этой схемы, процедура включает в себя: ♦ подготовку оборудования; ♦ подготовку программного обеспечения.
70 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Подготовка программного обеспечения Подготовка оборудования Компиляция SDK Загрузка микропрограммы Набор инструментов ESP8266 Рис. 1.7. Схема использования SDK I Подготовка оборудования и программного обеспечения Подготовка оборудования состоит в том, чтобы выбрать одну из описанных выше плат (ESP-LAUNCHER или ESP-WROOM-02). Оборудование нужно установить и подключить согласно прила- гаемой к нему инструкции. Затем на основе выбранного аппаратного модуля нужно собрать схему вашего проекта. Готовая аппаратная часть вашего проекта на рис. 1.7 обозначена как ESP8266 HDK. Это расшифро- вывается как Hard development Kit (набор аппаратных средств). Следующий этап — подготовка программного обеспече- ния. Начинается подготовка с загрузки программных инструмен- тов и собственно пакета SDK с сайта производителя. Адрес страницы загрузки информации по микроконтроллеру ESP8266 на сайте фирмы Espressif следующий [28].
Глава 1. Микросхема ESP8266EX 71 Для перехода по указанной в тексте ссыл- ке [28] запустите приложение «Сканер QR и штрих-кодов» на смартфоне (план- шете) и наведите его камеру на располо- женное рядом изображение QR-кода. СОВЕТ. Сайт не поддерживает русский язык (только ан- глийский и китайский), поэтому рекомендую от- крывать его при помощи браузера со встроенным автоматическим переводчиком. Например, можно использовать Яндекс браузер. К инструментальным программам of носятся: ♦ программа-компилятор; ♦ средства загрузки откомпилированной программы в про- граммную память ESP8266 HDK. Компиляция SDK ESP8266 производится стандартным компи- лятором операционной системы Linux. У тех, кто занимается ком- пиляцией SDK, на компьютере должна быть установлена именно эта операционная система. ПРИМЕЧАНИЕ. Если вы используете ОС Windows, можно использо- вать программу VirtualBox в качестве виртуальной машины, на которую устанавливается ОС Linux. С целью упрощения процедуры работы в Windows на сайте производителя доступен для скачивания OVA-образ виртуаль- ной машины с предустановленной ОС Linux и уже установлен- ными средствами компиляции, который вы можете импортиро- вать в VirtualBox. В результате компиляции получается файл прошивки, кото- рый на рис. 1.7 обозначен как ESP8266 FW, что расшифровыва- ется как Firmware (Прошивка).
72 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Как уже говорилось выше, существуют два варианта про- граммной части SDK: ♦ SDK без операционной системы (Non-OS SDK); ♦ SDK с операционной системой (RTOS SDK). ПРИМЕЧАНИЕ. Как явствует из названия, в качестве операцион- ной системы используется RTOS (Операционная Система Реального Времени). I Загрузка Non-OS SDK Пользователи могут скачать non-OS SDK (включая примеры приложений) по следующим адресам: ♦ с официального сайта фирмы Espressif [17] http://www. espressif.com/en/support/download/sdks-demos; ♦ с официального BBS сервера фирмы Espressif [15] http://bbs. espressif.com/. На рис. 1.8 приведена структура директорий non-OS SDK. Назначение директорий описано ниже: ♦ арр: основной рабочий каталог, содержащий исходные коды и файлы заголовков для компиляции; ♦ bin: скомпилированные двоичные файлы для загрузки непо- средственно во флэш-память; ♦ documents: связанные с SDK документы или ссылки; ♦ driverjib: файлы библиотеки, которые управляют перифе- рийными устройствами, такими как UART, PC и GPIO; ♦ examples: примеры кодов для вторичной разработки, напри- мер, IoT Demo; ♦ include: заголовочные файлы, предварительно установленные в SDK. Файлы содержат соответствующие функции API и дру- гие макро определения. Пользователям их изменять не нужно; ♦ Id: ссылка на файлы для программы SDK. Мы рекомендуем пользователям не изменять эту ссылку без особой надобности; ♦ lib: библиотека файлов SDK; ♦ tools: инструменты, необходимые для компиляции двоичных файлов. Пользователи не должны изменять эту директорию.
Глава 1. Микросхема ESP8266EX 73 Рис. 1.8. Структура директорий NON-OS SDK Загрузка | RTOS SDK II Пользователи могут скачать RTOS SDK и примеры его приме- нения (ESP8266_IOT_PLATFORM) по следующим адресам: ♦ RTOS SDK [22] https://github.com/espressif/ESP8266_RTOS_ SDK; ♦ ESP8266JOTJ>LATFORM [21] https://github.com/espressif/ ESP8266JOT_PLATFORM. На рис. 1.9 приведена структура директорий RTOS SDK. Назначение директорий описано ниже: ♦ bin — скомпилированные двоичные файлы для загрузки не- посредственно во флэш-память; ♦ documents — связанные с SDK документы или ссылки; ♦ examples — примеры кодов для вторичной разработки: • examples/driverjib — библиотечные файлы, которые управляют периферийными устройствами, такими как UART,I2CnGPIO; • examples/project_template — шаблон каталога проекта; • examples/smart_config — смарт-конфигурации, связан- ные с образцами кода;
74 Управление модулем ARDUINO по Wi-Fi с мобильных устройств • examples/spiffs test — примеры кодов, связанных с SPIFFS; • examples/websocketjiemo — примеры кодов, связанных с WebSocket. extraJnclude — файлы заголовков, предоставляемые Xtensa; include — файлы заголовков, предварительно установленные в SDK. Файлы содержат соответствующие функции API и дру- гие определения макросов. Пользователям не рекомендуется ничего изменять в этой папке; Id — ссылки на файлы для программы SDK. Рекомендую поль- зователям ничего не изменять в этой папке без особой надоб- ности; lib — библиотека файлов SDK; third_party — библиотеки сторонних файлов с открытым ис- ходным кодом; tools — инструменты, необходимые для компиляции двоич- ных файлов. Пользователям не рекомендуется ничего изме- нять в этой папке. Рис. 1.9. Структура директорий RTOS SDK
Глава 1. Микросхема ESP8266EX 75 ПРИМЕЧАНИЕ. Пользователи могут скопировать projectjemplate в любой свой каталог, например,/Workspace. 1.5. Инструментальные программы для SDK Загрузка | компилятора II Загрузить КОМПИЛЯТОР вы можете по следующей ссылке [26]. Для перехода по указанной в тексте ссыл- ке [26] запустите приложение «Сканер QR и штрих-кодов» на смартфоне (планше- те) и наведите его Камеруна расположен- ное рядом изображение QR-кода. ВНИМАНИЕ. Необходимо, выбрать правильную версию VirtualBox, соответствующую версии вашей ОС Загрузка образа | виртуальной машины II Загрузите ОБРАЗ ВИРТУАЛЬНОЙ МАШИНЫ ESP8266_ lubuntu_20141021.ova и остальные инструментальные про- граммы с виртуального диска Google по ссылке [20]. Подробное описание процесса установки компилятора на ваш компьютер и самого процесса компиляции вы найдете в документе «ESP8266 SDK Getting Started Guide» («ESP8266 SDK
76 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Руководство по началу работы»), которое вы также можете ска- чать на сайте фирмы-изготовителя. СОВЕТ. Хорошее подспорье в поиске нужных файлов и ин- струментальных программ - специальная систе- ма поиска, которая находится на сайте фирмы Espressif. Поиск ведется с учетом параметров ва- шего проекта (типа микроконтроллера, версии операционной системы и т. д.). Систему поиска вы найдете по адресу [18]. 1.6. Заключение главы, или «Не все так страшно!» Прочитав разделы по программированию, начинающий поль- зователь, наверное, уже успел испугаться сложности всех описан- ных операций. Но спешу вас успокоить: мы не будем применять Linux, изменять и перекомпилировать SDK. Вся вышеизложенная информация дана лишь для общего понимания ситуации. Во-первых, мы будем использовать лишь стандартную версию NON-OS SDK. А, во-вторых, из всех директорий, входящих в комплект про- граммной части SDK, нам понадобится лишь папка bin, содержа- щая бинарные файлы стандартной версии прошивки, и то лишь в том случае, если заводская прошивка вас почему-либо не устроит. Подробнее о том, как прошить программную память, мы узнаем в конце следующей главы книги.
ГЛАВА 2 МОДУЛИ НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА ESP8266 Предложенные фирмой Espressif аппаратные средства раз- работки, о которых мы говорили в предыдущей главе, не получили большого распространения. В основном, из-за своей достаточно высокой стоимости. Гораздо более широкое рас- пространение получила линейка модулей, разработанных и выпускаемых китайской фирмой Ai-Thinker, расположенной в городе Шэньчжэнь (Shenzhen Anxin can Technology Co., Ltd.). Это миниатюрные модули на основе микроконтроллера ESP8266EX. Модули имеют встроенную Flash-память про- грамм формата SOP-2Ют И, объемом 1 Мбайт и минимальную схемную обвязку, необходимую для работы микроконтроллера. Начало этой линейке положил модуль, который получил название ESP-01. Этот модуль имеет удобную компактную конструкцию, небольшие размеры и минимум внешних контак- тов. Модуль удобно использовать: ♦ или как внешний Wi-Fi адаптер для других микроконтрол- лерных модулей (например, для модуля ARDUINO); ♦ или для управления по Wi-Fi небольшой несложной нагрузкой. В дальнейшем первый вариант модуля был усовершенство- ван. Появился ESP-02, затем ESP-03 и так далее. В настоящее время линейка насчитывает уже 14 разных модификаций.
78 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 2.1. Краткое описание модулей ESP |Как модули ESP выглядят Модификации имеют в основном конструктивные отличия. На рис. 2.1 приведен внешний вид первых двенадцати модулей. ESP-01 ESP-02 ESP-03 ESP-04 ESP-05 ESP-06 ESP-07 ESP-08 ESP-09 ESP.1O ESP-11 ESP-12E(F) Рис. 2.1. Внешний вид модулей ESP-01...ESP-12
Глава 2. Модули на основе микроконтроллера ESP8266 79 Модуль II ESP-O1II ESP-O1 — первый в линейке модулей и самый распростра- ненный. Минимум выводов. На разъем выведены всего два GPIO. Дальность действия Wi-Fi — до 400 м на открытом пространстве. Модуль на базе ESP8266 с РСВ-антенной, 8-выводным штырько- вым разъемом и 1 МБ Flash-памяти. Имеет встроенную антенну Wi-Fi. Список контактов модуля приведен в табл. 2.1. Описание контактов модуля ESP-01 (варианты V090 и V080) Таблица 21 Номер контакта 1 2 3 4 5 6 7 8 Наименование контакта V090 GND TxD GPI02 СН PD GPIO0 RST RxD Vcc V080 GND TxD - - - - RxD Vcc Назначение Общий провод Выход Тх канала UART Линия Ввода/Вывода 2 Выбор микросхемы Линия Ввода/Вывода 0 Сброс Вход Rx канала UART Питание (3,3 В) Модуль ESP-02 ESP-02 — отличается от ESP-01 только конструкцией контактов. Для подключения к внешним цепям модуль имеет 8 краевых кон- тактов (металлизированные выемки в торцах платы). Такие кон- такты позволяют уменьшить общий размер конечной конструкции. Контакты универсальны. К ним легко подпаять проводники или плоский кабель, можно впаять модуль в плату, как планарный безвыводный компонент, а можно, при необходимости, припаять к контактам стандартный штырьковый разъем. Назначение контактов совпадает с модулем ESP-01. Только вместо цепи выбора микросхемы (CH_PD) выведена линия ввода/ вывода GPIO15. Кроме того, модуль ESP-02 не имеет встроенной
80 Управление модулем ARDUINO по Wi-Fi с мобильных устройств антенны, зато имеет разъем типа U.F1 (IPEX) для подключения внешней антенны. I Модуль ESP-03 ESP-03 — отличается тем, что имеет встроенную керамиче- скую антенну (разъем для внешней антенны отсутствует). Кроме того модуль имеет 14 краевых контактов, на которые выведено гораздо больше разных сигналов. А именно, на внешние кон- такты выведены: ♦ обе линии каналов UART (RX и ТХ); ♦ линии ввода/вывода GPIOO, GPIO2, GPIO12-GPIO15, GPIO18; ♦ общий провод (GND); ♦ цепь питания (Vcc); ♦ выбор микросхемы Chip Enable (CHJPD) для управления включением модуля с внешнего микроконтроллера; ♦ контакт для подключения антенны (WiFi_ANT), который в данной конфигурации модуля использовать не имеет смыс- ла, потому что модуль снабжен высококачественной встроен- ной керамической антенной. В остальном модуль имеет те же характеристики, что и предыдущие модели. I Модуль ESP-04 ESP-04 — доработанный вариант ESP-03. Из модуля убрана керамическая антенна, а вместо GPIO18 на тот же контакт выве- ден GPIO16. Так как внутренняя антенна отсутствует, модуль тре- бует подключения внешней антенны при помощи контакта ANT.
Глава 2. Модули на основе микроконтроллера ESP8266 81 Модуль II ESP-O5 II ESP-05 — конструкция этого модуля значительно отлича- ется от всех предыдущих. Модуль имеет U.F1 разъем для внеш- ней антенны. Для подключения к внешним цепям используются 6 сквозных металлизированных контактов (металлизированное отверстие). Пять контактов в ряд вдоль одного края платы и один допол- нительный контакт GND с противоположной стороны. На пять рядом стоящих контактов выведены следующие сигналы: RST, GND, RX, TX, VCC. Контакты можно использовать для того, чтобы припаять к ним провода или плоский кабель, а также при жела- нии к этим контактам легко припаивается штыревой разъем. Модуль || ESP-06 II ESP-06 — выполнен конструктивно как LGA-модуль с внешним экраном. LGA-модуль — это модуль с особой конструкцией контак- тов. Контакты выполнены в виде площадок печатного монтажа на нижней части модуля. Такой модуль должен устанавливаться на печатную плату с подпружиненными ответными контактами. Эта конструкция имеет повышенную стойкость к сильным ударам при транспортировке и работе в условиях повышенной вибрации. При смещении модуля в результате удара выводы не ломаются. Просто модуль смещается в сторону и легко может быть установлен в прежнее положение, в то время, как обычные контакты могут от удара обломиться. Взаимодействие модуля ESP-06 с внешними устройствами осуществляется через 12 контактов формата LGA, расположен- ных на нижней поверхности модуля вдоль краев. На эти контакты выведено множество интерфейсов чипа ESP8266EX: ♦ двух контактный UART интерфейс (RX и ТХ); ♦ общий провод (GND); ♦ контакт питания (Vcc); ♦ выбор микросхемы Chip enable (CH_PD); ♦ семь линий ввода/вывода GPIO.
82 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Монтаж антенны производится к специальному радиоча- стотному выводу WIFI_ANT с волновым сопротивлением 50 Ом. I Модуль ESP-07 ESP-07. Основная цель при разработке этой модели модуля — обеспечить электромагнитную совместимость согласно требова- ниям FCC (Federal Communications Commission — Федеральная комиссия по коммуникациям). Поэтому модуль ESP-07 позаим- ствовал экран от модуля ESP-06. Однако в нем не применяются LGA стандарты. В этой версии модуля контакты выполнены в виде двух рядов (2 по 8) металлизированных отверстий по двум краям платы. Причем каждый контакт выходит также и на торец платы, образя там еще и торцевой контакт. На контакты выведены следующие сигналы: ♦ две линии UART интерфейса (RX и ТХ); ♦ общий провод (GND), цепь питания (Vcc), вход выбора микро- схемы Chip enable (CH_PD); ♦ вход Reset (сброс); ♦ девять линий ввода/вывода GPIO; ♦ вход АЦП. Кроме того, в модуле установлена керамическая антенна, а также U.F1 разъем для внешней антенны. Модуль ESP-08 ESP-08 — тот же модуль ESP-07, но без встроенной антенны. I Модуль ESP-09 ESP-09 — суперминиатюрный модуль размером 10><10 мм в формате LGA (контакты в виде площадок на нижней части платы), но без использования экрана.
Глава 2. Модули на основе микроконтроллера ESP8266 83 На контактные площадки выведены следующие сигналы: ♦ две линии UART интерфейса (RX и ТХ); ♦ общий провод (GND), цепь питания (Vcc), вход выбора микро- схемы Chip enable (CH_PD); ♦ вход Reset (сброс); ♦ шесть линий GPIO. Монтаж антенны производится к специальному радиочастот-. ному выводу WIFI_ANT с волновым сопротивлением 50 Ом. Модуль II ESP-10 II ESP-1O — еще один миниатюрный модуль, предназначенный исключительно для задач serial-to-WiFi (то есть, для передачи сигналов последовательного канала через сеть Wi-Fi). В связи с этим в модуле выведены всего две линии GPIO. Кроме того, на внешние контакты модуля выведены: ♦ две линии UART интерфейса (RX и ТХ); ♦ цепь GND; ♦ цепь питания; ♦ вход Reset. Все 5 контактов представляют собой patch-интерфейс (то есть пять торцевых контактов на краю платы). Модуль II ESP-11II ESP-11 — модуль размерами 16*18,5 мм, с керамической антенной и восемью контактами в виде металлизированных отверстий. На контакты выведены: ♦ две линии UART интерфейса (RX и ТХ); ♦ две линии ввода/вывода GPIOO, GPIO1; ♦ общий провод (GND); ♦ цепь питания (Vcc); ♦ вход выбора микросхемы Chip Enable (CH_PD); ♦ вход Reset (сброс).
84 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Все краевые контакты модуля снабжены монтаж- ными отверстиями, пригодными для пайки в них штыревой линейки. I Модуль ESP-12 ESP-12 — все предыдущие варианты модуля имеют встро- енную Flesh-память программ объемом 1 Мбайт. Модуль ESP-12 имеет три модификации (ESP-12, ESP-12E и ESP-12F). Во всех трех вариантах используется Flesh-память объемом 4 МБайт. Все три варианта модуля имеют встроенную антенну выполненную мето- дом печатного монтажа. Модуль ESP-12 имеет 16 внешних контактов (два ряда торце- вых контактов с двух противоположных торцов платы). ПРИМЕЧАНИЕ. Модули с литерами EuF имеют, кроме тех же 16 кон- тактов, еще шесть контактов на третьем тор- це платы. Модуль ESP-12F отличается от ESP-12E усовершенствованной встроенной антенной. В модуле F антенна (по утверждению разработчика) имеет более высокую производительность. При этом коэффициент уси- ления антенны у всех трех модификаций модуля по паспорту оди- наковый и равен 3 dBi. На внешние контакты модуля ESP-12 (того, что без буквы) выведены следующие сигналы: ♦ две линии UART интерфейса (RX и ТХ); ♦ общий провод (GND); ♦ цепь питания (Vcc); ♦ вход выбора микросхемы Chip enable (CH_PD); ♦ вход сброса (Reset); ♦ девять линий GPIO и вход АЦП. Модули с литерами Е и F имеют еще 6 контактов, на которые выведено еще шесть линий ввода/вывода GPIO (с 6 по 11).
Глава 2. Модули на основе микроконтроллера ESP8266 85 Модуль II ESP-13 II ESP-13 — 18-выводный модуль на базе ESP8266 в форм- факторе ESP-WROOM-02, с РСВ-антенной (выполненной методом печатного монтажа) и 4 МБайт Flash-памяти. ПРИМЕЧАНИЕ. Этот модуль предназначен для того, чтобы мак- симально приблизиться к модулю, предлагаемому фирмой-производителем микросхемы ESP8266EX. На внешние контакты выводятся следующие цепи и сигналы: две линии UART интерфейса (RX и ТХ); общий провод (GND); цепь питания (Vcc); вход выбора микросхемы Chip enable (CH_PD); вход сброса (Reset); 11 линий ввода/вывода GPIO (включая выводы интерфейса SPI); ♦ вывод АЦП. Внешне модуль ESP-13 похож на ESP-12. Отличие в том, что модуль имеет с двух сторон два ряда по 9 торцевых контактов без отверстия для пайки штыревого разъема. ♦ ♦ Модуль ESP-14 ПРИМЕЧАНИЕ. Среди общего набора модулей производства компа- нии Al-Thinker, отличающихся между собой разме- рами, объемом Flash-памяти, наличием или отсут- ствием металлического экрана, типом антенны и /77. д. Особенно выделяется новый модуль ESP-14.
86 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Он, помимо микросхемы ESP-8266EX, содержит еще и мощ- ный высокопроизводительный микроконтроллер STMs8003F3P6, доступный для программирования и реализации весьма сложных приложений цифровой сигнальной обработки. При этом прямой доступ к выводам микросхемы ESP8266 для разработчика полностью закрыт. Любое управление ESP8266 может выполняться только через внутреннюю про- грамму микроконтроллера STMs8003F3P6. ESP-14 — 22-выводный модуль на базе ESP8266EX, соответ- ствующий требованиям FCC (с металлическим экраном), с улуч- шенной РСВ-антенной, 1 МБ Flash-памяти и встроенным микро- контроллером STMs8003F3P6. Внешне модуль ESP-14 очень похож на модуль ESP-12F. 2.2. Готовимся к использованию модуля ESP-O1 Почему выбрали именно модуль ESP-O1? ПРИМЕЧАНИЕ. Далее в качестве основы для всех учебных примеров I мы будем использовать модуль ESP-O1. Безусловно, этот модуль использует не все возможности микроконтроллера ESP8266EX. На внешние контакты модуля выводятся лишь две линии ввода/вывода (GPIO). Но это в нашем случае не критично.
Глава 2. Модули на основе микроконтроллера ESP8266 87 ПРИМЕЧАНИЕ. Основная тема книги - работа модуля ARDUINO с использованием сети Wi-Fi. А это значит, что мо- дуль ESP будет использоваться исключительно как внешний адаптер Wi-Fi для модуля ARDUINO. И лишь в последней главе модуль ESP-01 будет использо- ваться как самостоятельный микроконтроллер. Строго говоря, в нашем случае для решения поставленной нами задачи прекрасно подошел бы модуль ESP-1O. Он как раз задуман исключительно как адаптер. Однако модуль ESP-O1 более распро- странен в России. К тому же он выпускается дольше всех остальных модификаций, поэтому для него промышленностью разработано много вспомогательных плат и дополнений. Подключенные к модулю ESP-O1 такие дополнительные платы расширения сразу решают одну или несколько стандартных прак- тических задач. Этим облегчается конструирование систем управ- ления и автоматизации с использованием Wi-Fi канала связи. Но, главное - данный модуль лучше всего подходит в каче- стве примера для начинающих разработчиков. Как устроен | модуль ESP-O1II Рассмотрим подробнее устройство модуля. На рис. 2.2 пред- ставлена принципиальная схема модуля ESP-O1. ПРИМЕЧАНИЕ. Схема остальных модификаций, описанных выше, не сильно отличается от этой схемы. Исключение составляет лишь модуль ESP-14. Его схема гораздо сложнее.
88 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Но вернемся к модулю ESP-O1. Как видите, схема модуля достаточно проста. Основой схемы, естественно, является микро- контроллер ESP8266EX, обозначенный на схеме как Ш. Микросхема U2 — это внешняя Flesh-память, подключаемая к микроконтроллеру Ш посредством интерфейса SPI. В процессе работы программа из микросхемы U2 подгружается в память микроконтроллера U1 и исполняется входящим в его состав про- цессором (CPU). U3 на схеме — кварцевый резонатор, который подключается к встроенному в микроконтроллер тактовому генератору и задает частоту его колебаний. ПРИМЕЧАНИЕ. Применение кварцевого резонатора обеспечивает стабильность частоты колебаний генератора. Кварцевый резонатор имеет: ♦ два сигнальных контакта (XIN и XOUT); ♦ два контакта заземления. При помощи этих контактов заземления металлический экран резонатора соединяется с общим проводом модуля. Это снижает паразитное излучение модуля и, соответственно, уровень помех, создаваемых модулем для других электронных устройств. К выводу LNA через цепь согласования подключена встро- енная высокочастотная антенна. Антенна и согласующие цепи выполнены методом печатного монтажа. Кроме перечисленных выше радиокомпонентов, в схеме модуля установлены: ♦ конденсаторы фильтров по питанию; ♦ два согласующих конденсатора для кварцевого резонатора; ♦ два токоограничивающих резистора. Внешние сигналы выведены на восьмиконтактный разъем.
Глава 2. Модули на основе микроконтроллера ESP8266 89 vcc CH_PD GPIO02 GPIO00 RXD| TXD| RSTj gndP Рис. 2.2. Схема электрическая принципиальная модуля ESP-01 Управление модулем ESP-011 с помощью набора АТ-команд I Управление модулем ESP-O1, как и всеми остальными вариан- тами модулей линейки ESP, осуществляется посредством после- довательного канала UART. По UART каналу на модуль пере- даются: ♦ управляющие команды; ♦ данные для передачи по Wi-Fi сети. Также через этот канал можно получать: ♦ служебную информацию; ♦ данные, принятые по сети Wi-Fi.
90 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Управлять модулем можно как при помощи компью- тера, так и при помощи внешнего микроконтрол- лерного устройства, например, модуля ARDUINO. В том случае, если в программной памяти прошит Non-OS SDK, управлять модулем можно используя набор так называе- мых АТ-команд. Первоначально АТ-команды использовались для управления телефонным модемом. Небольшие текстовые после- довательности передавались по каналу связи в общем потоке информации, и воспринимались модемом, как команды управ- ления. В нашем случае эти команды будут управлять микроконтрол- лером ESP8266EX. Каждая команда начинается с буквенной пары «AT», за которой идет собственно команда и ее параметры. ПРИМЕЧАНИЕ. Подробнее о работе с модулем при помощи АТ- команд читайте в главе 3. Канал UART используется также для перепрошивки управ- ляющей программы модуля (то есть, SDK). Для этого микрокон- троллер переводится в режим программирования. Затем, при помощи специальной программы из компьютера в модуль пере- дается новая прошивка для программной памяти. Схема подклю- чения модуля ESP-01 к компьютеру приведена на рис. 2.3. I Питание модуля ESP-01 Большое значение имеет питание. Для питания модуля необ- ходимо иметь напряжение 3,3 В.
Глава 2. Модули на основе микроконтроллера ESP8266 91 ВНИМАНИЕ. Допустимый диапазон напряжения питания модуля ESP8266 от 3,0 до 3,6 вольт. Подача повышенного напряжения питания на модуль гарантированно приведет к выходу ESP8266 из строя. Пониженное напряжение не гарантирует стабильной работы модуля. Для того чтобы получить нужное напряжение питания удобно использовать микросхему стабилизатора напряжения LM1117, как это показано на рис. 2.3. Входные напряжения, которые будут поступать от внешних цепей на контакты модуля ESP-O1, желательно тоже преобразо- вать таким образом, чтобы их уровень не превышал напряжение питания микроконтроллера (3,3 В). Рис. 2.3. Схема подключения модуля ESP-O1
92 Управление модулем ARDUINO по Wi-Fi с мобильных устройств СОВЕТ. Хотя практика показывает, что микросхема вы- держивает на входе и стандартный для цифровых микросхем уровень сигналов (до 5 вольт), мы все же рекомендую согласовать уровни сигналов. I Подключение модуля ESP-O1 к компьютеру Как уже говорилось, для связи с компьютером используется последовательный канал UART. Канал UART использует протокол, совместимый с протоколом RS-232. Такой же протокол поддержи- вает широко использовавшийся когда-то в компьютерах фирмы IBM внешний последовательный СОМ порт. Различия были только в уровнях сигнала. Сейчас СОМ порт почти не используется. Поэтому для подключения UART к компьютеру используют преобразователи TTL-+USB. Сигналы UART как раз имеют TTL уровни (стандартные уровни для цифровых сигналов). TTL->USB адаптер подключается к USB-порту компьютера и работает обычно в режиме эмуляции СОМ-порта. ПРИМЕЧАНИЕ. Для работы с адаптером на компьютер должен I быть установлен специальный драйвер. В компьютере как бы появляется виртуальный СОМ-порт, и уже через этот порт программное обеспечение компьютера обща- ется с модулем ESP-O1. Один из возможных вариантов схемы TTL-+USB адаптера приведен на рис. 2.4. Адаптер выполнен на специализированной микросхеме, обозначенной на схеме — U1. Выводы D+ и D- используются для передачи данных по USB- протоколу, а выводы RXD и TXD — подключаются к UART интер- фейсу модуля ES-O1.
Глава 2. Модули на основе микроконтроллера ESP8266 93 Питание адаптера осуществляется от компьютера, через контакт VBOS, на котором всегда присутствует напряжение +5 В. Этот контакт специально предназначен для питания под- ключаемых к USB устройств малой мощности. Напряжение +5 В поступает на шину питания микросхемы (контакт 7), а также на один из выходных контактов модуля. Специализированная микросхема Ш, кроме своей основной функции, также вырабатывает напряжения +3,3 В (выход VDD, контакт 4). Это напряжение поступает на другой внешний кон- такт модуля и может использоваться для питания модуля ESP-O1. СОВЕТ. Мощности этого источника питания может не хватить. Рекомендую использовать схему подклю- чения, изображенную ранее на рис. 2.3. Напряжение на вход стабилизатора LM1117 (рис, 2.3) можно подавать с внешнего вывода +5 В адаптера (рис. 2.4). Но вернемся к схеме подключения модуля (рис. 2.3). Для перевода модуля в режим программирования (прошивки управ- ляющей программы) на схеме предусмотрена специальная пере- мычка S1. 00 СО сз ни GND 1мкФ VBUS D+ D- 3,3В 3,3 В t С2 + С1 Ж ЕХР | 0,1 |4,7мкФ <Н~" U1 ->+5В REGIN VBUS VDD D+ D- GND GND GND RST SUSPEND SUSPEND Rl DCD DTR DSR TXD RXD RTS CTS R1 4k7 25 24 CP210XJJSBJJART Рис. 2.4. Схема адаптера TTL- +з,зв >TxD >RxD GND | >GNC J_ TTL >USB
94 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Строго говоря, микросхема ESP8266EX не имеет специального режима программирования. Зато ми- кросхема имеет возможность изменять источник исполняемой программы. I Выбор источника исполняемой программы Источник исполняемой программы микроконтроллера ESP8266 задается состоянием портов GPIOO, GPIO2 и GPIO15 в момент окончания сигнала Reset (или в момент подачи питания). Полный список режимов приведен в табл. 2.2. Выбор источника исполняемой программы Таблица 2.2 Режим Flash UART SDIO GPIO15 0 0 1 GPIOO 1 0 X GPIO2 1 1 X Источник выполняемой программы Внешняя SPI Flash память Канал UART Внешняя CD-карта ПРИМЕЧАНИЕ. Значок «X» в табл. 2.2 означает любое значение. Наиболее интересны для нас два режима: ♦ выполнение кода из внешнего Flash — (GPIOO = 1, GPIO2 = 1 и GPIO15 = 0); ♦ выполнение кода из канала UART - (GPIOO = 0, GPIO2 = 1 и GPIO15 = 0). Первый из этих режимов (работа из Flash) — штатный рабо- чий режим. Второй режим (режим исполнения кода из UART) используется для перепрошивки флеш-памяти.
Глава 2. Модули на основе микроконтроллера ESP8266 95 ПРИМЕЧАНИЕ. Через UART-nopm к микроконтроллеру подключает- ся размещенная в компьютере программа, которая реализует функцию программатора. Для выбора какого-либо режима, нужно: ♦ установить на входах GPIOO, GPIO2 и GPIO15 нужные нам уровни (замкнуть входы на общий провод или подключить через резистор к шине питания); ♦ включить питание или, если питание уже включено, просто нажать и отпустить кнопку Reset. В момент прекращения действия сигнала сброса микропро- цессор переходит в выбранный вами режим. После этого выводы GPIOO, GPIO2 и GPIO15 можно освободить и использовать по их прямому назначению, как линии ввода/вывода. ПРИМЕЧАНИЕ. В модуле ESP-O1 вход GPIO15 постоянно соединен с общим проводом. Поэтому для выбора режима достаточно одной перемычки. При помощи этой перемычки можно соединить линию GPIOO с общим проводом. Пока перемычка не замкнута, на вход GPIO0 поступает высо- кий логический уровень благодаря подтягивающему резистору R1 (рис. 2.3). Перемычку можно заменить переключателем или нефиксируемой кнопкой. СОВЕТ. Использование именно перемычки оправдано, если вы не собираетесь часто менять прошивку про- граммной памяти. Кнопка нам понадобится при изучении главы 6. Там мы откажемся от стандартной прошивки (SDK) и будем прошивать в
96 Управление модулем ARDUINO по Wi-Fi с мобильных устройств программную память модуля программу, созданную в среде IDE (при работе без ARDUINO). В этом случае перепрошивать содер- жимое программной памяти нам придется часто. Например, при переходе от одного программного примера к другому. I Адаптеры для согласования модуля ESP-O1 с компьютером Адаптер для согласования модуля ESP-O1 с компьютером можно собрать самостоятельно по схеме, приведенной на рис. 2.3. Но проще купить готовый адаптер. В наше время в продаже име- ется довольно большой ассортимент самых разных вспомогатель- ных устройств для ESP-O1 и для других моделей линейки ESP. На рис. 2.5 показан самый, пожалуй, распространенный вариант адаптера, специально разработанного для использова- ния именно с модулем ESP-O1. Рис. 2.5. Адаптер для подключения ESP-O1 к компьютеру На рис. 2.6 показан тот же адаптер, но с установленным моду- лем. Как видите, получается очень удобная компактная конструк- ция, которую можно просто вставить в USB разъем на корпусе компьютера.
Глава 2. Модули на основе микроконтроллера ESP8266 97 Рис. 2.6. Адаптер с установленным на нем модулем ESP-01 ПРИМЕЧАНИЕ. Недостаток этого варианта адаптера в том, что в нем отсутствует перемычка для перевода в ре- жим программирования. Можно, конечно, дорабо- тать модуль, установив микропереключатель, но это будет не очень удобно, так как места для та- кого переключателя на модуле не предусмотрено. На рис. 2.7 показан второй вариант адаптера, с переключа- телем режимов. т Рис. 2.7. Адаптер с переключателем режимов, плюс модуль ESP-01
98 Управление модулем ARDUINO no Wi-Fi с мобильных устройств 2.3. Программирование модуля ESP-O1 на ARDUINO IDE Подключив модуль ESP-O1 к компьютеру через адаптер, можно проверить все режимы его работы при помощи АТ-команд. ПРИМЕЧАНИЕ. Как это сделать, мы подробно рассмотрим в главе 3. СОВЕТ. Если у адаптера есть переключатель режимов, то рекомендуем прошить в программную память мо- дуля свежую версию стандартной прошивки, кото- рую, например, можно скачать из сети Интернет. Адаптер с переключателем режимов позволяет также про- граммисту загружать в модуль свои программы. Как было сказано выше, микроконтроллер ESP8266EX — полноценный контроллер, способный решать достаточно широкий круг задач. На основе модуля ESP-O1 можно создавать миниатюрные устройства авто- матики, работающие автономно и управляемые по сети Wi-Fi. В этом случае не потребуется никаких дополнительных управляю- щих микроконтроллеров. Но тогда придется отказаться от стандартной заводской про- шивки (SDK). И использовать свою собственную прошивку. В этом нам поможет среда разработки «ARDUINO IDE», о чем подробнее мы расскажем в главе 6. ВНИМАНИЕ. На данном этапе рекомендую вам не менять про- шивку вашего ESP-модуля. Тем более не пытать- ся использовать среду IDE для непосредственного программирования ESP-O1. В главах 3-5 будет ис-
Глава 2. Модули на основе микроконтроллера ESP8266 99 пользоваться модуль именно с заводской прошивкой (Non-OS SDK). И лишь в главе 6 мы начнем интен- сивно ее перепрограммировать. Если вы все же изменили стандартную прошивку ESP-модуля, или вам достался модуль, над которым уже поколдовали другие программисты, и имеющий нестандартную прошивку, то вам придется ее восстановить. ПРИМЕЧАНИЕ. О том, как восстановить стандартную прошивку, а также как обновить прошивку на свежую версию, будет рассказано в разделе 2.4. 2.4. Подключение модуля ESP-O1 к модулю ARDUINO Особенности подключения | к модулю ARDUINO II Модуль ESP-O1 может подключаться не только к компьютеру, но и к другим управляющим модулям на основе микроконтроллера. В нашем случае нас интересует подключение ESP-O1 к модулю ARDUINO. Для такого подключения можно использовать описан- ную выше схему подключения, изображенную ранее на рис. 2.3. ПРИМЕЧАНИЕ. При подключении к ARDUINO нам не потребуется преобразователь «TTL-+USB». В модуле ARDUINO, также как и в ESP-O1, имеется последовательный канал UART.
100 Управление модулем ARDUINO no Wi-Fi с мобильных устройств I Соединение двух каналов UART и согласование уровней сигналов И в том, и в другом модуле канал UART работает с TTL уров- нями. Поэтому два модуля легко соединить между собой. Для соединения двух каналов UART нужно выход TxD одного канала подключить к входу (RxD) второго, и наоборот. Но в нашем слу- чае есть небольшая проблема — проблема в согласовании уровней сигналов. ВНИМАНИЕ. Модуль ARDUINO питается от напряжения +5 вольт. Соответственно, и уровни TTL сигналов у этого модуля имеют значение, близкое к пяти вольтам. Модуль ESP-01 питается от напряжения 3,3 вольта. Поэтому сигналы на его входах и выхо- дах не превышают 3,3 вольта. Опасность возника- ет, когда сигнал с выхода TxD модуля ARDUINO по- ступает на вход RxD модуля ESP-01. Поэтому на TxD выходе ARDUINO нужно поставить делитель напряжения, такой как показан на рис. 2.8. Делитель снизит уро- вень сигнала до 3,3 В. Схему подключения (рис. 2.3) с подключен- ным делителем (рис. 2.8) необходимо оформить в виде отдель- ной платы-переходника. Модуль ESP-01 вставляется в разъем переходника, а сам пере- ходник соединяется с модулем ARDUINO при помощи четырех проводников: ♦ два провода канала UART; ♦ плюс питания; ♦ общий провод. ПРИМЕЧАНИЕ. Питание переходника удобно подключить к источ- нику +5 вольт модуля ARDUINO. Как подключать остальные сигналы, надеюсь, понятно.
Глава 2. Модули на основе микроконтроллера ESP8266 101 GND Рис. 2.8. Делитель для согласования сигналов ARDUINO и ESP-01 Схемы | переходников II В Интернете и в магазинах электронных комплектующих можно купить готовый переходник, схема которого аналогична описанной выше. На рис. 2.9 показан внешний вид одного из вариантов такого переходника. Модуль ESP-01 устанавливается на специальный разъем. Для подключения к внешним устройствам переходник снабжен четы- рехконтактным штыревым разъемом. При помощи этого разъ- ема можно подключить модуль ESP-01 к модулю ARDUINO или к любому другому микроконтроллерному модулю. На рис. 2.10 показан тот же переходник с установленным на нем модулем ESP-01. Рис. 2.9. Переходник для подключения модуля ESP-01 к ARDUINO Рис. 2.10. Переходник с установленным модулем ESP-01
102 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Кабели для ARDUINO СОВЕТ. Для соединения модуля ARDUINO и других модулей друг с другом удобно использовать выпускаемые со- временной промышленностью специальные плоские кабели с разъемами на концах (смотри рис. 2.11). Эти кабели обычно продают под названием «Кабели для ARDUINO». Каждый такой плоский кабель имеет длину 21 см и содержит 40 изолированных проводников, склеенных друг с дру- гом. На обоих концах каждой жилы имеется отдельный однокон- тактный разъем. Это может быть штыревой разъем (на радиолю- бительском жаргоне — «Папа»), а может быть гнездо для штыре- вого разъема («Мама»). Есть три варианта кабеля, различающихся разъемами: ♦ «Папа-Папа»; ♦ «Папа-Мама»; ♦ «Мама-Мама», Изоляционная оболочка каждого провода в кабеле раскра- шена в свой отдельный цвет. Два соседних провода всегда разного цвета. Это облегчает визуальное прослеживание цепей в готовом устройстве. Провода в кабеле легко отделяются друг от друга. Вы можете отсчитать нужное вам количество жил и аккуратно отде- лить часть кабеля вдоль его проводников. В результате вы полу- чите плоский кабель с нужным вам количеством проводников. Рис. 2.11. Кабели для соединения модулей между собой
Глава 2. Модули на основе микроконтроллера ESP8266 103 Как можно обойтись II и без проводов? II Можно обойтись и без каких-либо проводов. Очень удобная универсальная плата для разработки устройств любой сложно- сти с использованием модулей ARDUINO и ESP-01 приведена на рис. 2.12. Рис. 2.12. Универсальная переходная плата для модулей ARDUINO и ESP-01 Переходная плата устанавливается прямо на плату ARDUINO UNO. Она совместима по всем разъемами, и каж- дый контакт переходной платы попадает в свое гнездо разъема модуля ARDUINO. Модуль ESP-01 устанавливается в специальный разъем на переходной плате. На плате установлены: ♦ стабилизатор LM1117; ♦ цепи согласования; ♦ дополнительная кнопка RESET для сброса ESP-01; ♦ кнопка REFLESH для перевода модуля в режим программиро- вания. А также на плате выполнены все соединения между модулями ARDUINO и ESP-01. Кроме того, на переходной плате имеется небольшое кон- тактное поле, состоящее из набора металлизированных отвер-
104 Управление модулем ARDUINO по Wi-Fi с мобильных устройств стий. На этом поле вы можете выполнить монтаж своей, разраба- тываемой лично вами, схемы. ПРИМЕЧАНИЕ. 1 N На этой переходной плате имеются разъемы, дублирующие все аналогичные разъемы модуля ARDUINO, которые можно использовать для под- ключения к ARDUINO внешних управляемых цепей. Имеются в продаже и другие вспомогательные платы, которые можно использовать при разработке своих проектов. Например, на фото (рис. 2.13) показаны переходные платы, при помощи кото- рых легко поместить модуль ESP-01 на макетном поле, на котором собирается макет разрабатываемого устройства. На макете удобно производить отладку и доводку как схемы, так и программы. Рис. 2.13. Переходные платы для макетных работ с ESP-01 Показаны два варианта комплектации: ♦ с припаянными разъемами; ♦ с не припаянными разъемами (в комплекте). Во втором случае вы можете припаять разъемы разными спо- собами, в зависимости от ваших задач. На фото (рис. 2.14) пока- зана плата электронного реле с управлением от модуля ESP-01. Модуль ESP-01 с прошитой в него специальной программой уста- навливается на эту плату. В результате получается автономное реле с управлением по Wi-Fi каналу, которое может коммути- ровать различные силовые сети.
Глава 2. Модули на основе микроконтроллера ESP8266 105 Рис. 2.14. Плата беспроводного реле с управлением от ESP-01 ПРИМЕЧАНИЕ. Например, такое устройство можно встроить в светильник и удаленно включать его и выключать при помощи системы «Умный дом». Или даже через «Интернет вещей» (1оТ)! На фото (рис. 2.15) изображена плата с датчиком темпера- туры и влажности. Плата имеет разъем для установки модуля ESP-01. В результате получается автономный беспроводной Рис. 2.15. Плата беспроводного датчика погоды
106 Управление модулем ARDUINO по Wi-Fi с мобильных устройств датчик для системы контроля погоды. Плата требует лишь внешнего питания, в качестве которого можно использовать: ♦ или батарейку 3,3 В; ♦ или блок питания от мобильного телефона (+5 В). ВНИМАНИЕ. Все вспомогательные платы, перечисленные выше, специально разработаны для использования со- вместно с модулем ESP-01. Другие модели ESP мо- дулей имеют совершенно другое расположение кон- тактов, и поэтому использование описанных выше плат для них затруднительно. Для них, к сожалению, почти не существует готовых модулей расширения. Преимущество более продвинутых вариантов ESP-модулей — их миниатюрность. Предполагается, что разработчик, применяю- щий эти модули для каждого конкретного случая, будет разраба- тывать свою уникальную печатную плату, имеющую свою уни- кальную схему и конструкцию. Хотя кое-что использовать можно. На рис. 2.16 показаны два варианта универсальных адапте- ров, которые можно использовать для подключения к компью- 15 см /1,8 см Рис. 2.16. Универсальные адаптеры для подключения ESP-модулей к компьютеру
Глава 2. Модули на основе микроконтроллера ESP8266 107 теру любых моделей ESP-модуля. Но, все равно, без специально разработанной переходной платы не обойтись. Все вышеописанные дополнительные модули можно купить на радиорынках и в магазинах радиокомпонентов, а также в раз- личных Интернет-магазинах. Например, на сайте AliExpress [23]. Для перехода по указанной в тексте ссылке [23] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. 2.5. Обновление и восстановление прошивки ESP-модуля Подготовка II к практической части курса II ПРИМЕЧАНИЕ. В заключение главы 2 очень важно сказать следую- щее: наша книга рассчитана на то, что читатель для лучшего усвоения теоретической информации обязательно будет повторять все предложенные программные примеры на практике. Поэтому рассчитываю, что у каждого нашего читателя обяза- тельно есть набор инструментов и оборудования для повторе- ния схем и программ. И, в первую очередь, для этого нужен стандартный персо- нальный компьютер. Обычный современный компьютер мини-
108 Управление модулем ARDUINO по Wi-Fi с мобильных устройств мальной конфигурации. Мощная видеокарта, принтеры, сканеры, мониторы с большой диагональю не обязательны. Второе, что нужно для практического освоения материалов книги, — наличие смартфона или планшета, работающих под управлением операционной системы Андроид (Android). Все приложения, которые использовал автор при составлении учебных примеров для этой книги, работают под управлением именно этой операционной системы. ПРИМЕЧАНИЕ. 1 N Существуют ли версии тех же приложений, рабо- тающие под управлением других ОС, автору не из- вестно. |Что еще нужно приобрести для успешной работы Кроме компьютера и смартфона (планшета), для практиче- ского изучения программ читатель должен приобрести исполь- зуемые в книге микроконтроллерные модули: ♦ микроконтроллерный модуль ARDUINO UNO. В комплекте с модулем необходимо иметь соответствующий USB кабель для подключения модуля к компьютеру. Такой кабель обычно ис- пользуется для подключения к компьютеру любого современ- ного принтера и свободно продается в любом компьютерном магазине; ♦ модуль ESP-01. Теоретически возможно использовать любой ESP-модуль, ведь они отличаются только конструктивно. Но именно ESP-01 используется в книге во всех обучающих при- мерах; ♦ адаптер для подключения модуля ESP-01 к USB порту ком- пьютера с возможностью перевода модуля в режим програм- мирования. Например, такой модуль, как показан на рис. 2.7. Если точно такого приобрести не удастся, то можно купить простой адаптер, такой, как показан на рис. 2.5, и доработать его, припаяв переключатель режимов и кнопку сброса. Как это сделать, расскажу чуть позже;
Глава 2. Модули на основе микроконтроллера ESP8266 109 переходник для подсоединения модуля ESP-01 к модулю ARDUINO. Его можно приобрести, а можно спаять самому. Подробнее об этом будет рассказано в главе 4; дополнительный адаптер для подключения модуля ESP-01 к USB порту компьютера, такой, как показано на рис. 2.16. Он понадобится вам в главе 4. Там будет описан способ отладки программы для модуля ARDUINO, управляющей ESP-модулем при помощи АТ-команд. ПРИМЕЧАНИЕ. В процессе отладки используется сразу два адап- тера. При помощи одного из них мы будем наблю- дать на компьютере АТ-команды, посылаемые моду- лем ARDUINO на модуль ESP-01, а при помощи дру- гого - увидим ответы ESP-модуля, посылаемые на ARDUINO. Поговорим II о прошивке I Модуль ESP-01 должен иметь стандартную прошивку (Non-OS SDK). Если прошивка нестандартная или имеет устаревшую версию, то может возникнуть необходимость ее обновить (прошить новую). ПРИМЕЧАНИЕ. Подробное описание процесса прошивки было реше- но поместить именно в этом месте книги. Хотя, скорее всего, прошивку обновлять не придется. В большинстве случаев модули продаются с заводской про- шивкой, а модули с устаревшими прошивками давно уже не про- изводятся. Но если все-же вам не повезет, и купленный вами модуль окажется прошит неправильно, это может поставить начинающего конструктора в тупик. Поэтому расскажу все по порядку о том, как прошить модуль ESP-01.
110 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Подключение модуля ESP-01 к компьютеру для прошивки Для того чтобы иметь возможность прошивать программ- ную память модуля ESP-01, необходимо для начала подключить модуль к компьютеру. Сделать это можно при помощи подходя- щего USB адаптера. ВНИМАНИЕ. Этот адаптер обязательно должен иметь пере- ключатель, переводящий модуль ESP-01 в режим программирования. Самый подходящий для этого адаптер с переключателем изображен на рис. 2.7. Как видно из фото, адаптер как раз имеет переключатель РАБОТА/ПРОГРАММИРОВАНИЕ. Но часто такого адаптера нет под рукой. В продаже чаще можно встретить адаптер без переключа- теля, такой как показан на рис. 2.6. Этот адаптер предназна- чен для работы без изменения прошивки. Такой адаптер тоже можно использовать. Но вам придется его немного доработать. Миниатюрный переключатель РАБОТА/ПРОГРАММИРОВАНИЕ можно распаять прямо на контакты разъема адаптера, как это показано на рис. 2.17. Такой доработанный адаптер, имеющий переключатель режи- мов РАБОТА/ПРОГРАММИРОВАНИЕ, уже вполне можно исполь- зовать для перепрошивки модуля. Но при этом останется одно неудобство. Отсутствие кнопки сброса. Рис. 2.17. Доработка платы адаптера для модуля ESP-01
Глава 2. Модули на основе микроконтроллера ESP8266 111 Для чего желательна | кнопка сброса? II Мы уже говорили ранее, что установка режима происходит либо в момент включения питания, либо по окончании сигнала начального сброса. Наш же адаптер не имеет кнопки сброса!!! Без КНОПКИ СБРОСА каждый раз после переключения режи- мов вам придется отключить его от USB порта, а затем включить обратно. Вернее, это потребуется только при выборе режима про- граммирования. Назад в рабочий режим модуль автоматически возвращается сразу после завершения процесса прошивки. ВНИМАНИЕ. Несмотря на вышесказанное, рекомендуем все же после перепрошивки всегда возвращать переключа- тель в режим «Работа». СОВЕТ. Для того чтобы не отключать адаптер каждый раз перед программированием, можно временно на контакты разъема припаять кнопку сброса. Правда, на разъем адаптера ее припаять будет сложно. Там уже припаян переключатель режимов. Проще при- паять ее к разъему самого ESP-модуля, как это по- казано на рис. 2.18. Рис. 2.18. Кнопка сброса но контактах модуля ESP-01
112 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Такой вариант даже удобнее. Мы получим модуль с кнопкой сброса, которой можно будет воспользоваться и в других ситу- ациях. Например, когда модуль будет установлен в переходную плату и подключен к ARDUINO. I Установка среды разработки IDE Следующее, что нужно сделать перед тем, как начинать про- цесс прошивки, — это, как ни парадоксально, установить на компьютер среду разработок для ARDUINO (в английском сокращении — IDE). Этот программный продукт в основном нам понадобится в главах 3—6. Именно в этой среде мы будем раз- рабатывать все наши программы. Сейчас же эта среда поможет нам: ♦ узнать версию прошивки и конфигурацию ESP-модуля; ♦ проверить работоспособность новой прошивки после того, как мы ее зальем. При установке среды IDE на компьютер инсталляционная программа одновременно установит драйвер для USB-COM порта, который используется в IDE для общения ARDUINO и компьютера. При подключении ARDUINO к компьютеру этот драйвер соз- дает в компьютере виртуальный СОМ порт. Через этот порт происходит общение IDE с ARDUINO. Этот же драйвер прекрасно будет работать и со всеми USB адаптерами, которые мы будем использовать для подключения к компьютеру модуля ESP-O1. ПРИМЕЧАНИЕ. Драйвер способен работать с несколькими USB адаптерами одновременно. Для каждого из адапте- ров драйвер создаст свой виртуальный СОМ порт. Главное же, зачем нам понадобится среда IDE, — входящий в эту программу монитор последовательного порта. Монитор встроен в среду IDE и позволяет:
Глава 2. Модули на основе микроконтроллера ESP8266 113 ♦ посылать любые текстовые сообщения в последовательный канал; ♦ отображать полученные из последовательного канала ответы. Мы будем использовать монитор для подачи AT-команд на наш ESP-модуль и для получения от ESP-модуля ответов. Скачать инсталляционный пакет для установки программы IDE можно на сайте ARDUINO.ru [14] в разделе «Среда разра- ботки». Там же можно узнать, как правильно выбрать версию IDE для вашей операционной системы и выяснить порядок ее уста- новки. Процесс установки IDE подробно описан во вступительной главе этой книги, а так же в [1]. Для перехода по указанной в тексте ссыл- ке [14] запустите приложение «Сканер QR и штрих-кодов» на смартфоне (план- шете) и наведите его камеру на располо- женное рядом изображение QR-кода. Настройка IDE II на компьютере I После установки IDE на компьютер нужно его настроить. Для этого следует подключить ESP-модуль к компьютеру при помощи USB-адаптера. При правильном подключении адаптера в ком- пьютере должен появиться новый виртуальный СОМ-порт. Чтобы его увидеть, откройте пункт меню «Компьютер/ Диспетчер устройств». В списке устройств откройте раздел «Порты СОМ и LPT». В нем вы должны увидеть новый порт. Порт будет иметь примерно такое название: «USB-SERIAL CH340». В скобках после названия будет указан номер этого порта (например, С0М5). Затем, запустите программу IDE, выберите пункт меню «Параметры/Порт», а в списке портов выберите виртуальный порт, связанный с ESP-модулем. В нашем случае это «С0М5».
114 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ВНИМАНИЕ. Виртуальный порт, созданный USB-COM адапте- ром, существует только тогда, когда ESP-модуль подключен к компьютеру. При отключении модуля, порт исчезает, и выбрать его не удастся. Теперь нужно запустить монитор порта. Для этого щелкните мышкой по иконке с изображением лупы Щ в верхнем правом углу окна IDE. Откроется окно монитора порта. В нижней правой части окна монитора порта при помощи двух специальных кно- пок выставьте параметры: и Загрузка SDK СОВЕТ. Если вы хотите прошить в ваш модуль самую све- жую версию SDK, вам нужно обратиться к сайту производителя [27]. Для перехода по указанной в тексте ссылке [27] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Входить на сайт следует при помощи компьютера. На сайте espressif.com [27] перейдите по ссылке: Products -+ ESP8266 Module -»Resources. В браузере с переводчиком это будет выглядеть так: Продукты —► Модуль ESP8266 —> Ресурсы.
Глава 2. Модули на основе микроконтроллера ESP8266 115 Откроется страница ресурсов, которые вы можете загру- жать с сайта для работы с микросхемой ESP8266. Можете вос- пользоваться прямой ссылкой на страницу ресурсов микросхемы ESP8266 [25]. На странице ресурсов имеются следующие разделы: ♦ SDKs & Demos — Пакеты SDK и демонстрационные программы; ♦ Tools — Инструментальные программы; ♦ Documentation —Документация; ♦ AT — Интерпретаторы АТ-команд (в виде bin-файлов). Справа, напротив каждого раздела, вы увидите значок 0- Это кнопка раскрытия содержимого раздела. Раскройте раздел SDK & Demos. Там вы найдете все последние версии SDK. Выберите и загрузите одну из последних версий SDK. ПРИМЕЧАНИЕ. Учтите, что выбирать нужно среди Non-OS SDK, рассчитанных на работу с микросхемой ESP8266, версии не менее vl.3.0. Все это можно определить по названию пакета. ВНИМАНИЕ. Иногда выбранная версия SDK может не заработать на вашем ESP-модуле, ведь некоторые версии не под- держивают нужное вам распределение памяти. В этом случае вам придется выбрать другую версию. Каждый пакет SDK представляет собой ZIP-архив, который содержит набор папок и файлов. Структуру этих папок мы под- робно рассматривали в главе 1. Как уже говорилось, из всех этих папок нам понадобится лишь папка Мл, в которой содержатся бинарные файлы, полученные при компиляции SDK.
116 Управление модулем ARDUINO по Wi-Fi с мобильных устройств СОВЕТ. Для удобства вы можете скопировать эту папку куда-нибудь поближе, например, в папку work в кор- невом каталоге рабочего диска. Если вы откроете эту папку bin, то увидите там целый набор bin-файлов и дополнительных подкаталогов. Это откомпили- рованные, готовые к работе части программы SDK, из которых нужно выбрать те, что предназначены именно для нашей конфи- гурации модуля. А затем следует прошить их в его программную память. Каждый фрагмент программы прошивается в строго отве- денное для нее место. Для разных конфигураций нужно выби- рать разный набор файлов. При этом для каждой конфигурации используется своя схема их размещения в памяти. Поэтому сна- чала нужно определить конфигурацию вашего модуля. I Определение конфигурации модуля ESP-O1 Модули ESP-O1 могут отличаться друг от друга своими пара- метрами. В основном они отличаются объемом и схемой распре- деления памяти. Более новые модули обычно имеют больший объем памяти программ: Причем, определить конфигурацию модуля без помощи компьютера невозможно. Для того чтобы узнать конфигурацию вашего модуля, подклю- чите модуль к адаптеру, вставьте адаптер в USB порт компьютера. На компьютере запустите среду разработок IDE. Откройте мони- тор последовательного порта (кнопка @ в верхнем правом углу окна программы). В окне монитора порта нужно подать на ESP-модуль пару АТ-команд.
Глава 2. Модули на основе микроконтроллера ESP8266 117 ПРИМЕЧАНИЕ. Подробно АТ-команды мы будем изучать в следующей главе. А пока верхней узкой строке монитора порта просто наберите «AT+GMR». Наберите только эти символы (без кавычек). Никаких пробелов не допуска- ется. Затем щелкните мышкой кнопку «Отправить». ч. у В средней части окна монитора порта появится ответ от ESP- модуля. В ответе содержится информация: ♦ о версии SDK; ♦ о версии АТ-команд. Запомните эти данные. Затем наберите вторую АТ-команду: «AT+RST» (снова без пробелов и кавычек). Нажмите «Отправить». В ответ вы получите длинное много- строчное сообщение. Нас интересует лишь несколько строк, которые будут выведены ближе к концу сообщения. Они должны выглядеть примерно так: ♦ 2nd boot version : 1.4(bl) ♦ SPI Speed : 40MHz ♦ SPI Mode : QIO ♦ SPI Flash Size & Map: 8Mbit(512KB+512KB) Это и есть конфигурация нашего модуля. Из этих четырех строчек мы узнаем, что: ♦ вторичный загрузчик модуля имеет версию 1.4(Ы); ♦ микросхема работает на частоте 40 МГц; ♦ микросхема имеет память 8 Мбит (что составляет 1 Мбайт); ♦ распределение памяти модуля — 512КВ+512КВ (512 Кбайт на программу и 512 Кбайт на данные). Все эти параметры мы и будем использовать далее при выборе варианта прошивки и параметров программатора. Структура папки bin | и правила использования ее содержимого I Теперь, когда мы знаем конфигурацию нашего ESP-модуля, разберемся с bin файлами SDK и порядком их прошивки. Откроем
118 Управление модулем ARDUINO по Wi-Fi с мобильных устройств папку bin. Примерное содержимое папки показано на рис. 2.19. Как видите, в корне папки bin расположены: ♦ четыре bin-файла; ♦ две папки. Файлы boot_vl.2.bin и boot_yl.4(bl).bin — это два варианта загрузчика. Файл espJnit^data^defaulLbin — это блок данных (набор пара- метров используемых по умолчанию). Файл ЫапкМп — это пустой блок. Четыре килобайта, запол- ненные кодом OxFF. Один или несколько таких блоков обяза- тельно должны быть включены в итоговую конфигурацию про- шивки SDK. Папка upgrade пуста. Она предназначена для обновлений. Папка at содержит несколько версий интерпретатора АТ-команд. Все версии разделены на три группы и помещены в три папки: ♦ первые две папки содержат версии интерпретаторов для двух разных схем распределения памяти (схемы 512+512 и схемы 1024+1024); ♦ третья папка (noboot) содержит версии интерпретатора, ра- ботающую без модуля начальной загрузки. Компьютер f фп V$userU024.new.2 1024+1024 noboot г её time (:!v? blank фЬогЛ^ЛАЫ) tftfift Уя£;;ентс?:сшк Рис. 2.19. Содержимое папки bin проекта SDK
Глава 2. Модули на основе микроконтроллера ESP8266 119 Ранее мы выяснили, что наш модуль поддерживает распределе- ние памяти 512+512. Поэтому будем использовать файлы из соответ- ствующей папки. На рис. 2.19 показано содержимое папки «512+512». Как видите, в этой папке всего два файла. Это два варианта интер- претатора. Они реализуют разные версии набора АТ-команд. Вопрос. А как в этом всем разбираться, какие версии Ып-файлов выби- рать и в какие области памяти их прошивать? На этот вопрос нам даст ответ текстовый файл readme.txt, раз- мещенный в корне папки at В этом файле в сжатом, но вполне понятном формате описаны схемы загрузки файлов для разных вариантов конфигурации вашего ESP-модуля. Для разных объ- емов памяти и разных схем ее распределения. Нас будет интересовать схема прошивки для объема памяти 8 Мбит и распределения 512+512. Эта запись выглядит следую- щим образом: Flash size 8Mbit: 512KB+512KB boot_vl.2+.bin ' 0x00000 userl.1024.new.2.bin 0x01000 esp_init_data_default.bin0xfc000 (optional) blank.bin 0x7e000 & OxfeOOO Запись означает следующее: для выбранной нами конфигу- рации (8Mbit: 512KB+512KB) необходимо записать содержимое файла boot_vl.2+.bin в программную память, начиная с нулевого адреса (0x00000); содержимое файла userl.lO24.new.2.bin поме- стить в память с адреса 0x01000, содержимое файла esp_init_data_ defaultbin с адреса OxfeOOO. ПРИМЕЧАНИЕ. Слово optional означает, что при желании вы може- те не использовать начальные установки по умолча- нию, которые помещены в этот файл. Ну, а содержи- мое файла blank.bin нужно поместить в два места: начиная с адреса 0х7е000 и начиная с адреса OxfeOOO.
120 Управление модулем ARDUINO по Wi-Fi с мобильных устройств СОВЕТ. Если набор АТ-команд вас не устраивает, то вме- сто файла userl.lO24.new.2.bin вы можете попро- бовать взять файл user2.1024.new.2.bin. Файл readme.txt имеется в каждом комплекте SDK. Он всегда находится в папке bin\at. I Программа- программатор Итак, мы разобрались, где какие файлы брать и куда про- шивать. Теперь осталось узнать, при помощи какой программы можно это сделать. Фирма Espersif предлагает для этих целей спе- циальную программу, которая называется «FLASHJDOWNLOAD_ TOOLS» (далее, для простоты будем говорить «Программа- программатор»). Последнюю версию программы можно скачать с сайта фирмы [27]. Для этого нужно снова открыть страницу Ресурсов на сайте espressif.com (мы обращались к ней в разделе «Загрузка SDK»). Теперь на этой странице необходимо развернуть раздел Tools. Откроется список программных инструментов. ВИРТУАЛЬНЫЙ ДИСК. 1 N При желании можно скачать эту программу с вир- туального диска. На диске имеется программа вер- сия 3.6.4. Это та самая версия, которая использова- лась при подготовке книги. Скачанная с сайта программа представляет собой ZIP-архив, содержащий папку со всеми необходимыми файлами. Вы должны просто извлечь папку с программой из архива и разместить в любом месте на жестком диске вашего компьютера. Затем вой- дите в папку и запустите исполняемый файл программы. В нашем случае он будет называться ESPFlashDownloadTooljr3.6.4.exe.
Глава 2. Модули на основе микроконтроллера ESP8266 121 Сначала откроется меню (рис. 2.20), в котором вы должны выбрать тип прошиваемого микроконтроллера. Выберите пункт «ESP8266 DownloadTool». Откроется окно программы, изображен- ное на рис. 2.21. Одновременно с окном меню (рис. 2.20) откро- ется второе синее окно на заднем плане. Оно останется открытым и тогда, когда откроется основное окно (рис. 2.21). Рис. 2.20. Меню выбора типа микроконтроллера ПРИМЕЧАНИЕ. Это технологическое окно, не обращайте на него внимание. Теперь необходимо заполнить все поля так, как показано на рис. 2.21. В верхней части окна вы видите набор строк. В каждую нужно внести полный путь к одному из нужных нам bin-файлов. Тех самых файлов, с которыми мы определились выше.
122 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 2.21. Основное окно программатора СОВЕТ. Имя и путь файла не обязательно вписывать вруч- ную. У каждого поля списка есть кнопка выбора файла. Нажмите ее, и в открывшемся окне найдите и выберите нужный файл. В маленьком поле справа от поля имени, наберите адрес, куда содержимое файла нужно поместить. Если файл и адрес выбраны правильно, то строчка подсветится зеленым цветом. В случае ошибки — красным. В начале каждой строки есть поле выбора. Чтобы набранные в строке параметры вступили в силу, нужно поставить «птичку» в начале этой строки. Не смотря на то, что файл read.me советует загрузить в память программ содержимое трех файлов плюс два раза файл blank.bin, на рис. 2.21 заполнена еще одна строка.
Глава 2. Модули на основе микроконтроллера ESP8266 123 ПРИМЕЧАНИЕ. В этой строке по адресу 0x81000 в память запи- сывается второй вариант интерпретатора АТ- команд. Такую конфигурацию предложил один из авторов. Если активировать и эту строчку то в прошивке будут использоваться сразу два АТ- интерпретатора. При желании можете попробо- вать такой вариант прошивки. Но мы не стали ак- тивизировать эту строку. После заполнения списка загружаемых модулей, настройте и другие параметры программы. Обязательно укажите: ♦ объем памяти модуля (8 Мбит); ♦ схему ее распределения (512+512) в соответствующих полях в средней части окна программатора. ВНИМАНИЕ. Не забудьте выбрать СОМ-порт. Номер порта останется такой же, какой мы выбрали при на- стройке среды IDE. Приступаем II к программированию II После того, как все параметры выставлены, можно пере- ходить к программированию. Подключите модуль ESP-O1 к USB-адаптеру, переведите переключатель режимов адаптера в положение ПРОГРАММИРОВАНИЕ, подключите адаптер к ком- пьютеру. Нажмите кнопку «START» в основном окне программы- программатора. Начнется процесс программирования. Ход этого процесса будет отображаться внизу основного окна программы-программатора в виде полосы прогресса. По оконча- нии процесса программирования, модуль автоматически пере- йдет в рабочий режим, и прошитая программа начнет выпол- няться.
124 Управление модулем ARDUINO по Wi-Fi с мобильных устройств СОВЕТ. Несмотря на то, что программа уже работает, ре- комендую по окончании процесса программирова- ния обязательно сразу перевести переключатель режима на адаптере в положение «Работа». После того, как SDK прошито, нужно проверить его работу. Для этого в мониторе порта нужно набрать короткую АТ-команду, состоящую лишь из двух символов: «AT». Эту команду тоже нужно набирать без пробелов и опустив кавычки. Если в ответ на «AT» вы получите «ОК», то SDK — прошилось и работает нормально. Если модуль с новой прошивкой не работает, проверьте пра- вильность заполнения всех параметров и, при необходимости, повторите прошивку. Можно также попробовать выбрать другую версию основного загрузчика или интерпретатора AT-команд.
ГЛАВА 3 РАБОТА С МОДУЛЕМ ESP-O1 ПРИ ПОМОЩИ АТ-КОМАНД В данной главе мы изучим язык АТ-команд, научимся вручную подавать эти команды на модуль ESP-O1 и при помощи них управлять модулем. В главах 4 и 5 мы будем составлять про- граммы для модуля ARDUINO, которые автоматически при помощи этих же АТ-команд будут управлять тем же модулем ESP-O1, устанавливая, таким образом, связь по Wi-Fi каналу со смартфоном или планшетом.
126 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 3.1. Система АТ-команд ESP-модуля I Принцип функционирования системы АТ-команд Как уже говорилось выше, модули ESP-O1 с заводской про- шивкой (NonOS SDK), как и остальные модули этой линейки (от ESP-O2 до ESP-13), могут управляться при помощи АТ-команд. Система АТ-команд в свое время была придумана для управления телефонным модемом. Команды были разработаны таким образом, что при их помощи можно было управлять модемом, посылая их в общем потоке данных. В те времена телефонный модем подключался к компьютеру при помощи СОМ-порта. Как вариант, модем используется для связи двух компьюте- ров при помощи телефонной линии связи. Компьютер посылает в модем (тогда это делалось через СОМ-порт) поток данных. Модем преобразовывает каждый байт потока данных в звуко- вые сигналы. На другом конце телефонной линии другой модем преобразует звуковые сигналы обратно в байты, и они (также через СОМ-порт) поступают в другой компьютер. Сейчас модем с компьютером обычно соединяются посред- ством USB-порта. Задачей разработчиков АТ-команд было при- думать для них такой формат, чтобы их можно было посылать через тот же канал, через который посылается основной поток информации. При этом модем должен иметь возможность выде- лять команду в потоке данных, дешифрировать и выполнять ее. Сама АТ-команда не должна попадать в телефонную линию. При помощи АТ-команд производится настройка и переключе- ние режимов работы модема. Затем АТ-команды начали исполь- зоваться и в других электронных устройствах управляемых по последовательному каналу. В модулях ESP также используются АТ-команды. Их, оказа- лось, удобно применять в том случае, когда модуль работает под управлением внешнего компьютера или микроконтроллера. Как уже говорилось выше, ESP-модуль можно при помощи дополни- тельного USB-COM адаптера подключить к персональному ком- пьютеру.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 127 Передавая АТ-команды через USB порт от компьютера в модуль можно осуществлять настройку модуля, переключение режимов его работы. Можно даже заставить модуль передавать и принимать информацию по Wi-Fi каналу. При этом передавае- мая информация будет поступать с компьютера, а полученная из Wi-Fi информация поступит назад на компьютер. Режимы, II управляемые АТ-командами II Какие же режимы можно переключать в модуле ESP-O1 при помощи АТ-команд? Главное, при помощи этих команд произ- водится управление Wi-Fi подсистемой модуля. Встроенная Wi-Fi подсистема модуля ESP-O1 может работать: ♦ как точка доступа; ♦ как Wi-Fi клиент, который, в свою очередь, может подклю- чаться к внешней точке доступа. ПРИМЕЧАНИЕ. Стоит отметить, что модуль может работать в двух этих режимах одновременно. Кроме того, стандартная прошивка модуля содержит про- граммные средства для поддержки основных протоколов работы Интернета и Wi-Fi сетей (протоколов TCP и UDP). Используя эти протоколы можно устанавливать соединение с другими микро- контроллерными системами, имеющими Wi-Fi адаптеры. При этом при помощи АТ-команд можно выбирать: ♦ протокол (TCP или UDP); ♦ тип соединения (TCP сервер либо ТСР-клиент); ♦ режим (моно пользовательский либо многопользовательский); ♦ другие параметры связи. После того, как связь установлена, при помощи тех же АТ-команд можно отправлять и принимать сообщения по Wi-Fi каналу.
128 Управление модулем ARDUINO no Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. В качестве бонуса в программное обеспечение ESP-модуля заложена возможность при помощи АТ- команд устанавливать уровни сигнала на линиях ввода/вывода микроконтроллера, а также считы- вать уровень сигналов на этих же линиях, когда они работают как входы. I Приобретаем модуль ESP-O1 и переходник Далее в этой книге, вплоть до главы 5, мы будем использо- вать АТ-команды. Сначала мы научимся при помощи АТ-команд управлять модулем ESP-O1, переключать режимы, устанавливать параметры, передавать и получать информацию. Затем мы нау- чимся составлять программы для ARDUINO, которые при помощи тех же АТ-команд будут автоматически управлять ESP-модулем. Рекомендую прежде, чем продолжить чтение этой книги, приобрести: ♦ модуль ESP-O1; ♦ переходник для подключения модуля к компьютеру по USB- интерфейсу. Затем нужно подключить модуль к компьютеру через интер- фейс и далее, по ходу изучения материала, повторять все описы- ваемые в книге действия на практике. В этой главе будут даны конкретные пошаговые инструк- ции, при помощи которых вы сможете запустить модуль последо- вательно в каждом из режимов работы, и тут же проверить работу модуля на практике. СОВЕТ. В качестве адаптера для подключения ESP-O1 к компьютеру удобнее всего использовать один из готовых покупных адаптеров, показанных на рис. 2.5-2.7.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 129 Кроме ESP-модуля и адаптера, вам понадобится мобильное устройство, которое сможет выступить вторым абонентом, с которым наш модуль будет устанавливать связь по Wi-Fi каналу. Для этой цели подойдет любой современный смартфон или план- шет с ОС Android на борту. ПРИМЕЧАНИЕ. Использование мобильных устройств, работающих под управлением другой операционной системы, в данной книге не рассматривается. Если выбирать между планшетом и смартфоном, то предпочте- ние нужно отдать смартфону Начинаем работу с Wi-Fi модулем, | ставим программное обеспечение I Если все вышеописанные устройства имеются в наличии, можно начинать практический урок работы с Wi-Fi модулем. В процессе этого урока мы будем: ♦ устанавливать соединение в различных режимах между ESP- модулем и смартфоном; ♦ передавать данные как от смартфона к модулю, так и от мо- дуля к смартфону. Для того чтобы смартфон мог принимать и посылать данные, вы должны скачать и установить на него специальное прило- жение, которое позволит вам работать с протоколами TCP и UDP. Строго говоря, в любом смартфоне уже установлено подобное приложение. Для обмена информацией по протоколам TCP и UDP может использоваться любой Интернет браузер. Но для полноценной работы Интернет-браузера на стороне ESP модуля должен быть установлен WEB-сервер с загруженной WEB-страницей. Стандартная прошивка модуля (NonOS SDK) WEB-сервера не содержит, а создать хотя бы простейший эму- лятор WEB-сервера при помощи АТ-команд довольно сложная задача для начинающего разработчика.
130 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Поэтому для работы с TCP протоколом в нашем случае удобнее использовать специально разра- ботанное для таких целей простое приложение. Например, приложение «TCP/UDP TEST TOOL». В пе- реводе на русский, это звучит примерно как «Набор инструментов для тестирования TCP/UDP». Долее по тексту для краткости мы будем называть при- ложение просто: «TEST TOOL». Для того чтобы быстро найти и загрузить приложение, просто отсканируйте камерой вашего смартфона (планшета) приведен- ный здесь QR-код [S]. Для перехода по указанной в тек- сте ссылке [5] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Смартфон сам найдет страницу загрузки приложения на Google Play, и вы сразу сможете начать процесс установки. На рис. 3.1 показана страница загрузки приложения «TCP/ UDP TEST TOOL» сайта Google Play. Приложение «TEST TOOL» содержит набор утилит для полной и всесторонней проверки и тестирования каналов связи по прото- колам TCP и UDP. Весь набор утилит мы можем видеть в основном меню программы (рис. 3.2). Это меню открывается сразу после запуска приложения. ПРИМЕЧАНИЕ. Для работы нам понадобятся не все эти утилиты. Назначение и порядок использования нужных нам утилит мы будем описывать в процессе изучения материала книги.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 131 TCP/UDP TEST TOOL immmmmm i Что нового ^^^^ВтЩ^^^^р Рис. 3.1. Загрузка приложения TCP/ Рис. 3.2. Главное меню программы UDP TEST TOOL TCP/UDP TEST TOOL Устанавливаем программное обеспечение на компьютер Итак, мы выяснили, какое программное обеспечение должно стоять на мобильном устройстве. Однако не следует забывать и о компьютере. Именно с компьютера мы будем посылать на наш ESP-модуль AT-команды. Для этого на компьютере необходимо установить специаль- ную программу, позволяющую посылать в последовательный канал текстовые сообщения. Мы уже договорились, что в качестве такой программы будем использовать среду разработок IDE.
132 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Выше упоминалось, что установка среды разрабо- ток решает и вторую задачу - вместе с ней авто- матически устанавливается USB-COM драйвер, ко- торый нам понадобится для работы USB-adanmepa, при помощи которого мы будем подключать к ком- пьютеру наш ESP-модуль. Порядок установки и настройки IDE подробно описан в раз- деле 2.4 (подраздел «Установка IDE»). I Особенности АТ-команд Начнем проверку модуля. Полагаем, что: ♦ наш ESP модуль при помощи USB адаптера подключен к ва- шему компьютеру, как это описано в главе 2; ♦ на компьютере установлен USB-COM драйвер и среда разра- боток IDE. ♦ Среда разработки настроена (правильно выбран виртуаль- ный СОМ-порт). Теперь все готово для подачи на ESP-модуль АТ-команд. AT-команды — это текстовые последовательности в коди- ровке ASCII. Каждая команда начинается с пары символов «AT». Далее, после символа «+» идет имя команды и ее параметры. Некоторые команды не используют символ «+». ВНИМАНИЕ. Любая АТ-команда представляет собой непрерыв- ную цепочку символов без пробелов. Если команда предусматривает параметры, то они располага- ются в конце команды сразу после символа «=». па- раметры разделяются друг от друга при помощи символа «,» (запятая).
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 133 Полный список АТ-команд с подробным описанием синтак- сиса вы найдете в Приложении 3 (стр. 474). ВНИМАНИЕ. Особенно следите, чтобы не было пробела в конце после последнего параметра команды. Любой пробел, особенно пробел в конце команды, является ошибкой. Пробел, допущенный в конце, после текста команды, невозможно увидеть. Однако, он также недопустим, как и другие пробелы. Для начинающих программи- стов это может стать камнем преткновения! Лишний пробел в конце команды может появиться в процессе ее копирования. Вроде команда написана правильно, а попытка ее выполнения возвращает ERROR! Чтобы проверить нали- чие пробела в конце команды, попробуйте переместить курсор вправо, за окончание ее текста. Если это удастся, значит, там есть пробел. Удалите его при помощи кнопки «Backup». Запускаем | монитор порта I Итак, запускаем монитор порта. Для этого нужно щелкнуть мышкой по иконке с изображением лупы @ в верхнем правом углу окна среды программирования. Окно монитора порта выгля- дит так, как это показано на рис. 3.3. В верхней части окна расположена строка ввода сообщений для передачи в последовательный канал. Справа от этого поля имеется кнопка ОТПРАВИТЬ. Основную часть окна занимает многострочное поле, куда будет выводиться принимаемая из последовательного канала информация. В нижнем правом углу окна монитора порта находятся две кнопки выбора параметров.
134 Управление модулем ARDUINO по Wi-Fi с мобильных устройств AT OK AT+GMR AT version:1.3.0.0(Jul 14 2016 18:54:01) SDK version:2.0.0(5a875ba) Farylink Technology Co., Ltd. vl.0.0.2 May 11 2017 22:23:58 OK Puc.3.3. Результат выполнения простых АТ-команд ПРИМЕЧАНИЕ. Следите, чтобы значения этих параметров были равны «NL & CR» и «115200 бод». Второй из па- раметров определяет скорость работы канала. Для старых версий SDK (которые сейчас почти не встречаются) скорость была равно 9600 бод. Если связь с модулем не устанавливается, попробуйте поменять значение скорости передачи. Параметр «Автопрокрутка» выбирайте по своему усмотрению. Первой АТ-командой, которую обычно подают сразу после включения модуля, обычно является простая команда проверки связи. Это команда AT. Просто «AT», без параметров. Наберите эту команду в строке передаваемых сообщений в верхней части окна монитора. НАПОМИНАНИЕ. Не забудьте проверить, нет ли лишних пробелов!
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 135 Щелкните мышкой по кнопке ОТПРАВИТЬ или просто нажмите Enter. Команда будет передана в порт, а через него — в ESP-модуль. В ответ на эту команду модуль должен выдать «ОК». Правда, на самом деле, модуль возвратит ответ, состоящий из трех строк. Как это выглядит, вы можете увидеть на рис. 3.3. Первые три строки в окне ответных сообщений (включая пустую строку) и есть ответ модуля на команду AT. Дело в том, что на рис. 3.3 показана работа модуля с включенным режимом «ЭХО». Этот режим устанавливается по умолчанию. Если «ЭХО» включено, то в ответ на любую команду модуль сначала возвращает ее текст, а затем уже собственно ответ. Режим ЭХА удобен для контроля правильности подачи команд. Если в ответ на какую-либо команду вы получили «ERROR» или не тот результат, которого вы ожидали, посмотрев на эхо-сообще- ние, вы всегда можете обнаружить свою ошибку. Ответ «ОК» на команду проверки связи «AT» говорит о том, что модуль работает нормально. Следующая команда, которую мы подадим, — команда AT+GMR. Она запрашивает у модуля версию его программного обеспечения. На рис. 3.3 показан результат выполнения этой команды. В ответ на команду AT+GMR модуль выдал целых четыре строки с описанием версий разных составных частей программ- ного обеспечения модуля. Завершает ответ слово «ОК» (команда выполнена успешно). Из ответа на запрос AT+GMR мы узнаем, что: ♦ прошивка данного конкретного модуля поддерживает систему АТ-команд версии 1.3.0.0 датированной 14 июля 2016 года; ♦ прошивка модуля содержит SDK версии 2.0.0, а также поддер- живает Wi-Fi интерфейс стандарта «Farylink Technology Co., Ltd.» версии 1.0.0.2. ПРИМЕЧАНИЕ. К сожалению, разработчики программы обработ- ки АТ-команд плохо позаботились о читаемости ее ответов. Ответ от команды AT содержит пустую строку (рис. 3.3), а между двумя ответами на раз- ные команды пустая строка не предусмотрена.
136 Управление модулем ARDUINO по Wi-Fi с мобильных устройств В некоторых случаях РЕЖИМ ЭХА только мешает. При жела- нии вы можете отключить режим эха. Это разгрузит экран, но затруднит анализ полученных сообщений. Для отключения и включения «эха» используются две специальные команды: ♦ АТЕО — отключить «ЭХО»; ♦ АТЕ1 - включить «ЭХО». Следующие две команды служат для перезагрузки ESP- модуля: ♦ AT+RST — оперативная перезагрузка модуля; ♦ AT+RESTORE — полная перезагрузка и возврат к заводским установкам. Попробуйте самостоятельно подать сначала одну, а затем вторую команды перезагрузки. В процессе перезагрузки модуль выдает множество сообщений, отражающих ход выполнения про- цесса. В разделе 2.4 мы рассказывали, как можно использовать сообщения, выдаваемые ESP-модулем в процессе перезагрузки для определения его внутренней конфигурации. ВИРТУАЛЬНЫЙ ДИСК. Полный справочник по АТ-командам вы найдете в Приложении 3 и на виртуальном диске.. Мы же будем рассматривать далее только те АТ-команды, которые понадобятся для решения поставленных в книге задач. Назначение и синтаксис каждой команды мы будем рассматри- вать по ходу изучения материала.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 137 3.2. Запуск Wi-Fi точки доступа Основные принципы работы | современных Wi-Fi сетей II В этом разделе будет поставлена конкретная задача по настройке Wi-Fi подсистемы нашего ESP-модуля. Но для реше- ния подобных задач необходимо хотя бы в общих чертах иметь представление об основных принципах работы современных Wi-Fi сетей. Поэтому, прежде чем переходить к постановке нашей задачи, углубимся немного в теорию. Любая Wi-Fi система использует для своей работы как мини- мум два основных протокола. Протокол «IEEE 802Л1 Wi-Fi» позволяет создать транспортную сеть нижнего уровня. Работа этой сети очень похожа на работу обычной офисной локальной сети, использующей витую пару или оптоволоконный кабель. Причем часто Wi-Fi роутер или Wi-Fi точка доступа подключа- ются к этой самой локальной сети. При этом все мобильные устройства, подключившиеся по Wi-Fi к такой точке доступа, также становятся хостами в этой локальной сети. То есть, передача информации в такой сети возможна: ♦ между подключенными к сети стационарными компьютерами; ♦ между любым стационарным компьютером и любым под- ключенным к сети мобильным устройством; ♦ между любыми двумя мобильными устройствами через ту же мобильную сеть. ЧТО ЕСТЬ ЧТО. 1 Ч Хостом принято называть любое устройство или его часть, имеющее в сети свой уникальный IP- адрес.
138 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Создание Wi-Fi сети низкого уровня Для создания Wi-Fi сети низкого уровня обычно используются устройства двух типов: ♦ точка доступа (сокращенно АР); ♦ Wi-Fi клиент (сокращенно STA). Любая Wi-Fi сеть всегда имеет всего одну точку доступа, к которой подключается один или несколько Wi-Fi клиентов. При подключении к точке доступа используются: ♦ пароль; ♦ специальный протокол шифрования. ПРИМЕЧАНИЕ. Однако, для связи двух разных устройств од- ного протокола низкого уровня недостаточно. Протокол лишь позволяет программам и мобиль- ным приложениям посылать пакеты данных от од- ного хоста к другому Для того чтобы два хоста могли общаться друг с другом, на каждом из них должна быть установлена программа, которая будет формировать и принимать эти пакеты, а протокол нижнего уровня использовать как транспортный для обмена пакетами. Эти программы для формирования пакетов обычно исполь- зуют другой протокол, более высокого уровня. ПРИМЕЧАНИЕ. Мы в книге будем использовать протокол TCP (Transmission Control Protocol). Название протокола переводится как «Протокол управления передачей данных».
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 139 Этот протокол широко используется в настоящее время во многих системах передачи данных. Он же является составной частью протокола TCP/IP, используемого для передачи данных, а также является основным протоколом всемирной сети Интернет. Выбор TCP протокола облегчит подключение ESP-модуля к сети Интернет. TCP протокол, как и многие современные протоколы, работает по принципу Клиент-Сервер. Для его функционирования необходимо на одном из хостов в сети развернуть TCP-сервер, а на каждом из хостов, с которым необходимо установить связь, должен быть запущен TCP клиент. ПРИМЕЧАНИЕ. Для нашей задачи, когда необходимо устанавливать связь между модулем ESP-O1 и любым мобильным устройством, мы можем либо развернуть сервер в модуле ESP-O1, а в мобильном устройстве запу- стить TCP клиент, либо, наоборот, - на мобильном устройстве сервер, на ESP-модуле клиент. Роли устройств (Смартфона и ESP-модуля) в обоих протоко- лах распределяются независимо. В качестве точки доступа может выступать как Смартфон, так и ESP-O1. Второе устройство при этом будет Wi-Fi клиентом. Независимо от того, какое из устройств — точка доступа, TCP сервер можно установить как на смартфоне, так и на ESP-модуле. На другом же устройстве будет запущен ТСР-клиент. Переводим ESP-модуль | в режим точки доступа II Теперь, когда мы имеем основные понятия о Wi-Fi протоко- лах, мы можем приступить к задаче, объявленной в заголовке этого раздела. А именно, переведем наш ESP-модуль в режим точки доступа. Для этого мы должны послать в ESP-модуль последователь- ность АТ-команд, показанную в табл. 3.1. В том порядке, как она показана в табл. 3.1.
140 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Последовательность команд для запуска точки доступа Wi-Fi Таблица 3.1 Последовательность команд AT+RESTORE AT+CWQAP AT+CWMODE=2 AT+CWSAP="MyESP'7'12345678'\9,4 Назначение Полный сброс настроек Отключение от роутера (если нужно) (или =3) Выбор режима АР (или AP+STA) Инициализация Wi-Fi точки доступа ПРИМЕЧАНИЕ. Первая и вторая команды не обязательны! Первая команда — используется в том случае, если перед этим вы (или кто-то другой) изменили настройки модуля, пода- вая какие-либо АТ-команды, и модуль находится в неизвестном вам режиме. Вторая команда (AT+CWQAP) подается тогда, когда модуль был ранее настроен и подключен к точке доступа. Для того чтобы изменить настройки в этом случае, необходимо обязательно завершить соединение. Команда CWMODE служит для выбора режима Wi-Fi подси- стемы. Команда имеет один параметр. В нашем случае он должен быть равен 2 (можно и 3). Значения параметра соответствуют сле- дующим режимам работы Wi-Fi: ♦ 1 — клиент; ♦ 2 — точка доступа; ♦ 3 — оба режима одновременно. Если модифицировать эту команду, то можно узнать, какое значение параметра CWMODE установлено и какие значения может принимать параметра: ♦ AT+CWMODE? — узнать текущий режим; ♦ AT+CWMODE=? — узнать возможные режимы. Последняя команда из табл. 3.1 запускает точку доступа. У этой команды четыре параметра: ♦ Параметр 1 («MyESP») — имя создаваемой точки доступа (SSID);
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 141 ♦ Параметр 2 («12345678») — пароль для доступа к точке (не ме- нее 8 символов); ♦ Параметр 3 (9) — номер Wi-Fi канала (может принимать зна- чение от 1 до 14); ♦ Параметр 4 (4) — тип шифрования. Возможные значения Параметра 4 (4): ♦ 0 — без шифрования; ♦ 1-WEP; ♦ 2-WPA_PSK; ♦ 3-WPA2_PSK; ♦ 4-WPA_WPA2_PSK. Ответ каждой из выполненных АТ-команд должен завер- шаться сообщением «ОК». ПРИМЕЧАНИЕ. Если в сообщении вы увидите «ERROR», то, значит, вы что-то сделали неправильно, и команда не была выполнена. После успешного выполнения всех вышеуказанных команд точка доступа сразу же начинает работать. Указанное в последней АТ-команде имя для вашей точки доступа (SSID) можно использо- вать при подключении к ней при помощи смартфона. ВНИМАНИЕ. Пароль для подключения к точке доступа должен иметь не менее 8 символов. Иначе команда CWSAP не сработает и выдаст ERROR. При желании, можно пароль просто не указывать. В этом слу- чае будет создана Wi-Fi точка доступа, не требующая пароля.
142 Управление модулем ARDUINO по Wi-Fi с мобильных устройств СОВЕТ. Значения номера канала и код типа шифрования ре- комендую выбрать такими, как указано в табл. 3.1. В современной аппаратуре, выпускаемой серийно, номер канала обычно выбирается автоматически. Используется тот канал, который не занят другой, рядом расположенной точкой доступа. Но в модуле ESP-O1 используется тот номер канала, какой вы указали. Если возникнет коллизия с другими точками доступа, просто выберите другой канал. Тип шифрования разумно использовать самый современный, обеспечивающий максимальную защиту. Тем более что старые методы шифрования уже не поддержива- ются некоторыми мобильными устройствами. I Подключаемся к точке доступа Теперь, когда точка запущена, вы можете попробовать к ней подключиться. Возьмите смартфон и найдите в списке доступных Wi-Fi сетей сеть с именем, которое вы задали параметром SSID. В нашем случае ее имя «MyESP». Подключитесь к ней, указав пароль (12345678). Если подклю- чение прошло удачно — ваша точка работает. ПРИМЕЧАНИЕ. Правда, использовать это соединения вы пока не сможете. Если смартфон имеет функцию провер- ки наличия Интернета, он сообщит вам, что вы- полненное вами соединение не имеет доступа в Интернет.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 143 Зато вы можете посмотреть IP адрес, присвоенный вашей точке доступа, набрав в мониторе порта следующую АТ-команду: AT+CIFSR — посмотреть IP адреса Wi-Fi подсистемы. На рис. 3.4 показан результат работы команды CIFSR. Команда выдает значение четырех параметров: ♦ IP и MAC адреса сетевого интерфейса, которые ESP-модуль получил как точка доступа (АР); ♦ такие же, адреса, которые модуль получил как Wi-Fi клиент (STA). Как видите, IP адрес для STA в данном случае не присвоен. Второй способ определения IP адресов Wi-Fi соедине- ния — использование функции «IP CONFIG» приложения «TEST TOOL» на смартфоне. Убедитесь, что смартфон подключен к точке доступа на ESP- модуле. Откройте главное меню приложения «TEST TOOL» и выберите пункт меню «IP CONFIG». Откроется окно, показанное на рис. 3.5. При первом запуске функции «IP CONFIG» вы увидите только название параметров Wi-Fi сети, но их значения указаны не будут. Щелкните кнопку «GET CONFIG», и программа считает значения ЬТ+CIFSR +CIFSR:APIP,"192.168.4 Л" +CIFSR:APMAC,lfb6:e6:2d:lb:7b:95" +CIFSR:STAIP,"0.0.0.0м +CIFSR:STAMAC,wb4:e6:2d:lb:7b:95if OK Рис. 3.4. Результат работы команды CIFSR
144 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 3.5. Окно «IP CONFIG» приложения «TEST TOOL» параметров. Процедура помогает узнать значения следующих параметров: ♦ SSID — идентификатор точки доступа, к которой подключен смартфон; ♦ IP — IP адрес, присвоенный Wi-Fi клиенту смартфона; ♦ Gateway — IP адрес шлюза для доступа к другой сети или к сети Интернет; ♦ Netmask — маска подсети; ♦ MAC — MAC адрес смартфона. При помощи приложения «TEST TOOL» вы можете пропинго- вать IP адрес точки доступа. ЧТО ЕСТЬ ЧТО. Пинговать (выполнить команду ping) - значит проверить наличие данного IP адреса в Wi-Fi сети и измерить время отклика на направленный к этому адресу запрос.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 145 Пингование — это очень важный инструмент для всех, кто работает в локальной либо глобальной сетях. Для перехода в режим пингования сначала вам нужно вернуться к основному меню приложения «TEST TOOL», нажав стандартную кнопку «воз- врат» смартфона. Затем нужно выбрать пункт меню «PING». Откроется окно «PING» (рис. 3.6). В поле «Target IP» наберите IP адрес точки доступа (в нашем случае 192.168.4.1). ПРИМЕЧАНИЕ. Параметры «Repeat Count» (Количество повторов) и «Packet Size» (размер пакета), оставьте по умол- чанию (4 и 56, соответственно). Рис. 3.6. Результат пингования в приложении «TEST TOOL».
146 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Нажмите кнопку «START». Приложение начнет пингование (посылку проверочных запросов по указанному вами адресу). Будет выполнено столько запросов, сколько было указано вами в параметре «Repeat Count» (то есть 4 запроса). Для каждого запроса будет выведен его резуль- тат (рис 3.6). Каждый ответ содержит три параметра: ♦ icmp_seq — номер запроса; ♦ ttl — время жизни пакета; ♦ time — задержка при получении ответа. Если IP адрес недоступен, то вместо параметров отклика, при- ложение выдает сообщение: «Destination Host Unreachable» (Узел Назначения Недоступен). После последнего запроса приложение выдает общую стати- стику по всему циклу пингования. 3.3. Запуск ТСР-сервера I Создаем канал связи по протоколу TCP Теперь, когда точка доступа работает и создано соединение со смартфоном, попробуем создать канал связи по протоколу TCP. Для этого мы запустим TCP сервер на стороне ESP-модуля, а на стороне смартфона будем использовать TCP клиент. ПРИМЕЧАНИЕ. Для того чтобы настроить и запустить TCP сер- вер нужно подать на ESP-модуль последователь- ность АТ-команд, показанную в табл. 3.2. Подавать команды, как и в предыдущем случае, нужно в том же порядке, как указано в табл. 3.1. Команда AT+CIPMODE устанавливает смешанный режим работы Wi-Fi (модуль работает одновременно и как точка доступа, и как Wi-Fi клиент). Только в этом режиме будет работать ТСР- сервер.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 147 Команды настройки и запуска TCP сервера Таблица 3.2 Последовательность команд AT+CWMODE=3 AT+CIPMODE=0 AT+CIPMUX=1 AT+CIPSERVER=1,88 Назначение Установить «смешанный» режим Отключение сквозного режима передачи данных Установить множественный режим подключения Запустить TCP IP сервер на 88 порте Команда AT+CIPMODE предназначена для включения/выклю- чения сквозного режима передачи данных. В сквозном режиме данные от Wi-Fi интерфейса напрямую передаются в последова- тельный канал, а данные из последовательного канала напрямую поступают на канал Wi-Fi. В данном случае мы выключаем сквоз- ной режим. Команда AT+CIPMUX устанавливает одинарный либо мно- жественный режимы подключения: ♦ если CIPMUX=0, то к серверу возможно лишь одно внешнее подключение; ♦ при CIPMUX=1 к серверу может подключиться до 4 внешних устройств. Мы выбираем множественный режим подключения. ПРИМЕЧАНИЕ. Значения параметров CIPMODE и CIPMUX в данном случае должны быть именно такими, как указано в табл. 3.2, иначе TCP-сервер не запустится. Команда AT+CIPSERVER запускает либо останавливает ТСР- сервер. У команды два параметра: ♦ значение первого параметра должно быть равно 1, если сер- вер нужно запустить, и нулю, если остановить. ♦ второй параметр устанавливает номер порта, на котором бу- дет работать создаваемый сервер. В нашем случае мы запу- скаем сервер с номером порта 88. Если нужно остановить работу сервера, подается команда (при этом второй параметр не указывается): AT+CIPSERVER=O.
148 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Если в ответ на каждую из описанных выше команд (табл. 3.2) вы получите «ОК», это значит, что TCP-сервер запущен, и вы можете с его помощью создавать канал связи между модулем и смартфоном. Если параметры были установлены ранее, вы всегда можете проверить их значение. Для этого существуют специальные команды запроса зна- чений установленных режимов: ♦ AT+CWMODE? — запрос режима Wi-Fi (точка доступа или клиент); ♦ AT+CIPMODE? — запрос режима передачи данных (сквозной или обычный); ♦ AT+CIPMUX? — запрос режима подключения (одиночный или множественный); ♦ AT+CIPSERVER? — запрос статуса TCP сервера (запущен или остановлен). ПРИМЕЧАНИЕ. Для того чтобы создать канал связи между смарт- фоном и ЕСР-модулем, сначала убедитесь, что смартфон подключен к точке доступа модуля (с именем «MyESP»). Некоторые смартфоны авто- матически отключаются от точки доступа, если нет доступа в Интернет. В приложении «TEST TOOL» прейдите в главное меню, а затем выберите пункт «TCP CLIENT». Откроется окно ТСР-клиента (рис. 3.7). В верхней части окна находятся два поля для выбора параме- тров канала связи: ♦ «Target IP»; ♦ «Port». В поле «Target IP» введите IP адрес вашего ЕСР-модуля (в нашем случае 192.168.4.1). В поле «Port» укажите выбранный порт TCP-сервера (мы выбрали порт номер 88). Тут же имеется кнопка «CONNECT» (Подключение). В нижней части окна ТСР-клиента находится поле для ввода сообщения. В момент, когда будет установлено соединение с сервером, справа от поля сообщения появится кнопка «SEND»
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 149 Рис. 3.7. Окно TCP CLIENT (Отправить). При нажатии на эту кнопку набранное сообщение будет передано по Wi-Fi каналу. Снизу, под полем ввода сообщений, имеется флажок «REPEAT» (повтор). Он позволяет включить режим многократ- ного повторения сообщения. Посредине экрана находится область вывода сообщений. Сюда будут выводиться как принятые данные, так и сообщения о ходе выполнения команд. Теперь все готово для создания канала и работы с ним. Процесс передачи данных от смартфона в ESP-модуль, а также от модуля к смартфону отражен на двух рисунках: ♦ на рис. 3.8 — показан экран смартфона; ♦ на рис. 3.9 — показано окно монитора порта на экране ком- пьютера. Мы начнем процесс передачи данных со смартфона. Сначала нужно установить соединение. Для этого нужно просто нажать в окне TCP-клиента приложения «TEST TOOL» кнопку «CONNECT». Клиент выполнит соединение с ТСР-сервером.
150 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Рис. 3.8. Работа с TCP каналом связи со стороны смартфона &T+CIPMUX=1 ок &T+CIPSERVER=1,2000 OK D,CONNECT +IPD, 0,9 .-Hello ESP AT+CIPSEND=0,14 OK > busy s... Recv 14 bytes jSEND OK 0,CLOSED Рис. 3.9. Работа с TCP каналом связи со стороны ESP модуля
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 151 Если все прошло нормально и соединение установлено, то в окне сообщений TCP-клиента (рис. 3.8) появится надпись «Connect» (Есть подключение). ПРИМЕЧАНИЕ. Кнопка «CONNECT» превратится в кнопку «DISCONNECT» (разработчики ошиблись и написали «DISCONNET»). Одновременно в окне монитора порта (рис. 3.9) тоже поя- вится сообщение об успешном подключении: «0,CONNECT». Оно означает, что создано соединение с идентификационным номером (ID) равным нулю. Переходим к передаче данных | со смартфона на модуль II Теперь можно передавать данные. Сначала передадим сооб- щение со смартфона. В поле сообщений внизу экрана (рис. 3.8) набираем, текст сообщения. Например: «Hello ESP». Нажимаем кнопку «SEND» и сообщение будет передано в канал связи. При этом в поле сообщений окна «TCP CLIENT» (рис. 3.8) появится повтор (ЭХО) только что переданного текста. Сообщение предваряют символы «»». ПРИМЕЧАНИЕ. [ Две угловые стрелки, повернутые вправо, символи- I зируют передачу данных в канал связи.
152 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Сообщение, переданное со смартфона, поступит по Wi-Fi каналу в ESP-модуль и появится на экране монитора порта (рис. 3.9). Сообщение придет в следующем формате: +IPD,0,9:HelloESP Этот формат является частью языка АТ-команд. Префикс «+IPD» означает, что получено сообщение из сети Wi-Fi. Два параметра означают: ♦ номер канала связи (ID=0); ♦ длину полученного сообщения (в сообщении 9 символов). После двоеточия идет само сообщение. I Переходим к передаче данных от ESP-модуля на смартфон Для передачи сообщения от ESP-модуля к смартфону необхо- димо подать на модуль соответствующую АТ-команду. Допустим, что мы хотим передать из модуля в смартфон сообщение: «Hello Smartfon». В этом случае вы сначала должны передать в ESP-модуль сле- дующую АТ-команду (команда передачи данных): AT+CIPSEND=0,14 У этой команды два параметра: ♦ номер (ID) канала связи; ♦ длина передаваемого сообщения. Вы заранее должны посчитать количество букв в сообщении, которое собираетесь передать. ПРИМЕЧАНИЕ. [ Данная команда работает необычно, не так, как остальные уже знакомые нам команды. После того, как вы введете текст команды и нажмете кнопку «Отправить», в ответ вы сначала получите сообщение «ОК». Затем
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 153 на экране появится приглашение на ввод данных: символ «>» (рис. 3.9), и программа перейдет в режим ожидания. Увидев приглашение, вы должны набрать буква за буквой столько символов, сколько было указано во втором параме- тре АТ-команды. В нашем случае мы наберем сообщение «Hello Smartfon», имеющее 14 символов. ВНИМАНИЕ. В процессе набора сами символы на экране не ото- I бражаются. Набрав все символы, вы должны нажать на экране кнопку «Отправить», или просто нажать Enter. Если вы все сделали пра- вильно, произойдет передача сообщения по каналу Wi-Fi. Сообщение появится на экране смартфона в окне «TCP CLIENT» в поле вывода сообщений, предваренное парой символов ««»(рис. 3.8). ПРИМЕЧАНИЕ. Стрелки, повернутые влево ««», символизируют получение данных из канала связи. На компьютере в окне монитора порта появится целый ряд системных сообщений (рис. 3.9). Во-первых, надпись «bussy s...» (занято...) выводится, пока идет выполнение команды. По окончании процесса передачи программа напишет «recv 14 bytes» (передано 14 байтов). В завершении программа напишет «SEND OK» (передача успешно завершена). В случае неудачной попытки передачи сообщений вы увидите на экране «ERROR». ВНИМАНИЕ. Передача сообщений как в прямом, так и в обрат- ном направлениях, возможна только при наличии соединения.
154 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Почему соединение периодически обрывается? Действительно, соединение периодически обрывается. Дело в том, что TCP сервер поддерживает такой параметр, как таймаут. Таймаут ограничивает время простоя сервера. Если в течение времени, определяемого этим параметром, не происходит ника- кой передачи данных, соединение разрывается. Если соединение разорвано, то прежде, чем передавать сообщение, необходимо заново нажать кнопку «CONNECT» в окне «TCP CLIENT» мобиль- ного приложения. При разрыве соединения в окне монитора порта также появ- ляется соответствующее сообщение (рис. 3.9). Сообщение гласит: «0,CLOSED» (т.е. соединение номер 0 — разорвано). Также и в приложении «TEST TOOLS» в окне «TCP CLIENT» в случае разрыва соединения появляется надпись «DISCONNECT» (рис. 3.8). А надпись на кнопке «DISCONNET» меняется на над- пись «CONNECT». При необходимости вы можете принудительно отключить TCP-сервер в ESP-модуле. Для этого достаточно подать на модуль следующую AT-команду: AT+CIPSERVER=O Итак, мы получили первый способ, создания канала, исполь- зуя который можно управлять разработанными нами устрой- ствами при помощи смартфона. Теперь рассмотрим другие спо- собы создания канала.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 155 ЗА Запуск ТСР-клиента Развернем TCP-сервер в смартфоне, используя I приложение «TEST TOOL» I Альтернативный вариант создания канала связи между ESP- модулем и смартфоном таков: ♦ развернуть TCP-сервер на смартфоне; ♦ ESP-модуль перевести в режим ТСР-клиента; ♦ подключить этого клиента к серверу в смартфоне. ПРИМЕЧАНИЕ. При этом Wi-Fi подсистему ESP-модуля мы оста- вим работать в прежнем режиме. ESP-O1 - точка доступа, а смартфон - Wi-Fi клиент. Развернуть TCP-сервер в смартфоне легко можно при помощи приложения «TEST TOOL». Для этого в главном меню приложе- ния нужно выбрать функцию «TCP-SERVER», Окно режима ТСР- сервера (рис, 3.10) очень похоже на окно ТСР-клиента (рис. 3.7). Отличие в том, что в окне сервера отсутствует поле ввода IP адреса. Вместо него в верхней части окна размещена надпись: «Target IP». Она означает, что сформированный при помощи этой функции TCP-сервер будет иметь IP адрес самого смартфона. ПРИМЕЧАНИЕ. Напомню, что при подключении смартфона к Wi-Fi точке доступа ему автоматически присваивается IP адрес. Поэтому вам остается указать только номер порта в поле «Local Port». Чтобы избежать путаницы, выберем номер порта отличный от того, что мы выбирали в предыдущем случае (раздел 3.3). А именно, установим номер порта равным 3000. После нажатия
156 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 3.10. Окно режима TCP-сервера приложения «TEST TOOL» кнопки «CONNECT» TCP-север будет запущен, и к нему могут под- ключаться любые ТСР-клиенты. I Настраиваем ESP-модуль в режим ТСР-клиента Теперь нам нужно настроить ESP-модуль в режим ТСР- клиента и подключиться к серверу смартфона. Если вы уже про- изводили какие-либо настройки режимов работы модуля, то желательно сначала произвести полный сброс модуля. ПРИМЕЧАНИЕ. Напомню, что для сброса и возвращения к завод- ским установкам нужно подать на модуль команду AT+RESTORE.
Глава 3. Работа с модулем ESP-O1 г1ри помощи АТ-команд 157 После полного сброса ESP-модуля, необходимо заново пере- вести его в режим Wi-Fi точки доступа. Для этого нужно про- сто выполнить последовательность АТ-команд, приведенную в табл. 3.1. Когда точка доступа заработает, подключитесь к этой точке с вашего смартфона. Теперь можно приступить к созданию TCP-клиента. ESP- модуль поддерживает два режима ТСР-клиента: ♦ однопользовательский; ♦ многопользовательский. В однопользовательском режиме модуль может устано- вить лишь одно TCP соединение с одним TCP сервером. В много- пользовательском режиме модуль может создать несколько (до четырех) соединений с одним или несколькими TCP серверами. Работа ТСР-клиента | в однопользовательском режиме II Для создания канала связи в этом режиме нужно выполнить последовательность АТ-команд, приведенную в табл. 3.3. Команды запуска ТСР-клиента в однопользовательском режиме Таблица 3.3 Последовательность команд AT+CWMODE=3 AT+CIPMODE=0 AT+CIPMUX=O AT+CIPSTART="TCP","192.168.4.2«,3000 Расшифровка Установить «смешанный» режим Установить сквозной режима передачи данных Установить однопользовательский режим подключения Запуск клиента по протоколу TCP Как видите, значения первых двух параметров (CWMODE и CIPMODE) такие же, как в случае запуска TCP-сервера. Значение третьего параметра (CIPMUX) равно 0 (однопользовательский режим). Четвертая команда в табл. 3.3 запускает ТСР-сервер. В однопользовательском режиме команда CIPSTART имеет три параметра:
158 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ TCP — название протокола; ♦ 192.168.4.2 — IP-адрес TCP-сервера к которому подключается клиент; ♦ 3000 — номер порта. ПРИМЕЧАНИЕ. Кроме протокола TCP, и сервер, и клиент могут ра- ботать также и с протоколом UDR Если установка параметров прошла без ошибок (ответ «ОК»), команда запуска клиента выдаст сообщение «CONNECT» (под- ключено), а затем «ОК» (рис. 3.11). Значит, соединение с ТСР- сервером установлено. Теперь вы можете передавать сообщения как от смартфона к ESP-модулю, так и в обратном направлении. Процесс передачи данных не отличается от аналогичного процесса, описанного в разделе 3.3. На рис. 3.10 и рис. 3.11 вы можете видеть, как выглядит этот процесс: ♦ на экране смартфона; ♦ в окне монитора порта. Со стороны смартфона изменений практически нет, в чем можно убедиться, сравнив рис. 3.8 и рис. 3.10 (окно «TEST TOOL» в режиме клиента и в режиме сервера). Все отличия состоят в том, что в последнем случае (рис. 3.10) после каждого сообщения в скобках отображается IP-адрес и номер порта источника этого сообщения. ПРИМЕЧАНИЕ. | Происходит это потому, что для «TCP SERVER» включен режим «Отображение IP-адреса данных». Если в настройках «TEST TOOL» включить режим «Отображать IP адрес» и для окна «TCP CLIENT», то адрес будет отображаться и там.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 159 ПРИМЕЧАНИЕ. Для включения режима «Отображение IP-адреса дан- ных» необходимо выбрать в главном меню программы «TEST TOOL» пункт SETTING». В открывшемся окне установок нужно найти пункт «Display IP address with a data» и перевести его в положение «Включено». В работе ESP-модуля при переходе в однопользовательский режим TSP-клиента появились небольшие изменения (рис. 3.11). Изменилось количество параметров команды CIPSEND. Так как мы работаем в однопользовательском режиме, в команде отсут- ствует параметр — номер канала связи. Поэтому команда пере- дачи данных выглядит следующим образом: AT+CIPSEND=14 Единственный параметр команды — это количество симво- лов в передаваемом сообщении. В остальном процедура передачи данных полностью соответствует рассматриваемой нами ранее (в разделе 3.3) аналогичной процедуре, когда ESP-модуль работал в режиме ТСР-сервера. \T+CIPSTART=IfTCPw/lf 192.168.4.2й, 3000 CONNECT Ж 4T+CIPSEND=14 Ж > busy s Recv 14 bytes SEND OK -J-IPD, 9:Hello ESP CLOSED Рис. 3.11. Процесс передачи данных со стороны ESP модуля
160 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Работа ТСР-клиента в многопользовательском режиме Работа ТСР-клиента в многопользовательском режиме не сильно отличается от работы в однопользовательском режиме. Набор АТ-команд для запуска многопользовательского клиента приведен в табл. 3.4. Отличие состоит в том, что значение пара- метра CIPMUX теперь равно 1. Кроме того, в команде CIPSTART теперь появился новый пара- метр. Этот параметр располагается в начале списка параметров. Он указывает номер канала и может принимать значение от 0 до 4. Так, команда в последней строке табл. 3.4 создает канал с номером (ID) равным нулю. Для создания каждого нового канала нужно подать новую команду CIPSTART с другим номером канала и с другим IP адресом. ПРИМЕЧАНИЕ. Обращаю ваше внимание, что в нашем примере па- раметр CWMODE равен 3 (смешанный режим). Это означает, что можем запустить не только не- скольких клиентов, но еще дополнительно можем запустить ТСР-сервер. Команды запуска ТСР-клиента в многопользовательском режиме Таблица ЗА Последовательность команд AT+CWMODE=3 AT+CIPM0DEO AT+CIPMUX=1 AT+CIPSTART=0,"TCP",«192.168.4.2",3000 Расшифровка Установить «смешанный» режим Установка сквозного режима передачи данных Установить однопользовательский режим подключения Запуск клиента по протоколу TCP
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 161 ВНИМАНИЕ. Одновременная работа TCP-сервера и нескольких TCP каналов возможна только при CWMODE=3 и CIPMUX=1. К сожалению, приложение «TEST TOOL» не может нам помочь в проверке многопользовательского режима. Создаваемый им TCP-сервер работает по упрощенному алгоритму. ПРИМЕЧАНИЕ. Вы можете подсоединиться к нему несколько раз, но работать он будет только с первым из этих со- единений. Для полной проверки пришлось бы взять два смартфона и на каждом установить и запустить приложение «TEST TOOL». Но мы этого делать не будем, так как этот режим применяется только в очень сложных системах. Когда вы наберетесь опыта и станете хорошим специалистом, вы сами разберетесь и попро- буете этот режим. Отмечу только, что команда передачи данных (CIPSEND) в этом режиме теперь снова имеет два параметра: ♦ номер канала связи; ♦ длина сообщения. Номер канала связи теперь нужен при работе с несколькими каналами. 3.5. Работа ESP-модуля в режиме Wi-Fi клиента Во всех предыдущих примерах мы использовали ESP-модуль как Wi-Fi точку доступа. Такой режим удобен, когда вам нужно управлять неким микроконтроллерным устройством при помощи мобильного устройства в местности, где отсутствуют доступные
162 Управление модулем ARDUINO по Wi-Fi с мобильных устройств вам Wi-Fi сети. Например, в поле, или просто далеко от дома или вашего офиса. В других случаях ESP-модуль может работать как Wi-Fi кли- ент. Режим клиента удобен в случае, если ваше микроконтрол- лерное устройство работает в зоне доступа вашей домашней или корпоративной Wi-Fi сети. В этом случае ESP-модуль подключа- ется в режиме клиента к вашей домашней или вашей корпоратив- ной точке доступа. ПРИМЕЧАНИЕ. После этого к ESP-модулю могут подключиться все мобильные устройства, работающие в той же Wi-Fi сети, а также стационарные компьютеры, подключенные к вашей сети, например, посред- ством витой пары. Если Wi-Fi сеть, к которой подключился ESP-модуль, имеет выход в Интернет, то модуль также получает доступ к Интернету. Это позволяет создавать на основе ESP-модуля IoT проекты. Напоминаю, термин «Internet of Things» (сокращенно IoT) озна- чает «Интернет вещей». Последовательность АТ-команд, используемая для перевода ESP-модуля в режим Wi-Fi клиента и подключения к внешней точке доступа, приведена в табл. 3.5. Подключение ESP модуля к внешней точке доступа Таблица 3.5 Набр команд AT+RESTORE AT+CWMODE=3 AT+CIPMODE=0 AT+CWLAP AT+CWJAP="MyWiFi","ParolMyWiFi" Расшифровка Сбросить все настройки Установить «смешанный» режим Установить сквозной режим передачи данных Посмотреть Доступные Wi-Fi сети (работает при CWMODE=1 или 3) Подключение к Wi-Fi точке доступа Последовательность команд начинается с команды RESTORE (полного сброса). Далее устанавливается значение параметров
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 163 CWMODE и CIPMODE. В табл. 3.5 параметру CWMODE присваи- вается значение 3 (смешанный режим — как точка доступа и как клиент). Допускается также параметру CWMODE присвоить зна- чение 2. Тогда модуль сможет работать только как клиент. Напротив, параметр CIPMODE обязательно должен иметь зна- чение 0 (сквозной режим передачи данных). После того, как описанные выше два параметра установ- лены, можно подавать команду на подключение к внешней точке доступа (последняя строка таблицы). Но сначала вам нужно уви- деть список доступных Wi-Fi сетей. Для просмотра доступных сетей используется AT-команда AT+CWLAP. На рис. 3.12 показан результат работы команды AT+CWLAP. После получения этой команды модуль начинает сканировать эфир на наличие Wi-Fi сетей. Это может занять несколько секунд. По окончании процесса сканирования модуль выдает список доступных для него сетей. Каждый найденный при сканировании канал представляется на экране в виде следующей строки: + CWLAP (ТШ, SSID, УСС, MAC, ID, Парб, Пар7,) AT+CWLAP +CWLAP:(3,"Cafe",-76,мс4:71:54:31:al:2c",1,100,0) +CWLAP: (4,nMyWiFi",-63,w30:b5:c2:e2:49:5alf,10,112,0) +CWLAP: (4,"Wi-Flay\-49,"a5:2c:76:5a:3e:5b",9,97,0) OK Рис. 3.12. Результат выполнения команды АТ+ CWLAP
164 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Тип шифрования (ТШ) может принимать значения: ♦ 0 — без шифрования; ♦ 1-WEP; ♦ 2-WPA-PSK; ♦ 3-WPA2-PSK; ♦ 4 - MIXED (WPA-WPA2-PSK). ♦ SSID - имя Wi-Fi сети. ♦ УСС (уровень сигнала сети) указывается в децибелах. ♦ MAC (МАС-адрес) — низкоуровневый адрес точки доступа. ♦ ID (Номер канала) — номер радиоканала Wi-Fi точки (1...14). ПРИМЕЧАНИЕ. Последние два параметра могут отсутствовать. Их значение зависит от конкретной версии систе- мы AT-ко манд. Команда AT+CWLAP позволяет нам убедиться, что нужная точка доступа работает, и уровень ее сигнала в норме. Теперь можно подавать команду подключения к выбранной точке доступа. Предполагается, что вы знаете пароль. Команда создания клиента и подключения его к точке доступа приведена в последней строке табл. 3.5. У этой команды два параметра: ♦ имя точки доступа, к которой вы подключаетесь; ♦ пароль. Сразу после получения команды модуль произведет попытку подключения. Если подключение произошло нормально, то модуль сообщит об этом так, как это показано на рис. 3.13. По мере выполнения процесса подключения модуль напишет: ♦ сначала - «Wi-Fi CONNECTED» (Wi-Fi подсоединен); ♦ затем — «GOT IP» (IP адрес получен); ♦ и в завершении — «ОК». Если что-то пошло не так (ошибка в имени сети или невер- ный пароль), то модуль выдаст сообщение «ERROR». Если соединение прошло успешно, мы можем узнать IP адрес, присвоенный модулю при подключении к домашней (корпора- тивной) сети. Для этого используем уже знакомую нам команду AT+SIFSR. Результат выполнения запроса вы также можете видеть
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 165 &T+CWJAP="MyWiFi", "ParolMyWiFi" WIFI CONNECTED WIFI GOT IP DK &T+CIFSR HTIFSR:APIP,"192.168.4.1" 4-CIFSR:APMAC,"b6:e6:2d:lb:7b:95" fCIFSR:STAIP,"192.168.0.103" fCIFSR:STAMAC,"b4:e6:2d:lb:7b:95" ЭК Рис. 3.13. Результат выполнения команды запроса IP адреса на рис. 3.13. Ответ содержит четыре строки и окончательное «ОК». Первые две строки сообщают нам IP и MAC адреса точки доступа модуля. А следующие две строки сообщают IP и MAC адрес Wi-Fi клиента. Цосле того, как мы подключили ESP-модуль к домашней сети, нужно к той же сети подключить и смартфон. Это даст нам воз- можность установить между ними связь по TCP протоколу. Для этого нам понадобится узнать IP-адрес смартфона в домаш- ней сети. Для определения адреса воспользуемся режимом «IP CONFIG» приложения «TEST TOOL». ПРИМЕЧАНИЕ. Какэто сделать,мыуже рассматривали в разделе 3.2. Результат работы функции «IP CONFIG» показан на рис. 3.5. Типичный IP адрес в домашней Wi-Fi сети будет выглядеть при- мерно так: 192.168.0.103.
166 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Теперь, когда наш ESP-модуль и наш смартфон подключены к одной Wi-Fi сети, мы можем установить связь между ними по TCP-каналу. Для этого на одном из этих устройств необходимо запустить TCP-сервер, а с другого — установить подключение к этому серверу в режиме TCP-клиента. Как это делается, мы уже разбирали выше. Для того чтобы создать TCP-сервер на ESP-модуле и подсо- единиться к нему со смартфона, нужно выполнить все действия, которые описаны в разделе 3.3. Для запуска сервера используйте АТ-команды из табл. 3.2. Далее в том же разделе описано, как на смартфоне запустить программу «TEST TOOL» и создать подклю- чение к TCP серверу, развернутому на ESP модуле. Выполните все эти действия, изменив лишь IP адрес ESP- модуля. В нашем новом примере IP-адрес будет иметь значение: 192.168.0.103 Когда связь установлена, вы можете передавать информацию как от смартфона в ESP-модуль, так и из модуля в смартфон, как это описано в разделе 3.3. Также вы можете создать TCP-сервер на смартфоне и под- ключить к нему ESP-модуль в режиме клиента. Для этого нужно выполнить те же действия, которые описаны в разделе 3.4. При этом вы можете создавать клиентское соединение, как в однопользовательском режиме, так и в многопользовательском. ВНИМАНИЕ. Не забывайте только, что IP адреса как ESP-модуля так и смартфона теперь будут другие.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 167 3.6. Работа ESP-модуля с протоколом UDP Что такое | протокол UDP? II ESP-модуль, кроме протокола TCP, поддерживает также еще один протокол. Он называется UDP. Этот протокол в настоящее время также используется в сетях Интернет. Протокол UDP — это более простой протокол для передачи информационных пакетов. Примерное представление о том, чем отличаются эти два протокола можно получить из расшифровки их названий. ЧТО ЕСТЬ ЧТО. TCP - транспортный протокол передачи данных в сетях TCP/IP, предварительно устанавливающий соединение с сетью. UDP - транспортный протокол, передающий паке- ты данных без необходимости установки соедине- ния в IP-cemu. Возникают вопросы: ♦ что это значит с практической точки зрения? ♦ какой из протоколов лучше, какой хуже? ♦ как выбирать и почему их два? Для того чтобы это понять сравним два протокола более детально. Разница между протоколами | TCP и UDPII Разница между протоколами TCP и UDP - в так называемой «гарантии доставки». Протокол TCP требует отклика от клиента, которому доставлен пакет данных. Отклик содержит подтвержде-
168 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ние доставки. Для того чтобы требовать подтверждение готовно- сти, необходимо заранее установить соединение. Также протокол TCP позиционируется, как надежный способ передачи данных, тогда как UDP — это протокол ненадежной доставки пакетов. В UDP-протоколе пакет данных просто посылается потреби- телю без проверки его доставки. Если нет обрывов связи и помех, пакет дойдет до потребителя и будет им принят. Если есть проблемы канала или в работе принимающего устройства, пакет будет утерян. В случае неполучения подтверждения протокол TCP про- изводит повторную отсылку пакета. Причем пакеты нумеруются, что позволяет после получения расставить все пакеты в правиль- ном порядке и исключить повторы. Все это исключает потери данных, дублирование и перемешивание пакетов. Протокол UDP все это допускает, и соединение для работы ему не требуется. UDP применяется в тех системах, которые могут обходиться полученными данными, даже если их часть потеряна. ПРИМЕЧАНИЕ. Кроме того, TCP контролирует загруженность со- единения, UDP не контролирует ничего, кроме це- лостности отдельных пакетов. С другой стороны, благодаря такой неизбирательности и бес- контрольности, UDP доставляет пакеты данных (их еще назы- вают «датаграммами») гораздо быстрее. Поэтому для приложе- ний, которые рассчитаны на широкую пропускную способность и быстрый обмен, UDP можно считать оптимальным вариантом. К таковым относятся: ♦ сетевые и браузерные игры; ♦ программы просмотра потокового видео; ♦ приложения для видео или голосовой связи. ПРИМЕЧАНИЕ. В нашем случае применение UDP оправдано при уда- ленном управлении электронными устройствами в случае, если управляющие команды могут идти не- прерывно с определенным периодом.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 169 Пока идет поток команд, действие выполняется. При отсут- ствии команд в течение некоторого промежутка времени выпол- нение всех команд прекращается. Таким способом можно управлять бытовой техникой, электрон- ными замками, системами климат-контроля и т. п. Во всех подоб- ных системах от потери пакета, полной или частичной, ничего не меняется. Автоматически повторять запрос не обязательно. При необходимости можно еще раз нажать кнопку. Зато загрузка происходит намного быстрее. Протокол TCP, как более надежный, с успехом применяется даже в почтовых программах, позволяя контролировать не только трафик, но и длину сообще- ния, и скорость обмена трафиком. ПРИМЕЧАНИЕ. Порядок использования протокола UDP в ESP- модуле кардинально отличается от использования протокола TCP. Протокол UDP не требует предварительной установки соеди- нения, поэтому при использовании UDP не используется техно- логия клиент-сервер. Необходимо просто запустить на каждом из устройств, между которыми производится обмен данными, про- грамму, которая будет посылать свои и обрабатывать принятые UDP-пакеты при их поступлении. На обоих устройствах, между которыми нужно производить обмен данными, устанавливаются абсолютно равнозначные по своему статусу программы. Любое из этих устройств может послать пакет данных на другое устройство. Если это другое устройство включено и есть связь, оно примет этот пакет. Организация обмена данными | по протоколу UDP 1 Рассмотрим подробнее, как организовать обмен информа- цией по протоколу UDP между ESP модулем и смартфоном. Для начала нужно включить смартфон и ESP-модуль в одну Wi-Fi сеть.
170 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Для этого вы можете включить ESP-модуль в режим точки доступа и подключить к нему смартфон, как это описано в раз- деле 3.1. Или просто подключить ESP-модуль и смартфон к вашей домашней Wi-Fi сети, как это описано в разделе 3.4. Допустим, что ESP-модуль и смартфон подключены в одну Wi-Fi сеть, и при этом: ♦ ESP модуль получил в этой сети IP-адрес 192.168.0.103; ♦ смартфон получил IP адрес 192.168.0.104. Далее необходимо создать UDP канал как на ESP-модуле, так и на смартфоне. Для создания UDP канала на ESP-модуле необ- ходимо выполнить последовательность команд, приведенную в табл. 3.6. Передача данных по UDP протоколу Таблица 3.6 Последовательность команд AT+CIPMUX=1 AT+CIPSTART=4,«UDP","192.168.0.104«,4000,4001,0 AT+CIPSEND=4,7 > UDPtest AT+CIPCL0SE=4 Расшифровка Включить множественные подключения Создать UDP канал с номером 4 Отправить 7 байт данных Набрать передаваемые данные Закончить UDP передачу Создание каналов UDP возможно как в однопользователь- ском, так и в многопользовательском режимах. В табл. 3.6 при- веден многопользовательский вариант. Поэтому значение пара- метра CIPMUX в первой строке табл. 3.6 устанавливается равным единице. Создание UDP-канала производится уже знакомой нам коман- дой AT+CBPSTART. При помощи этой команды мы выше создавали соединение клиента TCP с сервером. Теперь мы изменим значение параметра «протокол». Вместо «TCP» мы укажем «UDP». Как видно из табл. 3.6, команда AT+CIPSTART в данном слу- чае имеет больше параметров, чем в предыдущих примерах ее использования (табл. 3.3 и табл. 3.4). Разберем эти параметры подробно. Но сначала определимся с терминами. Далее, мы будем использовать следующие понятия:
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 171 ♦ «Локальный IP-адрес»; ♦ «Локальный порт»; ♦ «Удаленный IP-адрес»; ♦ «Удаленный порт». Если речь идет о ESP-модуле, то его собственный IP адрес и порт, на который он будет принимать информацию, считаются локальными. Напротив, IP-адрес и порт смартфона будут для него удаленными. ВНИМАНИЕ. N Когда мы будем говорить о смартфоне, то все бу- дет наоборот. IP-адрес и порт ESP-модуля для смартфона будут удаленными, а свои IP-адрес и порт - локальными. Имеется шесть параметров команды AT+CIPSTART. Рассмотрим их. Первый параметр — это номер (ID) создаваемого канала. Мы создаем канал номер 4. Второй параметр — вид протокола (UDP). Третий канал — IP-адрес удаленного устройства (в данном случае смартфона). Четвертый параметр — номер порта удаленного устройства (смартфона). Пятый параметр — номер порта ответа (локальный порт). Это порт будет открыт на ESP-модуле для приема данных с дру- гих устройств. Шестой параметр — разрешение изменения удаленного IP-адреса. Если этот параметр равен 0, то передавать инфор- мацию можно только на один IP-адрес. На тот, который указан в третьем параметре. При этом получать информацию модуль будет с любого устройства, приславшего сообщение на IP-адрес модуля на его локальный порт. Если последний параметр равен 1, то включается возможность динамически менять как удаленный IP-адрес, так и номер удаленного порта. Передача данных производится при помощи уже известной нам команды AT+CIPSEND. В ее работе нет никаких изменений. В нашем примере (табл. 3.6) передается 7 байт в канал номер 4.
172 Управление модулем ARDUINO по Wi-Fi с мобильных устройств AT+CIPMUX=1 ОК AT+CIPSTART=4,"UDP","192.168.О.104",4000,4001,О 4,CONNECT OK &T+CIPSEND=4,7 ЭК busy Recv SEND + IPD s.. . 7 bytes OK ,4,8:HelloESP Рис. 3.14. Передача сообщений no UDP протоколу на стороне ESP-модуля При выполнении команды на экране появляется приглашение «>», в ответ на которое нужно набрать само сообщение. Мы набе- рем «UDPtest». На рис. 3.14 можно видеть, как выглядит окно монитора порта после создания канала и передачи сообщения. ВНИМАНИЕ. Отправка сообщения по протоколу UDP не гаран- тирует того, что это сообщение дошло до адре- сата. Завершить работу UDP-канала в ESP-модуле можно при помощи команды AT+CIPCLOSE. В нашем примере у команды один параметр — номер закрываемого канала. Для создания UDP-канала на смартфоне запустите приложе- ние «TEST TOOL» и выберите в меню режим UDP. Внешний вид окна «UDP» показан на рис. 3.15.
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 173 192 168 103 4001 ieiioFSP Рис. 3.15. Передача сообщений по UDP протоколу на стороне смартфона В этом окне необходимо сначала выставить параметры канала: ♦ в поле «Target IP» (удаленный IP) нужно проставить IP адрес нашего ESP-модуля; ♦ в поле «Target Port» (удаленный порт) указать номер порта установленный в ESP-модуле как порт ответа; ♦ в поле «Local Port» (локальный порт) — указать порт, который будет открыт на смартфоне для получения сообщений от ESP- модуля. Значения всех этих параметров показано на рис. 3.15. После того, как все параметры прописаны, нажмите кнопку «CONNECT». Сразу после нажатия канал будет создан. Кнопка «CONNECT» пре- вращается в кнопку «DISCONNECT».
174 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. В данном случае CONNECT означает не соединение 1 с ESP-модулем, а просто соединение с Wi-Fi сетью. I Теперь, если из ESP-модуля произвести передачу информации, мы увидим ее в центральной части окна «UDP». Для того чтобы передать сообщение от смартфона в ESP-модуль, нужно: ♦ набрать текст сообщения в поле передаваемых сообщений в нижней части окна «UDP» (после слова «repeat»); ♦ нажать кнопку «SEND». Сразу после нажатия кнопки «SEND» сообщение отправится на ESP-модуль по заданному IP адресу. Если UDP канал в ESP- модуле уже запущен, то сообщение появится в окне монитора порта (рис. 3.14). При отправке сообщения на ESP-модуль, оно также появится и в окне «UDP» на смартфоне (рис. 3.15). I Режим смены IP-адреса Теперь рассмотрим, как происходит передача сообщений по протоколу UDP в том случае, когда разрешено динамическое изменение удаленного IP-адреса и удаленного порта. Заодно мы вместо многоканального режима установим одноканальныи режим передачи данных (установим CIPMUX=0). Для этого необ- ходимо выполнить последовательность АТ-команд, приведенную в табл. 3.7. ПРИМЕЧАНИЕ. Как уже говорилось выше, режим динамической сме- ны IP-адреса выбирается при помощи последнего параметра команды AT+CIPSTART. Значение параметра в данном случае должно быть равно 2. Так как вместо многоканального режима мы выбрали однока-
Глава 3. Работа с модулем ESP-O1 при помощи АТ-команд 175 нальный, во всех командах, где использовался параметр «Номер канала», теперь он отсутствует. Выбор одноканального режима никак не связан с возможно- стью динамического изменения адреса и порта. Просто хотелось одновременно продемонстрировать порядок работы при измене- нии обоих параметров, но не делать отдельный пример для каж- дого из них. Передача данных по UDP протоколу со сменой IP Таблица 3.7 Последовательность команд AT+CIPMUX=O AT+CIPSTART="UDP","192.168.0.104«,4000,4001,2 AT+CIPSEND=7 > UDPtest AT+CIPCLOSE=4 Расшифровка Включить множественные подключения Создать UDP канал с номером 4 Отправить 7 байт данных Набрать передаваемые данные Закончить UDP передачу Как видите, команда AT+CIPSEND имеет всего один параметр — количество передаваемых байтов. Параметр «Номер канала» отсут- ствует, так как мы выбрали одноканальный режим работы. Если команда передачи данных (AT+CIPSEND) выглядит так, как показано в табл. 3.7, то передаваемые при ее помощи данные все также будут направляться по фиксированному адресу, указан- ному в команде CIPSTART. Для того чтобы послать информацию по другому адресу и к другому порту, необходимо несколько изменить команду AT+CIPSEND, добавив в нее два новых параметра: AT+CIPSEND=7,"192.168.0.105",4002 В новом формате первый параметр (количество передавае- мых байт), как и прежде, равен 7. Два новых параметра: ♦ новый удаленный IP-адрес; ♦ новый номер удаленного порта. Новые IP-адрес и номер порта действуют только на одну опе- рацию передачи данных. Если после этого использовать команду CIPSEND без последних двух параметров, то пакет данных снова уйдет по фиксированным значениям IP-адреса и порта.
176 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Широковещательный режим передачи данных Современные Wi-Fi сети чаще всего работают в режиме пла- вающего IP адреса. Адрес присваивается автоматически, при помощи специального DHCP сервера, расположенного обычно в центральном роутере. DHCP-сервер присваивает каждому вновь подключившемуся к сети хосту один из свободных на данный момент IP-адресов, из выделенного в процессе настройки пула адресов. Если какой-нибудь хост отключается от сети, то при повтор- ном подключении ему может быть присвоен уже другой IP-адрес. Это приводит к тому, что каждый раз после подключения как ESP- модуля, так и смартфона, нам приходится выяснять и менять в наших программах значения IP-адресов. А это затрудняет созда- ние программ обмена данными. И здесь может очень помочь широковещательный режим. В сетевом протоколе адрес 2SS.25S.255.2SS является зарезерви- рованным. Он предназначен для передачи информации сразу для всех хостов, подключенных в данный момент к сети. Если в настройках UDP канала указать в качестве IP адреса 255.255.255.255, то при передаче пакета информации он будет принят сразу всеми хостами в сети. Но при конструировании устройств автоматики чаще всего нужно передавать данные на конкретное устройство. И тут нам поможет разделение по номеру порта. Установив разные номера портов для разных устройств, можно использовать широ- ковещательный способ передачи данных для выбора одного из устройств, меняя каждый раз лишь номер удаленного порта. При работе в широковещательном режиме будьте осторожны. Если вы управляете вашим ESP-модулем через домашнюю или корпоративную Wi-Fi сеть, то в этой сети, скорее всего, работают другие компьютеры и разные электронные устройства (напри- мер, принтеры, web-камеры, телевизоры и т. п.). Следите, чтобы номер удаленного порта, указанный при пере- даче данных, не совпал с номером порта одного из этих устройств. Выбирайте номера портов ближе к максимальному значению (максимальное значение равно 65536). А лучше используйте отдельную Wi-Fi сеть. Многие современные смартфоны могут работать в режиме точки доступа.
ГЛАВА 4 УПРАВЛЕНИЕ ESP-01 ПРИ ПОМОЩИ ARDUINO В данной главе мы научимся писать программы для модуля ARDUINO, при помощи которых Ардуино будет управлять модулем ESP-O1, превращая его в Wi-Fi адаптер. При помощи этих программ мы будем организовывать связь по Wi-Fi каналу и построим ряд устройств, управляемых по Wi-Fi.
178 Управление модулем ARDUINO no Wi-Fi с мобильных устройств 4.1. Учимся управлять модулем ESP-O1 при помощи ARDUINO I Порядок изучения данной главы В этой главе мы научимся управлять модулем ESP-O1 при помощи ARDUINO. Мы уже касались выше данного вопроса. Самый простой способ решения этой задачи: ♦ сначала подключить последовательный канал ARDUINO к по- следовательному каналу ESP-модуля; ♦ затем программным путем формировать АТ-команды и управлять таким способом работой ESP-модуля. ПРИМЕЧАНИЕ. Разумеется, ESP-модуль должен быть прошит стандартным NonOS SDK. При этом: ♦ ARDUINO будет выступать в роли основного управляющего контроллера; ♦ ESP-O1 будет выполнять функцию внешнего Wi-Fi адаптера. Изучение всего предложенного в этой главе материала будет производиться при помощи ряда специально разработанных программных примеров, которые шаг за шагом помогут рас- крыть заявленную в заголовке главы тему. СОВЕТ. Настоятельно рекомендую не просто прочитать каждый раздел, но и опробовать каждую программу на практике.
Глава 4.Управление ESP-01 при помощи ARDUINO 179 Во всех предложенных ниже примерах использу- ется одна из самых распространенных моделей ARDUINO - ARDUINO UNO. Рекомендую приобрести этот модуль, а также другие материалы и ком- плектующие, о которых мы расскажем в ходе изло- жения материала книги. Соединенные вместе модуль ESP-O1 и модуль ARDUINO мы будем называть «УЧЕБНЫЙ МОДУЛЬ». УЧЕБНЫЙ МОДУЛЬ будет являться основой для создания схем, используемых во всех программных примерах в главе 4 и в главе 5. Вспомогательные II программные средства II Кроме модуля ARDUINO, вам понадобится скачать и устано- вить на ваше мобильное устройство еще одно специализирован- ное приложение. Оно послужит пультом управления и источником команд, которые мы будем передавать с мобильного приложения на «УЧЕБНЫЙ МОДУЛЬ» и управлять им. ПРИМЕЧАНИЕ. В процессе создания данной книги на Play Market было обнаружено очень удобное, универсальное, спе- циально разработанное приложение, предназначен- ное для управления по Wi-Fi микроконтроллерными устройствами, выполненными на основе микросхе- мы ESP8266EX. Это приложение называется «WIFI Controller ESP8266» (далее просто «WIFI Controller»). Приложение представляет собой универсальный программ- ный пульт, позволяющий подавать по каналу Wi-Fi управляющие
180 Управление модулем ARDUINO по Wi-Fi с мобильных устройств команды на разрабатываемое вами микроконтроллерное устрой- ство. При помощи этого приложения легко продемонстрировать любой алгоритм и опробовать любой способ управления микро- контроллером при помощи мобильного устройства. СОВЕТ. Далее, в книге мы будем широко использовать это приложение в большинстве программных примеров. Поэтому, перед тем, как приступить к изучению программных примеров, необходимо установить приложение на ваше мобильное устройство. WiFs CcmtroSier ESP826? Снйль с рэзраб-гт Рис. 4.1. Страница загрузки приложения «WIFI Controller ESP8266»
Глава 4.Управление ESP-01 при помощи ARDUINO 181 Для перехода по указанной в тек- сте ссылке [6] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. При помощи смартфона отсканируйте QR-код [6] Смартфон автоматически перейдет на страницу установки приложения (см. рис. 4.1). 4.2. Осваиваем приложение «WIFI Controller ESP8266» Органы управления | приложением II Приложение «WIFI Controller ESP8266» представляет собой средство удаленного управления электронными устройствами на основе микроконтроллера ESP8266EX через Wi-Fi канал. В главном окне приложения имеется набор из трех движков (слайдеров) и 20 кнопок, при помощи которых на микроконтрол- лерное устройство можно посылать различные команды. Эти команды должен принимать и распознавать ваш УЧЕБНЫЙ МОДУЛЬ. Таким способом вы сможете управлять моду- лем путем нажатия кнопок. А при помощи движков можно пере- давать плавно изменяющиеся величины. Есть в приложении так же поле для ввода произвольных сообщений, которые так же можно отправлять на УЧЕБНЫЙ МОДУЛЬ. Предусмотрена и обратная связь. УЧЕБНЫЙ МОДУЛЬ может передавать любые сообщения, и они отобразятся в специ- альном поле приложения на смартфоне. Модуль ESP-01, являющийся составной частью вашего УЧЕБНОГО МОДУЛЯ можно использовать: ♦ в режиме Wi-Fi точки доступа; ♦ в режиме Wi-Fi клиента, подключенного к вашей домашней сети.
182 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ВНИМАНИЕ. Главное, чтобы в ESP-модуле был запущен TCP сер- вер. Приложение «WIFI Controller» может работать только в режиме ТСР-клиента. I Первый запуск приложения Работа с приложением «WIFI Controller» не должна вызвать никаких затруднений. Приложение имеет простой и интуитивно понятный интерфейс. При первом запуске приложение автома- тически запросит параметры УЧЕБНОГО МОДУЛЯ: ♦ его IP-адрес; ♦ номер порта. Окно запроса показано на рис. 4.2. В поле «Enter IP or Host Name» (введите IP или имя хоста) укажите IP адрес УЧЕБНОГО МОДУЛЯ, в поле «PORT» введите номер его порта. ПРИМЕЧАНИЕ. Учитывая опыт подключения модуля к домашней сети при изучении системы АТ-команд в главе 3, в режиме Wi-Fi клиента IP-адрес ESP-модуля будет равен 192.168.0.106. В случае, когда ESP-модуль работает в режиме точки доступа, IP адрес будет равен 192.168.4.1. Номер порта мы выберем равным 88. Убедившись в том, что параметры набраны правильно, нажмите кнопку «Add». В списке устройств, который находится сразу под заголовком «Saved Devices» появится запись с параме- трами введенного вами устройства (см. рис. 4.3).
Глава 4.Управление ESP-01 при помощи ARDUINO 183 © Рис. 4.2. Окно Saved Devises программы WIFI Controller Рис. 4.3. Список устройств в окне Saved Devises СОВЕТ. Удобно создать записи еще для нескольких уст- ройств, а затем в процессе работы оперативно выбирать нужное вам устройство. Таким образом, вы получаете возможность управлять несколькими УЧЕБНЫМИ МОДУЛЯМИ (по очереди). Каждая запись имеет кружочек в его левой части (так называ- емые РАДИОКНОПКИ). Выбранная РАДИОКНОПКА указывает на текущее выбранное устройство. Для выбора другого устройства просто коснитесь этой строки пальцем. Выбор запоминается. Программа будет работать с выбранным устройством, пока вы не сделаете другой выбор.
184 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Справа в каждой строке списка устройств имеется черный кружок с крестиком. Это кнопка удаления устройства из списка. I Главное окно Сразу после выбора устройства в окне «Saved Devises», оно закрывается, и открывается главное окно приложения. На рис. 4.4 показано как выглядит главное окно при первом вклю- чении. В заголовке окна мы видим, во-первых, название про- граммы. Под названием находится строка состояния канала связи с устройством (нашим УЧЕБНЫМ МОДУЛЕМ). Пока устройство не выбрано в этой строке выводится надпись: «No device selected» (Ни одно устройство не выбрано). Рис. 4.4. Главное окно программы WIFI Controller
Глава 4.Управление ESP-01 при помощи ARDUINO 185 Если в список устройств мы ввели, а затем выбрали одно из устройств, но соединение с ним пока не установлено, в строке состояния мы прочитаем: «Device not connected» (Устройство не подключено). Там же выводятся сообщения о ходе подключения. А когда соединение установлено — указываются его параметры. В заго- ловочной шапке окна имеется так же кнопка [§| — «Установить соединение». Рядом с этой кнопкой имеется индикатор наличия соединения в виде небольшого кружочка. ПРИМЕЧАНИЕ. Если соединение отсутствует - индикатор крас- ный, когда соединение установлено индикатор ста- новится зеленым. Правее индикатора подключения есть еще одна кнопка — кнопка вызова меню [§| Если параметры устройства вы ввели правильно, УЧЕБНЫЙ МОДУЛЬ включен и правильно настроен, соединение устанавли- вается автоматически, сразу после запуска приложения. Если попытка подключения оказалась неудачной, можно повторить попытку, нажав кнопку |§] — «Установить соединение». Как уже говорилось выше, TCP сервер автоматически отклю- чается, в случае отсутствия активности. Время, после которого происходит отключение, определяется параметром Timeout при настройке ТСР-сервера. ПРИМЕЧАНИЕ. Поэтому в процессе работы нужно следить за ин- дикатором наличия соединения, и, в случае обрыва связи, вовремя ее восстанавливать. В основной части главного окна приложения (см. рис. 4.4) расположены элементы управления. При первом включении мно- гие элементы еще не настроены.
186 Управление модулем ARDUINO по Wi-Fi с мобильных устройств В самом верху окна находится поле для передачи текстовых сообщений на УЧЕБНЫЙ МОДУЛЬ. Пока поле не заполнено, в нем видна надпись серого цвета: «Enter ASCII Command» (Введите команду в ASCII коде). Вы можете набрать любую последовательность букв и цифр и, нажав кнопку «Send ASCII», отправить ее на УЧЕБНЫЙ МОДУЛЬ. Модуль должен принять этот текст и обработать его. Это поле используется для оперативной проверки новых команд. Ниже в окне расположены три слайдера. Вы можете пере- мещать движок любого слайдера, а программа передает каждое новое его положение в виде текстового сообщения на УЧЕБНЫЙ МОДУЛЬ. Передаваемое сообщение состоит из буквенного пре- фикса и цифры, определяющей положение слайдера. ПРИМЕЧАНИЕ. Буквенный префикс нужен для того, чтобы при об- работке команды на стороне УЧЕБНОГО МОДУЛЯ, программа могла определить от какого слайдера она пришла. Цифра лежит в пределах: ♦ от 0 (когда слайдер находится в левом крайнем положении; ♦ до 255 (когда движок слайдера находится справа). При первом включении в программе уже установлены бук- венные префиксы для каждого слайдера: ♦ верхний слайдер включает в свое сообщение префикс «А»; ♦ следующий — префикс «В»; ♦ последний — префикс «С». Вы можете поменять настройки каждого слайдера. Для этого нужно щелкнуть по надписи «Edit» с правой стороны от слайдера. Откроется окно настроек Slider Settings (см. рис 4.5). В этом окне вы можете задать имя слайдера (Slider name). ПРИМЕЧАНИЕ. После первого включения поле «Slider Name» не за- полнено. Вы должны его заполнить.
Глава 4. Управление ESP-01 при помощи ARDUINO 187 Slider Settings Slider Name :| Скорость Prefix Char : |д Range B/W :| rj to 255 \r - CR (Carriage Return) \n-LF (Line Feed) sr Cancel Save Рис. 4.5. Окно настройки слайдера Имя слайдера будет выводиться в главном окне программы, как это показано на рис. 4.7. Оно должно отражать назначение слайдера, что помогает не запутаться в органах управления в про- цессе работы. Следующий параметр — «Prefix Char» (Префиксный сим- вол). Как уже говорилось выше, при первом запуске программы префиксы всех трех слайдеров заранее установлены. Вы можете поменять любой префикс по своему усмотрению. Можно исполь- зовать в качестве префикса не один, а несколько символов. ПРИМЕЧАНИЕ. Мы не будем менять префиксы и оставим их значе- ния по умолчанию. Следующие два параметра обозначены как «Range B/W» (Диапазон Минимум/Максимум). Это диапазон изменения циф- ровой части сообщения при перемещении движка слайдера из одного крайнего положения в другое. Вы можете изменить как нижний предел, так и верхний. По умолчанию эти значения равны 0 и 255, соответственно. Вы можете изменить и тот, и другой пределы. Оба значения не могут быть меньше нуля. Максимальное значение верхнего предела (не понятно, из каких соображений) может достигать 999999972. Нижний прел должен быть обязательно меньше верхнего.
188 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Но мы и эти значения оставим по умолчанию. Для задач управления микроконтроллером это самый удобный диапазон. Значения от 0 до 255 можно за- писывать всего одним байтом. К тому же для мно- гих задач такой диапазон является стандартным. Например, такой диапазон входных значений при- меняется в операции аналогового вывода в языке ARDUINO (команда analogWriteO). Последние два параметра в окне «Slider Settings» — это два чекбокса (флажка), позволяющие разрешить либо запретить пере- дачу символов окончания строки в конце сообщения. Как известно, таких символов два: ♦ «Carriage Return» (Возврат каретки), сокращенно CR; ♦ «Line Feed» (Перевод строки), сокращенно LF. Стандартная текстовая строка обычно всегда заканчивается двумя этими символами. Однако вы можете отключить пере- дачу любого из них. Использовать символы конца строки или нет, зависит от алгоритма обработки сообщения в управляющем микроконтроллере. Тут выбирают так, как удобно программисту. ПРИМЕЧАНИЕ. Мы и в этом случае оставим оба значения по умол- чанию. То есть разрешим передачу обоих символов. Button Settings Button Name: ® ASCII О Command : Start HEX SI \r - CR (Carriage Return) Bf \n - LF (Line Feed) 0 Cancel Save Рис. 4.6. Окно настройки параметров кнопки
Глава 4.Управление ESP-01 при помощи ARDUINO 189 Рис. 4.7. Главное окно программы с настроенными параметрами Убедившись, что все параметры введены правильно нажмите на кнопку «Save» и параметры будут записаны в память при- ложения. Если вы передумали менять параметры, нажимайте кнопку «Cancel». На рис. 4.7 показано главное окно программы «WIFI Controller», на которой настроены все слайдеры и кнопки. ПРИМЕЧАНИЕ. Про настройку кнопок мы поговорим чуть ниже. Слайдерам мы выбрали следующие имена: «Скорость», «Яркость» и «Высота тона». Имена мы выбрали условно. Для вашей конкретной задачи вы назовете слайдеры по-своему.
190 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Каждый раз, когда вы перемещаете движок слайдера, к его имени добавляется сообщение о его текущем положении. То самое сообщение, что передается по Wi-Fi в УЧЕБНЫЙ МОДУЛЬ. На рис. 4.7 видно, что слайдер «Скорость» находится в положе- нии 109 и передал в модуль сообщение «А109». Слайдер «Яркость» находится в положении 82 и передал на УЧЕБНЫЙ МОДУЛЬ сооб- щение «В82». Ну а слайдер «Высота тона» находится в положении 62, и передал сообщение «С62». I Настройка кнопок Теперь перейдем к настройке кнопок. Как видно из рис. 4.7, каждой кнопке мы можем присвоить свое отдельное имя. Если кнопка еще не настроена, то для перехода в режим настройки кнопки достаточно просто нажать на нее. Когда кнопка уже настроена (имеет свое имя) для вызова режима настройки нужно нажать и удерживать кнопку в течение одной секунды. На рис. 4.6 показано окно настройки кнопки «Button Setting». Имя кнопки определяется полем «Button Name». Имя должно быть коротким. Не больше пяти-шести символов. Оно будет написано на кнопке, когда вы вернетесь на главное окно приложения. ПРИМЕЧАНИЕ. Лишние буквы не вместятся на изображение кнопки, и просто не будут показаны. Когда надпись не вме- щается на кнопку, в конце появляется многоточие. Кроме поля имени, в окне «Button Setting» имеется несколько полей, при помощи которых определяется формат сообщения, посылаемого при нажатии этой кнопки в УЧЕБНЫЙ МОДУЛЬ. Сразу под «Button Name» мы видим элемент «переключатель», при помощи которого можно выбрать формат передаваемой команды. Возможны два варианта: ♦ ASCII (текстовый); ♦ HEX (шестнадцатеричный).
Глава 4.Управление ESP-01 при помощи ARDUINO 191 Саму команду вы должны вписать в поле «Command». Текстовый формат предполагает, что команду в поле Command вы будете вписывать в виде текстовой строки в кодировке ASCII (стандартная английская кодировка). ПРИМЕЧАНИЕ. Шестнадцатеричный формат используется в том случае, если в качестве команды мы должны пере- дать не текст, а набор произвольных байтов. Произвольные байты удобно записывать в шестнадцатерич- ном виде. Например, «EF» или «D7». В наших программах мы будем использовать текстовый фор- мат. На рис. 4.6 выбраны настройки, при выборе которых кнопка с именем «Start» при ее нажатии будет передавать в УЧЕБНЫЙ МОДУЛЬ текстовую команду «S1». Последние два параметра в окне «Button Setting», как и в окне настройки слайдера, позволяют разрешить либо запретить передачу в конце сообщения символов конца строки. И их мы оставим без изменения. Настройки кнопок программы WIFI Controller Номер кнопки 1 2 3 4 5 6 7 8 9 10 Имя кнопки [1] [2] [3] [4] [5] [6] [7] [8] [9] го 1 Команда К1 К2 КЗ К4 К5 Кб К7 К8 К9 КО Номер кнопки 11 12 13 14 15 16 17 18 19 20 Имя кнопки F1 F2 F3 F4 F5 Start Stop PUSK <- -> Таблица 4.1 Команда F1 F2 F3 F4 F5 SI SO SP SL SR
192 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Для дальнейшей работы с приложением «WIFI Controller» нами были придуманы настройки для всех элементов управления, которые мы будем использо- вать далее во всех программных примерах книги. О настройках слайдеров мы уже говорили. Настройки всех кнопок показаны в табл. 4.1. Введите эти настройки в приложе- ние «WIFI Controller» на смартфоне. Далее по тексту книги мы будем использовать именно эти значения параметров. Позже, если вы будете использовать приложение для своих целей, то должны будете выбрать другие, удобные для вас настройки. Главное, чтобы каждая кнопка передавала в УЧЕБНЫЙ МОДУЛЬ свое уникальное сообщение, чтобы принимающая их программа могла отличить одну команду от другой. ВНИМАНИЕ. При выборе новых параметров необходимо следить за тем, чтобы текст сообщения какой-либо из кно- пок не совпал с командой, передаваемой от одного из слайдеров. Например, если вы выберете для кноп- ки сообщение «А12», то оно совпадет с сообщением от слайдера «А» в момент, когда он будет нахо- диться в двенадцатой позиции. |Поле вывода принятых сообщений Кроме описанных выше органов управления, в главном окне приложения «WIFI Controller» имеется поле вывода принятых сообщений. Оно находится в нижней части окна, сразу под кноп- ками: ♦ при отсутствии сообщений в этом поле серым шрифтом вы- водится надпись «Reserved Data»; ♦ при наличии связи сюда выводятся все сообщения, поступа- ющие от УЧЕБНОГО МОДУЛЯ.
Глава 4.Управление ESP-01 при помощи ARDUINO 193 Дополнительные II функции II Приложение «WIFI Controller» имеет ряд дополнительных функций, доступ к которым осуществляется посредством меню. Для вызова меню используется кнопка Q в правом верхнем углу главного окна приложения. Приложение с открытым меню, пока- зано на рис. 4.8. Меню состоит всего из пяти пунктов. Clear (Очистить) Очистка окна принятой информации. Позволяет удалить уже ненужные записи, перед началом нового этапа работы. Select Device (Выбор устройства) Переход в режим выбора устройства. Этот режим мы уже рас- сматривали выше. Он открывается автоматически при первом запуске программы. В этом режиме можно: ♦ внести в список устройств новое устройство; ♦ удалить ненужные устройства; ♦ выбрать любое устройство в качестве текущего. Setting (Настройки) Настройки программы. При выборе этого пункта открывается окно, изображенное на рис. 4.9. В этом окне можно: ♦ включить или выключить звуковые эффекты (Switch Sound); ♦ включить или выключить запрет автогашения экрана (Keep Screen on); ♦ отключить рекламу (Remove Ads), предварительно заплатив за это. Help (Помощь) Вызов окна помощи. При выборе этого пункта откроется окно, в котором в краткой форме на английском языке дано описание данного программного продукта. View More (Смотреть далее) Вызов окна «Смотреть далее...». Это продолжение меню. Там вы найдете ряд полезных ссылок: ♦ Support (Поддержка); ♦ Contact us (Контакты); ♦ About (О нас).
194 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 4.8. Главное меню программы Рис. 4.9. Меню настроек программы WIFI Controller WIFI Controller Все ссылки малоинформативные. Содержат пару слов на английском и адрес электронной почты. Никакой ссылки на сайт. 4.3. Проблема с IP адресом учебного модуля I Особенности работы модуля ESP-O1 как Wi-Fi клиента Как следует из предыдущего раздела, для нормальной работы приложения WIFI Controller необходимо знать и прописать в настройках IP-адрес УЧЕБНОГО МОДУЛЯ. В этом не будет про-
Глава 4.Управление ESP-01 при помощи ARDUINO 195 блем, если модуль ESP-O1, входящий в состав УЧЕБНОГО МОДУЛЯ, настроен как точка доступа. ПРИМЕЧАНИЕ. В этом случае ее IP адрес будет фиксированным и, по умолчанию, будет иметь значение 192.168.4.1. Проблема возникает в том случае, если модуль ESP-O1 рабо- тает как Wi-Fi клиент, и подключается к вашей домашней (корпо- ративной) Wi-Fi сети. При таком подключении IP адрес модулю выдает роутер вашей сети. При каждом включении IP адрес выда- ется заново, и он может отличаться от адреса, выданного в про- шлом сеансе работы. Роутер выдает IP адрес, исходя из наличия свободных адре- сов. Обычно к роутеру уже подключены несколько мобильных устройств, и часть адресов уже занята. По этой причине после очередного включения УЧЕБНОГО МОДУЛЯ вы не можете знать наверняка, какой IP адрес он получит. Существует несколько способов решения этой проблемы. Если у вас есть доступ к настройкам вашего роутера, и вы умеете правильно работать с этими настройками, можно войти в систему DHCP роутера и внести в список фиксированных IP адресов адрес для вашего модуля, как это показано на рис. 4.10. Рис. 4.10. Настройка фиксированного IP адреса в окне роутера
196 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. На рис. 4.10 показана страница фиксированных DHCP адресов роутера, установленного в домашней сети автора этой книги. Та же страница вашего роутера может выглядеть иначе. В строке 4 автором внесена запись, которая закрепляет IP адрес 192.168.0.106 за МАС-адресом моего ESP модуля. МАС-адрес ESP-модуля можно узнать, напрямую, подключив его к компью- теру, и подав на него команду AT+CIFSR. Если у вас нет доступа к роутеру или вы боитесь испортить его настройки, придется каждый раз выяснять, какой же адрес при- своен модулю, и заново вносить его в настройки. СОВЕТ. Для облегчения задачи определения IP адреса удоб- но воспользоваться специальным мобильным при- ложением, при помощи которого можно проскани- ровать всю вашу Wi-Fi сеть и получить полный спи- сок всех работающих в данный момент хостов со всеми их характеристиками [7]. В полученном списке хостов вы найдете хост вашего УЧЕБНОГО МОДУЛЯ и увидите его IP и MAC адреса. Предлагаем читателям скачать и устано- вить на свое мобильное устройство одно из таких приложений. Оно называется «Network Utilities». I Приложение «Network Utilities» «Network Utilities» — это бесплатное приложение с професси- ональными возможностями. Имеет русскоязычный Help. Скачать приложение [7] можно так же, как и в предыдущих случаях — по QR-коду.
Глава 4.Управление ESP-01 при помощи ARDUINO 197 Для перехода по указанной в тек- сте ссылке [7] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. После сканирования OR кода камерой смартфона, на экране автоматически откроется страница загрузки приложения. Внешний вид страницы загрузки показан, на рис. 4.11. После того, как приложение будет установлено, запустите его. Для сканирования сети используется функция «IP Discover». При первом запуске этот режим включается по умолчанию. tilities '.^^i^rji/i-^ 's'l.-si- '■■'■■' Рис. 4.11. Страница загрузки программы Network Utilites Рис. 4.12. Главное окно программы Network Utilites
198 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Если режим не выбран, выберите его при помощи меню (кнопка в в левом верхнем углу экрана). Окно функции «IP Discover» показано на рис 4.12. Если режим выбран правильно, запустите процесс скани- рования. Для этого нажмите кнопку Ц в нижней части экрана. Сканирование займет некоторое время (зависит от количества хостов в сети). Найденные хосты будут отображаться постепенно, по мере их нахождения. Для каждого хоста в списке появляется запись, состоящая из трех строк: ♦ в первой строке — имя хоста; ♦ во второй строке — IP и MAC адреса; ♦ в третьей строке — название модели оборудования. Когда процесс сканирования завершится, найдите в списке хост с названием модели оборудования «Espressif Inc.». В параме- трах хоста вы увидите нужные вам IP и MAC адреса. ПРИМЕЧАНИЕ. . ^ Далее, по ходу изучения материала книги, мы будем пользоваться и другими функциями приложения «Network Utilities». 4.4. Подключение модуля ESP-O1 к ARDUINO I Создаем учебный модуль Итак, с тем, что касается использования мобильного устрой- ства для решения поставленной в этой книге задачи, мы разобра- лись. Теперь нам нужно создать тот самый УЧЕБНЫЙ МОДУЛЬ, о котором так много говорилось выше.
Глава 4.Управление ESP-01 при помощи ARDUINO 199 ПРИМЕЧАНИЕ. Проще всего для подключения модуля ESP-O1 к ARDUINO использовать переходную плату промыш- ленного изготовления. Например, такую плату, как показано на рис. 2.9 и рис. 2.10 (во второй главе). Плата имеет специальный разъем, куда вставляется модуль ESP-O1, а также выходной четырех контактный штыревой разъем, который можно использовать для подключения к ARDUINO. На выходной разъем выведены следующие цепи: ♦ общий провод (GND); > цепь VCC +5 вольт (через этот контакт на переходную плату поступает внешнее питание); ♦ две линии последовательного канала — ТХ и RX. На переходной плате установлены: ♦ стабилизатор напряжения, который преобразует поступаю- щее на плату напряжение +5 В в напряжение питания ESP- модуля (+3,3 В); ♦ элементы согласования сигналов, поступающих на модуль с сигналами ARDUINO. ВНИМАНИЕ. На плате ARDUINO имеется стабилизатор, форми- рующий напряжение +3,3 В. Некоторые авторы ис- пользуют это напряжение для питания ESP модуля. Однако модуль потребляет достаточно большую мощность при передаче сигнала по Wi-Fi каналу (до 300 мА). Источник 3,3 вольта на плате ARDUINO не может выдать такой уровень тока. Поэтому, для устойчивой работы модуля лучше всего использовать дополнительный стабилиза- тор, так как это сделано в предлагаемой переход- ной плате.
200 Управление модулем ARDUINO no Wi-Fi с мобильных устройств I Подключение учебного модуля Для подключения платы к ARDUINO удобно использовать стандартные кабели (см. рис. 2.11). Для этого нужно осторожно оторвать от общего кабеля полосу из четырех проводников. При помощи этого четырехжильного кабеля нужно соединить пере- ходную плату и модуль ARDUINO. Общий провод и шину питания VCC нужно подключить к кон- тактам GND и +5V ARDUINO. Линии RX и ТХ переходной платы нужно подключить к контактам 1 и 2 модуля ARDUINO (напом- ним, речь идет об «ARDUINO UNO»). ПРИМЕЧАНИЕ. ■ л Контакты 1 и 2 «ARDUINO UNO» выполняют так- же роль линий RXu ТХ последовательного канала. Соединение линий последовательного канала ARDUINO и переходной платы нужно выполнить перекрестным способом: ♦ RX ARDUINO - на ТХ переходной платы; ♦ ТХ ARDUINO - на RX переходной платы. |Как самостоятельно собрать переходную плату К сожалению, далеко не в каждом городе в магазинах элек- тронных компонентов можно купить такую переходную плату. Например, в Симферополе (тем более в других городах Крыма) таких плат в продаже нет. Купить плату можно в Интернете. Стоимость такой платы на начало 2019 года составляла примерно 78 рублей. Однако пересылка стоит довольно дорого. А на сайте Aliexpress, где имеется огромное количество самых разных плат и элементов, такие платы из-за их малой цены продаются обычно оптом (минимум по 10 штук).
Глава 4.Управление ESP-01 при помощи ARDUINO 201 СОВЕТ. В связи с вышесказанным, иногда проще собрать такую плату самостоятельно. На рис. 4.13 показана схема подключения модуля ESP-01 к ARDUINO. По сути, это и есть схема переходной платы. Собрать такую схему удобно на универсальной плате, которую легко купить в любом магазине электронных компонентов или на радиорынке. Внешний вид самодельного модуля изображен на рис. 4.14. Рис. 4.13. Схема подключения модуля ESP-01 к ARDUINO Рис. 4.14. Внешний вид самодельного переходного модуля
202 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Самодельный модуль, собранный по схеме рис. 4.13, дает еще одно преимущество. Дело в том, что в процессе работы вам обя- зательно понадобится подключать ESP-модуль к компьютеру для того, чтобы вручную подавать на него различные АТ-команды. Это понадобится для начальной ручной настройки модуля или для руч- ной проверки АТ-команд перед их использованием в программе. Для этого вам придется вынимать ESP-модуль из переходной платы и подключать через USB-адаптер к компьютеру. Небольшое изменение схемы превращает ARDUINO в USB-адаптер. Изменение сводится к переброске всего двух проводов. Провода, идущие к контактам 1 и 2 ARDUINO, нужно просто поменять местами. ПРИМЕЧАНИЕ. ~\ Дело в том, что на плате ARDUINO уже есть USB- TTL адаптер. При помощи этого адаптера ARDUINO подключается к компьютеру. Как это выглядит, по- казано на рис. 4.15. II Подключаем II плату ARDUINO UNO На рис. 4.15 в упрощенном виде изображена часть внутрен- ней схемы ARDUINO UNO. В качестве USB-TTL адаптера исполь- зуется микроконтроллер ATMegal6U2-MU. Линии RXD и TXD USB-TTL адаптера внутри платы ARDUINO подключены к линиям TXD, RXD основного микроконтроллера ARDUINO (ATMega328P-PU). Таким образом, основной контрол- лер ARDUINO получает возможность обмениваться информацией с компьютером. По этому же каналу производится загрузка в ARDUINO отком- пилированной программы. Одновременно, эти же сигналы (RX и ТХ) выводятся на внешний разъем ARDUINO, на контакты 0 и 1 (см. схему на рис. 4.15).
Глава 4.Управление ESP-01 при помощи ARDUINO 203 D+ +5В D- GNP USB-TTL TXD RXD ATMEGA328PPU TXD RXD 7"° 1кОм чиз- RXH) ATMEQA16U2-MU(R) IkOm о IOL Puc.4.15. Схема включения последовательного канала в модуле ARDUINO ПРИМЕЧАНИЕ. Сделано так потому, что в микроконтроллере ATMega328P-PU эти две линии имеют и второе на- значение - они служат линиями ввода-вывода. Линии RX и ТХ модуля ESP-01 подключаются к этим самым внешним контактам 0 и 1 ARDUINO (см. рис 4.13), и ESP-модуль тоже получает возможность обмениваться информацией с ARDUINO. В процессе обмена информацией между ARDUINO и ESP-01, компьютер не должен мешать. Поэтому в момент обще- ния ESP-01 с ARDUINO последовательный канал компьютера можно использовать только на прием информации. Описанная выше схема не позволяет установить двухсто- ронний обмен между компьютером и ESP-модулем, так как между линиями RX и ТХ этих двух устройств не соблюдается условие перекрестного подключения. Сокращение TxD или ТХ (Transmit Data) переводится как «Передача данных». A RxD или RX (Receive Data) переводится как «Прием данных». Для правильной работы вход должен подключаться к выходу. Чтобы оперативно превратить ARDUINO в адаптер, для под- ключения модуля ESP-01 к компьютеру, нужно поменять местами провода на контактах 0 и 1 ARDUINO. После этого линии RX и ТХ внутреннего USB-TTL адаптера ARDUINO окажутся корректно подключенными к линиям ТХ, RX ESP-модуля. Основной контроллер ARDUINO при этом нужно приостановить, нажав и удерживая кнопку сброса. Удерживать придется постоянно, в течение всего сеанса работы компьютера с ESP-модулем.
204 Управление модулем ARDUINO no Wi-Fi с мобильных устройств ВНИМАНИЕ. По окончании сеанса не забудьте вернуть провода на контактах 0 и 1 в прежнее положение. Питание учебного модуля Питание УЧЕБНОГО МОДУЛЯ удобнее всего осуществлять от компьютера, подключив модуль ARDUINO к его USB-порту. Через переходную плату, подключенную к ARDUINO, питание поступит и на модуль ESP-01. Если для решения очередной задачи потребуется автоном- ное использование УЧЕБНОГО МОДУЛЯ, то запитать весь модуль можно при помощи внешнего блока питания, обеспечивающего постоянное напряжение 6... 12 вольт и ток не менее 600...700 мА. Для подключения такого блока питания на плате ARDUINO име- ется специальный разъем. Стабилизатор, который также имеется на плате ARDUINO, преобразует напряжение от внешнего блока питания в стандартное напряжение +5 В. 4.5. Настройка параметров ESP-01 под управлением ARDUINO Задачи и возможности создаваемой программы Ну, а теперь перейдем непосредственно к программированию. ПРИМЕЧАНИЕ. Вы уже, наверное, поняли, что наша задача создать программу для модуля ARDUINO, которая будет ис- пользовать модуль ESP-01 для связи с мобильным
Глава 4.Управление ESP-01 при помощи ARDUINO 205 приложением, установленным в вашем смартфоне. При этом все общение ARDUINO и модуля ESP-01 будет происходить при помощи АТ-команд. Программа, которую мы создадим и загрузим в ARDUINO, должна: ♦ формировать нужные нам AT-команды; ♦ посылать команды в ESP-модуль. Затем программа должна принимать и анализировать ответы от ESP-модуля, и, в зависимости от их содержания, корректиро- вать свою работу. Из второй главы вы узнали, что для подготовки ESP-модуля к работе нужно сначала при помощи АТ-команд выполнить сле- дующие настройки: 1. создать Wi-Fi соединение ESP-модуля и мобильного устрой- ства; 2. запустить на ESP-модуле ТСР-сервер. Способы создания | Wi-Fi соединения II Создать Wi-Fi соединение можно двумя способами: 1. перевести ESP-модуль в режим точки доступа и подклю- читься к этой точке при помощи смартфона; 2. перевести ESP-модуль в режим Wi-Fi клиента и подклю- читься к домашней либо корпоративной сети. К той же сети обычно уже подключен ваш смартфон. Для выбора каждого из режимов существует строгая последо- вательность команд, каждая из которых устанавливает свой пара- метр. Эти команды мы подробно рассматривали в предыдущей главе. Мы также знаем, что при включенном режиме авто под- ключения ESP-модуля, он запоминает значения некоторых параметров. Другие же параметры не сохраняются и требуют повторной установки каждый раз после включения питания или после выполнения команд начального сброса. Поэтому послу- шайте совет.
206 Управление модулем ARDUINO по Wi-Fi с мобильных устройств СОВЕТ. Те параметры, значения которых автоматически сохраняются, правильнее всего единожды устано- вить вручную, непосредственно с компьютера. И наоборот, значения параметров, которые не сохра- няются в долговременной памяти ESP-модуля, нуж- но устанавливать программно при каждом переза- пуске ARDUINO. ВНИМАНИЕ. Режим авто подключения активизируется по умолчанию после подачи команды полного сброса AT+RESTORE либо при подаче специальной команды включения этого режима: AT+CWAUTOCONN=1. I Установка параметров настройки ESP-01 Попробуем разобраться, какие параметры мы должны уста- новить вручную, а какие будем устанавливать каждый раз при помощи программы. Для этого сначала сравним между собой: ♦ последовательность команд для перевода модуля в режим точки доступа (см. ранее табл. 3.1); ♦ последовательность команд для перевода в режим Wi-Fi кли- ента (см. ранее табл. 3.5). Сюда же нужно добавить коман- ды для запуска TCP-сервера (табл. 3.2). При анализе нужно учесть действие команд AT+RST и AT+RESTORE на сохран- ность установок. Результат сравнения всех этих таблиц и практической проверки действия команд начального сброса сведен в табл. 4.2. В столбце 1 перечислены все команды, используемые при выборе нужных нам режимов (согласно табл. 3.1, табл. 3.2, табл. 3.5):
Глава 4.Управление ESP-01 при помойци ARDUINO 207 ♦ первые три команды (строки 1...3) — это команды установки параметров; ♦ следующие три команды (строки 4...6) запускают какой-либо процесс. К процессам относятся: ♦ функционирующая Wi-Fi точка доступа; ♦ функционирующий Wi-Fi клиент; ♦ функционирующий ТСР-сервер. Поведение параметров настройки ESP-01 при сбросе и перезапуске Таблица 4.2 Команда 1 2 3 4 5 6 AT+CWMODE AT+CIPMODE AT+CIPMUX AT+CWSAP AT+CWJAP AT+CIPSERVER Wi-Fi точка доступа 2 или 3 0 1 Активна - Активна Wi-Fi клиент 1 или 3 0 1 - Активна Активна RESTORE 2 0 0 Сбрасыва- ется Сбрасыва- ется Сбрасыва- ется RST Не изменяется Не изменяется 0 Не изменяется Не изменяется Сбрасывается Выключение питания Не изменяется Не изменяется 0 Не изменяется Не изменяется Сбрасывается ПРИМЕЧАНИЕ. В столбцах 2...6 (табл. 4.2) показаны значения па- раметров и поведение процессов в разных ситуа- циях. Разберем подробнее содержимое табл. 4.2. В столбце 2 сведены значения параметров, которые нужно выставить, и отмечены процессы, которые должны быть запу- щены в режиме «точка доступа». В столбце 3 то же самое показано для режима «Wi-Fi клиент». В столбце 4 показано, как ведут себя параметры и процессы после выполнения команды AT+RESTOTE.
208 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Как видите, после выполнения полного сброса все три пара- метра возвращаются к значениям по умолчанию, а все процессы сбрасываются. Только параметр CIPMODE остался неизмен- ным. Но это потому, что он и так имеет значение по умолчанию. Отсюда сразу делаем вывод. ВЫВОД. Применять команду полного сброса можно только единожды и только перед началом процесса выбо- ра всех остальных настроек. После того как уста- новлены все параметры и запущены нужные нам процессы, полный сброс применять нельзя. Иначе придется каждый раз после его применения повто- рять все настройки заново. В столбце 5 показано, как ведут себя настройки и процессы, установленные (запущенные) в столбцах 2 и 3 после выполнения команды AT+RST. В столбце 6 то же самое показано для случая выключения и последующего включения питания. Как видим, результат выпол- нения команды RST и выключение питания дают совершенно одинаковые результаты. В обоих случаях сбрасывается всего один параметр — CIPMUX, и останавливается всего один процесс — ТСР-сервер. ВЫВОД. Значение параметров CWMODE и CIPMODE мож- но установить один раз вручную. Если перед этим также вручную была подана команда AT+RESTORE, то режим авто подключения гарантированно бу- дет включен и параметры сохранятся. Так же, один раз вручную можно запустить либо Wi-Fi сервер, либо Wi-Fi клиент. Процесс, который будет запущен таким образом, автома- тически возобновится при перезапуске модуля. А вот значение
Глава 4.Управление ESP-01 при помощи ARDUINO 209 параметра CIPMUX при перезапуске нужно устанавливать заново. Также, каждый раз, придется запускать TCP сервер. Задачу уста- новки CIPMUX и запуска TCP-сервера (команда AT+CIPSERVER) мы возложим на программу, которая будет работать в модуле ARDUINO. Команды, II которые нужно подать вручную II В следующем разделе мы научимся писать простейшую про- грамму, которая будет устанавливать значения всех параметров, которые должны обновляться программно и запускать TCP сер- вер. А пока мы напомним, какие же команды, и с какими параме- трами, вам нужно предварительно подать вручную. Для режима Wi-Fi точки доступа: AT+CWMODE=3 AT+CIPMODE=0 AT+CWSAP="MyESP", "12345678", 9,4 где: MyESP — имя точки доступа, 12345678 — пароль доступа. Для режима Wi-Fi клиента: AT+RESTORE AT+CWMODE=3 AT+CIPMODE=0 AT+CWJAP="MyWiFi", "ParolMyWiFi" где: MyWiFi — имя вашей домашней сети, ParolMyWiFi — пароль доступа. ПРИМЕЧАНИЕ. Вы должны заменить значения имени сети и паро- ] ля на свои.
210 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 4.6. Простейшая программа для управления ESP-01 ВИРТУАЛЬНЫЙ ДИСК. Пример 4.1 (папка на ВИРТУАЛЬНОМ диске Ррг_4_01) I Немного теории Итак, мы вручную перевели наш ESP-модуль в один из режимов: ♦ или Wi-Fi точка доступа; ♦ или Wi-F клиент. Теперь нам нужно разработать программу для модуля ARDUINO, которая при включении: ♦ будет выполнять остальные настройки; ♦ осуществлять запуск ТСР-сервера. ПРИМЕЧАНИЕ. Для разработки программ для этого, и всех после- дующих программных примеров, описанных в этой книге, мы будет использовать среду разработок IDE. Перед началом работы необходимо правильно выбрать режимы ее работы. Сначала войдите в меню «Инструменты/ плата» и в списке плат выберите тип модуля ARDUINO, с которым мы будем работать. ПРИМЕЧАНИЕ. Напоминаю, что мы работаем с модулем ARDUINO UNO. Поэтому в списке нужно выбрать пункт «ARDUINO/Genduino UNO».
Глава 4.Управление ESP-01 при помощи ARDUINO 211 Затем подключите к компьютеру модуль ARDUINO, войдите в меню «Инструменты/порт» и выберите из списка виртуальный СОМ порт, который связан с вашим модулем ARDUINO. Номер СОМ-порта для ARDUINO скорее всего будет отли- чаться от номера порта, который использовался при работе с ESP- модулем. Узнать номер порта можно так, как мы это делали при подключении ESP-O1. То есть, при помощи Диспетчера устройств, так как это описано в разделе 2.4 (пункт «Установка IDE»). Программы в ARDUINO называются скетчами. Скетчи созда- ются в среде разработок IDE. Для их написания используется язык ARDUINO. Это специальная версия СИ-подобного языка програм- мирования. Скетчи записываются на жесткий диск компьютера в виде файлов с расширением ino. Программа может состоять из нескольких скетчей, которые в среде IDE выглядят как отдельные вкладки. Все скетчи одной программы помещаются в отдельную папку, имя которой должно соответствовать имени главного скетча. После того, как программа написана, там же в среде IDE ее можно скомпилировать и загрузить в программную память ARDUINO. ПРИМЕЧАНИЕ. Подробнее о среде разработок IDE и языке про- граммирования ARDUINO читайте в [1] (см. список литературы). Для перехода по указанной в тексте ссылке [1] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Далее, при описании программ мы тоже вкратце будем опи- сывать используемые команды и функции. А для начала напом- ним основные особенности структуры языка ARDUINO.
212 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Любая программа, написанная на языке ARDUINO, содержит две обязательные функции: функцию setupO и функцию loopQ. setupQ — это функция начальных установок. Она выполняется один раз в начале программы. В эту функцию необходимо вклю- чить команды, выполняющие начальные установки. loopQ — основной цикл программы. Выполняется сразу после функции setupQ. Функция 1оор() выполняется многократно, все время, пока работает программа. Применение этих двух функций помогает реализовать типо- вую структуру программы, предназначенной для работы в микро- контроллере. Кроме двух системных функций, программа может содержать другие функции, созданные самим программистом. Постановка задачи Задача. Разработать программу, которая при помощи АТ-команд, посылаемых по последовательному каналу, выполнит остав- шиеся настройки Wi-Fi подсистемы модуля ESP-01 и запу- стит на нем ТСР-сервер. ПРИМЕЧАНИЕ. Напомню, что единственный параметр, который требуется устанавливать каждый раз при запуске программы - это параметр CIPMUX (выбор еди- ничного или множественного режима подключения). Наша программа должна установить значение параметра CIPMUX равным единице, то есть установить множественный режим работы. После этого программа должна также запустить ТСР-сервер.
Глава 4.Управление ESP-01 при помощи ARDUINO 213 Алгоритм II Алгоритм программы, реализующей поставленную задачу, предельно прост. Сразу после запуска она должна послать в ESP- модуль следующую последовательность из трех AT-команд: АТЕО AT+CIPMUX=1 AT+CIPSERVER=1,88 Первая из этих АТ-команд отключает режим эха. Когда АТ-команды формируются программно, ЭХО будет только мешать (увеличивать время ответа). Вторая AT-команда устанавливает значение параметра CIPMUX, равным единице. Ну и последняя АТ-команда запу- скает TCP-сервер с использованием порта номер 88. ПРИМЕЧАНИЕ. 1 "Ч Логика работы модуля ESP-O1 запрещает подавать новую АТ-команду, пока не завершено выполнение предыдущей. То есть, до того момента, пока в от- вет не получено сообщение «ОК». Мы не стали усложнять программу, заставлять ее анализи- ровать ответы ESP-модуля и дожидаться ответа «ОК». Наша про- грамма будет просто выдерживать паузу после подачи каждой АТ-команды, достаточную для ее выполнения. Программа Простейшая программа, выполняющая вышеописанные функции, приведена в листинге 4.1. Как уже говорилось выше, программа лишь выполняет начальную настройку ESP-модуля и больше не производит никаких действий. Поэтому основной цикл программы (функция loopQ, строки 19...21 программы) не содер-
214 Управление модулем ARDUINO no Wi-Fi с мобильных устройств жит никаких команд. Все команды размещаются только в теле функции начальной установки setupO (строки 7... 16). Первая команда функции setupO (строка 9 программы) выпол- няет инициализацию последовательного канала модуля ARDUINO. Инициализация выполняется при помощи функции Serial.beginO. Параметр функции (115200) определяет скорость, на которой будет работать последовательный канал. Через этот канал мы будем подавать на ESP-модуль текстовые АТ-команды. Поэтому скорость последовательного канала ARDUINO должна соответствовать ско- рости последовательного канала модуля ESP-01. ПРИМЕЧАНИЕ. В старых версиях SDK скорость последовательного канала может быть равна 9600 бод. Команды, расположенные в строках 10...15 программы выполняют передачу в ESP-модуль, описанной выше последо- Листинг 4.1. Простейшая программа /* Программный пример 4.1. Глава 4 Простейшая программа Настройка и запуск ТСР-сервера */ void setupO { // Настройка ESP8266 при помощи АТ-комаыд: Serial.begin(115200); delay(200); Serial.printIn ("ATE0"); // Отключить эхо delay(200); Serial.printIn ("AT+CIPMOX-l"); // Установить множественный режим подключения delay(200); Serial.println ("AT+CIPSERVER-1,88"); // Запустить TCP сервер на 88 порте //* 19 void loop() { // Команды основного цикла
Глава 4.Управление ESP-01 при помощи ARDUINO 215 вательности АТ-команд. Для вывода АТ-команд используется системная функция SerialprintlnQ (см. строки 11, 13 и 15 про- граммы). Функция Serial.println() посылает в последовательный канал текстовое сообщение, переданное ей в качестве параметра. В нашем случае в качестве сообщения используется текст АТ-команды. Для формирования задержки, обеспечивающей нормальное завершение каждой команды, используется функция delay() (см. строки 10,12 и 14 программы). Функция delayQ реа- лизует задержку, длительность которой передана в нее в качестве параметра. ПРИМЕЧАНИЕ. В нашей программе используется задержка в 200 миллисекунд. Задержка в строке 10 включена для надежного завершения процесса инициализации последовательного канала. Трансляция и проверка | работоспособности программы II Для создания нового файла программы в среде разработок IDE, выберите в меню «Файл» пункт «Новый». При первом запуске IDE заготовка нового файла открывается автоматически. СОВЕТ. Для удобства окно нового программного файла раз- верните на весь экран. В окне вы увидите заготовку вашей будущей программы. В заготовку уже вписаны две системные функции setopQ и 1оор(). Обе функции пусты и содержат только пояснение, для чего пред-
216 Управление модулем ARDUINO по Wi-Fi с мобильных устройств назначена каждая из них. Пояснения вы можете удалить, а в функцию setupQ внесите все необходимые команды, согласно листингу 4.1. После того, как программа набрана, можете записать ее на диск: ♦ либо при помощи пункта меню «Файл/Сохранить»; ♦ либо при помощи кнопки [£] в панели инструментов. Вы можете проверить правильность набранной программы, выполнив ее предварительную трансляцию, при помощи пункта меню «Скетч/Проверить-Компилировать» или кнопки [7]. ВИРТУАЛЬНЫЙ ДИСК. Вы можете не набирать программу, а просто ска- чать все программные примеры с виртуального диска книги и установить их на жесткий диск ва- шего компьютера. Теперь можно приступать к загрузке программы в модуль ARDUINO. Перед тем, как загружать программу, убедитесь в том, что модуль подключен и в настройках правильно выбран тип модуля и номер СОМ порта. Затем запустите процесс загрузки при помощи пункта меню «Скетч/Загрузка» или при помощи кнопки [7J. При запуске про- цедуры загрузки произойдет повторная компиляция программы, по окончании которой откомпилированный код будет загружен в программную память ARDUINO. Сразу после загрузки программы в ARDUINO, она начнет работать. Если к ARDUINO подключен ESP-модуль, программа настроит модуль и запустит в нем TCP сервер. После этого вам нужно проверить его работу. Способ проверки зависит от выбранного вами режима работы. Рассмотрим ПЕРВЫЙ этап. Если модуль работает в режиме точки доступа, то вы должны подсоединиться к этой точке при помощи вашего смартфона. Просто найдите в списке доступных Wi-Fi сетей в смартфоне сеть с именем «MyESP» и подключитесь к ней, используя выбранный вами пароль (12345678). Если подключение прошло нормально, значит, точка доступа работает.
Глава 4.Управление ESP-01 при помощи ARDUINO 217 ПРИМЕЧАНИЕ. Если ваш ESP-модуль работает как Wi-Fi клиент, и подключен к вашей домашней сети, то для про- верки его работоспособности нужно использовать описанное в предыдущей главе мобильное приложе- ния «Network Utilities». Алгоритм работы такой: берем смартфон, убеждаемся, что он подключен к той же до- машней сети, что и ESP-модуль; запускаем приложение «Network Utilities»; выбираем в меню пункт «IP Discover»; запускаем сканирование (кнопка Ц в нижней части экрана). По окончании процесса сканирования получаем список всех хостов в текущей Wi-Fi сети. Результат сканирования выглядит так, как показано на рис. 4.12. В списке ищем хост с названием «Espressif Inc». Если такой хост существует, значит, наш ESP-модуль работает. Запомните IP адрес модуля, который также будет указан в результатах поиска. ПРИМЕЧАНИЕ. Адрес нам понадобится для дальнейших проверок. Если предыдущая проверка прошла успешно (Wi-Fi подси- стема нашего модуля работает), приступаем ко ВТОРОМУ этапу проверки. Проверим, работает ли ТСР-сервер? Проверить факт работы сервера проще всего путем сканиро- вания портов ESP-модуля. ПРИМЕЧАНИЕ. Напомню, что при запуске TCP-сервера мы исполь- зовали порт номер 88.
218 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Если при сканировании хоста нашего ESP-модуля мы обна- ружим открытый порт номер 88, то это значит, что TCP сервер работает. Для сканирования портов мы также будем использовать при- ложение «Network Utilities». Для этого в меню приложения выби- раем пункт «Port scanner». В открывшемся окне выставляем пара- метры сканирования. Сначала мы должны указать IP-адрес модуля: ♦ в режиме точки доступа адрес равен 192.168.4.1; ♦ в режиме Wi-Fi клиента IP-адрес назначается роутером. Его вы должны были запомнить в окне результатов сканирова- ния утилиты «IP Discover». Кроме адреса, вы должны указать диапазон сканирования портов. Вообще, номер порта может принимать значение от 0 до 65025. Но мы знаем точно, какой номер порта мы ищем. Можно конечно просто указать этот номер в качестве начала и конца диапа- зона. Но для большего эффекта укажем диапазон адресов от 1 до 100. СОВЕТ. | Слишком большой диапазон указывать не рекомен- I дую: слишком долгим будет процесс сканирования. Диапазон портов указывается в поле «List of the ports numbers or ranges» (Список номеров портов или диапазон). Можно пере- числять номера портов через пробел или писать диапазон через тире. Мы напишем 1—100. Как выглядит окно процедуры «Port scanner» с заполненными параметрами, вы можете видеть на рис. 4.16. После того, как параметры будут установлены, нажмите кнопку запуска сканирования (Q), и программа найдет все открытые порты. Список найденных портов появится в окне программы. ПРИМЕЧАНИЕ. | В нашем случае это будет всего один порт с номе- I ром 88 (см. рис. 4.16).
Глава 4.Управление ESP-01 при помощи ARDUINO 219 Рис. 4.16. Сканирование портов ESP модуля В графе Description (Описание) мы увидим, что это за порт. Надпись «Kerberos — authentication system Official» переводится как «Официальное назначение порта — система аутентифика- ции Kerberos». Именно за этой системой закреплен порт 88. Но в нашем модуле данная система не установлена, поэтому мы можем использовать порт по своему усмотрению. ЧТО ЕСТЬ ЧТО. Kerberos (от слова Цербер) - сетевой протокол ау- тентификации, который предлагает механизм взаимной аутентификации клиента и сервера.
220 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 4.7. Программа «ЭХО» ВИРТУАЛЬНЫЙ ДИСК. Пример 4.2 (папка на ВИРТУАЛЬНОМ диске Ppr_4J)2) |Что сделали и что предстоит сделать Итак, мы научились при помощи ARDUINO настраивать и запускать TCP-сервер в подключенном кнему ESP-модуле. Теперь пойдем дальше. Заставим наш УЧЕБНЫЙ МОДУЛЬ, состоящий из ARDUINO и ESP-01, передавать и принимать информацию под управлением программы. В этом примере мы не будем пока добавлять что-либо к схеме УЧЕБНОГО МОДУЛЯ. Мы просто заставим обмениваться инфор- мацией УЧЕБНЫЙ МОДУЛЬ и смартфон. Постановка задачи Задача. Создать программу «ЭХО» для ARDUINO, которая, исполь- зуя модуль ESP-01, устанавливала бы канал связи для обмена сообщениями по сети Wi-Fi с приложением «WiFi Controller», установленным в смартфоне. Порядок работы программы «ЭХО» должен быть следующим. 1. Диалог между смартфоном и УЧЕБНЫМ МОДУЛЕМ должен имитировать запрос готовности УЧЕБНОГО МОДУЛЯ. Для запроса готовности мы будем использовать проверочное слово «ARDUINO». Получив в качестве запроса слово «ARDUINO», УЧЕБНЫЙ МОДУЛЬ должен ответить «Гт ready!» (Я готов). На дру- гие запросы модуль должен отвечать «Unknown» (He понимаю). 2. Программа должна поддерживать режим «ЭХО». То есть перед тем, как дать ответ, тренировочный модуль должен прислать
Глава 4.Управление ESP-01 при помощи ARDUINO 221 назад текст посланного на него запроса. Это позволит контро- лировать как запрос, так и ответ. Алгоритм II Перед тем, как разрабатывать алгоритм работы всей про- граммы, нам нужно до конца разобраться в работе ESP-модуля. Для этого сначала определимся с терминами. Главная задача ESP-модуля — обмениваться сообщениями с мобильным устройством по Wi-Fi сети. Сообщения, которыми обмениваются ESP-модуль и мобильное устройство по Wi-Fi сети мы будем называть WiFi-сообщения. ESP-модуль общается с модулем ARDUINO по последователь- ному каналу. ARDUINO посылает на ESP-модуль AT-команды. Сообщение, содержащее АТ-команду, мы будем называть про- сто «Команда». В ответ на команды ESP-модуль посылает на ARDUINO «Ответы» (такие как, «OK», «ERROR», «SEND OK» и т.п.). Кроме ответов, ESP-модуль может передавать на ARDUINO «ESP-сообщения». Примером ESP-сообщения может служить сообщение «Получены данные». Оно сообщает модулю ARDUINO о том, что получено WiFi-сообщение, а также передает в ARDUINO его текст. Формат такого ESP-сообщения следующий: +IPD,N,L:WIFISEND где+IPD — это префикс ESP-сообщения; N — номер канала; L — количество символов в WiFi-сообщении; WIFISEND — текст WiFi-сообщения. Инициатором WiFi-сообщения выступает: либо приложение в мобильном устройстве; либо программа в модуле ARDUINO. ПРИМЕЧАНИЕ. Если WiFi-сообщение формируется в модуле ARDUINO, он использует для его передачи коман- ду AT+CIPSEND. Когда WiFi-сообщение поступа-
222 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ет от мобильного устройства на ESP-01, модуль ARDUINO получает его при помощи ESP-сообщения «Получены данные». Исходя из вышеописанной терминологии, алгоритм работы программы «ЭХО» будет следующий. Сразу после запуска программа должна перейти в режим чтения ESP-сообщений. Она должна непрерывно читать из последователь- ного канала все, приходящие от ESP-модуля сообщения, и искать среди них ESP-сообщение, начинающееся с префикса «+IPD». После его обнаружения, программа должна выделить содер- жащееся в нем WiFi-сообщение. Это и будет присланный от мобильного приложения запрос. Далее текст запроса программа должна сначала отослать назад на мобильное приложение, обеспечив эффект Эха. А затем программа должна проанализировать запрос и послать на ESP-модуль ответ. Если тестом запроса является слово «ARDUINO», нужно послать ответ «Гт ready!», в противном случае нужно послать ответ «Unknown». I Программа: создаем вспомогательные функции Для решения поставленной выше задачи нам нужно сначала создать ряд вспомогательных функций. Эти функции нам приго- дятся и в последующих наших программных примерах. ГДЕ ПРИГОДЯТСЯ. 1 N Вспомните, например, как выполняется команда пе- редачи сообщения по Wi-Fi сети при помощи соот- ветствующей АТ-команды (AT+CIPSEND). Это целый ритуал. Нужно, во-первых, посчитать количество символов в передаваемом сообщении, затем подать команду AT+CIPSEND, указав в параметрах количество символов. Затем нужно дождаться ответа «ОК».
Глава 4.Управление ESP-01 при помощи ARDUINO 223 После этого нужно еще подождать и дождаться прихода сим- вола приглашения «>». Только после того, как приглашение полу- чено, можно посылать текст WiFi-сообщения. Но и это не все. Чтобы можно было считать процедуру пере- дачи информации законченной, нужно переждать все служебные сообщения («busy», «Recv») и дождаться сообщения «SEND OK». Вся эта сложная процедура так и просится, быть оформленной в виде отдельной функции. ПРИМЕЧАНИЕ. Мы просто будем передавить текст WiFi-сооб- щения в эту функцию, а она будет выполнять все описанные выше действия. Сразу же возникает необходимость создания и еще одной функции. Функции ожидания ответа. Только для описанной выше процедуры передачи данных нам нужно выполнять ожи- дание несколько раз. Сначала нужно ожидать ответа «ОК», затем символа приглашения, и, наконец, ответа «SEND OK». Ожидание может понадобиться и в других случаях. Чаще всего приходится ожидать слова «ОК». Этот ответ служит индикатором окончания выполнения любой AT-команды. У вас может возникнуть вопрос: в предыдущем программ- ном примере (пример 4.1) мы не использовали ожидание ответа «ОК». Вместо нее мы обошлись командой задержки. Дело в том, что в программе начальной настройки использовались про- стые команды, которые выполняются практически мгновенно. Поэтому усложнять программу процедурами ожидания там не имеет смысла. При передаче сообщений по сети без ожидания ответа никак не обойдешься. СОВЕТ. Все дополнительные функции программы удобно поместить в отдельные вкладки.
224 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Среда программирования IDE позволяет создавать вкладки и размещать разные части программы каждую в свою вкладку. Это разгрузит основное тело программы от второстепенных функций, что повысит ее читаемость. Для каждой вкладки среда создает в папке программы свой отдельный скетч (файл с расширением *.ino). ПРИМЕЧАНИЕ. Так как вспомогательные функции мы будем применять и в других программных примерах, вам не потребуется каждый раз набирать их текст вручную. Достаточно просто скопировать в папку с новой программой фай- лы с нужными функциями из уже готовых программ. Для того чтобы создать дополнительную вкладку, нужномв правом верхнем углу окна среды IDE нажать мышкой кнопку Q. Откроется меню управления вкладками (см. рис. 4.17). Выберите пункт «Новая вкладка». В нижней части окна редак- тора программ появится оранжевая полоса с надписью «Имя для нового файла». И поле для ввода этого имени. Набираете имя, и нажмите кнопку «ОК». Вкладка будет соз- дана. В верхней части окна с текстом программы появится еще один «корешок» для выбора нашей новой вкладки. Рис. 4.17. Меню управления вкладками среды IDE
Глава 4.Управление ESP-01 при помощи ARDUINO 225 Для начала мы в виде отдельной функции оформим набор команд начальной настройки модуля ESP и поместим эту функ- цию в отдельную вкладку. Этот набор команд будет формиро- вать те самые три АТ-команды, которые в предыдущем примере (листинг 4.1) были размещены в теле системной функции SetupQ (строки 9... 15). Функция II SetupESP() II Итак, создаем вкладку с именем «Setup». Помещаем туда функцию, содержащую указанные выше команды. Как выглядит такая функция и вкладка, показано в листинге 4.2.1. Вызывать функцию SetupESPQ мы будем из функции setupO, расположенной в основной части программы. ПРИМЕЧАНИЕ. Как это сделать, мы рассмотрим чуть позже. Листинг 4.2.1. Функция настройки модуля ESP-O1 2]//************************** Настройка ESP8266 при помощи АТ-команд: 3ivoid SetupESPO { Serial.begin(115200); delay (200); Serial.print in (мАТЕ0и); // Отключить эхо delay(200); Serial.print1г. (иАТ+С1РМих=1"); // Установить множественный режим подключения 9 delay(200); Serial.println ("AT+CIPSERVER=1,88"); // Запустить TCP сервер на 88 порте
226 Управление модулем ARDUINO по Wi-Fi с мобильных устройств II Первый вариант II функции sLinelnput() Далее мы создадим вкладку «DopFunction» и поместим туда все дополнительные функции, о которых мы говорили в начале этого раздела. Первая функция, которая нам понадобится, — это функция получения строки. Дело в том, что все ответы от ESP-модуля идут по последовательному каналу общим потоком в виде отдельных байтов. Каждый байт — это код символа. Однако, этот поток, все же, состоит из строк. Каждая строка заканчивается специальными символами окончания строки (символом возврата каретки и сим- волом перевода строки). Сокращенное название этих символов CR и LN. В языке СИ они обозначаются \п' и V'. ИНФОРМАЦИЯ. Символ перевода строки: код 10 (ОхОА). Обозначения: LF V' Символ возврата каретки: код 13 (OxOD). Обозначения: CR V' Каждый ответ или сообщение от модуля — это одна строка. Необходимо создать функцию, которая при каждом обращении к ней будет выделять из потока данных очередную строку. Строго говоря, в системе команд языка ARDUINO имеется такая функция. Это функция SerialreadStringUntil(). Функция выделяет из потока данных, передаваемых по последовательному каналу, строку символов, используя в качестве признака оконча- ния строки, символ, который должен быть передан в эту функцию в виде параметра. Если указать в качестве параметра символ перевода строки (\п'), то функция возвратит строку, ограниченную этим симво- лом. Правда, кроме текста команды, такая строка будет содержать в конце символ возврата каретки. Для корректной работы функ- ции этот символ нужно отбросить. Поэтому мы создадим свою функцию ввода строки и назовем ее sLinelnputQ. Текст функции приведен в листинге 4.2.2.
Глава 4.Управление ESP-01 при помощи ARDUINO 227 Листинг 4.2.2. Первый вариант функции sLinelnput /* Вспомогательные функции */ Ввод строки из Wi-Fi канала void sLineInput() { InputString = Serial.readstrmgUntil('\n'); InputString. replace (п\г*, *•*); Функция не имеет входных параметров и не возвращает зна- чений. Передача информации в этой функции происходит при помощи строкового объекта InputString. ПРИМЕЧАНИЕ. Как известно, классический язык СИ не имеет пере- менных типа текст или строка. Текстовые строки в этом языке представляются в виде массива эле- ментов типа char (символ). Это усложняет работу с текстом для программиста, но позволяет очень рационально использовать память компьютера (в нашем случае, микроконтроллера). Однако в последнее время многие версии языка СИ стали поддер- живать объект типа строка. Объектное программирование давно и прочно заняло свое место во многих языках программирования. Строковый объект хранит текстовую строку произвольной длины. Как любой объект, строковый объект имеет свои, так называ- емые, «свойства», «функции» и «методы». ЧТО ЕСТЬ ЧТО. Методом объекта называется некая встроенная в объект процедура, при помощи которой можно производить различные операции с содержащейся в объекте символьной строкой.
228 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Функция, встроенная в объект, отличается от метода тем, что при выполнении возвращает некое значение (процедура не возвращает). Среди функций и методов строкового объекта мы можем уви- деть такие, известные по другим языкам программирования: ♦ выделение подстроки; ♦ поиск и замена символов в строке; ♦ удаление ведущих и завершающих пробелов и другие. ПРИМЕЧАНИЕ. Подобные функции широко используются при обра- ботке текста в таких языках, как Бейсик, Паскаль или FoxPro. С введением механизма строковых объектов язык СИ также становится более дружественным к программисту. Строковый объект InputString в нашей программе имеет статус глобального. Для этого команда создания объекта InputString помещена в начало программы вне описания всех функций. ПРИМЕЧАНИЕ. Как это делается, мы увидим позже, когда будем рассматривать содержимое основной вкладки про- граммы. • Так как объект глобальный, он доступен в любом месте про- граммы. Под программой, в данном случае, понимается все содержимое всех вкладок. При компиляции программы текст всех вкладок рассматривается как одно целое. Вернемся теперь к листингу 4.2.2. В строке 5 листинга для считывания очередной строки из потока данных используется описанная выше функция Serial.readStringUntilO с параметром \п'. Считанная строка присваивается строковому объекту InputString. В строке 6 из принятого сообщения удаляется символ возврата каретки. Удаление символа производится при помощи метода replaceQ текстового объекта InputString.
Глава 4.Управление ESP-01 при помощи ARDUINO 229 ПРИМЕЧАНИЕ. Этот метод предназначен для того, чтобы заме- нить в содержимом текстового объекта одни сим- волы на другие. Для этого при вызове метода ему передаются два параметра: ♦ символ, подл ежащий замене; ♦ символ, на который нужно его заменить. ПРИМЕЧАНИЕ. В нашем случае замене подлежит символ возврата каретки («V»), о в качестве символа для замены ис- пользуется пустая строка. Опыт применения функции, приведенной в листинге 4.2.2, показал, что она работает с некоторой задержкой. В дальнейшем, когда мы будем применять эту функцию для выделения команд в программах, управляющих внешними нагрузками (напри- мер, подключенными к учебному модулю светодиодами), такая задержка делает работу некомфортной. Поэтому мною было решено разработать свою собственную функцию выделения строки из потока данных. Тем более, что это послужит дополнительным примером обработки потока данных. ВИРТУАЛЬНЫЙ ДИСК. Программный пример, использующий первый вари- ант функции sLinelnputO, также имеется на вирту- альном диске. Он имеет номер 4.2а. Папка програм- мы Ppr_4J)2a. Программный пример 4.2 (папка Ррг_4_02) считается основ- ным. При желании вы можете скомпилировать сначала при- мер 4.2, затем пример 4.2а и сравнить самостоятельно их работу. Кроме функции sLinelnputQ эти два примера больше ничем не отличаются.
230 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Второй вариант функции sLinelnput() Новый вариант функции sLinelnputQ приведен в листинге 4.2.3. Прежде, чем разбирать текст этой функции построчно, необходимо разобраться с алгоритмом ее работы. С одной стороны, все просто. Нужно считывать каждый полу- ченный байт из последовательного канала до тех пор, пока не будет получен код символа перевода строки. При получении его кода наша функция должна сформировать из всех полученных перед этим символов строку, исключая только символ возврата каретки. Эту строку и должна возвращать функция sLinelnputQ, поместив ее в строковый объект InputString. Однако при создании любой программы нам всегда нужно учитывать возможность возникновения сбоев и ошибок. ПРИМЕЧАНИЕ. Если очередной символ возврата каретки будет утерян (в случае сбоя или ошибки), то программа, построенная по описанном выше алгоритму, за- циклится. Она будет вечно ждать прихода это- го кода, а пока не завершится вызванная функция, остальная программа выполняться не будет. Так, один небольшой сбой может привести к зависанию всей программы. СОВЕТ. Для обработки этой ситуации в алгоритм нашей функции необходимо включить еще одну проверку. Эта проверка должна прерывать цикл ожидания символа перевода строки в случае, когда он длится слишком долго. Стандартная функция SerialreadStringUntilQ учитывает воз- можность подобного сбоя. Для предотвращения зависания она
Глава 4.Управление ESP-01 при помощи ARDUINO 231 использует метод ограничения по времени. Если символ, который используется как окончание строки, не приходит в течение задан- ного времени, функция прекращает его ожидание и возвращает ту часть строки, которая принята к этому моменту. Время ожидания можно задать при помощи функции Serial. setTimeoutQ. Новое время ожидания (Таймаут) указывается в функции в качестве аргумента. Таймаут задается в миллисекун- дах. По умолчанию он равен 1000 мс. В нашем варианте функции sLinelnputO проблему зациклива- ния мы будем решать по-другому. Мы будем подсчитывать неу- дачные попытки считывания очередного байта из канала. В про- цессе работы последовательного канала все приходящие по нему байты сохраняются в специальном буфере. ПРИМЕЧАНИЕ. Для считывания байтов из буфера в языке ARDUINO имеется функция SeriaLread()> Эта функция считы- вает из буфера очередной принятый байт. Используя эту функцию, программа может байт за байтом считывать приходящие байты. Если буфер последовательного порта пуст, то при очередном считывании, функция Serial.readQ возвращает -1 (минус один). Вот эти неудачные попытки считы- вания и будет подсчитывать наша функция sLinelnputO. Обратимся к листингу 4.2.3. Листинг показывает содержи- мое вкладки «DopFunction», которая содержит все необходимые нам дополнительные функции. Мы же пока будем рассматривать текст функции sLinelnputO. Функция занимает строки с 4 по 17. Начинается функция с определения локальной переменной inChar (см. строку 5). Она будет использоваться для хранения оче- редного считанного байта. Локальная переменная отличается от глобальной тем, что она доступна только внутри функции, в кото- рой она была определена. После завершения функции эта пере- менная из памяти удаляется. Далее, в строке 6 очищается содержимое строкового объекта InputString. Напоминаем, что этот объект определяется в начале основной программы, и имеет статус глобального. В строке 6 содер- жимому объекта присваивается значение «пустая строка».
232 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Листинг 4.2.3. Вспомогательные функции /* Вспомогательные функции */ /у************************ ввод строки из Wi-Fi канала void sLmelnput () { int mChar = 0; InputStrmg = ""; // Очистить буфер строки for (int tim=0; tinK2000; tim++) { inChar = Serial.read(); if (mChar!=-l) { if (mChar! = '\n') { if (inChar!='\r') InputStrmg tira=0; // получить новый байт // Если буфер не пуст // Если не конец строки += (char)mChar; // добавляем символ в строку else break; // Иначе завершаем цикл Вывод сообщения в Wi-Fi канал void PrmtWIFI () { int LenStr = OutputStrmg. length(); FLerr = false; Serial.flush(); delay(400); Serial.print("AT+CIPSEND=0,"); Serial.printIn(LenStr+1); waitOK("OKw); waitOK(lf> R) ; if (!FLerr) { Serial.prmtln (OutputString+"\n") ; waitOK("SEND OK"); // Определяем длину сообщения // Сброс флага ошибки // Ожидание конца передачи // Передача первой части команды // передача окончания команды // Ожидание ответа ИОКП // Ожидание приглашения // Если флаг ошибки не установлен // Передаем сообщение // Ожидаем ответе "SEND OK" /у******************************, void waitOK (const char* mWrd) { if (FLerr) return; FLerr = true; for (int 1=0; i<50; i++) { sLmelnput () ; if (InputStnng—mWrd) { FLerr = false; delay(200); break; Ожидание ответа OK // Если флаг ошибки уставновлен выходим // Установить флаг ошибки // Цикл ожидания нужного ответа // Получаем строку из поел.канала // Если принятое сообщение то что нужно // Сбрасываем флаг ошибкти // Выход из цикла ожидания ответа
Глава 4.Управление ESP-01 при помощи ARDUINO 233 В строках 7..Л6 расположен цикл приема данных. Цикл многократно читает данные из буфера последовательного канала и составляет из прочитанных символов строку. Для организации цикла используется оператор for(). Этот опе- ратор имеет три параметра: ♦ в первом параметре переменной tim, которая выступает в ро- ли счетчика цикла, присваивается начальное значение. Тип переменной int (целое); ♦ второй параметр определяет условие продолжения цикла. Цикл в данном случае длится до тех пор, пока значение пере- менной tim меньше 2000; ♦ третий параметр определяет, как будет изменяться значение счетчика цикла при каждой его итерации. Выражение tim++ означает увеличение значения tim на единицу. Это сокра- щенная форма выражения tim=tim+l. Таким образом, в каждой итерации цикла переменная будет увеличиваться на единицу. В результате, если не произойдет пре- ждевременного прерывания цикла, цикл выполнится 2000 раз. Для считывания очередного байта в цикле используется функ- ция Serial.readO (см. строку 8 программы). Считанный байт поме- щается в переменную inChar. В строке 9 происходит проверка значения переменной inChar. Если значение равно минус единице (нет данных), то операторы в строках 10...14 не выполняются, и цикл считывания продол- жается сначала. В противном случае управление переходит к строке 10. В этой строке проверяется, не получен ли символ \п\ Проверка значения переменной inChar производится при помощи оператора if(). В качестве параметра этому оператору передается условие. То есть некое логическое выражение. ПРИМЕЧАНИЕ. Команды, расположенные в фигурных скобках после этого оператора, выполняются в том случае, если условие имеет значение true («Истина»). , у При необходимости в паре с оператором if() используется оператор else. Английское слово //означает «Если», a else озна- чает «Иначе».
234 Управление модулем ARDUINO по Wi-Fi с мобильных устройств При использовании этой пары операторов в случае выполне- ния условия выполняются команды, закрепленные за оператором ifO> в противном случае команды, закрепленные за else. ПРИМЕЧАНИЕ. Если за оператором ifO или за оператором else за- креплена лишь одна команда, то фигурные скобки можно опустить. В строке 10 программы оператор if() использует условие inChar!=\n\ To есть, операторы в строке 11 и в строке 12 будут выполняться в том случае, если значение переменной inChar не равно спецсимволу \п\ В противном случае выполняется опера- тор в строке 14 (оператор else). Оператор else вызывает команду break. Оператор break вызы- вает досрочное прекращение цикла for() ввода строки (который начинается в строке 7 и занимает строки 1... 16). После цикла никаких команд больше нет. Поэтому функция завершается, а в InputString при этом останется принятая к этому моменту строка. Если в результате оценки в строке 10 окажется, что приня- тый очередной полученный не является признаком конца строки, управление переходит к строке 11. В этой строке мы также видим функцию сравнения ifQ. На этот раз она проверяет принятый символ на равенство \г\ ПРИМЕЧАНИЕ. Это необходимо для того, чтобы отбрасывать символ возврата каретки. Если условие оператора inChar!=\r' является истиной, то про- грамма выполняет выражение, непосредственно следующее за оператором if() (см. строку 11). Смысл этого выражения в том, что вновь считанный символ добавляется к уже ранее считанным символам в строковый объект InputString.
Глава 4.Управление ESP-01 при помощи ARDUINO 235 Для операции добавления символа используется составной оператор «+=». Подобные операторы — это фирменная особен- ность языка СИ. Одно из наглядных и удобных сокращений, кото- рых множество в этом уникальном языке программирования: ♦ выражение — InputString += (char)inChar; ♦ аналогично выражению — InputString=InputString + (char)inChar; Оператор (char) (обязательно писать в круглых скобках) — выполняет преобразование типов. Переменная inChar объявлена как int (см. строку 5 листинга 4.2.3). Значение именно такого типа возвращает функция Serial. readO- Для того, чтобы корректно присоединить символ к значению строкового объекта InputString, нужно поменять тип значения с циф- рового int на символьное char (код символа меняется на сам символ). В строке 12 обнуляется счетчик цикла tint. Это делается для того, чтобы после успешного получения символа, счет неудачных попыток начинался бы сначала. Если в течение 2000 попыток все попытки оказались неудачными, цикл считывания строки, объ- явленный в строке 7, заканчивается естественным путем. Независимо от того, по какой причине завершилась функция sLinelnputQ, после ее завершения строковый объект InputString будет содержать очередную принятую строку, поступившую по последовательному каналу от ESP модуля. Это может быть и пустая строка, если после 2000 попыток не пришло ни одного символа. Функция II PrintWIFI() 1 Следующая вспомогательная функция, которую нам нужно соз- дать, —функция передачи сообщений по Wi-Fi (WiFi-сообщений). То есть функция, которая реализует весь сложный алгоритм обще- ния с командой AT+CIPSEND. Назовем эту функцию PrintWIFIQ. Определимся с основными требованиями к этой функции. Основная программа будет использовать PrintWIFIO для пере- дачи сообщений, которые затем будут выводиться на экране смартфона в виде «Эха» и ответов на запрос. Предназначенное для передачи WiFi-сообщение перед вызовом функции должно передаваться в нее через глобальный текстовый объект. Для того чтобы выводимые на экране смартфона сообщения располага-
236 Управление модулем ARDUINO по Wi-Fi с мобильных устройств лись каждое в своей строке, наша функция должна автоматиче- ски добавлять к переданному ей тексту (в конце) символ перевода строки Од'). Перенос по строкам улучшает читаемость ответов. ПРИМЕЧАНИЕ. В большинстве современных систем вывода инфор- мации наличие символа перевода строки V'e кон- це сообщения вполне достаточно для того, чтобы следующее сообщение выводилось с новой строки. Возврат каретки обычно выполняется автомати- чески, если в конце строки обнаружен одиночный символ перевода строки V' Для передачи WiFi-сообщений функция PrintWIFIQ должна реализовать всю последовательность действий, необходимую для выполнения команды AT+CIPSEND, которая подробно описана в разделе 3.3 и проиллюстрирована на рис. 3.9 в третьей главе книги. Как мы помним, этот порядок действий требует, чтобы программа несколько раз выполняла процедуру ожидания опре- деленного ответа от ESP-модуля. ПРИМЕЧАНИЕ. Эту несколько раз повторяющуюся процедуру удоб- но оформить в виде отдельной функции - функции ожидания ответа. Такая функция должна приостанавливать работу программы до тех пор, пока от ESP-модуля не придет нужный в данной ситу- ации ответ. ПРИМЕЧАНИЕ. Мы пока не будем подробно разбирать функцию ожидания ответа. Просто дадим ей название waitOKf) и договоримся, что это будет универсаль- ная функция, которая сможет ожидать не только
Глава 4.Управление ESP-01 при помощи ARDUINO 237 I самый часто встречающийся ответ - «ОК», но и I I любое другое сообщение. \ Сообщение, прихода которого будет ожидать эта функция, мы будем передавать в нее в виде параметра. Также отметим, что функция waitOKO должна иметь защиту от зависания. Если нужный ответ не придет в течение длительного времени, функция должна завершиться, установив при этом, так называемый, «Флаг ошибки». ПРИМЕЧАНИЕ. Флагом в программировании называют перемен- ную, принимающую в процессе работы всего два значения: «Флаг установлен» и «Флаг сброшен». Обычно он имеет тип boot (Логический) и ис- пользуется следующим образом: ♦ если значение переменной равно true - считает- ся, что флаг установлен; ♦ если false - сброшен. По ходу работы программы при определенных условиях флаг устанавливается и это влияет в дальнейшем на ход ее выполнения. В нашем случае флаг ошибки будет устанавливаться при непо- лучении нужного ответа в течение долгого времени. Все проце- дуры, для которых ошибка имеет критическое значение, прове- ряют значение флага, и если он установлен, они аварийно завер- шают свою работу. Функция PrintWIFIQy как и остальные вспомогательные функции, размещена во вкладке «DopFunction» (см. листинг 4.2.3). Она занимает строки 20—33. Она, также как и описанная ранее функция sLinelnputQ, не имеет входных параметров и не возвращает значений. ПРИМЕЧАНИЕ. Как уже говорилось выше, для передачи значений в I функцию используется строковый объект.
238 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Это специально созданный для данной функции строковый объект, которому мы дадим имя OutputString. Объект OutputString (как и InputString) имеет статус глобального, поэтому команда инициализации этого объекта также находится в начале основ- ной части программы. Еще один элемент, определяемый вне функции, но необхо- димый для ее работы — это переменная FLerr. Эта глобальная переменная, имеет тип bool (логическая) и используется в каче- стве флага ошибки. Как видите, для работы всех наших вспомогательных функ- ций в начале нашей программы мы должны будем определить целых три глобальных объекта: String InputString="" ; I/ строковый объект для // хранения входящих данных; String OutputString-1"; I/ строковый объект для хранения // данных для вывода; bool FLerr = false; II Переменная — флаг ошибки. Но продолжим описание функции PrintWIFIQ. Как уже говорилось, текст описания функции начинается в строке 20 (см. листинг 4.2.3). В строке 21 определяется локальная переменная LenStr типа int. Тут же ей присваивается значение, равное длине WIFI- сообщения, переданного в функцию через OutputString. Длина WIFI-сообщения определяется при помощи функции lengthQ строкового объекта OutputString. Значение длины используется далее в качестве второго параметра АТ-команды CIPSEND. В строке 22 мы сбрасываем флаг FLerr (присваиваем ему начальное значение false). Ошибочная ситуация может возник- нуть далее в процессе выполнения операции передачи WIFI- сообщения. Но сначала флаг должен быть сброшен. В строке 23 выполняется команда Serial.flushO. Функция flushO является методом объекта Serial. Функция flushO — приостанавли- вает программу до окончания процесса передачи информации. В данном случае функция ожидает завершения предыдущего сеанса передачи данных по последовательному каналу.
Глава 4.Управление ESP-01 при помощи ARDUINO 239 Далее, в строке 24 программы выполняется еще одна небольшая задержка. Она введена для того, чтобы переданная в предыдущем сеансе информация гарантированно была принята ESP-модулем. В строках 25 и 26 происходит передача АТ-команды CIPSEND. Сначала, в строке 25 передается основная часть АТ-команды. При этом используется функция SerialprintQ. Такая функция передает в последовательный канал сообщение без завершающих симво- лов новой строки. В строке 26 программы уже при помощи функции Serial. printlnQ передается последний параметр АТ-команды — длина сообщения. Основная часть команды сливается с ее последним параметром в одну непрерывную строку с символами заверше- ния строки в конце. ПРИМЕЧАНИЕ. Функция Serial.printO передает сообщение в после- довательный канал без символов завершения стро- ки. Функция Serial.printlnO похожа на предыдущую, но завершает переданное в последовательный ка- нал сообщение символами перевода строки и воз- врата каретки. Обратите внимание, что в строке 26 мы увеличили значе- ние длины WIFI-сообщения на единицу. Это связано с тем, что далее, к каждому WIFI-сообщению будет добавлен символ \п', а, значит, длина сообщения будет на один байт длиннее. В строке 27 вызывается функция waitOKQ — ожидание ответа. В качестве параметра в функцию передается текстовый литерал «ОК». Именно этот ответ от ESP-модуля в данном случае будет ожидать функция waitOK0. Функция читает все сообщения от ESP-модуля и ждет прихода слова «ОК». Она завершает свою работу тогда, когда нужный ответ получен. ПРИМЕЧАНИЕ. Если нужный ответ не приходит после 50 попыток чтения, работа функции завершится с установкой флага ошибки. То есть переменной FLerr будет при- своено значение true.
240 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Такое значение флага приведет к тому, что все последующие операции будут аварийно завершаться либо вообще не будут выполняться, и функция PrintWIFIO быстро завершит свою работу, не выполнив процедуру передачи WiFi-сообщения по сети. Ниже мы увидим, как это происходит. Независимо от того, как завершилось выполнение функции в строке 27, управление переходит к строке 28. В этой строке еще раз вызывается функция waitOKO. Но теперь она ожидает прихода от ESP-модуля текста приглашения: «>». ВНИМАНИЕ. Текст приглашения состоит из двух символов! Символа «>» и пробела! По получении приглашения мы должны послать в последо- вательный канал WiFi-сообщение, дополнив его символом \п в конце. Но перед этим в строке 19 программа проверяет флаг ошибки. Команды в строках 30 и 31 выполняются в том случае, если флаг ошибки сброшен (имеет значение false). ПРИМЕЧАНИЕ. Оператор «!» (восклицательный знак), поставлен- ный перед именем переменной, означает инверсию ее значения. Если значение переменной FLerr равно false, то выражение «! FLerr» вернет true. \ ' В строке 30 программы происходит вывод собственно WiFi- сообщения плюс символ перевода строки в последовательный канал. В данном случае символ \п должен быть заключен в двой- ные кавычки, так как символ «+» в тут означает команду конка- тенации (слияния двух строк) — содержимого строкового объекта OutputString и символьного литерала «\п». В строке 31 вызывается функция waitOKQ, которая ожидает прихода ответа «SEND OK». После того, как «SEND OK» получен, функция PrintWIFIQ завершается.
Глава 4.Управление ESP-01 при помощи ARDUINO 241 Функция II waitOK() II Функция waitOKO занимает строки 36...47 (в листинге 4.2.3). Функция имеет один параметр inWrd. Параметр имеет тип «ссылка на символьную константу». ПРИМЕЧАНИЕ. На то, что это ссылка, указывает звездочка. Такой тип входной переменной означает, что при вы- зове функции в качестве ее параметра нужно ис- пользовать текстовый литерал (текст в двойных кавычках). Начинается функция с проверки флага ошибки (строка 37). Если флаг ошибки установлен, выполняется оператор return (досрочный выход из функции). То есть, если какая-либо из пре- дыдущих операций вызвала ошибку, функция waitOKQ не произ- водит никаких действий, и сразу завершается. Если ошибки не было, управление передается к строке 38. В этой строке флаг ошибки принудительно устанавливается. Это такой прием определения факта ошибки. Далее функция ожидает прихода нужного сообщения. Если сообщение приходит, программа сбросит флаг ошибки (см. строку 42). В противном случае флаг так и остается установ- ленным. Основное тело функции представляет собой цикл ожидания (строки 39...46). В цикле многократно считываются и проверя- ются сообщения из последовательного канала. Цикл организо- ван при помощи оператора for(). Количество итераций цикла равно 50. То есть, если после 50 считываний нужный текст не получен, цикл завершается, а флаг ошибки так и остается уста- новленным. В строке 40 вызывается уже известная нам функция sLinelnputQ — ввод очередной строки текста по последователь- ному каналу. Функция sLinelnputQ при каждом вызове считывает очередную строку, полученную от ESP-модуля (если вы не забыли) и помещает ее в строковый объект InputString.
242 Управление модулем ARDUINO по Wi-Fi с мобильных устройств В строке 41 значение из объекта InputString сравнивается со значением строкового литерала, на который указывает ссылочная переменная inWrd. Если полученная из последовательного канала строка и тек- стовый литерал одинаковы, то выполняются команды завершаю- щие процесс ожидания, расположенные в строках 42...44. В про- тивном случае эти команды не выполняются, и цикл ожидания продолжается. Что же происходит, если нужный ответ найден? В строке 42 сбрасывается флаг ошибки. В строке 43 предусмотрена небольшая задержка — гарантия на переходные процессы. Ну, и в строке 44 оператор break досрочно завершает цикл ожидания. Вопрос. Вы спросите — а что произойдет, если сообщения от ESP- модуля вовсе перестанут приходить? Отсылаю вас к описанию функции sLinelnpyt. Если сообщения не приходят достаточно долго, она возвращает пустую строку. То есть, сообщения не прекратятся. Просто они будут приходить пустыми. Цикл ожидания ответа отсчитает 50 таких ответов и завершит ожидание с ошибкой. Итак, все вспомогательные функции мы рассмотрели. Теперь мы можем приступить к рассмотрению основной части про- граммы. Основная часть программы находится в главной вкладке, которая называется так же, как называется вся программа. В нашем случае ее имя Ррг_4_02 (программный пример номер 2 в главе 4). Также называется папка программы и основной файл в этой папке. I Программа: основная часть Текст основной части программы приведен в листинге 4.2А В строках 1...4 находится заглавие программы, оформленное в виде комментария. В строках 5 и 6 расположены операторы инициализации двух строковых объектов InputString и OutputString. Как мы знаем, первый
Глава 4.Управление ESP-01 при помощи ARDUINO 243 из них используется при возврате значения функцией sLinelnputO, второй для передачи WiFi-сообщений в функцию PrintWIFIO. В строке 7 определяется глобальная переменная FLerr (флаг ошибки). Далее в строках 9...12 расположена функция начальных уста- новок setupQ. Она включает в себя всего две строки (строки 10 и 11). В строке 10 происходит вызов функции SetupESPO- В эту функ- цию мы свели все команды начальной настройки ESP-модуля. Текст функции SetupESPO находится во вкладке с именем «Setup» (см. листинг 4.2Л). В строке 11 находится команда задержки. Эта задержка гарантирует надежный переход ESP-модуля в рабочий режим после выполнения команд начальной установки. Основной цикл программы loopO занимает строки 15...25. В строке 16 производится начальная очистка содержимого строкового объекта InputSthng (ему присваивается значение «Пустая строка»). Листинг 4.2.4. Основная часть программы «ЭХО» /* Программный пример 4.2. Глава 4 Программа Автоответчик */ String InputString=w1i; // строка для хранения входящих данных String OutputString=""; // строка для хранения данных для вывода bool FLerr = false; // Глобальный флаг ошибки void setup() { SetupESPO; // Настройка Wi-Fi модуля delay(200); /у********************************************** void loop() { InputString - ""; // Очистить буфер строки while (InputString.length()<10) sLinelnput(); // Поиск сообщений короче 10 if (InputString. substring (0r 5) ="+IPD,") { // Если начинается с IPD OutputString = InputString.substring(9); // Выделяем содержимое PrintWIFIO; // Посылаем ее текст по WiFi if (OutputString.equalsIgnoreCasef^Arduino")) OutputString="I'ra ready!"; else OutputString^Unknown"; PrintWIFIO; // Посылаем ответ по результатам распознавания }
244 Управление модулем ARDUINO по Wi-Fi с мобильных устройств В строке 17 организован цикл предварительной фильтрации. Цикл организован при помощи оператора while(). В переводе на русский while означает «Пока». Цикл выполняется до тех пор, пока выполняется условие, указанное в качестве его параметра. В теле цикла всего одна команда — вызов функции sLinelnputO. При каж- дом вызове функция читает очередное сообщение от ESP-модуля и помещает его в InputString. Цикл предварительной фильтрации отбирает среди принятых сообщений, сообщение, длина которого больше или равна 10. ПРИМЕЧАНИЕ. Дело в том, что наша задача, найти ESP-сообщение с префиксом «+IPD». Не сложно подсчитать, что дли- на такого сообщения будет не меньше 10 символов. Например, если WiFi-сообщение состоит из одной буквы «А», то соответствующее ему ESP-сообщение будет выглядеть так: Сами подсчитайте его длину. Проверка длины сообщения произ- водится при помощи функции lengthO строкового объекта InputString (смотри аргумент оператора while в строке 17 программы). После того, как сообщение нужной длины найдено, цикл фильтрации завершается, и управление переходит к строке 18. В этой строке программа проверяет, содержит ли принятое сообще- ние в своем начале подстроку «+IPD,». Для выделения подстроки используется функция substringQ строкового объекта InputString. Функция возвращает подстроку, из сообщения, помещенного в этот строковый объект. Номера начального и конечного символов подстроки передаются в функ- цию в качестве ее аргументов. ПРИМЕЧАНИЕ. Немного запутанным выглядит способ нумерации символов у этой функции.
Глава 4.Управление ESP-01 при помощи ARDUINO 245 Во-первых, отсчет номеров начинается с нуля. Во-вторых, в качестве конечного номера указывается номер символа, непо- средственно следующий за последним в подстроке. Поэтому команда InputString.substring(0,5) выделяет подстроку в пять сим- волов, начиная с начального (нулевого) и заканчивая символом номер 4. Полученная подстрока сравнивается с литералом «+IPD,» (см. строку 18 программы). Для сравнения значений используется оператор if(). Если эти два значения равны, то выполняются операторы в строках 19...23. В противном случае основной цикл программы выполня- ется сначала. В строках с 19 по 23 находятся операторы, производящие оценку принятого запроса и вывод сообщений назад по Wi-Fi каналу. Для этого в строке 19 из ESP-сообщения выделяется заложенный в нем текст запроса (т. е. WiFi-сообщения). Для этого снова используется функция substringQ. Но теперь в этой функции только один аргумент. Когда второй аргумент опущен, функция выделяет подстроку, начиная с символа, определяемого первым аргументом и закан- чивая концом исходной строки. ПРИМЕЧАНИЕ. Для упрощения задачи будем считать, что длина запроса не превышает девяти знаков. v В этом случае ESP-сообщение будет выглядеть примерно так: «+IPD,0,7,ARDUINO». Текст запроса в этом сообщении начинается со знака номер 9 (не забывайте, что нумерация начинается с нуля). Выделенная подстрока (текст запроса) помещается в строковый объект OutputString (см. строку 19). В строке 20 вызывается функция PrintWIFIQ. Она передает по Wi-Fi содержимое объекта OutputString (текст запроса), обеспечи- вая таким образом эффект эха. В строке 21 происходит проверка текста запроса. Содержимое OutputString проверяется на равенство контрольному слову «Arduino». Для оценки используется функция equalsIgnoreCaseQ.
246 Управление модулем ARDUINO по Wi-Fi с мобильных устройств объекта OutputString. Эта функция, сравнивает содержимое тек- стового объекта с символьным литералом, переданным ей в виде параметра. ПРИМЕЧАНИЕ. Эта функция не чувствительна к регистру То есть для нее не важно - буква заглавная или строчная. В нашем случае содержимое OutputString сравнивается со словом «Arduino». Функция возвращает значение true, если два слова равны к false в противном случае. Благодаря нечувствитель- ности к регистру, положительный ответ будет получен не только в случае, если текст запроса равен «Arduino». Подойдут также варианты «ARDUINO», «arduino» и, даже, «ArDuInO». Если результат сравнения положительный, объекту OutputString присваивается значение «Гт ready!» (строка 21). В противном случае значение «Unknown» (строка 22). В строке 23 присвоенное объекту OutputString значение выво- дится по Wi-Fi в ESP-модуль. На этом текущий проход основного цикла завершается и цикл начинается сначала (то есть, со строки 15). Повторяясь таким образом, основной цикл обрабатывает поступившие сообщения и реализует эффект Эха и ответ на присланный запрос, как и задумы- валось при постановке задачи. На рис. 4.18 и рис. 4.19 приведен внешний вид экрана смарт- фона и окно монитора порта в процессе работы с программой «ЭХО». На этих рисунках видно, как отображаются все этапы пере- дачи информации, когда в программе «WiFi Controller» сначала был набран и передан на УЧЕБНЫЙ МОДУЛЬ текст «test», затем был передвинут в положение 112 слайдер «В», а в конце два раза было набрано слово «Arduino» сначала с большой буквы, а затем с маленькой. На рис. 4.18 вы можете наблюдать ответы программы «ЭХО» на все эти запросы, а на рис. 4.19 представлены все AT-команды, при помощи которых передаются все эти ответы.
Глава 4.Управление ESP-01 при помощи ARDUINO 247 Рис. 4.18. Работа программы «ЭХО» в окне «WiFi Controller» кГ+CIPMUX? VT+CIPSERVER-1,88 |T+CIPSEND-0,5 jest ^T+CIPSEND«0,8 jnknown | iT+CIPSEND-0,5 W+CIPSEND-0,8 Jnknown ^rduino lT+CIPSEND-0,11 fm ready! ^T+CIPSEND-0,8 firduino ^T+CIPSEND-0,11 [Pin ready! Puc. 4.19. Работа программы «ЭХО» в окне монитора порта IDE
248 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 4.8. Особенности отладки программ в связке двух модулей ВИРТУАЛЬНЫЙ ДИСК. Пример 4.2dbg (папка на ВИРТУАЛЬНОМ диске Ppr_4_02dbg) Немного о возможных ошибках и отладке программы ПРИМЕЧАНИЕ. Наша книга предназначена для того, чтобы не про- сто дать читателю описание нескольких конкрет- ных программ, а для того, чтобы побудить чита- теля к самостоятельному творчеству Автор надеется, что в ходе чтения книги у читателя появятся свои идеи, как использовать и усовершенствовать эти программы, как приспособить их для своих целей. При разработке своих программ у вас обязательно появятся проблемы, связанные с их отладкой. При написании любой про- граммы программист обязательно допускает явные или неяв- ные ошибки. Вдруг оказывается, что внешне вполне логичная и правильная программа почему-то не работает. Не стоит этого пугаться. ШУТКА. Старая программистская шутка-поговорка гла- сит: Если вы написали программу, и она сразу за- работала, то тут что-то не так! Значит, вы про- сто не заметили ошибки!
Глава 4.Управление ESP-01 при помощи ARDUINO 249 Отладка программы (по-английски — Debugging) включает в себя: ♦ поиск ошибок; ♦ оптимизацию текста программы; ♦ устранение недочетов алгоритма. Сложность поиска ошибок в нашем случае увеличивается из-за того, что в процессе работы программы мы не видим ответы ESP-модуля. Команды, передаваемые из ARDUINO на ESP-O1, дублируются на компьютере в окне монитора порта среды IDE. Ответы же ESP-модуля поступают лишь на вход ARDUINO и нигде не отображаются. Из-за этого мы не видим, что же пошло не так. Не видим сообщений об ошибке, которые выдает ESP- модуль. Не видим, в какой момент что-то пошло неправильно (от ESP-модуля не пришло то сообщение, которое ожидалось). Программный способ контроля | ответа ESP-модуля II При разработке учебных программ для этой книги автору при- шлось самому решать описанные выше проблемы. В результате были опробованы два способа контроля ответов ESP-модуля: ♦ программный; ♦ аппаратный. Для программного метода пришлось создать несколько отла- дочных процедур, позволяющих программисту увидеть ответы ESP-модуля в момент возникновения ошибки. Эти процедуры временно на этапе отладки добавляются к тексту программы, а в нужных местах программы временно добавляются команды их вызова. Первая из этих процедур способна перехватывать входящую информацию из последовательного канала и записывать ее в опе- ративную память ARDUINO по ходу работы основной программы. При этом в памяти ARDUINO формируется нечто вроде времен- ного лог-файла. В заданном месте программы (там, где по его предположению возникает ошибка) программист может вставить команду, вызы- вающую вторую отладочную процедуру. Эта процедура выво- дит содержимое сформированного ранее лог-файла по после-
250 Управление модулем ARDUINO по Wi-Fi с мобильных устройств довательному каналу на компьютер, где его можно наблюдать в окне монитора последовательного порта. Для хранения лог-файла используется специально создан- ный для этих целей строковый объект ErrorString. ПРИМЕЧАНИЕ. Эти процедуры, а, вернее, функции удобно разме- стить в отдельную вкладку программы. Назовем эту вкладку «Otladka». Текст отладочных функ- ций приведен в листинге 4.2.5. Первая из функций называется debugscan. Алгоритм действия функции очень прост. После того, как этой функции будет передано управление, она начинает читать все, что приходит по последовательному каналу, и каждый получен- ный символ добавляет в конец лог-файла. Прочитав все сообще- ния, пришедшие по последовательному каналу, пришедшие к Листинг 4.2.5. Отладочные процедуры 7* Отладочные функции */ //******************* сканирование выдачи ESP модуля void debugscan() { mt inChar = 0; for (int tim*0; tira<2000; tiro++) { -юловок inChar = Serial.read(); // получить новый байт if (inChar!=-l) { ErrorString += (char)inChar; /у******************** вывод на экран отладочной информации void PrintLogO { Serial.println(ErrorString); while(true); // Зацикливание (программа останавливается)
Глава 4.Управление ESP-01 при помощи ARDUINO 251 текущему моменту времени, функция завершает свою работу, и управление снова возвращается основной программе. Команду вызова функции debugscanQ можно включать несколько раз в разных местах основной программы. ВНИМАНИЕ. Нужно расставить команды вызова функции debugscanO таким образом, чтобы не было упущено ни одного сообщения от ESP-модуля. Для отображения лог-файла в окне монитора порта служит вторая отладочная функция — PrintLog(). В критическом месте основной программы, там, где имеются сомнения в правильно- сти ее работы (или просто в момент обнаружения ошибки) нужно включить в программу команду, вызывающую PrintLogQ. Функция выводит содержимое лог-файла в последовательный порт и затем производит принудительное зацикливание про- граммы. ПРИМЕЧАНИЕ. Остановка программы путем ее зацикливания не- обходима потому, что вывод лог-файла сам по себе сбивает работу ESP-модуля, так как выводимая ин- формация поступает и на него. ESP-модуль воспринимает содержимое лог-файла как непра- вильные команды и начинает выводить сообщения об ошибках. Чтобы эти сообщения не мешали при анализе лог-файла, про- грамму следует остановить. ВНИМАНИЕ. В микроконтроллере не предусмотрена команда остановки программы. Поэтому применен метод зацикливания.
252 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Иногда использование функции debugscanO невозможно. Это бывает в том случае, когда основная программа сама читает дан- ные из буфера последовательного канала. Если после этого вставить команду вызова debugscanO, то она ничего не прочитает, и лог-файл останется пустым, так как вся информация из буфера уже прочитана. В таком случае для контроля сообщений от ESP-модуля в раз- ные места основной программы нужно включать строки следую- щего вида: ErrorString += <значение> + \п' где <значение> — это некая величина, которую основная про- грамма уже прочитала из входного буфера, а вы желаете вклю- чить ее в лог-файл. СОВЕТ. При этом нужно следить, чтобы <значение> обяза- тельно было символьного типа, или представляло собой строковый объект. В противном случае не- обходимо использовать команды преобразования типов. Такие как (char) или (String). Добавление в нужных местах описанной выше строки позво- ляет получить такой же лог-файл, как и в результате работы функции debugscanQ. Полученный лог-файл выводится на ком- пьютер так же, как и в предыдущем случае, при помощи функции PrintLogQ. НАПОМИНАЕМ. Как уже говорилось выше, для хранения лог-файла отладочные функции используют отдельный, спе- циально созданный строковый объект, имя которо- го ErrorString. Команду инициализации этого объекта программист должен временно включить в основную программу в самом ее начале. Там, где определяются объекты InputString и OutputString.
Глава 4.Управление ESP-01 при помощи ARDUINO 253 Строка определения нового строкового объекта должна выгля- деть следующим образом: String ErrorString = «Log start —\n»; Такое выражение создает строковый объект с именем ErrorString и присваивает его содержимому начальное значение. В качестве начального значения выступает сообщение «Log start —\п». Это заголовок лог-файла. Он будет предварять лог-файл и при выводе его в окне монитора порта. ПРИМЕЧАНИЕ. При анализе результатов отладки заголовок помо- жет отделить на экране содержимое лог-файла от других сообщений. ВНИМАНИЕ. По завершении процесса отладки все временные функции и команды должны быть удалены из про- граммы. Рассмотрим подробнее описанные выше отладоч- ные функции. Содержимое вкладки «Otladka» приведена в листинге 4.2.5. Функция debugscanQ занимает строки 4... 12 листинга. Она создана путем доработки функции sLinelnputQ, поэтому во многом на нее похожа. Работа функции начинается с опре- деления вспомогательной локальной переменной inChar (см. строку 5). В этой переменной будет храниться текущий про- читанный байт. ПРИМЕЧАНИЕ. Локальная переменная inChar, определенная в теле функции debugscanO, действует исключительно внутри этой функции. Переменная с точно та-
254 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ким же именем, определенная внутри функции sLinelnputO в той же программе, - это совсем дру- гая локальная переменная. Эти две переменные хранят разные значения. Каждая из этих переменных возникает при вызове соответствующей функции, и исчезает при ее завершении. Далее начинается цикл сканирования. Он занимает строки 6...11 (листинга 4.2.5). Цикл организован при помощи опера- тора forO (строка 6 программы). Этот цикл — копия аналогичного цикла в функции sLineInput(). В нем так же в качестве счетчика цикла используется переменная tim. Эта переменная также имеет статус локальной и действует только внутри функции debugscan(). Цикл сканирования так же, как и в функции sLinelnputO, огра- ничен двумя тысячами попыток. Как видите, функция debugscanf) по структуре очень похожа на функцию чтения строки из потока сообщений sLinelnputO. Отличие в том, что debugscanO не разделяет поток данных на строки. Функция просто добавляет каждый счи- танный символ вконец сообщения в строковый объект ErrorString. Тело цикла сканирования последовательного канала занимает строки 7...10. В строке 7 при помощи функции Serial.readO счи- тывается очередной байт из буфера последовательного канала и помещается в переменную inChar. В строке 8 при помощи опера- тора ifO проверяется считанное значение. Если значение переменной inChar равно -1 (минус единице), то это значит, что буфер был пуст и байт не считан. А, значит, строка 9 выполнена не будет. В противном случае (если очеред- ной символ успешно прочитан) строка 9 выполняется. В строке 9 считанный байт добавляется к лог-файлу. Для этого применяется уже знакомый нам оператор «+=». При добав- лении данных используется преобразование типов. Переменная inChar имеет тип — int. Оператор (char), преобразует значение int (число целое) в значение char (символ). И этот символ добавля- ется к содержимому строкового объекта ErrorString.
Глава 4.Управление ESP-01 при помощи ARDUINO 255 ПРИМЕЧАНИЕ. Таким образом, в результате работы цикла ска- нирования все считанные байты по очереди при- соединяются к лог-файлу. В данном случае «все», означает не только буквы и символы пробела, но и служебные символы, к которым относятся симво- лы перевода строки и символы возврата каретки. Поэтому в дальнейшем, при распечатке лог-файла, сохраняется исходное разбиение потока сообще- ний на строки. Вторая отладочная функция называется PrintLogQ. Она занимает строки 15.. 18 в листинге 4.2.5. Эта функция предна- значена для вывода в окно монитора порта содержимого лог- файла. Функция состоит всего из двух строк. В строке 16 происходит собственно вывод лог-файла. Делается это при помощи стандартной функции печати в после- довательный канал. В строке 17 расположена команда зацикливания. Это пустой цикл while, в качестве условия продолжения которого выбрано логическое значение true. To есть цикл будет продолжаться бес- конечно (программа зациклится). Таким образом, дальнейшее выполнение программы остановится. ПРИМЕЧАНИЕ. Выйти из зацикливания можно только при нажа- тии кнопки сброса, или просто закрыв и снова от- крыв окно монитора порта. Два примера использования отладочных процедур приведены в листинге 4.2.6 и в листинге 4.2.7. В листинге 4.2.6 показан пример отладки функции SetupESPQ — функция начальной установки ESP-модуля. В уже известную нам функцию, текст которой был приведен в листинге 4.2.1, включены команды вызова функций debugscanO и PrintLogQ. В доработанном варианте (см. листинг 4.2.6) вызов функ- ции debugscanQ происходит в строках 7, 10 и 13. То есть, после
256 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Листинг 4.2.6. Отладка функции начального сброса /у************************** настройка ESP8266 при помощи АТ-команд: void SetupESPO { Serial.begin(115200); delay (200); Serial.println ("ATEO"); // Отключить эхо debugscan (); deiay(200); Serial.print In ("AT+CIPMUX=1"); // Установить множественный режим подключения debugscan() ; delay(200); Serial.println ("AT+CIPSERVER=1, 88"); // Запустить TCP сервер на 88 порте debugscan(); PnntLogO ; посылки каждой команды на ESP-модуль. В конце всей этой про- цедуры, в строке 14 вызывается PrintLog(). При каждом вызове функция debugscanQ принимает ответы от ESP-модуля и записы- вает их в лог-файл. Функция PrintLogQ выводит лог-файл на экран и останавливает программу. ПРИМЕЧАНИЕ. Подобные .средства отладки позволяют нам об- наружить, например, тот факт, что ESP-модуль в разных случаях на один и тот же запрос дает раз- ные ответы. На рис. 4.20 показан набор сообщений, которые появились в окне монитора порта в процессе работы программы, в которую включены отладочные команды, согласно листингу 4.2.6. Первые три строки, которые мы видим в окне монитора, — это АТ-команды, которые ARDUINO послал на ESP-модуль.
Глава 4. Управление ESP-01 при помощи ARDUINO 257 АТЕО AT+CIPMUX=1 AT+CIPSERVER=1,88 Log start &ТЕ0 OK OK АТЕО AT+CIPMUX=1 AT+CIPSERVER=1,88 Log start OK OK no change OK OK Рис. 4.20. Отладка SetupESR Первый запуск программы ПРИМЕЧАНИЕ. Рис. 4.21. Отладка SetupESR Перезапуск программы Как уже говорилось выше, все, что ARDUINO посыла- ет по последовательному каналу на ESP-модуль, па- раллельно отображается в окне монитора порта. Далее, после заголовка («Log start —») мы видим содержимое лог-файла. В лог-файл попали все ответы ESP-модуля, посланные им на модуль ARDUINO с момента старта программы до момента вызова функции PrintLogQ. В нашем случае лог-файл содержит ответы на каждую из АТ-команд. Тех самых команд, которые мы видим в первых трех строках на рис. 4.20. Так первая строка лог-файла — это ЭХО от команды «АТЕО». Речь идет о системном эхе, вырабатываемом обработчиком АТ-команд ESP-модуля. Команда АТЕО служит для выключения эха. Однако пока команда не выполнена, ЭХО от нее самой при- ходит. Для всех остальных АТ-команд ЭХО уже отсутствует. Кроме эха после выполнения команды АТЕО модуль возвращает пустую строку, а за ней сообщает «ОК». Следующие два «ОК» ESP-модуль выдает после выполнения команд AT+CIPMUX и AT+CIPSERVER. Каждое «ОК» предваряется пустой строкой.
258 Управление модулем ARDUINO по Wi-Fi с мобильных устройств На рис. 4.21 показан результат работы той же программы (см. листинг 4.2.6) при ее повторном перезапуске. ОБЪЕКТ ОТЛАДКИ. Если перезапустить программу в ARDUINO (нажав кнопку сброса или просто закрыв и снова открыв окно монитора последовательного порта), но при этом не сбрасывать ESP-модуль и не выключать его питание, то ESP-модуль останется в прежнем режиме (CIPMUX=1 и TCP-сервер запущен). При этом команды начальной настройки, поданные при пере- запуске программы в ARDUINO, окажутся лишними. Это не кри- тично, и работа модуля не нарушится, но в ответах модуля мы увидим сообщение о некритической ошибке. Сообщение «no change» — это ответ на команду AT+CIPSERVER=1,88. Оно сообщает нам, что команда инициали- зации сервера получена, но сервер и так уже запущен. Поэтому режим не изменился. ПРИМЕЧАНИЕ. В данном случае мы нашли не критичную ошибку, но сам метод поиска ошибок, надеюсь, вам понятен, В других, более сложных случаях такие сообщения могут помочь нам в поиске настоящих ошибок. Программа, приведенная в листинге 4.2.6, обладает опреде- ленной избыточностью. Из нее вполне можно исключить команды вызова функции debugscan() в строках 7 и 10. Многократное включение вызова функции оправдано в том случае, когда известно, что объем выводимых сообщений будет большой. Буфер последовательного канала имеет объем, равный 64 бай- там. Если предполагаемый объем всех сообщений превышает эту величину, то включать в отлаживаемую программу строку вызова функции debugscanO нужно как можно чаще. Иначе часть ответов от ESP-модуля будет утеряна.
Глава 4.Управление ESP-01 при помощи ARDUINO 259 Листинг 4.2.7. Отладка ожидания ответа 35 //* Ожидание ответа ОК 36 void waitOK(const char* inWrd) { if (FLerr) return; FLerr = true; for (mt i=0; i<50; i++) { sLinelnput(); ErrorString +« InputString + if (InputString=inWrd) { FLerr = false; delay(200); break; // Если флаг ошибки уставновлен выходим // Установить флаг ошибки // Цикл ожидания нужного ответа // Получаем строку из поел.канала и~\пи; // Запись в лог-файл // Если принятое сообщение то что нужно // Сбрасываем флаг ошибкти // Выход из цикла ожидания ответа } if (FLerr) PrintLogO; // Если ошибка вызываем печать лог-файла В листинге 4.2.7 показан другой вариант использования отладоч- ных функций. На этот раз мы будем отлаживать функцию waitOKO, которую мы рассматривали в предыдущем разделе (см. листинг 4.2.3). Функция waitOKO в нашей программе применяется несколько раз, и используется в основном внутри функции PrintWIFIQ. ПРИМЕЧАНИЕ. Напомню, что функция waitOKO имеет защиту от зависания. Функция реализует процесс ожидания нужного нам ответа от ESP-модуля. Функция завершает свою работу в момент, когда нужный ответ получен. Если же нужный ответ так и не пришел, то после определенного числа попыток его дождаться функция заверша- ется с установкой флага ошибки. Для того чтобы понять, почему же не пришел нужный ответ, нам желательно увидеть, какие же ответы давал ESP-модуль. Проанализировав реальные ответы, можно понять, где произошел сбой. В данном случае мы не можем использовать функцию debugscanO, так как сама отлаживаемая процедура waitOKO мно- гократно читает данные из буфера последовательного канала.
260 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Вставленная в такую программу функция debugscanQ ничего не сможет прочитать, так как буфер будет уже пуст. Поэтому мы поступим следующим образом: мы вставим в цикл ожидания ответа функции команду, записывающую каждую считанную в процессе ожидания строку в лог-файл (см. строку 41 листинга 4.2.7). В строке 41 к содержимому лог-файла, размещенному в строковом объекте ErrorString, добавляется только что считан- ная из потока данных строка, находящаяся в строковом объекте InputString. В конец этой новой строки лог-файла добавляется окончание, состоящее всего из двух символов: «~\п». Символ «~» введен для визуализации конца строки. Если в конце текущей строки имеются лишние пробелы, наличие этого символа поможет их увидеть. Символ «\п» заставляет каждое сообщение выводиться с новой строки. Если в процессе работы функции waitOKQ с включенными в нее отладочными командами ошибки не произойдет, то функция завершится штатно, и выполнение программы продолжится. При этом в лог-файле останутся все ответы от ESP-модуля. Далее, в процессе дальнейшей работы программы, вызов функции waitOKQ будет производиться снова и снова. Допустим, в какой-то момент произойдет ошибка. Блок команд вызова функции PrintWIFIQ, распечатывающей лог- файл, размещен в конце функции waitOKQ в строке 48 (см. листинг 4.2.7). Строка 48 размещена сразу после окончания цикла ожидания ответа. К этой строке программа переходит лишь в случае оконча- ния всех 2000 итераций цикла, когда нужный ответ так и не был получен. В строке 48 происходит проверка флага ошибки. Если флаг установлен, происходит вызов функции PrintWIFIQ. Результат работы программы с включенными в нее отладоч- ными вставками в соответствии с листингом 4.2.7 приведен на рис. 4.22. На рис. 4.22 показан случай, когда возникла ошибка. Так же, как и в предыдущем примере (рис. 4.21 и рис. 4.22), пер- вые строки в окне сообщений — это команды, которые ARDUINO послал на ESP-модуль.
Глава 4.Управление ESP-01 при помощи ARDUINO 261 АТЕО &T+CIPMUX=1 AT+CIPSERVER=1,88 AT+CIPSEND=0,8 Arduino Log start OK- busy s...~ Recv 8 bytes- Рис. 4.22. Отладка функции waitOKf) На этот раз ARDUINO выдал пять команд, прежде чем воз- никла ошибка. Это команды начальной настройки и команда CIPSEND (передачи WiFi-сообщений). Передан также и сам текст сообщения. Далее, после заголовка лог-файла выводится его содержимое. Печать лог-файла была вызвана возникновением ошибки, кото- рую мы сейчас попытаемся обнаружить. ПРИМЕЧАНИЕ. Тут нужно отметить, что запись информации в лог-файл производилась только в процессе рабо- ты функции waitOK(). Ответы ESP-модуля на дру- гих этапах работы (например, при работе функции SetupESPQ) в данном случае в лог-файл не вошли.
262 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Из текста лог-файла мы видим, что после подачи команды CIPSEND программа успешно дождалась сообщения «ОК», затем дождалась приглашения «>». Далее, пришло сообщение «busy s...» («линия занята»). И, наконец, модуль сообщил о том, что по Wi-Fi каналу успешно передано 8 байт (сообщение «Recv 8 bytes»). Но вот сообщение «SEND OK» так и не было получено. Это и явилось причиной ошибки. ПРИМЕЧАНИЕ. Для того, чтобы смоделировать данную ошибку, мы специально уменьшили число циклов ожидания нужного ответа в строке 39 (см. листинг 4.2.7). В результате программа не дождалась последнего сообщения. Таким образом, данный способ обнаружения ошибки может реально показать нам, что параметр «допустимое количество неудачных попыток считывания» слишком мал. Если на практике вы получите подобный результат, то для решения проблемы вам придется использовать данный метод обнаружения ошибки для подбора оптимального значения данного параметра. Постепенно увеличивая параметр в строке 39 можно подо- брать значение, при котором происходит надежное срабатыва- ние функции waitOKQ. В нашем случае оптимальным оказалось значение 50. Приведенный на рис. 4.22 результат работы отладочных процедур позволяет извлечь и другую полезную информацию. Например, из текста лог-файла видно, что приглашение «> » состоит именно из двух символов. Это важная деталь, которую невозможно заметить при подаче АТ-команд вручную или дру- гим способом. В технической документации эта тонкость также не отра- жена. Не зная этой, казалось бы, мелочи, можно допустить очень неприятную неявную ошибку. Указать неправильно параметр в процедуре ожидания: вместо waitOK(«> ») ожидать waitOK(«>»). Визуально обнаружить ошибку в таком случае очень нелегко! Все вроде правильно, но не работает!
Глава 4.Управление ESP-01 при помощи ARDUINO 263 ВНИМАНИЕ. Программный пример «Ppr_4J)2_dbg» на виртуаль- ном диске содержит в себе оба способа применения описанных выше отладочных процедур. Однако при- менять каждый из двух способов следует по от- дельности. Если вы хотите попробовать первый способ локализации ошибки, исключите все временные команды из текста функции waitOK(). Для проверки на практике второго способа, уберите времен- ные команды из функции SetupESPQ. Аппаратный способ контроля 1 ответа ESP-модуля II Второй способ, который поможет программисту увидеть не только сообщения, уходящие по последовательному каналу от ARDUINO к ESP-модулю, но и ответы ESP-модуля, которые он воз- вращает обратно на ARDUINO — это использование дополнитель- ного внешнего адаптера для просмотра обратного канала. Подойдет любой внешний USB-TTL адаптер. Например, один из тех, что изображен на рис. 2.16. У такого адаптера обычно име- ется стандартный USB-разъем для подключения к компьютеру и, как минимум, 5 выводов, на которые выводятся следующие цепи: TxD, RxD, GND, +5.0V и +3.3V. Нам понадобится всего два из этих контактов: RxD и GND. Эти контакты нужно подключить к точкам КТ1 и КТ2 на схеме УЧЕБНОГО МОДУЛЯ (см. рис. 4.13). Линию RxD дополнительного адаптера нужно подключить к точке КТ1, а линию GND к точке КТ2. Таким образом, наш дополнительный адаптер окажется параллельно подключенным к той линии последовательного канала, по которой ответы от ESP-модуля поступают на модуль ARDUINO.
264 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ВНИМАНИЕ. При подключении внешнего модуля не перепутайте провода! Это может вызвать выход из строя не только модуля ARDUINO и дополнительного адап- тера, но и USB порта компьютера! ПРИМЕЧАНИЕ. По большому счету, контакт GND дополнительно- го адаптера можно вообще никуда не подключать, так как и внешний адаптер и модуль ARDUINO бу- дут подключены, каждый через свой USB-разъем, к компьютеру В результате, общий провод обоих устройств и так будет соединен черед общий про- вод компьютера. Прямое соединение GND и контакта К2 может потребоваться в случае, если для подключения используются USB кабели и их длина слишком большая. Это может стать причиной большого уровня помех. На рис. 4.23 показан внешний вид УЧЕБНОГО МОДУЛЯ с подключенным к нему внешним USB-TTL адаптером. Внешний адаптер подключается к одному из USB портов вашего компьютера, a ARDUINO — к любому другому его USB- порту. Так как у вас на компьютере уже установлен драйвер USB- СОМ, то при подключении двух устройств к двум USB-портам на компьютере появятся два виртуальных СОМ-порта. Рис. 4.23. Подключение дополнительного USB-TTL адаптера
Глава 4.Управление ESP-01 при помощи ARDUINO 265 Войдите в «Диспетчер устройств» и убедитесь в этом. Запомните номера каждого из виртуальных СОМ-портов. Через СОМ-порт, связанный с модулем ARDUINO, как и пре- жде, мы будем наблюдать сообщения, передаваемые от ARDUINO к ESP-модулю, используя для этого монитор порта среды IDE. Через второй виртуальный СОМ-порт, связанный с допол- нительным USB-TTL адаптером мы будем наблюдать ответы ESP- модуля. Не должно быть проблемы с тем, какой порт подключен к ARDUINO, а какой — к внешнему адаптеру. Номер СОМ-порта, подключенного к ARDUINO, не изменится. Мы его знаем по пре- дыдущим примерам. Вновь возникший виртуальный СОМ-порт и есть порт, подключенный к дополнительному адаптеру. Теперь нам осталось установить на компьютер дополнитель- ную программу, при помощи которой мы сможем посмотреть информацию, поступающую от внешнего адаптера. Для этого можно использовать любую бесплатную терминальную про- грамму, которую легко найти и скачать в сети Интернет. Автор использовал программу с простым названием Terminal. Вот ссылка на страницу, где можно скачать эту программу в Интернете [24]. ПРИМЕЧАНИЕ. На смартфоне можно лишь посмотреть страни- цу и почитать описание программы. Текст описа- ния на английском, поэтому пользуйтесь браузе- ром с переводчиком (например, Яндекс браузером). Скачивать программу нужно на компьютере (ссыл- ка [24] в конце книги). Для перехода по указанной в тексте ссылке [24] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода.
266 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ВИРТУАЛЬНЫЙ ДИСК. Копия программы есть также и на виртуальном | диске. Программа не требует установки. После скачивания вы полу- чите zip-архив. Распакуйте его в отдельную папку на ваш ком- пьютер. Зайдите в эту папку и запустите файл Terminal.exe. Внешний вид программы Terminal вы можете видеть на рис. 4.24 (окно слева). Перед началом работы вы должны выста- вить в верхней части программы номер порта и скорость пере- дачи информации. Номер порта должен соответствовать порту, куда подключен дополнительный адаптер. Название порта нужно вписать в поле «COM Port» вручную. Автоматически номер порта в выпадающий список этого поля не попадает. Кнопка PORTs производит сканирование всех пор- тов в компьютере и выводит их названия в основное поле вывода информации. Там название нужного вам порта можно скопиро- вать при помощи мыши и вставить в поле «COM Port». Рис. 4.24. Аппаратная отладка в программе Terminal и в мониторе порта
Глава 4.Управление ESP-01 при помощи ARDUINO 267 Скорость передачи (Baud rate) выбираем равной 115200. Затем нужно нажать кнопку «Connect» (Подключение). При успешном подключении кнопка должна стать утопленной и название кнопки должно поменяться на «Disconnect». После этого все готово к отладке программ в нашем УЧЕБНОМ МОДУЛЕ. Отлаживать мы будем программу «ЭХО» (программный пример 4.2). ВНИМАНИЕ. По ходу процесса отладки постоянно следите, чтобы программа Terminal оставалась в режиме Connect В этом режиме ни кнопке в верхнем ле- вом углу окна программы должно быть написано «Disconnect»! Не выключая программу Terminal, запустите среду про- граммирования IDE, откройте в ней монитор последователь- ного порта. В момент открывания этого окна перезапустится программа в ARDUINO, и в окне порта вскоре появятся сообще- ния, посланные на ESP-модуль. Перезапуск программы также может вызвать Disconnect программы Terminal. Восстановите соединение! Запустите приложение «WiFi Controller» в смартфоне и пошлите с него сообщение на УЧЕБНЫЙ МОДУЛЬ. В окне мони- тора последовательного порта наблюдайте появление соответ- ствующих AT-команд. Одновременно в окне программы Terminal вы должны увидеть все сообщения, которые выдал ESP-модуль в ответ на АТ-команды. Весь процесс обмена информацией сразу в окне монитора порта и окне программы Terminal отображен на рис. 4.24. Общие вопросы | отладки программ II Описанные выше способы облегчения процесса отладки пред- назначены для решения лишь данной конкретной проблемы, возникающей при совместной работе двух микроконтроллерных
268 Управление модулем ARDUINO по Wi-Fi с мобильных устройств модулей, связанных по последовательному каналу. В каждом из этих каналов работает своя отдельная программа, и требуется отладить их взаимодействие. Специфическая проблема тут в том, что программист не видит, как реагирует ESP-модуль на команды от ARDUINO. Но, кроме этих проблем, при отладке любой программы будут возни- кать обычные, стандартные проблемы, которые всегда возникают в процессе отладки любых алгоритмов. Тут вам придется приме- нять стандартные методы и приемы отладки. Подробно об этом было описано в [1]. Для перехода по указанной в тексте ссылке [1] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Один из таких методов — временное включение в программу в критичных местах команд, выводящих информацию в после- довательный канал ARDUINO. Это должны быть сообщения, ото- бражающие: ♦ значения различных переменных; ♦ состояние портов; ♦ просто индицирующие сообщения о прохождении того либо иного этапа алгоритма. ПРИМЕЧАНИЕ. В нашем случае такой метод отладки затруднен тем, что к последовательному порту подключен ESP-модуль, который будет реагировать на вывод в последовательный канал отладочных сообщений. И это будет просто сбивать работу всей системы. Поэтому такой способ можно использовать для предваритель- ной отладки отдельных процедур без подключения ESP-модуля. Например, можно отладить алгоритм формирования АТ-команд, наблюдая эти команды в мониторе порта, когда ESP-модуль не подключен.
Глава 4.Управление ESP-01 при помощи ARDUINO 269 4.9. Программа управления светодиодами ВИРТУАЛЬНЫЙ ДИСК. Пример 4.3 (папка на ВИРТУАЛЬНОМ диске Ррг_4_03) Как научится управлять светодиодами | и не только... II Перейдем теперь к более практическому примеру. Научимся создавать программу, при помощи которой мы сможем по Wi-Fi каналу управлять светодиодами, подключенными к нашему УЧЕБНОМУ МОДУЛЮ. ПРИМЕЧАНИЕ. Научившись управлять светодиодами, вы без труда сможете управлять любыми другими устройства- ми: реле, электромоторами, соленоидами, нагрева- тельными элементами и т. п. Достаточно вместо светодиода подключить соответствующий элек- тронный ключ, рассчитанный на ток нагрузки вы- бранного вами устройства. Для начала создадим программу, позволяющую при помощи смартфона включать и выключать любой светодиод. Начнем со схемы. Схема II На рис. 4.25 приведена схема, которая поможет нам выпол- нить поставленную задачу. Если вы читали предыдущие книги нашей серии (книгу [1] или [2], см. список литературы), то подоб- ная схема вам знакома.
270 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 4.25. Схема для программы управления светодиодами Те читатели, кто не только прочитал книгу [1] или [2], но и пробовал собирать все предложенные в них схемы, может исполь- зовать сделанную ранее конструкцию в этом примере. Для перехода по указанной в тек- сте ссылке [1] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Для перехода по указанной в тек- сте ссылке [2] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода.
Глава 4. Управление ESP-01 при помощи ARDUINO 271 Восемь светодиодов подключаются к восьми цифровым линиям ввода-вывода модуля ARDUINO. Используются контакты с номерами от 2 по 9. К каждому контакту подключается катод одного светодиода. Анод же каждого светодиода через токоогра- ничивающий резистор подключается к шине питания +5 вольт. ПРИМЕЧАНИЕ. Для управления светодиодами соответствующие контакты должны быть переведены в режим выво- да информации. Для того чтобы светодиод загорелся, нужно на соответствую- щий выход подать логический ноль. Разница потенциалов между нулем на выходе и +5 вольтами зажжет светодиод. Если же на выход подать логическую единицу, то разность потенциалов ока- жется равной нулю, и светодиод потухнет. Алгоритм Зададимся следующим алгоритмом управления светодио- дами: 1. Для управления светодиодами в приложении «WIFI Controller» мы будем использовать кнопки с именами от «1» до «8». Каждая кнопка соответствует своему светодиоду. 2. При нажатии любой из этих кнопок состояние светодиода должно измениться на противоположное: • если светодиод горел, он должен потухнуть; • если светодиод не горел — зажечься. 3. Каждый раз, когда после нажатия кнопки состояние светоди- ода изменилось, УЧЕБНЫЙ МОДУЛЬ должен послать назад на смартфон сообщение о выполнении команды.
272 Управление модулем ARDUINO по Wi-Fi с мобильных устройств II Программа Перейдем к разработке программы. Сначала мы предлагаем создать еще одну вспомогательную функцию. Если вернуться к программе «ЭХО» (листинг 4.2.4), то можно видеть, что там есть фрагмент, который наверняка нам понадобится практически в любом последующем программном примере. Понадобится он и в задаче по управлению светодиодами. Речь идет о ряде команд, которые выделяют из ESP-сообщений, приходящих от ESP-модуля, заключенные в них WiFi-сообщения. В нашем новом примере каждое WiFi-сообщение — это и будет команда для управления светодиодами. Команды, выделяющие WiFi-сообщения в программе «ЭХО» расположены в строках 16, 17, 18 и частично в строке 19 (см. листинг 4.2.4). Как уже описывалось выше, указанные опе- раторы сначала перебирают и отбрасывают все сообщения короче 10 символов, затем проверяют, начинается ли сообщение с под- строки «+IPD,». Если начинается, то из текста ESP-сообщения выделяется под- строка, начиная с символа номер 9 и до конца исходной строки. Полученная подстрока и есть WiFi-сообщение. При нажатии на одну из кнопок с «1» по «8» в приложении «WIFI Controller» на смартфоне, на УЧЕБНЫЙ МОДУЛЬ посыла- ется закрепленная за ней команда, согласно табл. 4.1. Например: ♦ при нажатии кнопки «1» по Wi-Fi уходит команда «К1»; ♦ при нажатии кнопки «2» по Wi-Fi уходит команда «К2»; ♦ так далее. Будет логично, если мы оформим действия по выделению команд из ESP-сообщений как отдельную функцию и поме- стим эту функцию во вкладку «DopFunction». Эта функция получила название getCommandQ. Текст функции приведен в листинге 4.3.1. ВНИМАНИЕ. В листинге 4.3.1 приведена лишь функция getCommandO. Это последняя функция во вкладке «DopFunction», добавленная к уже существующим
Глава 4.Управление ESP-01 при помощи ARDUINO 273 там трем ранее описанным функциям. Они нахо- дятся в начальных строках вкладки и просто не показаны. В реальной программе они существуют и полностью соответствуют листингу 4.2.3. Листинг 4.3.1. Дополнительная функция «Получить команду» 49 50 void getCoraraand() { //********♦***♦*****♦**************♦****** получить команду while (true) { // Цикл ожидания команды sLinelnput(); // Получаем очередную строку if (InputString.length()>9) { // Если строка длиннее 9 if (InputString.substring(0,5)=R+IPD,") { // Если начинается с IPD OutputString = InputString.substring(9); // Выделяем команду break; // Выход из цикла Функция getCommandQ не возвращает значений и не имеет входных параметров. Она сама читает сообщения от ESP-модуля, выделяет из них WiFi-сообщения и помещает их в строковый объ- ект OutputString. Хотя основной алгоритм выделения команды из ESP- сообщения такой же, как в программе «ЭХО», в данной функции он реализован немного по-другому. Тело функции составляет цикл сканирования сообщений, получаемых по последовательному каналу (от ESP-модуля). Цикл занимает строки 51...59. Цикл организован при помощи опера- тора while (строка 51) и является бесконечным (условие, продол- жение цикла равно true). Выход из цикла происходит лишь при обнаружении WiFi-сообщения. Рассмотрим подробнее этот цикл сканирования. В строке 52 вызывается функция sLinelnputQ — чтение строки из последовательного канала. Функция, как мы знаем, читает очередную строку из потока сообщений от ESP-модуля, и помещает ее содержимое в строковый объект InputString.
274 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Далее, в строках 53 и 54 идут два оператора сравнения. В строке 53 оценивается длина принятого сообщения. Строки 54...56 выполняются только в том случае, если длина полученного сообщения больше 9 символов. В строке 54 программы проверя- ется начало полученного сообщения. Строки 55 и 56 выполняются только в том случае, если в начале сообщения найдена подстрока «+IPD,». Если оба условия (в строках 53 и 54) выполнены, управление переходит к строке 55 программы, где из принятой ESP-строки выделяется подстрока, начиная с девятого символа и до конца сообщения. Полученная подстрока и есть WiFi-сообщение. Оно помещается в строковый объект OutputString. Затем, в строке 56 программы выполняется оператор break. Это оператор досрочного выхода из цикла while(). Цикл завершается, а после этого завершается и сама функция. После выполнения функции getCommand() строковый объект OutputString содержит полученную по Wi-Fi команду. В листинге 4.3.2 приведен основной текст программы управления светодиодами. Начинается программа с определе- ния глобальных объектов. В строках 5 и 6 мы видим команды инициализации строковых объектов InputString и OutputString. Одновременно очищается их содержимое (присваивается значе- ние «пустая строка»). В строке 7 происходит инициализация массива pinbufl]. Массив будет использоваться для хранения текущего значения сигналов на всех выходах, к которым подключены светодиоды. Будем называть его буфером состояния светодиодов. Тип значения элементов массива bool (булевый). То есть, каж- дый из элементов массива может принимать значение либо true, либо false. При выводе содержимого элементов массива на кон- такты управления светодиодами: ♦ значению true соответствует логическая единица; ♦ значению false — логический ноль. Массив имеет размерность 8. Для каждого выхода один элемент. ПРИМЕЧАНИЕ. В языке СИ нумерация элементов в массиве начи- нается с нуля. Массив из 8 элементов будет иметь элементы с номерами О,1,2,3,4,5,6 и 7.
Глава 4.Управление ESP-01 при помощи ARDUINO 275 В строке 8 мы видим описание переменной «флаг ошибки». Описание этой переменной и механизм ее действия мы уже под- робно разбирали в предыдущем разделе. В строках 10...18 расположена обязательная функция setupQ — функция начальных установок. Разберем подробно ее работу. В строке 11 вызывается функция SetupESPQ, которая выпол- няет начальные установки ESP-модуля. В строках с 12 по 16 производится настройка всех восьми линий ввода-вывода, к которым подключены светодиоды, а также устанавливаются начальные значения всех восьми элементов буфера состояния светодиодов pinbufl]. Для перебора всех восьми линий и элементов массива используется оператор цикла for() (строка 12 программы). Цикл делает 8 итераций, в ходе которых значение переменной i (счетчика цикла) изменяется от 0 до 7. ПРИМЕЧАНИЕ. Таким образом, цикл перебирает все элементы мас- сива (буфера состояния светодиодов). Тело цикла занимает строки 13,14,15. В строке 13 текущему элементу буфера состояния светоди- одов присваивается начальное значение true. Напомню, что при таком значении светодиод будет потушен. В строке 14 устанавливается режим работы текущей линии ввода-вывода. Размещенная там команда pinMode определяет для контакта номер i+2 режим вывода информации (режим OUTPUT). ПРИМЕЧАНИЕ. Элемент номер «0» буфера состояния светодиодов хранит состояние свет од иода номер 1. Этот све- тодиод подключен у нас к цифровому контакту но- мер 2 (см. рис. 4.25). За второй светодиод отвечает элемент номер 1 буфера и контакт номер 3 модуля. И так далее.
276 Управление модулем ARDUINO по Wi-Fi с мобильных устройств [ Поэтому номер контакта всегда будет на 2 боль- ^ ше, чем номер элемента массива. В строке 15 на выход номер /+2 подается высокий уровень (начальное значение). Начальные значения выбраны такими, что сразу после запуска программы все светодиоды будут потушены. Для установки уровня сигнала на цифровом выходе используется стандартная функция языка ARDUINO digitalWriteQ- Листинг 4.3.2. Программа управления светодиодами String InputString=wlt; String OutputString^ "; 7bool pinbuf[8]; 8 bool FLerr — false; void setup() { SetupESPO; for (int i=0; i<8; i++) { pinbuf{1J =true; pinMode(i+2, OUTPUT); digitalWnte(i+2, true); } delay(200); Программный пример 4.3. Глава 4 Программа управления светодиодами // строка для хранения входящих данных // строка для хранения данных для вывода // Буфер состояния светодиодов // Флаг ошибки // Настройка Wi-Fi модуля // Цикл настройки выходов // Установка буфера состояния светодиодов // Настройка контакта // Установка начального значения на выходе //*♦***♦**************************♦*♦*< void loop() { int npin; FLerr = false; getCoramand(); if (OutputStrmg.substring(0,l)==wKff) { npin = OutputString.substring(1).tolnt(); pinbuf [npin-1] = !pmbuf [npin-1] ; digitalWrite(npin+1, pinbuf[npin-1]); OutputString = "LED^+Stringfnpin); if (pinbuf[npin-1]) OutputString += "=OFFn; else OutputString += n=OHn; PrintWIFIO; // Сброс флага ошибки // Получение команды // Если первая буква команды - "К" // Получаем числовую часть команды // Инвертируем состояние светодиода // Вывод состояния на светодиод // Формируем сообщение // Посылаем сообщение по Wi-Fi
Глава 4.Управление ESP-01 при помощи ARDUINO 277 У функции два входных параметра: ♦ номер контакта; ♦ выводимое значение. Номер контакта такой же, как и в строке 14. Устанавливаемое значение true. По окончании цикла настройки выходов в строке 17 про- граммы выполняется небольшая защитная задержка. В строках 21.. .34 программы расположен основной цикл loopQ. Функция loopQ начинается с определения локальной пере- менной npin (строка 22). Переменная имеет тип int и предназна- чена для хранения текущего номера светодиода. ПРИМЕЧАНИЕ. Локальная переменная в отличие от глобальной действует только в пределах той функции, в кото- рой она определена. Вне этой функции данная пере- менная не существует. В строке 23 сбрасывается флаг ошибки. Ошибка может воз- никнуть далее, в ходе выполнения программы. Но в начале флаг ошибки должен быть сброшен. В строке 24 вызывается функция получения команды getCommandQ. Как мы уже знаем, эта функция завершит свою работу только тогда, когда от ESP-модуля придет WiFi-сообщение (т. е. команда). Текст команды, будет помещен в объект OutputString. Далее, в строке 25 происходит оценка первой буквы в полу- ченной команде. В нашем случае команда должна начинаться с буквы «К». Именно такие сообщения посылает приложение «WIFI Controller» при нажатии одной из выбранных нами кнопок. Каждое сообщение состоит из буквы «К» и номера кнопки. Для выделения первой буквы из содержимого объекта OutputString используется метод substringQ. Выделяется под- строка, длиной в 1 символ, начиная с символа номер 0. Если выделенный символ — это буква «К», то строки 26...32 выполня- ются. В противном случае эти строки будут пропущены, основ- ной цикл достигнет конца, и управление перейдет начало функ- ции loopQ.
278 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Вопрос. А что же происходит, если обнаружена команда, начинающа- яся с буквы «К»? Для начала из текста команды мы должны выделить номер кнопки (он же будет и номером светодиода). Для этого в строке 26 к объекту OutputString последовательно применяются сразу две функции. Во-первых, функция substring^ выделяющая из строки команды подстроку, начиная с символа номер 1 и до конца сообщения. То есть, выделяем цифровую часть команды. ПРИМЕЧАНИЕ. Нумерация символов в символьной строке в языке СИ начинается с нуля. В сообщении «К1» символ «К» имеет номер 0, а символ «1» имеет номер 1. К выражению OutputString.substrinjg(l), результатом работы которого является подстрока, в которой в символьном виде содер- жится номер нажатой кнопки, применяется еще одна функция строкового объекта — функция tolnt(). Эта функция преобразует текстовое (строковое) значение в число. То есть, если число запи- сайо в текстовом виде, то функция toIntQ преобразует текстовое значение в значение числового типа. ПРИМЕР. Например, текстовое значение «1» превратится в число 1,значение «2» - в число 2 и т.д. Полученное таким образом число записывается в переменную npin. Теперь, когда мы имеем номер нажатой кнопки, мы можем приступать к выполнению команды. В строке 27 значению эле- мента буфера состояния светодиодов номер npin-1 присваивается его же инвертированное значение.
Глава 4.Управление ESP-01 при помощи ARDUINO 279 Вопрос. Почему в этом выражении от содержимого переменной npin мы отнимаем единицу? Опять же, из-за особенностей нумерации. Номер элемента мас- сива на единицу меньше номера кнопки (он же — номер светоди- ода). В результате значение элемента массива сменится на противо- положное. Значение true сменится на false или наоборот, false на true. В строке 28 программы значение текущего элемента буфера состояния светодиодов выводится на соответствующий выход. Вывод производится при помощи уже известной нам стандарт- ной функции языка digitalWriteQ- ПРИМЕЧАНИЕ. Надеюсь, вы не забыли, что номер контакта на 2 больше, а номер элемента на 1 меньше номера на- жатой кнопки? В результате светодиод: ♦ зажжется, если был потушен; ♦ потухнет, если горел. В соответствии со значением своего элемента в буфере состояния. Нам осталось послать на смартфон сообщение о выполненной операции. Наше сообщение будет состоять из имени светодиода и установленного значения. Например, если была выполнена команда «Включить светодиод номер 2», то сообщение должно выглядеть сле- дующим образом: «LED2=ON». После команды «Выключить свето- диод номер 5» сообщение должно быть следующим: «LED5=OFF». СОВЕТ. Для формирования текста сообщения удобно использовать строковый объект OutputString. Команда, которая хранится в нем, уже выполнена, и нам ее текст больше не нужен.
280 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Сначала, в строке 29 мы запишем в OutputString имя светоди- ода. Для этого к слову «LED» мы добавим номер нажатой кнопки. Оператор «+» при работе со строковыми значениями выполняет конкатенацию (объединение) двух строк. Но предварительно чис- ловое значение номера строки мы должны преобразовать к типу «строковый объект». Это делается при помощи функции StringQ. Именно так, с заглавной буквы. Другое написание будет ошибкой! В строках 30 и 31 происходит оценка состояния светоди- ода и выбор окончания текста сообщения. Условием оператора if() в строке 30 проверяет значение соответствующего элемента буфера состояния светодиодов. Если это значение равно true, то выполняется команда, следу- ющая сразу за функцией if() в строке 30. К содержимому объекта OutputString добавляется дополнительный текст «=OFF». В против- ном случае (если содержимое элемента массива — false), выпол- Рис. 4.27. Окно монитора порта среды IDE при управлении светодиодами Рис. 4.26. Окно программы WIFI Controller при управлении светодиодами
Глава 4.Управление ESP-01 при помощи ARDUINO 281 Рис. 4.28. Внешний вид устройства со схемой управления светодиодами няется команда else в строке 31 и к содержимому OutputString добавляется «=ON». В строке 32 содержимое OutputString выводится по Wi-Fi каналу на смартфон. Как выглядит окно приложения «WIFI Controller» в процессе работы программы управления светодио- дами, показано на рис. 4.26. Если в этот момент USB разъем ARDUINO подключен к ком- пьютеру, на компьютере запущена среда IDE и открыто окно монитора последовательного порта, то в этом окне мы также уви- дим все команды, передаваемые от ARDUINO на ESP-O1. Как выглядит в этом случае окно монитора порта показано на рис. 4.27. Внешний вид УЧЕБНОГО МОДУЛЯ с подключенными к нему светодиодами показан на рис. 4.28.
282 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 4.10. Программа регулировки яркости светодиодов I Учимся использовать слайдеры В следующем примере мы научимся использовать слай- деры. Как уже говорилось, в приложении «WIFI Controller» име- ется три слайдера, при помощи каждого из них вы можете пере- дать на УЧЕБНЫЙ МОДУЛЬ по Wi-Fi не просто команду, а некую изменяемую цифровую величину. В разделе 4.2 мы присвоили этим слайдерам названия: ♦ «Скорость»; ♦ «Яркость»; ♦ «Высота тона». Присваивая слайдерам указанные выше имена, мы исходили из того, что именно эти величины чаще всего регулируются в реальных системах управления. ПРИМЕЧАНИЕ. Однако в данном примере мы не будем обращать вни- мания на эти названия. Мы просто используем каж- дый слайдер для регулировки яркости свечения одного из светодиодов. Вернее двух, но об этом позже. Для регулировки яркости светодиода в языке ARDUINO име- ется подходящая команда. Так называемая команда аналогового вывода analogWrite(). Эта команда подает на один из цифровых выходов псевдо-аналоговый сигнал. Сигнал с широтно-импульс- ной модуляцией (ШИМ). Будучи поданным на светодиод, сигнал ШИМ заставляет его светиться и яркость свечения при этом зависит от ширины импульсов ШИМ-сигнала. Частота импульсов остается постоян- ной, а ширина зависит от значения параметра «аналоговое зна- чение» функции analogWriteQ. Значение параметра «аналоговое значение» должно лежать в пределах 0...255:
Глава 4.Управление ESP-01 при помощи ARDUINO 283 ♦ если значение равно нулю (ширина импульса равна нулю) — импульсы исчезают, и на выходе устанавливается уровень ло- гического нуля; ♦ при значении 255 (ширина импульса равна периоду их следо- вания) — импульсы также сливаются в постоянный уровень, и на выходе устанавливается логическая единица ♦ при остальных значениях параметра ширина импульса тем больше, чем больше передаваемое в функцию analogWhteQ значение. Вместо светодиода можно подключать и другие виды нагрузки: ♦ электродвигатели; ♦ нагреватели; ♦ осветительные приборы и т. п. ВНИМАНИЕ. Для управления перечисленными выше нагрузками придется предусмотреть силовой ключ, чтобы со- гласовать ток потребления управляемого устрой- ства и выходной ток модуля ARDUINO. Если вы прочитали книгу [1] или книгу [2], вы знаете, а для остальных сообщаем, что не все цифровые контакты модуля ARDUINO способны выводить сигналы ШИМ. Для перехода по указанной в тексте ссылке [1] наведите видоискатель мо- бильного Приложения «Сканер QR- и штрих-кодов» смартфона, планшета на расположенный рядом QR-код. Для перехода по указанной в тексте ссылке [2] наведите видоискатель мо- бильного Приложения «Сканер QR- и штрих-кодов» смартфона, планшета на расположенный рядом QR-код.
284 Управление модулем ARDUINO по Wi-Fi с мобильных устройств У модуля ARDUINO UNO имеется всего 6 выводов, которые способны выводить ШИМ сигнал. Это контакты 3,5,6 и 9—11. На плате ARDUINO такие выводы обозначены символом «~» рядом с номером контакта. Исходя из того, что выходов для вывода ШИМ сигнала всего шесть, а слайдеров у нас три, — создадим программу, в которой каждый из трех слайдеров будет регулировать яркость двух све- тодиодов. Для разнообразия сделаем так, что в процессе регули- ровки яркость одного из пары светодиодов будет уменьшаться, а второго увеличиваться. Схема Схема для реализации поставленной выше задачи будет очень похожа на схему из предыдущего примера. Она приведена на рис. 4.29. Уменьшено количество светодиодов, и они подклю- чены только к тем контактам, которые поддерживают ШИМ. Программа Программа управления яркостью светодиодов приведена в листинге 4.4.1. Как видите, эта программа даже проще, чем программа, предыдущего примера. Все дополнительные функ- ции помещены в две уже знакомые нам вкладки («DopFunction» и «Setup») и полностью соответствуют аналогичным функциям, используемым в программе 4.3. Поэтому мы их тут рассматри- вать не будем. В начале основного тела нашей новой программы (см. листинг 4.4.1) мы видим операторы, определяющие глобальные объекты. Их всего три (строки 5, 6, 7). И это уже известные нам объекты, которые мы хорошо знаем по предыдущим программам. Функция setupQ занимает строки 9... 12 и также имеет мини- мальный размер. В строке 10 вызывается функция конфигурации ESP-модуля, а в строке 11 защитная задержка.
Глава 4.Управление ESP-01 при помощи ARDUINO 285 Рис. 4.29. Схема управления яркостью светодиодов Основной цикл (функция loopO) программы занимает строки с 15 по 35. Начинается функция loopQ с определения локальных переменных. Локальных переменных на этот раз довольно много. Переменная pref (строка 17) имеет тип char (символ) и предна- значена для хранения префикса команды. НАПОМИНАНИЕ. Если вы еще не забыли, слайдер номер 1 («Скорость») передает команду, состоящую из символа «А» и чис- ла, определяемого положением слайдера. Символ «А» и есть префикс команды. Второй слайдер («Яркость») имеет префикс «В», а третий слайдер («Высота тона») - префикс «С». Переменные nomledl и nomled2 (строки 18 и 19) предназна- чены для хранения соответственно номера контактов первого и второго из управляемых в данный момент светодиодов.
286 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Переменная tval (строка 20) предназначена для хранения значения, переданного со слайдера, которое и используется для установки яркости светодиодов. Все три переменные (nomledl, nomled2 и tval) имеют тип int (целое число). Переменная flop — это флаг «ФЛАГ ОПЕРАЦИИ». Он имеет тип bool (логический). Флаг устанавливается в том случае, если Команда от слайдера найдена. То есть, префикс команды имеет значение «А», «В» или «С». В противном случае (при другом зна- чении префикса) флаг остается сброшенным. В строке 21 происходит инициализация переменной flop, и тут же ей присваивается значение false, что означает сброс флага операции. В строке 22 определяется и сбрасывается глобальный флаг ошибки FLerr. В строке 24 вызывается функция getCommandQ, которая выделяет из сообщений, полученных от ESP-модуля очередную команду и помещает ее текст в строковый объект OutputString. В строке 25 из полученной команды выделяется первый сим- вол (префикс) и помещается в переменную pref. Для выделения символа используется новая для нас функция charAtO- Метод воз- вращает один символ из содержимого строкового объекта. Номер символа задается в качестве параметра функции. В данном случае из объекта OutputString извлекается символ номер 0. В строках 26...28 находится каскад из функций ifO... else ifO, в котором последовательно сравнивается значение префикса из переменной pref с символами 'А', 'В' и 'С Сначала, в строке 26, проверяется, не равно ли значение переменной pref символу *А\ Если да, то выполняются три опера- тора присвоения, расположенные в фигурных скобках после опе- ратора ifO в той же строке 26. ПРИМЕЧАНИЕ. В языке СИ несколько операторов могут распола- гаться в одной строке. Главное, чтобы в конце каж- дого оператора стоял символ «точка с запятой». Операторы в строке 26 присваивают значения номеров кон- тактов, подключенных к двум светодиодам, которыми будет
Глава 4.Управление ESP-01 при помощи ARDUINO 287 управлять слайдер с префиксом «А». В нашем случае это кон- такты с номерами 3 и 5. Третий оператор присвоения в строке 26 устанавливает флаг операции (присваивает переменной flop значение true). Если префикс не равен 'А', то выполняются команды после оператора else в строке 27. То есть, следующий оператор сравне- ния iff), который проверяет, не равен ли префикс букве *В\ Если префикс окажется равным 'В', то выполняются три опера- тора присвоения, находящиеся в фигурных скобках в конце строки 27. Там переменным nomledl и nomled2 присваиваются номера контактов 6 и 9, и также устанавливается флаг операции flop. Если префикс не равен «В», то выполняется оператор сравне- ния в строке 28. Он проверяет, не равен ли префикс букве «С». В случае если префикс равен «С», выполняются свои операторы присвоения в конце строки 28. Они выбирают контакты 10 и 11 и тоже устанавливают флат flop. Последняя часть основного цикла программы (строки 29...34) выполняется только в том случае, если установлен флаг операции flop. Если в каскаде сравнений не будет обнаружен ни один из префиксов «А», «В» или «С», то флаг останется неустанов- ленным. Значение флага проверяет оператор if() в строке 29. Если флаг установлен, выполняются операторы в строках 30...33. В противном случае, программа не выполняет никаких действий с яркостью светодиодов, и цикл loopQ продолжается сначала. В строке 30 из текста команды выделяется значение входя- щей в нее величины, переданной слайдером. Выделенная вели- чина записывается в переменную tval. ПРИМЕЧАНИЕ. Способ выделения числового значения из текста команды нам уже знаком. Этим способом в предыду- щем программном примере мы выделяли из текста команды номер нажатой кнопки. А именно, при по- мощи функций substringO и tolntQ. Функция substringQ выделяет подстроку, начиная с символа номер 1 и до конца сообщения. То есть отбрасывается символ
288 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Листинг 4.4.1. Программа управления яркостью светодиодов /* Программный пример 4.4. Глава 4 Программа управления яркостью светодиодов 4 5 String InputString=""; // строка для хранения входящих данных 6 String OutputString=ltf?; // строка для хранения данных для вывода 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 номер 0. Далее, функция tolntO превращает символьное представ- ление числового значения в значение типа int (числовое значение). В строках 31 и 32 полученное в строке 30 значение выво- дится на оба заданных выше светодиода. Причем в строке 31 значение инвертируется. Инверсия аналогового значения произ- водится при помощи выражения 255-tval (значение переменной отнимается от максимально возможного значения). bool FLerr = false; // Глобальный флаг ошибки void setup() { SetupESPO; // Настройка Wi-Fi модуля delay(200); /у********************************************** void loop() { // Определение переменных char pref; // Префикс команды int noraledl; // Номер первого из пары светодиодов mt noraled2; // Номер второго из пары светодиодов int tval; // Текущее значение параметра в команде bool flop = false; // Флаг "команда получена" FLerr = false; // Сброс глобального флага ошибки getCommand(); // Получаем команду pref = OutputString.charAt(0); // Выделяем префикс if (pref='A') { nomledl=3; nomled2=5; flop=true; } else if(pref=='Bf) { noraledl=6; nomled2=9; flop=true; } else if(pref=lCi) { nomledl=10; nomled2=ll; flop=true; } if(flop) { tval = OutputString.substring(1).tolnt(); // Получаем значение параметра analogWrite(nomledl, 255-tval); // Выводим значение на первый светодиод пары analogWrite(nomled2, tval); // Выводим значение на второй светодиод пары PrintWIFI(); // Печать сообщения по Wi-Fi
Глава 4.Управление ESP-01 при помощи ARDUINO 289 Как мы знаем, значение переменной tval может изменяться от О до 255. А, значит, значение выражения будет меняться от 255 до 0. Инвертированное значение выводится на контакт, номер кото- рого хранится в переменной nomledl, а не инвертированное зна- чение на контакт, номер которого записан в nomled2. С каждого из этих контактов сформированный на нем ШИМ сигнал поступит на свой светодиод. В строке 33 на смартфон посылается ЭХО от только что выполненной команды. Текст принятой команды все еще хра- нится в строковом объекте OutputString. Поэтому для его отсылки достаточно вызвать функцию PrintWIFIQ. ЭХО появится в окне вывода информации приложения «WIFI Controller». Оно будет полезно при оценке правильности работы программы. Работа с программой регулировки яркости очень про- ста. После того, как программа откомпилирована и загружена в ARDUINO, она сама запускается. Затем вам необходимо запу- стить приложение «WIFI Controller» на смартфоне. В приложении проверяете и при необходимости устанавливаете соединение с УЧЕБНЫМ МОДУЛЕМ. При первом включении все светодиоды будут потушены. Передвигаете первый слайдер в любое выбранное вами положе- ние. Главное стронуть его с места. Два светодиода, связанных с этим слайдером, загорятся. Яркость свечения будет зависеть от положения слайдера. Если слайдер находится в центре, то свето- диоды будут светиться одинаково. При перемещении слайдера к одному из крайних положений, яркость первого из пары свето- диодов уменьшится, а второго — увеличится. Причем изменение яркости будет происходить в момент, когда вы закончили пере- мещение слайдера и убрали палец с экрана. ПРИМЕЧАНИЕ. Плавное изменение яркости одновременно с пере- мещением слайдера в логике работы приложения «WIFI Controller» не предусмотрено. Слайдер номер один («Скорость») изменяет яркость светоди- одов номер VD1 и VD2 (см. схему рис. 4.29). Слайдер номер два
290 Управление модулем ARDUINO по Wi-Fi с мобильных устройств («яркость») регулирует светодиоды VD3 и VD4. И, наконец, третий слайдер («Высота тона») регулирует VD5 и VD6. Практика использования приведенной выше схемы и про- граммы показала, что обычный стандартный ШИМ не очень под- ходит для регулировки яркости светодиодов. При управляющих значениях от 0 и примерно до 170 визуально яркость светодиода практически не изменяется. Он горит в полную яркость. И только после 170 начинается заметное на глаз изменение яркости. Он начинает тухнуть и потухает полностью при значениях 255. Этот недостаток можно скомпенсировать двумя способами. Первый способ — программный. Можно создать функцию, изменяющую диапазон значений управляющей величины. Такая функция и способ ее применения изображены в листинге 4.4.2. В этом листинге показано переделанное окончание программы, приведенной в листинге 4.4.1. В конце нового варианта программы мы добавили функцию пересчета диапазона rediapO. Функция возвращает значение типа int и имеет один входной параметр /va/, такого же типа (int). Через входной параметр функция подучает управляющее значение и возвращает его в пересчитанном диапазоне. Функция rediapQ занимает строки 37...39 в листинге 4.4.2. Она, как видите, предельно проста. По сути, тело функции состоит всего из одной строки (строка 38). Она представляет собой команду возврата break, которая возвращает значение выражения 170 + Ш/З. Листинг 4.4.2. Использование функции преобразования диапазона if (flop) { tval — OutputString.substring(1).tolnt(); analogWrite(noraledl, rediap(255-tval)); analogWrite(nomled2, rediap(tval)); PrintWIFIQ; // Получаем значение параметра // Вывод на первый светодиод пары // Вывод на второй светодиод пары // Печать сообщения по Wi-Fi /у********************************************** int rediap(int ival) { return 170 + ival/3; // Возврат пересчитанного значения
Глава 4.Управление ESP-01 при помощи ARDUINO 291 Полученное на входе функции значение переменной ival делится на 3, и к полученному таким образом результату при- бавляется 170. В результате пересчета при изменении входного параметра от 0 до 255, значение на выходе функции изменится от 170 до 255. В строках 30 и 31 листинга 4.4.2 мы видим, как нужно при- менить функцию пересчета диапазона при выводе управляющего значения на светодиоды. Второй способ изменения диапазона состоит в коррек- тировке настроек приложения «WIFI Controller» на смартфоне. Нужный диапазон можно просто установить в настройках каж- дого из трех слайдеров. Для изменения настроек слайдера нажмите «Edit» в конце полосы его прокрутки. Откроется окно настроек. Установите новое значение для начала диапазона, как это показано на рис. 4.30 и нажмите кнопку «Save» для того, чтобы записать параметры в память. ВНИМАНИЕ. Приведенное в этом примере изменение параме- тров слайдера применяется только для случая управления яркостью светодиода. При других видах нагрузки диапазон нужно подбирать индивидуаль- но. Если не задано особых требований, выбирайте полный диапазон (от 0 до 255). Вы всегда можете его изменить при необходимости. Рис. 4.30. Настройка диапазона в приложении «WIFI Controller»
292 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 4.11. Не забывайте согласовать нагрузку с выходами микроконтроллера Из данной главы вы узнали, как при помощи мобильного приложения «WiFi Controller» организовать управление микро- контроллерным комплектом, состоящим из модуля ARDUINO и подключенного к нему Wi-Fi модуля ESP-O1. Думаю, теперь вам будет не сложно самостоятельно разработать аналогичные про- граммы для управления другими внешними элементами — реле, электромагнитами, нагревательными элементами. СОВЕТ. Не забывайте только согласовать нагрузку с выхо- дами микроконтроллера. Если ток нагрузки не пре- вышает 40 мА (но не более 200 мА суммарно на все выходы), то можно подключать нагрузку непосред- ственно к контактам ARDUINO. Если ток нагрузки больше 40 мА или нагрузка требует напря- жения питания выше, чем 5 вольт, то нужно использовать элек- тронный ключ или реле. А в случае, когда нагрузка требует питания от источника пере- менного тока, нужно использовать схему на основе тиристоров или симисторов. Множество вариантов силовых ключей легко можно найти в Интернет. Например, схемы управления нагрузкой с питанием от сети переменного тока напряжением 220 В можно найти, перейдя по ссылке [16]. Для перехода по указанной в тексте ссылке [16] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода.
ГЛАВА 5 КОНСТРУКТОР ГРАФИЧЕСКИХ ИНТЕРФЕЙСОВ В данной главе мы узнаем об очень интересном и полезном интернет-проекте, который облегчит решение задач, опи- санных в предыдущей главе книги. Главное - позволит быстро и легко разрабатывать дизайн своих собственных приложе- ний для смартфона, при помощи которых вы будете управ- лять по Wi-Fi вашими микроконтроллерными устройствами на основе ARDUiNO.
294 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 5.1. Вместо приложения с универсальным интерфейсом - конструктор интерфейсов I Универсальные приложения типа «WIFI Controller» В предыдущей главе мы научились при помощи смартфона по каналу Wi-Fi управлять УЧЕБНЫМ МОДУЛЕМ, состоящим из модуля ARDUINO с подключенным к нему модулем ESP-O1. ПРИМЕЧАНИЕ. Вы, конечно, заметили, что самой уязвимой частью предложенных выше решений является мобильное приложение, при помощи которого формируются команды управления микропроцессорным блоком. Универсальные приложения типа «WIFI Controller» используют интерфейс, имеющий фиксированный набор элемен- тов управления. Это вполне приемлемо для тренировки и обуче- ния, но не очень удобно для решения практических задач, а, тем более, для создания коммерческих проектов. Фиксированный набор органов управления приводит к тому, что при разработке конкретного проекта: ♦ каких-то элементов (например, слайдеров) может не хватить; ♦ других элементов (например, кнопок) может оказаться слиш- ком много. Лишние кнопки будут только мешать, а при недостатке слай- деров придется придумывать нестандартные схемы их использо- вания. ПРИМЕЧАНИЕ. В идеале конечно для каждого конкретного проекта желательно разрабатывать специальное приложе- ние, имеющее специально созданный интерфейс.
Глава 5. Конструктор графических интерфейсов 295 Написание специальных приложений, реализующих нестан- дартные интерфейсы, тредбует изучения достаточно сложного раздела программирования - создание программ для мобильных устройств. Альтернативный вариант решения проблемы - | конструктор интерфейсов II Однако существует более простой, альтернативный вариант решения данной проблемы — использовать универсальные приложения. Такие приложения дают возможность разработ- чику не программным путем самостоятельно сконструировать собственный интерфейс, рассчитанный для решения своей кон- кретной задачи. Так называемый «Конструктор интерфейсов». Разработчику предлагается набор готовых элементов управле- ния и индикации, которые он может расставлять в пределах соз- даваемого интерфейса по своему усмотрению. Созданный таким образом проект интерфейса затем воспроизводится в специаль- ном мобильном приложении и используется в реальной работе. Существует несколько вариантов подобных программ, которые мы рассмотрим далее. Например, широко известна система Blynk. Редактор интерфейсов системы Blynk ПРИМЕЧАНИЕ. Девиз проекта Blynk - «Мы делаем Интернет ве- щей простым для вас!» Проект Blynk — это аппаратно-агностическая IoT платформа с мобильными приложениями, работающие в концепции «white- label», с индивидуальным облаком. Эта платформа предназначена для решения следующих задач: ♦ управления электронными устройствами;
296 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ решения аналитических задач; ♦ решения задач машинного обучения. ПРИМЕЧАНИЕ. White label (рус Белая этикетка) - это концепция, предусматривающая производство немарочных продуктов или услуг одной компанией и использо- вание таких продуктов или услуг другой компанией под своей маркой. Подробное описание системы Blynk имеется на ее официаль- ном сайте [19]. Для перехода по указанной в тексте ссылке [19] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Правда, сайт имеет только англоязычную версию. Система Blynk предоставляет разработчику довольно широкий спектр средств и возможностей. Редактор интерфейсов этой системы позволяет использовать достаточно солидный набор готовых эле- ментов управления и индикации. Однако мы рекомендуем читателю другую систему, разрабо- танную российскими программистами. I Редактор интерфейсов системы RemoteXY Российская система называется RemoteXY. Автор проекта Евгений Шемануев (e-mail:info@remotexy.com). Исчерпывающее описание проекта дал сам автор на своем сайте [10] (русскоязыч- ная версия [11]).
Глава 5. Конструктор графических интерфейсов 297 Для перехода по указанной в тексте ссылке [10] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Для перехода по указанной в тексте ссылке [11] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. ЧТО ЕСТЬ ЧТО. RemoteXY- это система разработки и использо- вания мобильных графических интерфейсов для управления контроллерами со смартфона или планшета. В состав системы входят: ♦ редактор мобильных графических интерфейсов для контрол- леров, размещенный на сайте remotexy.com; ♦ мобильное приложение RemoteXY, позволяющее подклю- чаться к контроллеру и отображать графические интерфейсы. Конфигурация графического интерфейса хранится в кон- троллере. При подключении нет никакого взаимодействия со сторонними серверами для того что бы загрузить графически интерфейс. Конфигурация графического интерфейса загружается в мобильное приложение из контроллера. С одного мобильного приложения вы можете управлять всеми своими устройствами. Количество устройств не ограничено. Поддерживаются следующие способы связи между кон- троллером и мобильным устройством: ♦ Bluetooth; ♦ Wi-Fi в режиме клиента и точки доступа; ♦ Ethernet no IP адресу или URL;
298 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ Интернет из любого места через облачный сервер; ♦ USB (доступно только для Android с поддержкой USB OTG). Генератор исходного кода интерфейса поддерживает сле- дующие контроллеры: ♦ ARDUINO UNO, ARDUINO MEGA, ARDUINO Leonardo, ARDUINO Pro Mini, ARDUINO Nano, ARDUINO MICRO; ♦ WeMos Dl, WeMos Dl R2, WeMos Dl mini; ♦ NodeMCUV2,NodeMCUV3; ♦ TheAirBoard; ♦ ChipKIT UNO32, ChipKIT uC32, ChipKIT Max32. Поддерживаются следующие модули связи: ♦ Bluetooth НС-05, НС-06 и совместимые; ♦ Wi-Fi модули на основе ESP8266; ♦ Ethernet Shield W5100; Поддерживаемые IDE: ♦ ARDUINO IDE; ♦ FLProglDE; ♦ MPIDE. Поддерживаемые мобильные операционные системы: Android и iOS. 5.2. Конструктор интерфейсов RemoteXY I Приглашаем на сайт remotexy.com RemoteXY — это ON-Line проект, расположенный в Интернете по адресу remotexy.com [10]. Сайт имеет как русскоязычную [10], так и англоязычную [11] версии. Работать с сайтом можно как с мобильного устройства, так и с компьютера. Но удобнее все же с компьютера. При входе на сайт открывается англоязычная версия. Для перехода на русскую, щелкните мышкой изображение англий- ского флага в правом верхнем углу сайта и в выпадающем меню
Глава 5. Конструктор графических интерфейсов 299 выберите язык «русский». Или сразу зайдите по адресу remotexy. com/rus [11]. На сайте имеется достаточно качественное и подробное опи- сание того, как с ним работать. Тут же можно скачать все необхо- димые для работы программы и вспомогательные файлы. Основа всего проекта — это ON-Line редактор [12], при помощи которого прямо на сайте вы можете создать свой соб- ственный интерфейс, который потом автоматически будет открываться в специальном мобильном приложении на вашем смартфоне или планшете. Для перехода по указанной в тексте ссылке [12] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Как скачать и установить приложение, описано тут же в спе- циальном разделе сайта (раздел «Приложение»). В этом разделе также имеются QR-коды, которые можно просканировать при помощи вашего смартфона и он автоматически откроет страницу установки приложения на Google Play или Арр Store. Далее, по ходу изложения материала в этой главе вы увидите те же QR-коды и сможете установить приложение прямо из книги. После того, как вы создадите свой интерфейс в окне редак- тора интерфейсов, вы должны запустить в том же редакторе процедуру генерации заготовки программы для микроконтрол- лерного модуля. ПРИМЕЧАНИЕ. ^ Г В нашем случае это будет УЧЕБНЫЙ МОДУЛЬ. Образ созданного вами интерфейса закладывается в эту заго- товку программы. Туда же закладываются процедуры, которые:
300 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ автоматически передают этот образ в приложение на смартфон; ♦ обеспечивают обмен информацией между смартфоном и ми- кроконтроллерным модулем. Вам остается лишь дополнить автоматически сформирован- ную заготовку программы таким образом, чтобы она могла: ♦ управлять УЧЕБНЫМ МОДУЛЕМ, используя информацию, по- лученную от смартфона; ♦ отправлять на смартфон информацию, предназначенную для отображения и индикации, используя уже готовый механизм обмена данными. ПРИМЕЧАНИЕ. На сайте проекта вы найдете также подробные описания с иллюстрациями, схемами и таблицами в которых внятно, доходчиво, но кратко расска- зывается обо всех аспектах работы с проектом RemoteXY. I Редактор интерфейсов: начинаем освоение Перейти к редактору интерфейсов можно по ссылке «Редактор» на сайте проекта или по ссылке [12]. Редактор интер- фейсов (рис. 5.1) представляет собой страницу на сайте проекта, в центре которой расположено схематичное изображение смарт- фона. На экран этого виртуального «смартфона» мы должны при помощи мышки перетащить и разместить там элементы управ- ления и индикации. Набор элементов расположен в колонке «Элементы» в левой части окна редактора. Все элементы объединены в три группы: ♦ «Управление»; ♦ «Индикация»; ♦ «Оформление». Содержимое каждой группы открывается щелчком мышки по ее заголовку. Каждый элемент можно установить на виртуаль- ный «экран смартфона» сколько угодно раз. Установленный на «экран смартфона» элемент можно выделить, щелкнув по нему
Глава 5. Конструктор графических интерфейсов 301 Рис. 5.1. Окно ON-Line редактора интерфейсов проекта RemoteXY мышью, а затем перемещать его той же мышкой в пределах вир- туального «смартфона» и менять его размеры. Для изменения размеров элемента необходимо захватить мышкой один из ключевых узлов обрамления, возникающего при выделении элемента и «перетащить» узел. ПРИМЕЧАНИЕ. При этом можно отдельно изменить как высоту, так и ширину любого элемента. В правой части экрана находится колонка «Свойства». В ней также имеется три группы: ♦ «Конфигурация»; ♦ «Подключение модуля»; ♦ «Экран».
302 Управление модулем ARDUINO rto Wi-Fi с мобильных устройств Если раскрыть группу «Конфигурация», вы увидите там меню выбора общей конфигурации микроконтроллерного устройства, которым мы будем управлять при помощи создавае- мого в редакторе интерфейса. Мы можем выбрать: ♦ вид канала связи (Wi-Fi, Ethernet или Bluetooth); ♦ основной микроконтроллерный модуль (в нашем случае это будет «ARDUINO UNO»); ♦ модуль связи (у нас это «ESP-01»); ♦ программную среду, в которой мы собираемся писать управ- ляющую программу для основного микроконтроллерного модуля (в нашем случае это среда разработки IDE ARDUINO). I Особенности выбора канала связи При щелчке мышью по любому пункту раздела «Конфигурация» в колонке «Настройка» (рис. 5.1) открывается окно помощника по выбору конфигурации (рис. 5.2). Помощник tarn Рис. 5.2. Помощник выбора конфигурации системы
Глава 5. Конструктор графических интерфейсов 303 дает возможность в экранной форме выбирать нужную нам кон- фигурацию, автоматически отслеживая правильность выбора. В верхней части окна помощника мы видим наглядные гра- фические символы основных составляющих конфигурации («Соединение», «Устройство», «Модуль», «Среда Разработки»). На рис. 5.2 пункт «Соединение» является выбранным (картинка обведена красной каемкой). ПРИМЕЧАНИЕ. Какой из основных пунктов помощника при входе в него окажется выбранным, зависит от того, через какой пункт меню вы в него вошли. Если для входа в Помощник в главном окне редактора вы щел- кнули по пункту «Соединение», то и в Помощнике будет выде- ленным пункт «Соединение». Если выбран пункт «Соединение», в центральном поле помощника мы видим все возможные варианты соединений. Окно имеет два раздела. В разделе «Совместимые соединения» предлагается выбрать один из трех пунктов: ♦ «Ethernet ТСРДР»; ♦ «Wi-Fi Access Point»; ♦ «Cloud server». В разделе «Доступные соединения» имеется еще один пункт для выбора — «Bluetooth». Рассмотрим все эти пункты подробнее в следующем разделе. Совместимые I и доступные соединения I Wi-Fi Access Point Если вы желаете что бы ваш ESP-модуль работал, как авто- номная точка доступа, выбирайте «Wi-Fi Access Point». Ethernet TCP/IP Если вы выберите «Ethernet TCP/IP», то это значит:
304 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ либо ваш ESP-модуль будет работать в режиме клиента и под- ключаться к смартфону через домашнюю (корпоративную) Wi-Fi сеть; ♦ либо он будет использовать адаптер Ethernet и подключаться к той же домашней (корпоративной) сети при помощи витой пары. Смартфон при этом также будет подключаться по Wi-Fi к домашней сети и уже через нее подключаться к микроконтрол- леру. В последнем случае ESP-модуль не используется. Cloud server В режиме «Cloud server» ваш ESP-модуль будет подклю- чаться по Wi-Fi к домашней (корпоративной) сети, а через нее к Интернет. Посредством Интернет он подключится к специаль- ному облачному серверу проекта, где вы должны заранее зареги- стрироваться и создать «Токен». ЧТО ЕСТЬ ЧТО. Токен - это специальная регистрационная запись, через которую осуществляется двухсторонняя связь между микроконтроллером и смартфоном. Для каждого вашего проекта вы должны создать свой отдель- ный «Токен». Облачный сервер позволяет легко создать индиви- дуальный канал связи через Интернет без получения фиксиро- ванного IP-адреса и сложных настроек маршрутизации. Bluetooth Ну, а режим «Bluetooth» предполагает, что вы вместо ESP- модуля будете использовать модуль Блютуз (Bluetooth). Полезные возможности помощника Кроме типа соединения, помощник позволяет выбирать: ♦ основной модуль; ♦ модуль связи;
Глава 5. Конструктор графических интерфейсов 305 ♦ программную среду, в которой будет разрабатываться управ- ляющая программа. ПРИМЕЧАНИЕ. При выборе каждого из этих пунктов в централь- ном окне помощника вы также увидите варианты для выбора. Как уже говорилось, помощник следит за корректностью выбора конфигурации. ПРИМЕР. Если вы выбрали в качестве модуля связи модуль ESP-01, то вы не сможете выбрать в качестве ка- нала связи Bluetooth. На рис. 5.1 показано, как выглядит меню «Конфигурация» для нашего случая. Мы будем управлять по Wi-Fi нашим УЧЕБНЫМ МОДУЛЕМ. То есть, модулем, состоящим из ARDUINO UNO и модуля связи — ESP-01. А соединяться наш УЧЕБНЫЙ МОДУЛЬ со смартфоном будет через домашнюю (корпоративную) Wi-Fi сеть. В качестве среды разработки мы будем использовать среду IDE ARDUINO. ПРИМЕЧАНИЕ. Такую настройку мы будем использовать далее в этой главе во всех программных примерах. Подключение | модуля II Но вернемся к меню «Свойства» в основном окне редактора. Выше мы рассматривали первую группу настроек, которая назы- вается «Конфигурация». Следующая группа настроек называется
306 Управление модулем ARDUINO no Wi-Fi с мобильных устройств «Подключение модуля». На рис. 5.3 показано меню «Настройки», в котором: ♦ развернута группа «Подключение модуля»; ♦ остальные группы настроек за- крыты. Первые два параметра в этой группе настроек отвечают за выбор способа под- ключения модуля связи (ESP-01) к основ- ному управляющему модулю (ARDUINO). Проект RemoteXY предусматривает два способа связи этих модулей. Первый вариант нам хорошо зна- ком. Для связи используется аппарат- ный последовательный канал ARDUINO (выводы 0 и 1), который подключается к стандартному последовательному каналу модуля ESP-01 по схеме, приве- денной на рис. 4.13. Второй вариант — использование программного эмулятора последова- тельного канала. Такой канал форми- руется программным путем на двух любых цифровых контактах модуля ARDUINO. Чаще всего используют цифровые контакты 2 и 3. Это позволяет освободить аппаратный последователь- ный канал для других целей. Например, для вывода отладочной информации. Рис. 5.3. Настройка параметров «Подключение модуля» в меню «Свойства» ПРИМЕЧАНИЕ. При таком способе подключения проводники, кото- рые на схеме (рис. 4.13) подключались к контактам 0 и 1 ARDUINO, теперь будут подключаться к кон- тактам 2 и 3, соответственно. Такой способ подключения имеет дополнительное преиму- щество — при загрузке программы в ARDUINO уже не нужно будет каждый раз отключать от него, а по окончанию процесса загрузки снова подключать модуль ESP-01.
Глава 5. Конструктор графических интерфейсов 307 Если вы захотите использовать режим программной эмуля- ции последовательного канала, в выпадающем списке параме- тра «Интерфейс подключения» выберите пункт «Software Serial» (Программный последовательный канал). При этом поле «Порт Serial» разделится на две части: ♦ «Контакт RX»; ♦ «Контакт ТХ». В них вы можете выбрать удобные для вас контакты. ПРИМЕЧАНИЕ. Но мы не будем использовать этот режим. Поэтому для параметра «Интерфейс подключения» мы оставим первоначальное значение - «Hardware Serial» (Аппаратный последовательный канал). В этом режиме в поле «Порт Serial» останется для выбора только одно значение: «Serial pin 0 (RX) and 1 (ТХ)». Для других типов модуля ARDUINO (например, «ARDUINO Mega») в этом поле может быть несколько вариантов значений. В поле «Скорость обмена» вы можете выбрать нужную ско- рость передачи информации последовательного порта. Если вы выбрали аппаратный порт (Hardware Serial), то скорость должна соответствовать скорости последовательного канала вашего модуля ESP-01. НАПОМИНАЕМ. В последнее время эти модули выпускаются с пред- установленной скоростью последовательного пор- та равной 115200 бод. В модулях старого выпуска скорость была равна 9600 бод. Но устаревшие мо- дули встречаются очень редко. Если вы выбрали программное формирование канала (Software Serial), то скорость такого канала будет гораздо меньше. По умолчанию редактор предлагает скорость 2400 бод. Вы можете выбрать немного большую скорость (максимум 19200 бод). В этом
308 Управление модулем ARDUINO по Wi-Fi с мобильных устройств случае вам придется вручную, при помощи АТ-команд изменить скорость ESP-модуля, сделав ее равной скорости программно- эмулированного последовательного канала. Но мы не будем рабо- тать в таком режиме. Следующие три поля под общим названием «Подключение к Wi-Fi» позволяют ввести параметры подключения: ♦ имя Wi-Fi сети (SSID); ♦ пароль для входа в сеть; ♦ номер порта ТСРДР сервера. ПРИМЕЧАНИЕ. По умолчанию выбран порт 6377. Оставим этот выбор. I Настройка экрана Последняя группа в меню «Свойства» называется «Экран». В этой группе можно выбрать: ♦ рабочую ориентацию смартфона (вертикальную, горизонтальную или оба варианта); ♦ цвет фона; ♦ пароль доступа (рис. 5.4). Рис. 5.4. Настройка внешнего вида ПРИМЕЧАНИЕ. Если вы выбираете пункт «Оба варианта», то соз- данный вами пульт получит возможность менять ориентацию в зависимости от положения смарт- фона в пространстве.
Глава 5. Конструктор графических интерфейсов 309 Пароль позволит ограничить доступ к вашему интерфейсу и защитить ваш учебный модуль от подключения к нему посторон- них пользователей, которые так же, как вы, могут скачать при- ложение RemoteXY, установить его на свой смартфон и подклю- читься к вашему устройству. Пароль не даст им это сделать. ВНИМАНИЕ. f ■ ч ^ Если пароль не указан, доступ к УЧЕБНОМУ МОДУЛЮ будет свободный. СОВЕТ. Рекомендую сменить цвет фона интерфейса на менее ядовитый, а также выбрать вертикаль- ную ориентацию смартфона, как это показано на рис. 5.4. Так будет удобнее повторять все предло- женные далее программные примеры. Поговорим II о скрытой группе «Элемент» II Кроме трех описанных выше групп параметров, в меню «Настройки» есть еще одна скрытая группа «Элемент». Эта группа свойств появляется, если вы выделите какой-либо элемент на виртуальном «Экране смартфона». В группе «Элемент» размещаются свойства выделенного в данный момент элемента. Каждый элемент (если это не элемент оформления) имеет свое формальное имя. ПРИМЕЧАНИЕ. Имя дается автоматически, но вы можете его из- менить. При этом имя должно соответствовать правилам для имен переменных языка СИ.
310 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Это имя будет использоваться затем в программе для ARDUINO в качестве имени переменной, через которую про- грамма в ARDUINO будет взаимодействовать с этим элементом управления. В автоматически созданной в редакторе интерфей- сов программе уже будет заложена процедура обмена данными между приложением, на котором отображается созданный вами интерфейс и модулем ARDUINO. I Обмен данными между смартфоном и учебным модулем Обмен данными между смартфоном и учебным модулем про- исходит следующим образом. Для элементов управления При воздействии на элемент управления на экране смартфона (нажатии кнопки, перемещении движка переключателя, измене- нии положения слайдера) результат воздействия запоминается и после сеанса связи между смартфоном и УЧЕБНЫМ МОДУЛЕМ новое значение присваивается соответствующей переменной в программе на ARDUINO. Далее программист использует значение переменной для программирования реакции на изменение значения данной переменной, а, значит, и на изменение состояния этого органа управления. Для элементов индикации В процессе работы программы в УЧЕБНОМ МОДУЛЕ, она изменяет значения переменных, связанных с элементами инди- кации. Например: ♦ устанавливает интенсивность «свечения» светодиода или уровень, для отображения линейным индикатором; ♦ присваивает текстовое значение для текстового индикатора. После сеанса связи модуля со смартфоном значения всех переменных передаются на смартфон, и соответствующие инди- каторы отображают переданные значения на экране смартфона. Сеансы связи производятся непрерывно с периодом при- мерно 1...3 секунды. Поэтому реакция на изменения происходит довольно быстро.
Глава 5. Конструктор графических интерфейсов 311 ВИРТУАЛЬНЫЙ ДИСК. На виртуальном диске имеются несколько видео, на которых вы можете наглядно увидеть как это ра- ботает, и оценить скорость реакции. 5.3. Подготовка модуля ESP-O1 для проекта RemoteXY Разбираемся | с версиями прошивки модуля II Опыт работы с проектом RemoteXY показал, что есть несколько моментов, связанных с использованием и настройкой модуля ESP-O1. Их нужно учитывать для того, чтобы избежать проблем и ошибок. Некоторые из требований подробно описаны на сайте проекта (в разделе «Документация», подразделе «Модуль ESP8266WiFi»). В частности на сайте рекомендуется использовать самую последнюю версию прошивки ESP модуля. Там же дается ссылка на страницу сайта производителя, откуда можно скачать все последние версии. N ПРИМЕЧАНИЕ. [ Практика показала, что последняя версия прошив- ки к вашему модулю может не подойти. Проблемы могут возникнуть в небольших городах. При заказе в Интернете никогда не знаешь, что тебе придет. А в магазинах ассортимент обычно очень скудный. Например, в Симферополе удалось купить всего один экзем- пляр модуля ESP-O1 на радиорынке, который там оказался послед-
312 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ним. Еще один модуль тоже последний удалось купить в магазине радиотоваров. Оба модуля оказались довольно устаревших моделей, с объ- емом Flash памяти 8 Мбит. А последняя прошивка рассчитана на модули с минимальным объемом памяти в 16 Мбит. Кроме самой последней версии, на сайте производителя доступными к скачиванию оказалось еще две более старые версии. Но одна из них не заработала на имеющихся в наличии модулях. К счастью одна из доступных версий на сайте производителя заработала. Кроме того, на сайте проекта RemoteXY доступна для скачивания рекомендованная сайтом, проверенная версия про- шивки. По большому счету, родная прошивка, залитая при производ- стве приобретенного вами модуля, совсем не обязательно ока- жется непригодной. ВНИМАНИЕ. На сайте проекта есть лишь одно требование к прошивке ESP-модуля - версия интерпретатора АТ-команд, используемая в прошивке должна быть не ниже vOAO. Правда, у тех двух экземпляров модуля, которые оказались в моем распоряжении, версия интерпретатора АТ-команд обозна- чена как 1.3.0.0. Не совсем понятно, это настолько более новая версия или просто другая нумерация? В общем, оказалось, что проверить, подойдет ли та или иная вер- сия, можно только опытным путем. Хорошие результаты удалось получить с той версией прошивки, которая размещена на сайте [10]. ВИРТУАЛЬНЫЙ ДИСК. Копия этой же версии размещена также на вирту- альном диске книги.
Глава 5. Конструктор графических интерфейсов 313 СОВЕТ. Рекомендуем читателю не спешить обновлять вер- сию прошивки ESP-модуля на новую. Вы всегда успее- те обновить ее, если будут проблемы. Используйте сначала заводскую прошивку. Если возникла необходимость перепрошить модуль, напо- минаю, что подробное описание процесса прошивки находится в конце второй главы этой книги, который называется «Обновление и восстановление прошивки ESP-модуля». Выполняем две очень важные манипуляции II Вне зависимости от того, оставили ли вы старую прошивку или прошили новую, с модулем нужно выполнить две очень важ- ные манипуляции. Они выполняются при помощи АТ-команд. Естественно, сначала модуль должен быть подключен к компью- теру при помощи адаптера. Перед использованием модуля полезно произвести его пол- ную перезагрузку. Для этого на него необходимо подать команду AT+RESTORE. Вторая важная операция, которую необходимо произвести с модулем, — отключить режим автоподключения модуля к Wi-Fi сети. ПРИМЕЧАНИЕ. Режим авто-подключения в модуле включен по умолчанию. Его мы использовали при составлении программ в предыдущей главе. Все программы, приведенные в главе 4, рассчитаны на то, что часть настроек ESP-модуля, связанных с подключением модуля к Wi-Fi сети, предварительно выполнены вручную при помощи АТ-команд. Эти настройки благодаря режиму автоподключения были запомнены в памяти модуля. Поэтому при включении пита-
314 Управление модулем ARDUINO no Wi-Fi с мобильных устройств ния или после аппаратного сброса ESP-модуля все сохраненные в памяти настройки восстанавливаются автоматически. ВНИМАНИЕ. Программы, которые автоматически создаются в проекте RemoteXY, рассчитаны на то, что авто- подключение будет выключено. Весь набор АТ-команд, начиная с команды AT+RST, про- грамма, автоматически созданная в проекте, выдает на модуль в начале своей работы. Если не отключить режим автоподклю- чения, то команды подаваемые модулем ARDUINO в процессе начального запуска, будут конфликтовать с настройками, сохра- ненными в памяти ESP-модуля. Управление режимом автопод- ключения производится при помощи следующих АТ-команд: ♦ AT+CWAUTOCONN=0 Отключить авто-подключение к точке доступа; ♦ AT+CWAUTOCONN=1 Включить авто-подключение к точке доступа. ВНИМАНИЕ. Строго соблюдайте последовательность подачи команд. Сначала подайте команду полного сброса AT+RESTORE, а затем команду отключения режима автоподключения AT+CWAUTOCONN=0. СОВЕТ. Если вы решите вернуться к программам из главы 4, не забудьте включить режим автоподключения.
Глава 5. Конструктор графических интерфейсов 315 5.4. Простой проект - тест элементов управления ВИРТУАЛЬНЫЙ ДИСК. Пример 5.1 (папка на ВИРТУАЛЬНОМ диске PprJ_01-ish) Начало работы | в графическом редакторе II Перед тем, как начинать процесс создания проекта при помощи графического редактора на сайте remotexy.com [11], рекомендуем на нем зарегистрироваться. Для перехода по указанной в тексте ссылке [11] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. ПРИМЕЧАНИЕ. Вообще-то, пользоваться редактором в полном объеме можно и без регистрации. Не регистриру- ясь, можно выполнять все этапы создания проекта, вплоть до получения исходного кода программы. Но только зарегистрированный пользователь может: сохранить свои проекты в своем аккаунте на сайте; в дальнейшем вернуться к любому из сохраненных проектов; отредактировать проект при необходимости; снова записать уже отредактированную версию; создавать токены в облачном сервере.
316 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Процедура регистрации очень проста и абсолютно бес- платна. Для регистрации нужно выбрать логин и пароль, а также указать адрес электронной почты, на который придет код под- тверждения. Итак, зарегистрируйтесь на сайте, войдите в свой аккаунт, выберите русский язык, как это было описано выше, а затем откройте раздел «редактор». ПРИМЕЧАНИЕ. При первом входе в редактор там уже будет соз- дан простейший проект - одна большая круглая кнопка посреди экрана. Но мы создадим свой проект. Для создания нового про- екта щелкните мышкой по кнопке Q в верхней правой части окна редактора. На экране появится пустой проект (рис. 5.5). Настройте свойства проекта так, как это описано в разделе 5.1. После этого приступайте к расстановке элементов на «экране смартфона». Рис. 5.5. Создание нового проекта
Глава 5. Конструктор графических интерфейсов 317 Постановка | задачи II В данном примере мы создадим интерфейс, который помо- жет нам проиллюстрировать работу элементов управления. Для этого установим на экран четыре элемента управления (как пока- зано на рис. 5.2): ♦ «Выключатель»; ♦ «Кнопка»; ♦ «Переключатель»; ♦ «Слайдер». Затем автоматически сформируем исходный код про- граммы. В следующем разделе данной главы мы доработаем этот исходный код, превратив его в готовую программу. В результате должна получиться программа, при помощи которой мы сможем на практике узнать, как заставить работать выбранные нами эле- менты управления. Схема Чтобы не усложнять задачу, управлять мы будем светодио- дами. И тут нам очень подойдет схема из программного при- мера 4.3 «Программа управления светодиодами» (раздел 4.9). Эта схема приведена на рис. 4.25. Алгоритм II Алгоритм управления у нас будет очень простой. Элемент «ВЫКЛЮЧАТЕЛЬ» в схеме будет управлять светоди- одом VD1, подключенным к контакту 2 модуля ARDUINO. Когда «Выключатель» включен, светодиод должен гореть, когда выклю- чен — должен потухнуть. Элемент «КНОПКА» будет управлять светодиодом VD2 (кон- такт 3). При нажатии кнопки светодиод должен загореться, при отпускании потухнуть.
318 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Следующими пятью светодиодами мы будем управлять при помощи пятипозиционного «ПЕРЕКЛЮЧАТЕЛЯ». Когда пере- ключатель установлен в позицию «А» (в самом верху), должен гореть светодиод VD3 (контакт 4). Если переместить движок переключателя на позицию ниже (в положение «В»), то свето- диод VD3 должен потухнуть, и загореться VD4 (контакт 5). В каждом следующем положении должны загораться светоди- оды VD5, VD6 и VD7 соответственно (контакты 6,7,8). ПРИМЕЧАНИЕ. В каждом положении переключателя горит один из пяти светодиодов. Последним светодиодом (VD8) мы будем управлять при помощи слайдера, используя команду аналогового вывода. Это позволит плавно изменять яркость свечения светодиода. Светодиод VD8 подключен к контакту 9, а он, как раз, является одним из тех контактов, который может работать в режиме анало- гового выхода (может формировать сигнал с широтно-импульс- ной модуляцией). II Создание образа 1 панели управления Для установки управляющего элемента на панель управления его изображение нужно просто перетянуть мышкой на изображе- ние этой панели. При этом перетянется копия элемента, а ориги- нал останется на месте. Затем любой элемент на виртуальном «экране смартфона» можно выделить, щелкнув по нему мышкой. Выделенный эле- мент получит ряд дополнительных атрибутов. На рис. 5.6 показаны все изменения в окне редактора интер- фейсов для случая, когда выделен элемент «ВЫКЛЮЧАТЕЛЬ». Выделенный элемент окружен по периметру рамкой с ква- дратиками по углам, а над элементом появились его имя и номер контакта, которым управляет в данном случае переключатель.
Глава 5. Конструктор графических интерфейсов 319 Имя присваивается автоматически в момент создания (пере- таскивания) элемента. ПРИМЕЧАНИЕ. Такой параметр, как номер контакта, имеется лишь у элементов «ВЫКЛЮЧАТЕЛЬ» и «КНОПКА». Этот номер тоже присваивается автоматически. Вы можете при желании изменить этот номер или вообще поставить вместо него прочерк. О номере контакта мы расскажем позже. А пока вернемся к выделенному элементу. Ухватившись мышкой за квадра- тики в обрамлении выделенного элемента, можно изменять его размеры, как по ширине, так и по высоте. Так же, при помощи мышки можно перемещать элемент по экрану. Если по элементу щелкнуть правой кнопкой мыши то откро- ется контекстное меню, с командами редактирования. При помощи этого меню можно: ♦ выделенный элемент; ♦ скопировать; ♦ вырезать. ♦ затем вставить элемент в другом месте, а также удалить. Кроме того, в контекстном меню имеются команды измене- ния порядка следования элементов. Если надвигать один эле- мент на другой, то изображение одного перекроет изображение другого. То есть один элемент как бы «выше» другого. Порядок следования элементов определяет расположение элементов друг над другом. Первоначально этот порядок соответствует порядку их создания. Сверху будет тот элемент, который был создан последним. При помощи меню изменения порядка следова- ния элементов вы можете переместить элемент: ♦ на самый верх; ♦ на самый низ; ♦ на одну позицию выше; ♦ на одну позицию ниже. Каждый из элементов находится на своем отдельном уровне. После того как все элементы расставлены, нужно настроить свойства каждого элемента. На рис. 5.6 показано, как выбрать
320 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 5.6. Редактирование свойств элемента настройки элемента «Выключатель». Этот элемент выделен. Поэтому в колонке «Свойства» появился раздел «Элемент». ПРИМЕЧАНИЕ. Здесь мы можем увидеть и при желании изменить все свойства выделенного элемента. Каждый элемент имеет свой собственный набор свойств. Элемент «ВЫКЛЮЧАТЕЛЬ» имеет следующие доступные к изме- нению свойства (рис. 5.6): ♦ Два поля, определяющие раскраску элемента. Поле «Цвет» определяет цвет самого элемента (в нашем случае цвет движ- ка выключателя). Поле «Цвет фона» определяет цвет остав- шейся части выключателя.
Глава 5. Конструктор графических интерфейсов 321 Выбранный цвет вы можете видеть в специальном прямо- угольнике — индикаторе цвета. Для изменения цвета нужно щелкнуть мышкой по ссылке «Изменить» справа от соответ- ствующего индикатора цвета и выбрать из палитры желае- мый цвет. ♦ Поле «Имя переменной». Тут указано имя переменной, по- средством которой состояние выключателя передается в про- грамму на ARDUINO. Если выключатель включен, значение переменной равно единице, а если выключен — нулю. Имен- но это имя при выделении элемента появляется над его изо- бражением в окне редактора. ♦ Два поля надписей на элементе. Поле «Надпись включе- ния» определяет надпись на движке выключателя в момент, когда он включен. Поле «Надпись выключения» определя- ет надпись на движке выключателя, когда он выключен. По умолчанию используются надписи «ON» и «OFF». Вы можете заменить их, например, на «Вкл.» и «Выкл.». ♦ Поле выбора цвета текста имеется под каждым из полей текста надписей. Вы можете изменить цвет отдельно для над- писи включения и надписи выключения. ♦ Поле «Отрисовка» определяет форму выключателя. В вы- падающем списке вы можете выбрать прямоугольную либо овальную форму. ♦ Поле «Привязать к выводу»— это вспомогательное поле, введенное для дополнительного удобства программиста. ПРИМЕР. Пусть ваша кнопка предназначена для элементар- ной операции. Например, при нажатии включить светодиод (или другую нагрузку), подключенный к какому-нибудь определенному контакту модуля ARDUINO. Еще на этапе графического редакто- ра вы можете просто указать номер контакта в этом поле. В этом случае при автоматической ге- нерации программы в нее будет включена готовая операция по управлению выбранным вами выходом при помощи переключателя.
322 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Задача эта простая и прописать нужные команды не так трудно. Данное поле просто немного упрощает работу програм- миста. В момент создания самого первого из элементов «Переключатель» или «Кнопка», он автоматически привязыва- ется к контакту 13. К этому контакту уже подключен стацио- нарно установленный на плате ARDUINO светодиод. ПРИМЕЧАНИЕ. В остальных элементах типа "«Выключатель» или «Кнопка» в поле «Привязать к выводу» автомати- чески ставится прочерк. Прочерк означает, что при генерации программы не нужно включать в нее команды по управлению каким-либо выходом. Рис. 5.7. Свойства элемента «Кнопка» Но вы можете самостоятельно указать там номер контакта. В нашем случае, согласно постав- ленной выше задаче, выключатель будет управлять контактом 2. Элемент «КНОПКА». На рис. 5.7 показано окно параметров следую- щего выбранного нами элемента — элемента «Кнопка». У «Кнопки» набор параметров немного меньше чем у «Выключателя». Имеется всего одно поле определяющее цвет кнопки. Надпись на кнопке тоже всего одна. Соответственно имеется лишь одно поле выбора цвета над- писи. Зато поле «Отрисовка» имеет три возможных значения: ♦ «Круглая»; ♦ «Прямоугольная»; ♦ «Овальная». Добавлено новое поле — «Стиль окантовки». Параметр «Стиль окан- товки» может принимать значения:
Глава 5. Конструктор графических интерфейсов 323 ♦ «Темная»; ♦ «Светлая»; ♦ «Нет окантовки». Присутствует также поле «Привязать к выводу». Кнопку мы привяжем к выводу 3. Элемент «Переключатель». На рис. 5.8 показано окно свойств эле- мента «Переключатель». Этот эле- мент, как и элемент «Выключатель», имеет два поля выбора цвета: ♦ «Цвет»; ♦ «Цвет фона». Кроме того, имеет неизменное поле «Имя переменной» и еще два дополнительных поля: ♦ «Количество положений»; ♦ «Ориентация». Л тл „ w Рис. 5.8. Свойства элемента «Переключатель» ПРИМЕЧАНИЕ. Количество положений по умолчанию равно трем. Мы увеличим значение этого параметра до пяти. Диапазон выбора количества положений от 2 до 10. Значение параметра «Ориентация» может быть: ♦ либо «Горизонтальное»; ♦ либо «вертикальное» (по умолчанию, так мы его и оставим) Окно параметров элемента «Слайдер» приведено на рис. 5.9. Тут мы видим уже знакомые нам параметры: ♦ «Цвет» и «Цвет фона»; ♦ «Имя переменной»; ♦ «Ориентация»; ♦ «Позиция». Новый для нас параметр «Позиция» определяет начальное положение движка слайдера. Параметр может принимать значения: ♦ «Снизу» (по умолчанию); ♦ «Посредине»; ♦ «Сверху».
324 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Leoucmea элемента «Слайдер» СОВЕТ. Флажок «Автоцентрирование» позволяет включить еще одно полезное свойство параметра «Положение». Если установить этот флажок, то положение движка слай- дера в вашем смартфоне запоми- нается. При следующем включении движок окажется в той же позиции, что и перед выходом из приложения. ПРИМЕЧАНИЕ. Мы оставили значе- ние этого параме- тра по умолчанию («Снизу»), чтобы сра- зу после включения светодиод оказался потушенным. Когда все параметры для всех элементов настрое- ны, полезно проект записать. Проект записывается в базу данных сайта, по- этому вы всегда можете вернуться к вашему про- екту, войдя на сайт под своим именем с любого компьютера. Для записи проекта нужно щелкнуть мышью по кнопке [3] Вообще-то текущий проект и так сохраняется в редакторе. Когда вы повторно входите на сайт и открываете редактор, в нем вы увидите последний свой проект. Но этот эффект организован при помощи механизма Cookie (то есть, информация хранится в вашем браузере). Такая инфор- мация может быть легко потеряна.
Глава 5. Конструктор графических интерфейсов 325 Рис. 5.10. Список проектов пользователя RemoteXY СОВЕТ. Поэтому рекомендую вам всегда сохранять проект перед тем, как вы закончите работу с сайтом. После нажатия кнопки |!у система запросит имя сохраняе- мого проекта. Проект можно назвать как по-русски, так и лати- ницей. Для того чтобы просмотреть список записанных проектов, щелкните иконку Q- Откроется список проектов (рис. 5.10). Для каждого проекта список содержит: ♦ его имя; ♦ дату создания; ♦ дату последнего изменения. В этой же таблице в отдельной колонке для каждого проекта есть специальные гиперссылки, при помощи которых, можно открыть нужный проект или удалить ненужный. Кроме того, в последней колонке таблицы напротив каждого проекта расположена гиперссылка «Поделиться». При нажатии на эту гиперссылку соответствующий проект становится доступ- ным всем желающим. Сразу после щелчка по этой гиперссылке откроется окно, в котором вы увидите текст ссылки на выбран- ный проект. Эту ссылку вы сможете послать вашим друзьям либо выложить на своей странице в Интернете.
326 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ЧТО ЕСТЬ ЧТО. 1 \ В среде программистов такой способ поделиться каким-либо ресурсом называется «Расшарить про- ект». От слова Share (делить, распределять). Когда вы закроете окно со ссылкой на расширенный проект, то увидите, что вместо ссылки «Делиться» в последней графе таблицы напротив проекта, который вы расшарили, появятся две другие ссылки: ♦ «Закрыть»; ♦ «Показать ссылку» (как это показано на рис. 5.10). Пункт «Показать ссылку» используется в том случае, если вам повторно понадобится адрес ссылки на расшаренный про- ект. А пункт «Закрыть» отключает открытый доступ к проекту. То есть, отключает расшаривание. Но вернемся назад к графическому редактору. Если вы желаете создать новый проект на основе другого, уже имеюще- гося у вас проекта, вы можете ♦ открыть этот проект; ♦ изменить его; ♦ доработать проект. После этого следует выполнить операцию «Сохранить как...». Для этого вы должны щелкнуть мышкой по иконке Щ. I Создание программы Поле того, как вы создали проект и сохранили его на сайте, можно приступать к следующему этапу — получению заготовки исходного кода программы для ARDUINO. Чтобы получить исходный код программы нужно просто щелкнуть мышкой кнопку «Получить исходный код» на экране графического редактора. Откроется страница «Исходный код проекта Ррг_5_01» (или с другим присвоенным вами именем проекта). На этой странице вы увидите: ♦ текст программы для ARDUINO; ♦ подробные инструкции как его использовать.
Глава 5. Конструктор графических интерфейсов 327 ПРИМЕЧАНИЕ. Сначала эту программу нужно перенести на ваш компьютер. Сделать это можно двумя способами. Первый способ представлен в пункте 1 указаний по уста- новке. Просто нажмите ссылку «Загрузить исходный код». И код автоматически загрузится на ваш компьютер. Так же, как загру- жаются любые файлы по ссылке «Скачать» (Download). Скачанный файл будет помещен в стандартную папку для скачивания, ука- занную в настройках вашего браузера. Он будет представлять собой ZIP-архив, содержащий проект в формате среды разработки IDE ARDUINO. Распакуйте папку проекта в любое место на вашем компьютере, и можете открыть проект при помощи среды IDE. Второй способ состоит в том, что вы можете просто открыть IDE, создать в нем новый пустой проект, а затем выделить и ско- пировать на странице сайта remotexy.com текст программы и вставить его в созданный вами проект на IDE. СОВЕТ. Не забудьте предварительно удалить стандарт- ную заготовку программы, которую среда IDE ав- томатически помещает в каждый новый проект при его создании. СОВЕТ. Выполнив генерацию и перенос проекта на свой ком- пьютер, не торопитесь запускать процесс его ком- пиляции и загрузки в память ARDUINO. Для правиль- ной компиляции и дальнейшей работы программы вы должны загрузить и подключить в среду IDE специ- альную библиотеку, которая и будет выполнять все операции по обмену информацией между смартфоном и модулем ARDUINO через ESP-модуль по Wi-Fi каналу.
328 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Для того чтобы узнать, как скачать и установить библио- теку, обратимся к пункту 2 инструкций на странице «Исходный код проекта Ррг_5 01». Щелкните мышкой по ссылке «Загрузить библиотеку RemoteXY». Библиотека загрузится в ваш компьютер так же, как перед этим был загружен исходный код программы. А ■ ВИРТУАЛЬНЫЙ ДИСК. [ Копию библиотеки можно найти и на виртуальном I диске книги. Скачанный файл библиотеки также представляет собой ZIP- архив. Но распаковывать его не нужно. Среда разработки IDE имеет встроенные средства, помогающие установить библиотеку, представленную в ZIP-архиве. Для установки библиотеки, находясь в среде разработки IDE, выберите пункт меню: «Скетч / Подключить библиотеку / Добавить ZIP-библиотеку...». Откроется окно выбора файла. Выберите только что загружен- ный файл библиотеки и нажмите кнопку «OPEN». Библиотека авто- матически распакуется, установится и подключится к среде IDE. Теперь все готово для компиляции программы. Только вот программа не готова. Она пока может реагировать лишь на эле- мент «ВЫКЛЮЧАТЕЛЬ» и элемент «КНОПКА». Для того чтобы задействовать остальные элементы управле- ния, нам нужно программу доработать. Для того, чтобы понять, как дорабатывать программу, сначала разберем подробнее авто- матически сформированный исходный код. ВНИМАНИЕ. Чтобы отличать исходный (автоматически сфор- мированный) текст программы от окончательного варианта программы, который будет получен нами в результате доработки, мы присвоили исходному и окончательному вариантам программы разные имена.
Глава 5. Конструктор графических Интерфейсов 329 ВИРТУАЛЬНЫЙ ДИСК. Для исходного текста программы в папке «Программные примеры» на виртуальном диске был создан отдельный проект, который получил название Ppr_5_01-ish. Под этим именем на диск записан тот самый, автоматически созданный проект, содержа- щий еще не измененный исходный код программы. Текст исходного кода программы приведен в листинге 5.1.1. Длина автоматически созданного текста — 90 строк. Первые 16 строк программы при автоматической генерации всегда содер- жат специальный пояснительный текст на английском языке. Там кратко, но обстоятельно, рассказывается: ♦ что это за программа; ♦ как получена; ♦ как ее применять. Кроме того, в этом пояснительном тексте размещены лицен- зионные требования. В переводе на русский язык эти требования гласят: Эта программа распространяется по принципу «Свободной Лицензии» («Free Software»); Вы можете распространять и/или изменять ее в соответствии с условиями GNU Lesser General Public. Правила лицензирования должны соответствовать Free Software Foundation версии 2.1, либо (по вашему выбору) любой более поздней версии. Если кратко, то это значит, что вы можете свободно приме- нять и изменять программу. ВНИМАНИЕ. Главное требование, чтобы при любых изменени- ях программы было сохранено указание на ее изна- чальное авторство.
330 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Так как в тексте книги мы уже указали авторство программы, в листинге мы не станем повторять текст заголовка. Тем более что он на английском. Наш листинг 5.1.1 начинается сразу со строки 17. Со строки 18 и до строки 62 размещен специальный блок «RemoteXY include library». Это блок команд, создающий все объекты и переменные, которые понадобятся программе для обеспечения взаимодействия с приложением RemoteXY, установленным на смартфоне. Блок команд отмечен двумя заголовками: ♦ начальным (строки 18...20); ♦ конечным (строки 60...62). ВНИМАНИЕ. Весь этот блок команд между двумя заголовками, как и сами заголовки, запрещено как-либо изменять при доработке программы. Разберем подробнее этот стандартный блок команд. Начинается блок с определения параметра, который можно назвать «Вариант конфигурации». Программный комплекс RemoteXY поддерживает довольно большой набор разных конфи- гураций, отличающихся составом используемого оборудования и режимами его работы. При этом во всех случаях используется одна, универсальная библиотека «RemoteXY.h». Для каждой конкретной конфигурации нужен свой алгоритм обработки операций обмена данными. Определенный в про- грамме вариант конфигурации служит указателем для библио- течных процедур, по какому из алгоритмов работать. Параметр «Вариант конфигурации» определяется в строке 23 программы (листинг 5.1.1). Его значение равно: REMOTEXY MODE ESP8266 HARDSERIAL
Глава 5. Конструктор графических интерфейсов 331 ПРИМЕЧАНИЕ. Эта текстовая метка легко расшифровывается: Режим RemoteXY с использованием микроконтрол- лера ESP8266, подключенного к ARDUINO по аппа- ратному последовательному каналу. В строке 25 собственно и происходит подсоединение к про- грамме библиотеки <RemoteXY.h>. Далее, в строках 28...32 расположен блок, определений под заголовком «Настройки соединения». В этом блоке определяется ряд параметров, которые затем используют процедуры из библи- отеки RemoteXY.h при установке соединения по Wi-Fi каналу. Тут определяется: ♦ вид канала связи (Serial — последовательный канал); ♦ скорость передачи информации (SERIALJ5PEED); ♦ имя Wi-Fi сети (SSID); ♦ пароль для подключения к сети; ♦ номер порта TCP/IP сервера. ПРИМЕЧАНИЕ. Все эти данные взяты из параметров в разделе «Свойства» редактора интерфейсов. Далее, в строках 37...57 определяется набор констант и переменных, которые и будут использоваться для обмена дан- ными между основной программой и процедурами библио- теки «RemoteXY.h». Все эти константы и переменные в процессе работы программы будут размещаться в памяти микроконтрол- лера модуля ARDUINO. Для более компактного размещения данных, перед бло- ком команд определения констант и переменных применя- ется команда изменения параметра уравнивания (команда #pragma pack в строке 36).
332 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Дело в том, что по умолчанию при выделении памя- ти для констант и переменных применяется вы- равнивание. Для каждой переменной или констан- ты выделяется фиксированное количество байт. Например, 2 или 4 байта. Это количество называ- ется параметром выравнивания. Предположим, что значение параметра выравнивания выбрано равным 4 байтам: ♦ если длина конкретной константы или переменной меньше (например, 2 байта), переменная занимает эти 2 байта из че- тырех, а остальные байты не используются; ♦ если константа или переменная занимает больше чем 4 байта (например, 6), то для нее выделяется еще 4 байта. Констан- та (переменная) занимает шесть из восьми байт, а остальные снова не используются. ПРИМЕЧАНИЕ. Естественно, для констант и переменных, длина которых совпадает с параметром уравнивания, не- используемые ячейки отсутствуют. Такой способ размещения выбран для того, чтобы ускорить процесс чтения констант и чтения/записи переменных. Так легче вычислять адрес начала выделенной под переменную области памяти. Но память при этом расходуется неэкономно! Оператор #pragma pack(push, 1) устанавливает значение параметра урав- нивания, равным единице. То есть, на константу (переменную) выделяется один байт, если не хватает — еще один и т. д. При таком значении параметра каждая константа и перемен- ная занимает столько байт в памяти, сколько ей нужно, и ни один байт не пропадает.
Глава 5. Конструктор графических интерфейсов 333 ЧТО ЕСТЬ ЧТО. Управляющее слово push в параметрах оператора означает то, что текущее значение параметра выравнивания сохраняется в стеке. В конце блока олределения констант и переменных другой оператор #pragma pack(pop) (строка 58 программы) восстанавли- вает из стека прежнее значение параметра, выравнивания, остав- ляя программисту стандартные параметры среды. Рассмотрим подробнее, какие же константы и переменные задаются в этом стандартном блоке. Что касается констант, то в данном случае речь идет о всего одном массиве данных, который определяется в строках 37...43. Тут же ему присваивается набор значений. Имя массива RemoteXYjCONF[]. Тип данных массива uint8_t. Это специальный тип данных — беззнаковое целое число, занимающее ровно 1 байт в памяти (8 бит). Все данные в массиве RemoteXY_CONF[] представ- ляют собой закодированный образ разработанного вами интер- фейса. В этот массив заложены данные каждого элемента управле- ния, которые мы разместили на виртуальном «экране смартфона». Для каждого элемента в цифровом виде закодированы: ♦ тип элемента; ♦ координаты его расположения, размеры; ♦ все его параметры. В этом же массиве находятся настройки экрана (цвет, ори- ентация). Все эти данные были закодированы в процессе генерации исходного кода программы и используются программой в про- цессе работы. Мобильное приложение RemoteXY, установленное в смарт- фоне, сразу после соединения с УЧЕБНЫМ МОДУЛЕМ, посылает специальный запрос по каналу связи. В ответ на этот запрос программа посылает все данные из массива RemoteXY_CONF[] по тому же каналу, т. е. назад в мобиль- ное приложение. Получив эти данные, приложение: ♦ вырисовывает все элементы управления на экране смартфона; ♦ дает возможность ими управлять.
334 Управление модулем ARDUINO no Wi-Fi с мобильных устройав Листинг 5.1.1. Автоматически сформированная программа // RemoteXY include library // // определение режима соединения и подключение библиотеки RemoteXY ♦define REMOTEXYMODE ESP8266_HARDSERIAL ♦include <RamoteXY.h> // настройки соединения ♦define REMOTEXYSERIAL Serial ♦define REMOTEXYSERIALSPEED 115200 ♦define REMOTEXYWIFISSID "MyWiFi" ♦define REMOTEXYWIFIPASSWORD "ParolMyWiFi" ♦define REMOTEXY SERVER PORT 6377 // конфигурация интерфейса ♦pragma pack(push, 1) umt8_t RemoteXYCONFf] = { 255,4,0,0,0,51,0,8,55,1, 1,2,36,13,21,10,2,31,208,146, 208,186,208,187,0,2,0,8,12,21, 11,2,26,31,31,79,78,0,79,70, 70,0,3,5,13,36,13,60,2,26, 4,0,41,38,8,55,2,26 }; // структура определяет все переменные вашего интерфейса управления struct { // input variable uint8_t button_l; // =1 если кнопка нажата, иначе =0 uint8_t switchl; // =1 если переключатель включен и =0 если отключен uint8_t select_l; // =0 если переключатель в положении А, «1 если в положении В int8_t slider_l; // «0..100 положение слайдера // other variable uint8_t connect_flag; // =1 if wire connected, else -0 } RamoteXY; ♦pragma pack(pop) // END RemoteXY include // ♦define PINBUTTON1 3 ♦define PIN SWITCH 1 2
Глава 5. Конструктор графических интерфейсов 335 void setup() RemoteXYInit () ; pinMode (PIN_BUTTON_1, OUTPUT); pinMode (PIN_SWITCH_1, OUTPUT); // TODO you setup code void loop() RemoteXY_Handler (); digitalWrite(PINBUTTON1, (ReraoteXY.button_l=0)?LOW:HIGH); digitalWrite (PINSWITCH1, (ReraoteXY. switch_l=0) ?LOW: HIGH); // TODO you loop code // используйте структуру RemoteXY для передачи данных ПРИМЕЧАНИЕ. Таким образом, само мобильное приложение не со- держит информацию о разработанном вами ин- терфейсе и получает эти данные только после со- единения с микроконтроллерным модулем. Такой способ хранения данных о структуре интерфейса позволяет при помощи одного и того же мобильного приложения управлять сразу несколькими микроконтроллерными блоками. Каждый микроконтроллерный модуль будет иметь свой собствен- ный IP адрес в Wi-Fi сети. Подключаясь к разным адресам можно легко переключаться от одного устройства к другому. И для каж- дого устройства у вас на смартфоне появится свой индивидуаль- ный пульт управления. В строках 46...S7 происходит определение основных пере- менных для обмена информацией основной части программы с библиотечными процедурами, а через них с органами управления в мобильном приложении. Это те самые переменные, имена которых мы присваивали элементам управления в редакторе интерфейсов.
336 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Все переменные объединены в структуру, имя которой RemoteXY. В результате обращение к каждой переменной в про- грамме происходит через точку как к элементу структуры. Так же, как мы обращаемся к свойству объекта. Например: RemoteXY.button_l или RemoteXY.switchJ. Создание структуры производится при помощи оператора struct, (строка 46 программы). Далее, в фигурных скобках произ- водится определение пяти переменных. Определение перемен- ных происходит обычным способом: ♦ четыре первых переменных— это переменные связанные каждая со своим элементом управления (кнопкой, выключа- телем, переключателем, слайдером); ♦ пятая переменная connectJlag — это специальная перемен- ная, которая используется для индикации состояния канала связи. ПРИМЕЧАНИЕ. Если связь установлена, значение этой переменной равно единице. Если связь обрывается, значение пе- ременной становится равным нулю. Ваша программа может использовать эту переменную для того, чтобы обрабатывать эту ситуацию: ♦ запускать повторно процесс подключения; ♦ просто индицировать отсутствие связи при помощи, напри- мер, специального светодиода. Каждая переменная в автоматически созданной программе снабжена кратким пояснением логики ее работы. Например, переменная button_l (кнопка) принимает значение: ♦ 1 — если кнопка нажата; ♦ 0 — если кнопка отпущена. Тип всех переменных также специальный. Они все занимают в памяти ровно 1 байт. В основном это беззнаковое целое (uint8_t). Тип переменной sliderl — это целое число со знаком (int8j). Создание структуры переменных заканчивается закрыва- ющей фигурной скобкой, за которой указано имя создаваемой структуры (строка 57).
Глава 5. Конструктор графических интерфейсов 337 ПРИМЕЧАНИЕ. Все определенные выше переменные и массив кон- стант имеют статус глобальных, так как они описаны вне каких-либо функций в начале програм- мы. Поэтому доступ к любой из этих переменных возможен из любого места программы. Заканчивается блок операторов «RemoteXY include»: ♦ командой восстановления значения параметра уравнивания (строка 58); ♦ конечным заголовком блока (строки 60...62). После строки 63 начинается та часть программы, которую вы должны и можете дорабатывать под ваши задачи. ВНИМАНИЕ. В доступной для редактирования части програм- мы две строки все же должны остаться неприкос- новенными. Их вы должны оставить на том самом месте, где они находятся. Обе эти строки вызыва- ют каждая свою специальную функцию из библио- теки «RemoteXY.h». Во первых, это команда вызова функции начальной ини- циализации ESP-модуля RemoteXYJnitQ (строка 70). А также вызов функции RemoteXY^HandlerQ — обмен данными с мобиль- ным приложением (строка 81). Остальные несколько команд, которые автоматически были вставлены в программу, — это как раз простейшие операции по управлению светодиодом, подключенным к выходному контакту 3 от элемента «Кнопка». А также управление светодиодом на кон- такте 2 при помощи элемента «Выключатель». Но разберем структуру оставшейся части программы по порядку. В строках 64 и 65 происходит определение имен для двух контактов: ♦ номера контакта для подключения светодиода, управляемого кнопкой;
338 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ номера контакта для подключения светодиода, управляемого выключателем. Этим контактам даны имена PIN^BUTTONJ и PIN_SWITCHJ, соответственно. В строках 68—77 расположена системная функция setupQ. Функция начинается строкой вызова библиотечной функции RemoteXYJnitQ. Эта функция как раз и производит начальную настройку ESP-модуля, посылая на модуль ряд АТ-команд. ПРИМЕЧАНИЕ. Набор команд зависит от того, в каком режиме должен работать модуль ESP-01 в данном конкрет- ном варианте конфигурации. Мы рассматриваем случай, когда Wi-fi модуль работает в режиме клиента и подключается к домашней (корпоративной) Wi-Fi сети. В этом случае программа посылает на модуль набор АТ-команд, показанный на рис. 5.11. Команды подаются по следующему алгоритму: ♦ после подачи каждой очередной команды программа ожида- ет ответ от модуля, подтверждающий успешное выполнение операции; ♦ получив этот ответ, программа посылает следующую команду. Если после очередной АТ-команды правильный ответ не был получен, то весь процесс передачи команд прекращается, а пере- менная connectJlagустанавливается в ноль. При этом выполнение программы не прекращается. Вы имеете возможность включить в программу процедуру обработки этой ситуации, и программа выполнит действия, кото- рые вы предусмотрите в этой процедуре. Например, повторит вызов функции RemoteXY_Init(). В строках 71...76 сразу после вызова функции RemoteXYJnitO находится область, предоставленная программисту для своих процедур начальной настройки. В эту область уже автоматиче- ски включены две команды. Эти команды определяют режим работы двух контактов модуля ARDUINO: ♦ контакта управляемого кнопкой (PIN_BUTTON_1); ♦ контакта, управляемого выключателем {PINJSWITCH^l).
Глава 5. Конструктор графических интерфейсов 339 AT AT+RST АТЕО AT+CWMODE=1 AT+CWQAP |AT+CWDHCP=1,1 AT+CWJAP=HMyWiFi", "ParolMyWiFi" AT+CIPMODE=0 AT+CIPMUX=1 AT+CIPSERVER=1, 6377 AT+CIPSTO=7 Рис. 5.11. Набор команд передаваемых на ESP-01 при запуске Оба контакта переводятся в режим цифровых выходов (OUTPUT). Такая настройка нужна для того, чтобы эти контакты смогли управлять светодиодами. В строке 75 программы при автоматической генерации про- граммы вставлена подсказка «TODO you setup code» (вставьте сюда ваш программный код). ПРИМЕЧАНИЕ. Мы обязательно воспользуемся этим советом, ког- да будем дорабатывать программу в следующем разделе главы книги. В строках 79...90 расположен основной цикл программы loopQ. Начинается он, как уже говорилось, с вызова функции RemoteXY_Handler() (строка 81). Назначение этой функции — синхронизация значений всех переменных. Именно эта функ- ция при помощи АТ-команд выполняет обмен данными между мобильным приложением в смартфоне и основной програм- мой. В результате этого обмена значение переменных элемен- тов управления передаются из мобильного приложение в про- грамму на ARDUINO, а значения переменных элементов инди-
340 Управление модулем ARDUINO по Wi-Fi с мобильных устройств кации передается из программы на ARDUINO в мобильное приложение. Работа функции RemoteXY_Handler() зависит от значения переменной connect Jlag. ПРИМЕЧАНИЕ. Если значение этой переменной равно нулю, обмен данными не производится. Функция сразу завершает работу, не выполняя никаких действий. Если ARDUINO подключен к компьютеру, то в окне монитора порта вы можете наблюдать процесс обмена информацией между мобильным приложением и программой ARDUINO. Вернее не весь процесс, а набор AT-команд, посылаемых модулем ARDUINO на модуль ESP-01 (рис. 5.12). Как видите, в процессе обмена модуль ARDUINO периоди- чески посылает по Wi-Fi каналу блоки информации длиной 34 байта. ПРИМЕЧАНИЕ. При желании, вы можете увидеть и ответные данные, применив способ отладки с подключением второго USB-TTL адаптера, так как это показано в главе 4 (подраздел «Аппаратный способ отладки»). Сразу после команды вызова функции обмена данными про- граммист может размещать свои команды для основного цикла программы. В автоматически сформированном тексте уже име- ются две команды. Это как раз команды, непосредственно управ- ляющие двумя светодиодами. В строке 83 при помощи команды цифрового вывода digitalWriteQ выводится сигнал на выход PIN_BUTTON_1 (на све- тодиод, управляемый кнопкой). Выводимое значение зависит от значения переменной button_l> которая является частью струк- туры RemoteXY. Для оценки значения переменной RemoteXY
Глава 5. Конструктор графических интерфейсов 341 J" J" J" J" J" J" J" J" J" J" J" J" J" J" J" А А А А А А А А А А А А А А А А 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 „ AT+CIPSEND=0/34 „ AT+CIPSEND=Of34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 n AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0,34 „ AT+CIPSEND=0/34 „ AT+CIPSEND=0,34 Puc. 5.12. Процесс обмена информацией между смартфоном и Ардуино button_l используется оператор условного выбора. Формат опе- ратора следующий: (условие) ? значеные1 : значение2 Как видите, в качестве имени этого оператора используется символ «Знак вопроса». Оператор возвращает одно из двух зна- чений (значение 1 или значение2) в зависимости от результата логического выражения «условие». Если результат выражения «условие» равен true, то опера- тор «?» возвращает значение 1. Если результат выражения «усло- вие» равен false, оператор «?» возвращает значение2. В качестве значенийя 1 и значения2 в нашем случае используются зарезерви- рованные слова: ♦ LOW (низкий логический уровень); ♦ HIGH (высокий логический уровень). В результате выражение имеет вид: (RemoteXY.button_l==0)?LOW:HIGH Возвращает LOW, если значение переменной RemoteXY. button_l равно нулю.
342 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Возвращает HIGH, если значение переменной RemoteXY. button_l не равно нулю. Переменная button J. отражает состояние элемента управле- ния «Кнопка». Это значение было передано при вызове функции обмена данными в строке 81. В результате (при нажатии кнопки) на выходе PIN_BUTTON_1 установится логическая единица, а при отпускании — логический ноль. В строке 84 программы мы видим точно такую же, как в строке 83, команду управления светодиодом, но теперь уже с управлением от элемента «Выключатель». ПРИМЕЧАНИЕ. *\ Отличие в том, что вместо переменной button_l в операторе условного выбора проверяется перемен- ная switch_l. А результат этого оператора пере- дается на контакт PIN SWITCH 1. Далее, в строках 86 и 87 вы видите подсказку. В ней гово- рится, что в это место можно включить свои собственные опе- раторы. Кроме того, напоминается, что в своей программе вы можете использовать значения переменных, объединенных в структуру RemoteXY так же, как они были использованы в стро- ках 83 и 84. Приведенная в листинге 5.1.1 и описанная выше программа может уже частично работать. Если вы скомпилируете ее и загру- зите в программную память модуля ARDUINO, то вы уже можете подключаться при помощи смартфона к модулю через домаш- нюю Wi-Fi сеть. На экране смартфона появятся все органы управления, кото- рые вы создали в графическом редакторе. Органы управления будут реагировать на ваши нажатия. «Кнопка» будет «нажи- маться» (менять окраску), «Выключатель» будет «включаться и «выключаться». При этом будут зажигаться и потухать соответ- ствующие светодиоды, подключенные к модулю ARDUINO к кон- тактам 2 и 3. Правда, они будут вести себя наоборот. При «нажатой» «Кнопке» светодиод потухнет, при ее «отпускании» зажжется. Также и с «Выключателем». Светодиод загорится в положении
Глава 5. Конструктор графических интерфейсов 343 «Выключено», а в положении «Включено» потухнет. Это связано с тем, что мы подключили светодиоды не так, как предполагается в проекте RemoteXY. ПРИМЕЧАНИЕ. Напомню, что для испытания программы мы до- говорились использовать схему, изображенную на рис. 4.25. Проект же рассчитан на то, что свето- диод подключается между выходным контактом ARDUINO и общим проводом. В схеме на рис. 4.25 реализован классический способ под- ключения светодиода: светодиод через токоограничивающий резистор подключается между выходным контактом и шиной питания. Оба способа подключения корректны и практически равноценны. Но классический способ мне кажется более удоб- ным и привычным. Поменять в программе логику работы этих двух светодиодов очень просто. Ниже мы покажем, как это сде- лать. А также покажем, как задействовать остальные элементы управления. 5.5. Простой проект - доработка исходного кода ВИРТУАЛЬНЫЙ ДИСК. Пример 5.1 (папка на ВИРТУАЛЬНОМ диске Ppr_5_01-rez) Доработанный вариант программы, автоматически сфор- мированной нами в предыдущем разделе данной главы, реализу- ющий все функции, заданные при постановке задачи, приведен в листинге 5.1.2. Разберем подробнее все доработки, которые нам понадобилось сделать.
344 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Для удобства будем называть: ♦ программу, приведенную в листинге 5.1.1 — «Исходный ва- риант программы» или просто «Исходная программа»; ♦ программу, приведенную в листинге 5.1.2— «Окончатель- ный вариант программы» или просто «Готовая программа». Готовая программа создана из исходного ее варианта: ♦ как путем добавления новых команд; ♦ так и путем изменения некоторых команд, автоматически включенных в исходный вариант программы. Кроме того, в результирующем варианте программы мы изменили стиль написания автоматически сформированной про- граммы: ♦ убрали некоторые пустые строки; ♦ убрали лишние переносы строк. ПРИМЕЧАНИЕ. Это немного сократило общее количество строк результирующей программы, но набор и последова- тельность команд при этом не изменились. В листинге 5.1.2, как и в листинге 5.1.1 не показан началь- ный заголовок (в самой программе заголовок присутствует). ВИРТУАЛЬНЫЙ ДИСК. л Если вы скачаете примеры всех программ с вир- туального диска, то открыв текст каждой про- граммы (исходной Ppr_5_01-ish и доработанной Ppr_5J)l-rez), вы увидите полный текст заголовка. Как уже говорилось выше, начальный блок программы (строки 18...62) изменять нельзя. Правда, благодаря изме- нению стиля написания, начальный блок стал чуть короче. И теперь текст обязательного блока заканчивается в строке 58 (листинг 5.1.2). В исходной программе сразу после обязательного блока идут две команды именования контактов:
Глава 5. Конструктор графических интерфейсов 345 ♦ PIN_BUTTONJ; ♦ PIN_SWITCH_1. В готовой программе эти две команды занимают строки 60 и 61. Ниже, в строке 62 окончательного варианта программы, добавлена еще одна команда именования. Контакт 9 модуля ARDUINO именуется как PIN_ANALOG. Этот контакт будет исполь- зоваться для подключения светодиода, управляемого слайдером. Контакт будет работать в режиме аналогового вывода. В строках 64 и 65 окончательного варианта программы дополнительно объявляются две вспомогательные переменные. Обе эти переменные мы будем использовать в процедуре управ- ления группой светодиодов при помощи элемента управления «Переключатель». В этой группе из пяти светодиодов всегда должен гореть только один светодиод. Его порядковый номер в группе должен соответствовать текущему положению «Переключателя». При изменении положения переключателя должен загореться новый светодиод, а тот, что горел до этого, должен потухнуть. Для того чтобы реализовать такой алгоритм и используется две переменные: ♦ переменная selset_t (строка 64 программы) будет хранить те- кущее положение переключателя; ♦ переменная selsetji (строка 65) предназначена для хранения нового значения переключателя, передаваемого по каналу связи от смартфона. ПРИМЕЧАНИЕ. По умолчанию обеим переменным при их объявле- нии присваивается значение 0. Это начальное зна- чение положения «Переключателя». Обе перемен- ных имеют статус глобальных, так как их описа- ние производится вне каких-либо функций в начале программы. Теперь опишем доработки, которые мы сделали в теле функ- ции setupQ. Вызов библиотечной функции RemoteXYJuitQ остав- лен на своем месте — в самом начале функции setupQ. А именно
346 Управление модулем ARDUINO по Wi-Fi с мобильных устройств в строке 68 результирующей программы. Остальное же содержи- мое функции изменено полностью. В исходном варианте программы в этом месте стояли две команды, определяющие режим работы двух КОНТАКТОВ ВВОДА/ВЫВОДА модуля ARDUINO. Речь идет о тех, к которым под- ключены светодиоды управляемые «Кнопкой» и «Выключателем». В новой программе необходимо установить режим работы для семи контактов, к которым подключены светодиоды, управ- ляемые «Кнопкой», «Выключателем» и «Переключателем». ПРИМЕЧАНИЕ. Удобнее всего перебирать в цикле все /контак- тов устанавливая для каждого из них режим его работы. Цикл настройки контактов расположен в строках 69...72. Начальное значение счетчика цикла i равно 2. В процессе работы это значение изменяется от 2 до 8. Перебирая, таким образом, семь нужных нам контактов. Тех, к которым подключаются светодиоды с VD1 по VD7. Настройка режима работы контакта 9, к которому подключен све- тодиод VD8, не требуется. Команда аналогового вывода не нужда- ется в предварительной настройке режима работы контакта. В цикле настройки режимов работы контактов всего два оператора. Оператор pinModeQ в строке 70 переводит каждый контакт в режим цифрового выхода. Кроме настройки режима работы контактов, в том же цикле выполняется установка началь- ного значения каждого выхода. ПРИМЕЧАНИЕ. Дело в том, что при переводе контакта в режим цифрового выхода на полученном таким образом выходе устанавливается уровень логического нуля. Как уже говорилось выше, при выбранной нами схеме вклю- чения светодиодов сигнал логического нуля заставляет светодиод
Глава 5. Конструктор графических интерфейсов 347 Листинг 5.1.2. Автоматически сформированная программа // RemoteXY include library // // определение режима соединения и подключение библиотеки RemoteXY tdefine REMOTEXYMODE ESP8266HARDSERIAL ♦include <RemoteXY.h> // настройки соединения ♦define REMOTEXYSERIAL Serial ♦define REMOTEXYSERIALSPEED 115200 ♦define REMOTEXYWIFISSID "MyWiFi", ♦define REMOTEXYWIFIPASSWORD "ParolMyWiFi" ♦define REMOTEXYSERVERPORT 6377 // конфигурация интерфейса ♦pragma pack(push, 1) uint8_t RemoteXYCONFU = { 255,4,0,0,0,51,0,8,55,1, 1,2,36,13,21,10,2,31,208,146, 208,186,208,187,0,2,0,8,12,21, 11,2,26,31,31,79,78,0,79,70, 70,0,3,5,13,36,13,60,2,26, 4,0,41,38,8,55,2,26 }; // структура которая определяет все переменные вашего интерфейса управления struct { // входные переменные: uint8_t button_l; // =1 если кнопка нажата, иначе =0 uint8_t switch_l; // =1 если переключатель включен и =0 если отключен uint8_t select_l; // =0 если переключатель в положении А, =1 если в положении В int8_t sliderl; // =О..1ОО положение слайдера // другие переменные: umt8_t connect_flag; // =1 if wire connected, else =0 } RemoteXY; ♦pragma pack(pop) /У/////////////////////////////////////////// // END RemoteXY include // ♦define PIN_BUTTON_1 3 // Контакт, управляемый элементом "Кнопка" ♦define PIN_SWITCH_1 2 // Контакт, управляемый элементом "Выключатель" ♦define PINANALOG 9 // Контакт управляемый элементом "Слайдер** (добавлено) mt pinsel_t =0; // Переменная "Текущее положение переключателя" int pinsel_n =0; // Переменная "Новое положение переключателя" void setup() { RemoteXY_Imt (); // Процедура инициализации модуля ESP-01
348 Управление модулем ARDUINO по Wi-Fi с мобильных устройств for (int i=2; i<9; i++) { // Цикл настройки контактов ввода-вывода pinMode (i, OUTPUT); // Орпределяем контакт как цифровой выход digitalWrite(i, HIGH); // Выводим на выход логическую единицу void loop () { RemoteXY_Handler (); // Вызов процедуры обмена данными со смартфоном digitalWrite(PIN_BUTTON_l, (RemoteXY.button_l==0) ?HIGH:LOW) ; // От кнопки digitalWritefPINSWITCHl, (RemoteXY. swxtch_l==0) ?HIGH:LOW) ; // От выключателя pinseln = RemoteXY.select^l; // Получить новое положение переключателя if (pinseln != pmselt) { // Если положение изменилось digitalWrite(pmsel_t+4, HIGH); // Тушим светодиод старого положения digitalWnte(pinsel_n+4, LOW); // Зажигаем светодиод нового положения pinselt = pinseln; // Новое текущее положение analogWnte(PIN_ANALOG, 255 - RemoteXY.sliderl); // Управление от слайдера светиться. Нам же желательно, чтобы светодиоды сразу после включения УЧЕБНОГО МОДУЛЯ были потушены. Исключение будет лишь для светодиодов, управляемых «Переключателем». Один из этих пяти светодиодов всегда будет светиться. Но он включится позже. А в цикле начальной уста- новки мы все светодиоды потушим. Для этого в строке 71 в цикл включена команда, выводящая в каждый из перебираемых контактов высокий логический уро- вень (HIGH). На этом функция setupQ окончательной версии про- граммы заканчивается. Рассмотрим теперь изменения, которые мы выполнили в основном цикле программы loopO, который в окончательной вер- сии программы занимает строки 75...87. На своем месте в самом начале цикла (строка 76 программы) находится команда вызова библиотечной функции RemoteXY_ HandlerQ. Сразу за ней два уже известных нам оператора, реали- зующих: ♦ управление светодиодом от «Кнопки» (строка 77); ♦ управление светодиодом от «Выключателя» (строка 78).
Глава 5. Конструктор графических интерфейсов 349 ПРИМЕЧАНИЕ. Это те же команды, которые автоматически были включены в исходную программу. Но мы немного из- менили каждую из них. В операторе условного вы- бора два последних параметра (LOW и HIGH) мы поменяли местами. В результате логика работы кнопки и выключателя стала противоположной. Теперь при нажатии кнопки, когда значение переменная RemoteXY.button_l равно единице, на контакт PIN_BUTTON_1 будет подан низкий логический уровень (LOW). При отпускании кнопки (RemoteXY.button_l=0) на контакт подается высокий логический уровень (HIGH). To же самое спра- ведливо и для переменной RemoteXY.switch_l и выходного кон- такта PIN_SWITCH_1. В результате кнопка и выключатель будут работать так, как нам нужно. Далее, в строках 80...85 вставлен новый блок команд, кото- рый обеспечивает работу элемента управления «Переключатель». Функция RemoteXY_Handler() вызывается при каждом проходе основного цикла программы 1оор(). И каждый раз считывается новые значения всех переменных. Наша программа должна сравнить новое значение перемен- ной RemoteXY.select_ly определяющей положение «Переключателя» с ее старым значением. ЛОГИКА РАБОТЫ. Если значение не изменилось, ничего делать не нуж- но. В противном случае нужно потушить светоди- од на выходе, с номером контакта, соответствую- щим старому значению «Переключателя» и зажечь на выходе, соответствующем новому его значению.
350 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Значение переменной RemoteXY.select_l равно номе- ру текущей позиции элемента «Переключатель»: ♦ для самой верхней позиции («А») значение пере- менной равно нулю; ♦ для следующей позиции («В») - единице и так да- лее. Для последней, самой нижней позиции значение пе- ременной равно 4. Сначала в строке 80 программы переменной selsetji при- сваивается новое значение положения «Переключателя». То есть, значение переменной RemoteXY.selectJ. Далее нам нужно прове- рить, действительно ли изменилось положение переключателя. В строке 81 оператор /Д) сравнивает между собой: ♦ значение переменной selsetj, где хранится предыдущее по- ложение «Переключателя»; ♦ новое значение, которое находится теперь в переменной selsetji. Если положение изменилось {selsetji не равно selsetj), то выполняются операции по переключению светодиодов (строки 82...84). В противном случае порядок свечения пяти светодиодов, управляемых «Переключателем», остается неизменным. Рассмотрим, как происходит переключение светодиодов в слу- чае, если положение «Переключателя» изменилось. Сначала в строке 82 программы на выход, соответствующий предыдущему значению переключателя, подается высокий логический уровень HIGH. Светодиод, подключенный к этому выходу, тухнет. Затем в строке 83 на выход, соответствующий новому значению положе- ния переключателя, подается низкий логический уровень LOW. Светодиод, подключенный к этому выходу, загорается. В строке 84 переменной pinselj присваивается значение pinselji. Теперь новое значение переключателя стало текущим. ПРИМЕЧАНИЕ. Номер контакта, куда нужно подавать управля- ющий сигнал, вычисляется по простой формуле: к значению переменной selsetj) (новое положение)
Глава 5. Конструктор графических интерфейсов 351 или selsetj (текущее старое положение) прибавля- ется четыре. Такое смещение выбрано потому, что группа све- тодиодов,управляемых «Переключателем», подклю- чена к контактам с 4 по 8. А значение переменной (RemoteXY.select_l), соответствующее состоянию «Переключателя» на смартфоне, а, соответствен- но, и значение переменных selset_n и selsetj изме- няется от 0 до 4. Вывод управляющих значений на выходные контакты модуля ARDUINO производится при помощи стандартного оператора digitalWrite(). В строке 86 программы находится оператор, который произ- водит вывод величины, определяемой положением движка эле- мента управления «Слайдер» на светодиод, подключенный к кон- такту PIN_ANALOG. Для вывода значения используется стандартный оператор аналогового вывода языка ARDUINO analogWriteQ. У оператора два параметра: ♦ первый — номер контакта; ♦ второй — аналоговая величина, выводимая на указанный вы- ход методом широтно-импульсной модуляции. Аналоговая величина, передаваемая на контакт, вычисляется из значения переменной RemoteXY.slider_l. Значение этой пере- менной передается от смартфона и зависит от положения движка «Слайдера» на его экране. При перемещении движка «Слайдера» от одного крайнего положения в другое, значение переменной изменяется от 0 до 100. Но этот диапазон желательно сузить (пересчитать). ПРИМЕЧАНИЕ. В разделе 4.11 мы узнали, что для плавной регули- ровки яркости светодиода желательно подавать на управляющий им выход аналоговое значение от 170 до 255.
352 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Для простоты пересчета мы применим элементарную фор- мулу: мы вычтем значение переменной RemoteXY.sliderl из мак- симально допустимого значения аналогового уровня для функ- ции analogWriteQ, которое равно 255. В результате диапазон зна- чений на входе функции analogWriteQ будет лежать в пределах от 155 до 255. Командой аналогового вывода завершается функция loopQ, а значит и вся программа. 5.6. Мобильное приложение RemoteXY 1С какой версией лучше начинать работать: с бесплатной или коммерческой? После того, как исходный текст программы, автоматиче- ски сформированный при помощи графического редактора на сайте [8] доработан, откомпилирован и загружен в программную память УЧЕБНОГО МОДУЛЯ, можно приступать к испытанию всего проекта в целом. Для перехода по указанной в тексте ссылке [8] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Сначала необходимо установить на ваш смартфон (планшет) приложение RemoteXY. Существует два варианта этого приложения: ♦ RemoteXYFree Бесплатная версия. Имеет ограничение в использовании. Ограничение одно — общее количество элементов управления и индикации должно быть не более пяти. Можно и больше, но тогда такой проект будет работать с ограничением по времени в 30 секунд. ♦ RemoteXY Pro Коммерческая версия. Не имеет никаких ограничений. На момент написания книги (лето 2019 года) эта версия стоила 379 рублей.
Глава 5. Конструктор графических интерфейсов 353 ПРИМЕЧАНИЕ. Напомню, что одно приложение может управлять неограниченным числом микроконтроллерных бло- ков (учебных модулей). Нужно отметить, что ограничения в бесплатной версии про- являются только в момент использования мобильного прило- жения. Когда вы создаете свой проект в графическом редакторе, никаких ограничений нет: ♦ вы можете создать пульт управления любой сложности; ♦ можете сформировать автоматически исходный код про- граммы; ♦ можете загрузить программу в среду разработки IDE; ♦ доработать программу как вам нужно; ♦ можете скомпилировать ее и загрузить в программную па- мять ARDUINO. Если все сделано правильно, вы можете запустить УЧЕБНЫЙ МОДУЛЬ. Он подключится через ESP-модуль к вашей домашней сети и будет полностью готов к работе. Запустив мобильное приложение RemoteXY на смартфоне, вы можете подключиться к УЧЕБНОМУ МОДУЛЮ. При успешном подключении на экране смартфона тут же появится разработан- ный вами пульт. ПРИМЕЧАНИЕ. Если у вас бесплатная версия, а количество эле- ментов в пульте окажется больше 5, то на экране прямо поперек всех элементов появится полупро- зрачная надпись «Free version», а ниже побегут по- лупрозрачные цифры, обратного отсчета времени. Счетчик отсчитывает секунды от 30 до 0. По истечении 30 секунд изображение пульта исчезает, и про- грамма открывает страничку с рекламой коммерческой версии. Тридцати секунд вполне хватает для того, что бы убедиться, что разработанный вами пульт работает и удобен в управлении. Вы можете тут же подсоединиться к микроконтроллерному блоку еще раз и еще раз получить свои 30 секунд.
354 Управление модулем ARDUINO по Wi-Fi с мобильных устройств СОВЕТ. Не спешите сразу покупать платную версию. Для начала мы рекомендуем установить и попробовать именно бесплатную версию. I Установка приложения «RemoteXY Free» Для того чтобы установить приложение «RemoteXY Free» на ваше мобильное устройство (смартфон, планшет), вы можете просто отсканировать QR-код [8], приведенный ниже. Для перехода по указанной в тексте ссылке [8] запустите приложение «Сканер QR и штрих-кодов» на смарт- фоне (планшете) и наведите его камеру на изображение QR-кода. Наведите для этого на QR-код камеру смартфона, отскани- руйте код, и смартфон автоматически перейдет на страницу загрузки приложения. ПРИМЕЧАНИЕ. Такой же QR-код вы можете найти в разделе «Приложение» сайта revotexy.com [11]. I Первый запуск приложения После того, как приложение будет установлено, запустите его. На экране появится основное окно приложения (рис. 5.13). При первом включении основное окно программы будет пустое.
Глава 5. Конструктор графических интерфейсов 355 Рис. 5.13. Основное окно приложения RemoteXY Квадратики с символом веда соединения и IP адресом, которые вы ведите на рис. 5.13, — это кнопки выбора устройств, которыми вы управляете при помощи приложения. Кнопка устройства появля- ется автоматически в главном окне приложения после успешной попытки соединения. Повторные запуски | приложения II При повторном подключении вы просто касаетесь нужной кнопки устройства, и соединение возобновляется. Если нужного устройства на экране нет, то вы должны его создать. Для этого коснитесь символа «+» в правом верхнем углу окна. Откроется окно выбора нового устройства (рис. 5.14).
356 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. По сути, в окне выбора нового устройства из списка вы должны выбрать вид канала связи, по которому будет осуществляться связь с этим новым устрой- ством. В нашем случае вы должны выбрать «Ethernet». После выбора вида канала связи откроется окно настроек под- ключаемого вами устройства. Вид этого окна зависит от выбран- ного канала связи. В нашем случае окно будет выглядеть так, как показано на рис. 5.15. Параметров устройства Ethernet всего два. Первый параметр называется «IP адрес или URL». Если вы работаете в локальной Wi-Fi сети вашего дома или офиса, то тут вы должны указать IP адрес, который был присвоен вашему учеб- ному модулю при подключении к Wi-Fi сети. Рис. 5.14. Выбор нового устройства приложения RemoteXY Рис. 5.15. Выбор параметры Ethernet устройства
Глава 5. Конструктор графических интерфейсов 357 СОВЕТ. Определить IP-адрес устройство в сети можно при помощи приложения «Network Utilities», функция «IP Discover». Если вы работаете через Интернет, то сюда нужно вписать адрес, который вы получите при создании токена в облачном сер- вере проекта RemoteXY. Второй параметр — это номер порта TCP/IP сервера. Выбрав параметры, нужно нажать на кнопку «Подключиться». Если УЧЕБНЫЙ МОДУЛЬ включен и его начальный запуск про- шел без ошибок, после нажатия этой кнопки вы сразу увидите на экране все элементы вашего пульта. После завершения сеанса в главном окне вы увидите значок вашего устройства. ПРИМЕЧАНИЕ. При необходимости вы можете поменять свойство любого из устройств. Для этого вы должны зожоть кнорпку устройство пальцем и удерживать ее так в течение нескольких секунд. Откроется окно «Настройки устройства» (рис. 5.16). Кроме уже знакомых нам IP адреса и номера порта, в этом окне можно изменить и еще ряд свойств. Во-первых, устройству можно присвоить имя. Например, «Управление светодиодами». По умолчанию в качестве имени используется IP-адрес устройства. Во-вторых, можно изменить внешний вид иконки и цвет кнопки. Для изменения иконки коснитесь пункта «Иконка» в списке параметров. Откроется окно выбора иконок (рис. 5.17). Выберите в нем иконку по вкусу. Если коснуться пункта «Цвет кнопки», откроется палитра выбора цвета. В-третьих, можно установить срок, в течение которого хра- нится журнал соединений. Сам журнал можно посмотреть, кос- нувшись пункта «Сессии».
358 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ШШШШ^^^РШ i Наименование • Иконка ;Р эдоег и?;и UHi аи i «<*» 6 f jf Q » III Рис. 5.16. Страница Рис. 5.17. Окно выбора иконок «Настройки устройства» I Загружаем коммерческую версию Когда вы решите купить коммерческую версию, вы должны обновить приложение до версии «RemoteXY Pro». Как это сделать, вы всегда можете узнать прямо в приложении RemoteXY. На спе- циальной рекламной страничке приложения (рис. 5.18). На эту страничку приложение переходит при любой ошибке в работе приложения, либо по окончанию сеанса связи с устрой- ством. При желании вы всегда можете перейти к рекламной стра- нице, нажав на специальную иконку [|§|| в верхнем левом углу главного окна приложения. В рекламном окне вам предлагается два варианта приобрете- ния коммерческой версии:
Глава 5. Конструктор графических интерфейсов 359 Рис. 5.18. Страница лицензирования приложения «RemoteXY» ♦ либо заплатить за регистрацию, получить регистрационный код и зарегистрировать уже установленную бесплатную вер- сию. После регистрации она превратится в коммерческую; ♦ либо перейти к странице загрузки приложения «RemoteXY Pro». Купить и установить его. Несколько II полезных советов II В процессе испытаний программ, приведенных в этой главе, удобно постоянно держать модуль ARDUINO подключенным к USB порту компьютера. На компьютере нужно запустить среду IDE и контролировать работу модуля при помощи монитора последова- тельного порта. Причем окно монитора можно использовать для оперативного перезапуска модуля ARDUINO.
360 Управление модулем ARDUINO по Wi-Fi с мобильных устройств При закрытии и последующем открытии окна монитора после- довательного порта автоматически происходит перезапуск модуля ARDUINO. После того, как окно монитора откроется, наблюдайте за передачей команд на ESP-модуль. Это поможет увидеть момент, когда окончатся все начальные настройки ESP-модуля и устано- вится соединение ESP-модуля с домашней Wi-Fi сетью. Процесс начального запуска завершен, если на экране монитора вы увидите все команды, какие показаны на рис. 5.11. Если последовательность команд обрывается, это значит, что произошла какая-то ошибка, и устройство не запустилось. В этом случае можно даже не пробовать подключаться к микроконтрол- лерному модулю при помощи мобильного приложения. Если же все команды, вплоть до последней, вы видите на экране, можете пробовать подключится. При успешном подклю- чении вы увидите: ♦ на экране мобильного устройства — изображение созданного вами пульта; ♦ в окне монитора последовательного порта на компьютере — непрерывную череду команд обмена данными (рис. 5.12). СОВЕТ. Иногда бывает, что все команды начального запу- ска прошли успешно, а соединение не устанавлива- ется. Закройте и откройте заново окно монитора последовательного порта. Дождитесь окончания процесса перезапуска и повторите попытку под- ключения с мобильного устройства. Итак, в предыдущих уроках мы научились, при помощи редактора интерфейсов на сайте RemoteXY создавать образ пульта с элементами управления микроконтроллерным модулем и использовать созданный пульт на практике, при помощи специ- ального мобильного приложения RemoteXY. Следующим этапом мы научимся создавать интерфейс с элементами индикации.
Глава 5. Конструктор графических интерфейсов 361 5.7. Проверка элементов индикации: разработка проекта ВИРТУАЛЬНЫЙ ДИСК. Пример 5.2 (попка на ВИРТУАЛЬНОМ диске Ррг_5_02) Постановка | задачи I Задача. Создать образ интерфейса, содержащий пять элементов индикации из набора элементов редактора интерфейсов RemoteXY. Использовать из этого набора следующие элементы: ♦ «Индикатор»; ♦ «Шкала дуговая стрелочная»; ♦ «Уровень линейный»; ♦ «Текстовая строка»; ♦ «Онлайн график». На основе созданного образа интерфейса нужно автоматиче- ски сформировать исходный код программы для ARDUINO. Схему и окончательный вариант программы мы будем создавать в следую- щем разделе книги. Новый программный пример получил название Ррг_5_2. На первом этапе мы будем создавать образ панели управления с выбранными выше элементами индикации при помощи редак- тора интерфейса RemoteXY. Удобнее всего новый проект созда- вать на основе предыдущего (рис. 5.1).
362 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Начинаем работать с новым проектом Для начала в редакторе интерфейсов откроем предыдущий проект. Удалим все элементы с «экрана смартфона» и запи- шем проект под другим именем, используя для этого кнопку (Записать). ВНИМАНИЕ. После того, как вы внесли изменения в интерфейс, созданный для программного примера 5.1, не за- будьте обязательно записать проект с изменени- ями под новым именем! Если вместо кнопки^З^Ваписатькак...) вы слу- чайно нажмете кнопку |ш) (Записать), то вы затрете проект из первого примера! А он вам мо- жет еще пригодиться. Вместо удаленных элементов управления на «экране смарт- фона» мы разместим элементы индикации. Такой прием (соз- дание нового проекта путем переделки старого) позволит нам не проходить заново этап установки свойств в разделах «Конфигурация» и «Подключение модуля». ПЛП Оставить свойства без измене- «&«: ния можно было бы также и в разделе «Экран». Но мы, все же, поменяем цвет фона экрана для того, что бы интерфейсы программных примеров 5.1 и 5.2 отли- чались друг от друга своим оформле- нием. Итак, открываем в колонке «Элементы» группу «Индикация». Перетягиваем на виртуальный «экран смартфона» элементы, выбранные нами при постановке задачи. Расположим их так, как показано на рис. 5.19. ! В верхней части экрана слева эле- Рис. 5.19. Проект мент «Индикатор», а справа — «Шкала «Элементы индикации» в дуговая стрелочная». Сразу под ними графическом редакторе
Глава 5. Конструктор графических интерфейсов 363 «Уровень линейный». Еще ниже «Текстовая строка». И, нако- нец, в самом низу экрана «Онлайн график». ПРИМЕЧАНИЕ. После перетаскивания элементов мы несколько из- менили их размеры, а для элемента «Уровень линей- ный» поменяли ориентацию с вертикальной на го- ризонтальную. Еще мы изменили цвета элемента «Текстовая строка» и другие настройки элементов. ч у Подробнее настройки каждого из элементов рассмотрим ниже. Элемент II «Индикатор» II Элемент «Индикатор» имитирует светодиод. Светодиод может быть любого из трех цветов: ♦ красный; ♦ зеленый; ♦ синий. А также многоцветным (с произвольным выбором цвета). Яркость светодиода регулируется плавно. Светодиод имеет 256 уровней яркости по каждому из цветов, от полного потуха- ния (черный цвет) до максимального свечения. В настройках эле- мента «Индикатор» имеется возможность включить сразу два или даже три цвета. При этом светодиод становится: ♦ в первом случае — двухцветным с плавным переходом от од- ного цвета к другому; ♦ во втором случае — многоцветным, отображать все цвета ра- дуги в широком диапазоне яркости. При максимальном уровне всех трех цветовых составляющих светодиод светится белым цветом. Окно редактирования свойств элемента «Индикатор» показано на рис. 5.20. Для управления цветом и яркостью «Индикатора» с этим элементом связаны три специальных пере- менных. Каждая переменная определяет яркость своего цвета.
364 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Рис. 5.20. Настройки элемента «Индикатор» Значение каждой переменной можно изменять в пределах от 0 до 255. Устанавливая разные уровни для каждого цвета можно получить любой нужный цвет. Имена этих переменных состоят из имени элемента с добавле- нием приставки. Для каждого цвета своя приставка. Имя элемента указывается в поле «Имя переменной. Оно дается авто- матически и может быть при желании изменено вами на другое. Как видите, система присвоила эле- менту имя «/ed_l». Имена трех перемен- ных, определяющих цвет и яркость све- чения, в этом случае будут следующие: ♦ «led_l_r» для красного цвета; ♦ «led_ljp> для зеленого цвета; ♦ «led_lj)» для синего цвета. Рассмотрим более подробно окно настроек элемента «Индикатор» (рис. 5.20). Сразу под полем «Имя переменной» мы видим три флажка, при помощи которых можно включить или выключить один из трех цветов. ПРИМЕЧАНИЕ. По умолчанию все флажки не установлены. Вы должны установить хотя бы один их флажков. Если флажок не установлен, цвет не выбран и связанная с этим цветом переменная тоже не существует. Для нашего примера мы установим все три флажка. Поле «Отрисовка» определяет внешний вид индикатора. Доступны два значения: ♦ «Круглая»; ♦ «Прямоугольная». Поле «Окантовка» определяет стиль окантовки индикатора. Доступны три варианта окантовки: ♦ «Темная»; ♦ «Светлая»; ♦ «Нет окантовки».
Глава 5. Конструктор графических интерфейсов 365 Элемент | «Уровень линейный» I Окно настройки элемента «Уровень линейный» показаны на рис. 5.21. ЧТО ЕСТЬ ЧТО. ■ л Линейный уровень - это подвижный столбик, дли- на которого изменяется, отображая индицируемую величину Настройки элемента начинаются с двух полей выбора цвета. Это уже знакомые нам поля «Цвет» и «Цвет фона». Далее идет поле «Имя переменной». С элементом «Уровень линейный» свя- зана лишь одна переменная. Имя ее, разумеется, тоже задается автоматически. Ниже поля «Имя переменной» | — расположено поле «Ориентация». По умолчанию значение этого пара- метра «Вертикально». Мы же выберем «Горизонтально». Следующее поле «Позиция цен- тра» определяет точку, откуда будет «вырастать» столбик индикатора уровня. Доступны три варианта: ♦ «Слева» (столбик вырастает от левого края окна индикатора); ♦ «Справа» (столбик растер от правого края); ♦ «Посередине» (столбик растет от сре- дины окна индикатора в обе сторо- ны). От выбора параметра «Позиция цен- тра» зависят свойства переменной, свя- занной с элементом «Уровень линейный». Если выбраны варианты «Слева» или Рис. 5.21. Настройки «Справа», то переменной можно присва- элемента «Уровень ивать значение в диапазоне от 0 до 100. линейный»
366 Управление модулем ARDUINO по Wi-Fi с мобильных устройств При этом столбик будет изменять свой размер: ♦ от минимального (столбик отсутствует); ♦ до максимально возможного (столбик занимает все окно ин- дикатора). При выборе первых двух вариантов параметра «Позиция центра» переменная /eveM, связанная с этим элементом, имеет тип — Целое число без знака. При выборе варианта «Посередине» для правильной работы индикатора переменной level J, нужно присваивать зна- чения в диапазоне от минус 100 до плюс 100. Для этого тип пере- менной изменяется на «Целое число со знаком». ПРИМЕЧАНИЕ. При отрицательных значениях столбик индика- тора растет от центра влево, а при положитель- ных значениях столбик растет от центра вправо. При нулевом значении длина столбика равна нулю (столбик отсутствует). Если бы мы оставили значение параметра «Ориентация» по умолчанию («Вертикально»), то значения «Справа» и «Слева» в окне свойств элемента были бы заменены на значения «Снизу» и «Сверху». Но логика работы осталась бы прежней. Поле «Вариант отображения» определяет внешний вид самого столбика. Он может быть «Сплошной» или «Сегментный». В последнем случае растущий столбик не сплошной, а состоит из коротких сегментов. I Элемент «Шкала дуговая стрелочная» На рис. 5.22 показано окно настроек элемента «Шкала дуго- вая стрелочная». Этот элемент имитирует механическую стрелоч- ную шкалу.
Глава 5. Конструктор графических интерфейсов 367 ПРИМЕЧАНИЕ. Похожая шкала, напри- мер, применяется в неко- торых моделях счетчи- ков расхода воды. Рис. 5.22. Настройки элемента «Шкала дуговая стрелочная» Основа индикатора — тонкая стрелка, движущаяся на фоне импро- визированной шкалы. Шкала условная. Точное значение отображаемой вели- чины можно оценить только приблизи1 тельно. В свойствах элемента имеется лишь одно поле выбора цвета. Оно опреде- ляет только цвет шкалы. Цвет стрелки и круглого утолщения на ее оси изменить невозможно. Фон под индикатором про- зрачный. Сквозь него виден цвет панели. Под полем выбора цвета мы видим три поля свойств, кото- рые полностью аналогичны соответствующим полям элемента «Уровень линейный». Свойства переменной, связанной с элемен- том «Шкала дуговая стрелочная» также зависят от выбора значе- ния параметра «Позиция центра». Если позиция центра «Слева» или «Справа», то перемен- ной можно присваивать значения в диапазоне от 0 до 100. При этом стрелка перемещается по дуге из одной крайней позиции в другую крайнюю позицию. Если значение этого параметра — «Посередине», то пере- менной нужно присваивать значения в диапазоне от минус 100 до плюс 100. При значении переменной, равном нулю, стрелка устанав- ливается по центру шкалы. В нашем случае, когда элемент расположен горизонтально, стрелка установится вертикально. При отрицательных значениях переменной стрелка откло- няется влево, при положительных значениях переменной стрелка идет вправо.
368 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Если вы обратили внимание, элемент «Уровень ли- нейный» имеет имя level__l, а элемент «Шкала дуго- вая стрелочная» имеет имя level__2, хотя на экране Шкала дуговая стоит раньше Линейного уровня. Это произошло потому, что имена даются в по- рядке создания элементов. Элемент «Уровень ли- нейный» был создан раньше. I Элемент «Текстовая строка» На рис. 5.23 показано окно настроек элемента «Текстовая строка». Этот элемент дает возможность выводить на экран пульта управления любую текстовую надпись. Первые два параметра в окне настроек предназначены для выбора цвета текста и цвета фона, на котором будет написан этот текст. Следующий параметр стандарт- ный — «Имя переменной». Переменная ; имеет тип символьного массива. Размер \ этого массива выбирается в следующем \ поле, которое называется «Символов». Количество символов просто вносится в поле с клавиатуры. Размер массива огра- ничивается лишь возможностями модуля ШШШ ARDUINO и здравым смыслом. Этот мае- | сив будет храниться в памяти микрокон- ! троллера. А она не безгранична. СОВЕТ. Выбирайте размер как можно меньше, но такой, что бы знаков хватило для отображения всей не- обходимой информации. Рис. 5.23. Настройки элемента «Текстовая строка»
Глава 5. Конструктор графических интерфейсов 369 При создании исходного кода программы размер массива автоматически увеличится на единицу. Лишний разряд нужен для того, чтобы в конце сообщения можно было записать обязатель- ный завершающий нулевой код. Параметр «Выравнивание» определяет выравнивание выво- димого текста. Вы можете выбрать из трех вариантов: ♦ «Слева»; ♦ «Справа»; ♦ «Центр». Мы оставим значение по умолчанию — выравнивание по центру. Флажок «Показывать фон» позволяет отключить действие параметра «Цвет фона». Если флажок не выбран — фон будет про- зрачный (соответствовать фону окна). Элемент II «Онлайн график» I На рис. 5.24 показано окно настроек элемента «Онлайн график». Через соответствующие переменные на этот элемент можно подавать от одного до десяти разных величин. Из этих величин в поле графика на экране вашего пульта в режиме реаль- ного времени составляется набор графиков. Для каждой величины свой график. Каждый график отобра- жает изменение соответствующей величины во времени. ПРИМЕЧАНИЕ. При помощи пальцев, стандартными жестами для тачпада в поле графика вы можете перемещать изображение вправо и влево, а также увеличивать и уменьшать масштаб изображения. Точно так, как вы это делаете с другими изображениями на смартфоне. Первый параметр в окне настроек элемента «Онлайн гра- фик» (рис. 5.25) — «Цвет фона». Вы можете выбрать фон, на кото-
370 Управление модулем ARDUINO по Wi-Fi с мобильных устройств шшш Рис. 5.24. Настройки элемента «Онлайн график» gig помечен ■1ере«©г?ной ( V: Показать легеилу ■V-- Показать зидцени? mm {УэгшУ \/3iiabsg 3 Рис. 5.25. вь/5ор легенд элемента «Онлайн график» ром будут вырисовываться все графики. При выборе цвета фона следите, чтобы он сочетался с цветами самих графиков. СОВЕТ. Важно обеспечить достаточную контрастность изображения. Если цвет фона и цвет одного из гра- фиков будут близки друг к другу, график будет сла- бо виден. Следующий параметр называется «Имя переменной». На самом деле это имя самого элемента, Переменных у элемента «Онлайн график» столько, сколько будет строиться графиков. Имя каждой переменной состоит из имени элемента, к которому добавлено имя графика.
Глава 5. Конструктор графических интерфейсов 371 В нашем случае элементу присвоено имя «onlineGraph_l». Графиков мы будем строить три. Поэтому и переменных будет три (смотри параметр «Количество значений» на рис. 5.24). В нашем случае переменные имеют следующие имена: «onlineGraph_l_var 1» «onlineGraph_l_var2» «onlineGraph_l_var3». Два флажка «Показывать легенду» и «Показывать значе- ния» расширяют возможности индикации графиков. Если уста- новить флажок «Показывать легенду», то в поле, где рисуются гра- фики, в верхней его части появятся, так называемые, «Легенды» для каждого из графиков. Выглядит каждая «Легенда» как отрезок линии цвета одного из графиков, подписанный названием этого графика (легендой). ПРИМЕЧАНИЕ. По умолчанию используются автоматически присвоенные легенды для каждого из графиков: «Variable 1», «Variable 2», «Variable 3». Вы можете выбрать свои значения легенды для каждого графика. Для этого в нижней части окна настроек элемента появляются специальные поля с именами легенд (рис. 5.25). Неинформативные легенды, присвоенные автоматически, логично поменять на имена, характеризующие назначение изменяемой величины. Например, «Температура», «Давление», «Влажность». ВНИМАНИЕ. Не путайте легенду и имя графика. Имя графика («varl», «var2», «var3») выбирается автоматически, и изменить его невозможно. Имя графика являет- ся расширением для имени переменной. Легенда используется только на экране, для увеличения ин- формативности.
372 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Флажок «Показывать значения» включает режим показа текущего мгновенного значения каждой из величин, по которым строится графики. Текущие значения величин показываются с правой стороны от каждого графика в числовом виде. В резуль- тате вы можете не только наблюдать характер изменения вели- чины во времени, но постоянно видеть мгновенную величину текущего значения каждого графика в цифровом выражении. Поле «Количество значений» находится сразу под двумя описанными выше флажками. Количество значений равно коли- честву графиков. Значений у нас будет три. Нижнюю часть окна настроек элемента «Онлайн График» занимает блок параметров под общим заголовком «Данные гра- фиков». Под этим заголовком идут наборы параметров для каж- дого из графиков («Данные 1», «Данные 2», «Данные 3»). Если режим вывода легенд не включен, то для каждого из гра- фиков можно выбрать только его цвет (рис. 5.24). По умолчанию выбраны красный, зеленый и желтый цвета. СОВЕТ. Вы можете изменить любой из этих цветов. Помните лишь о том, что цвета всех графиков должны сочетаться с фоном элемента. Если выбран режим «Показывать легенду», у каждого графика появится еще один параметр — поле «Легенда» (рис. 5.25). В этом поле уже будут вписаны легенды по умолчанию. Вы можете изменить имя любой из легенд.
Глава 5. Конструктор графических интерфейсов 373 5.8. Проверка элементов индикации: схема и программа ВИРТУАЛЬНЫЙ ДИСК. Пример 5.2 (папка на ВИРТУАЛЬНОМ диске Ррг_5_02) Готовимся 1 к созданию программы II После того, как образ будущего пульта управления (а точнее пульта индикации) будет готов, можно приступать к созданию программы. ПРИМЕЧАНИЕ. Как вы уже убедились, эта задача сильно облегча- ется, если вы работаете в проекте RemoteXY. Для начала автоматически сформируем исходный код про- граммы, просто нажав в окне графического редактора на сайте [11] кнопку «Получить исходный код». Затем перенесем исходный код на свой компьютер, создав новый проект, который назовем Ррг_5_02. ПРИМЕЧАНИЕ. Как это делать мы подробно разбирали в первом примере в этой главе (смотри раздел 5.4). Теперь нам нужно доработать автоматически сформирован- ную программу так, чтобы она приобрела законченный вид. На этот раз, без каких либо доработок автоматически сформиро- ванная программа ничего не умеет. Для элементов индикации не предусмотрены такие удобства, какие имеются для элементов «Кнопка» и «Выключатель», когда операции обработки их нажа-
374 Управление модулем ARDUINO по Wi-Fi с мобильных устройств тия вставляются в программу автоматически. В нашем случае, чтобы что-то заработало, нужно программу дополнять. Прежде чем дорабатывать программу, мы должны придумать, каким образом мы будем формировать изменяющиеся значе- ния, которые будут подаваться на элементы индикации для того, чтобы наглядно увидеть их работу. При этом желательно максимально сымитировать реальные способы получения измеряемых величин. Получить их так, как это обычно происходит в микроконтроллерных устройствах. Удобнее всего воспользоваться аналоговыми входами модуля ARDUINO. Если подать на несколько из входов некое внешнее напряжение, которое можно было бы изменять при помощи регуляторов, то микроконтроллер мог бы считывать величину этих напряжений и подавать считанное значение на разные элементы индикации. I Постановка задачи Задача. Разработать схему на основе микроконтроллерного ком- плекта — «УЧЕБНЫЙ МОДУЛЬ» в рамках проекта RemoteXY. Схема должна иметь три регулятора напряжения. Напряжение с каждого регулятора должно поступать на свой аналоговый вход модуля ARDUINO и использоваться для отображения при помощи элементов индикации на разработанном в раз- деле 5.7 пульте управления. Порядок отображения измеряемых величин должен быть следующий: ♦ на элемент «Индикатор» должны влиять все три напряжения, позволяя добиться любого цвет его свечения и любой яркости; ♦ одновременно величина напряжения номер 1 должна отобра- жаться при помощи элемента «Уровень линейный», напря- жение номер 2 должно отображаться элементом индикации «Шкала дуговая стрелочная», а напряжение номер 3 должно отображаться в числовом виде в условных единицах при по- мощи элемента индикации «Текстовая строка»; ♦ элемент индикации «Онлайн график» должен строить три графика, используя все три входных напряжения.
Глава 5. Конструктор графических интерфейсов 375 Схема Описанным выше условиям отвечает схема, приведенная на рис. 5.26. Схема предельно проста. Основа схемы — наш УЧЕБНЫЙ МОДУЛЬ. В качестве источника тестовых напряжений используются три переменных резистора Rl, R2 и R3. Каждый резистор включен по схеме потенциометра: своими крайними выводами включен между шиной питания и общим проводом, тестовое напряжение снимается с движка резистора. Снятые с движка каждого резистора напряжения подается каждое на свой аналоговый вход модуля ARDUINO. Используются аналоговые входы АО, А1 иА2. Программа Мы не будем публиковать исходный код, полученный авто- матически в редакторе интерфейсов. Доработанную версию про- граммы вы можете видеть в листинге 5.2. R1...R3 10К Рис. 5.26. Схема устройства для проверки элементов индикации
376 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Текст программы — это «Исходный код», доработанный в соответствии с требованиями, заданными при постановке задачи. ПРИМЕЧАНИЕ. Так же, как и в предыдущем примере, мы не приво- дим шапку программы. Шапка программ, сформиро- ванных автоматически редактором RemoteXY всег- да одинаковая. Она содержит краткое описание на- значения программы, источник получения и порядок применения. А также условия лицензирования. В процессе доработки, как и в прошлом случае, изменен стиль написания программы без изменения набора и последователь- ности команд. Это позволило немного сократить число строк в листинге. Собственно текст программы начинается со строки 18 (листинг 5.2). И начинает программу неизменяемый блок. Блок называется «RemoteXY include library» и занимает строки с 18 по 62. Этот блок определяет все константы, переменные и пара- метры, необходимые для работы библиотеки «RemoteXY.h». Блок ограничен с двух сторон начальным и конечным заголовками. ВНИМАНИЕ. Все, что находится между указанными выше заго- ловками, категорически запрещается изменять. Изменить этот блок команд можно только через графический редактор (изменить настройки эле- ментов в редакторе и сформировать заново исход- ный код программы). Содержимое неизменяемого блока почти такое же, как и в предыдущем примере (листинги 5.1.1 и 5.1.2). Отличия связаны с тем, что в новой программе используются другие элементы и другие переменные.
Глава 5. Конструктор графических интерфейсов 377 В связи с этим в неизменяемом блоке для нового проекта (листинг 5.2) другими будут: ♦ во-первых, массив RemoteXY_CONF[]y задающий внешний вид и конфигурацию пульта управления (строки 35...41); ♦ во-вторых, набор переменных в структуре RemoteXY. Вместо блока переменных, связанных с элементами управле- ния, в новой программе имеется блок переменных, связанных с элементами индикации (строки 46...54). ПРИМЕЧАНИЕ. Так как конфигурация всей системы и вид канала связи остались неизменными, то строки 27...31 в новой программе (листинг 5.2) остались такими же, как и в старой (листинг 5.1.1 или 5.1.2). Только номера строк изменились. Остальная часть исходного кода программы до доработки представляла со|5ой пустую заготовку, содержащую лишь две стандартные системные функции setupQ и loopQ, практически пустые. Функция setupQ содержала лишь команду вызова библиотеч- ной функцииRemoteXYInitQ, а функция loopQ — вызов библио- течной функции RemoteXY__HandlerQ. ПРИМЕЧАНИЕ. Далее, при описании доработанной версии програм- мы мы подробно опишем, что нам пришлось доба- вить в программу, что бы обеспечить ее работо- способность. В строках 63...65 (листинг 5.2) размещены три оператора определения имени для трех аналоговых входов. Входам 0,1 и 2 определены имена AnalogPinO,AnalogPinl nAnalogPin2.
378 Управление модулем ARDUINO no Wi-Fi с мобильных устройав Листинг 5.2. Программа проверки элементов индикации // RemoteXY include library // // определение режима соединения и подключение библиотеки RemoteXY ♦define REMOTEXYMODE ESP8266_HARDSERIAL «include <RemoteXY.h> // настройки соединения «define REMOTEXYSERIAL Serial «define REMOTEXYSERIALSPEED 115200 «define REMOTEXY_WIFI_SSID "MyWiFi" «define REMOTEXYWIFIPASSWORD "ParolMyWiFi" «define REMOTEXYSERVERPORT 6377 // конфигурация интерфейса «pragma pack(push, 1) umt8_t RemoteXYCONFJ] - { 255,0,0,28,0,44,0,8,138,lr 66,129, 6, 34,51,7,2,26,65,7, 11,11,9,9,68,19,4,64,54,32, 27,36,135,94,67,5,5,48,52,12, 189,16,11,66,132,29,6,26,20,38, 24 >; // структура определяет все переменные вашего интерфейса управления struct { // output variable int8_t level_l; // =O..1OO положение уровня uint8_t led_l_r; // =0..255 яркость красного цвета индикатора uint8_t led_l_g; // =0..255 яркость зеленого цвета индикатора umt8_t led_l_b; // =0..255 яркость синего цвета индикатора float onlineGraph_l_varl; float onlineGraph_l_var2; float onlineGraph_l_var3; char text_l[ll]; // ^строка UTF8 оканчивающаяся нулем int8_t level_2; // =0..100 положение уровня // lheubt gthtvtyyst uint8_t connect_flag; // «1 если соединение установлено, иначе *0 } RemoteXY; «pragma pack(pop) It END RemoteXY include // miiiin/n/m/ii/fi/i/mmiiinii/i/im «define AnalogPinO 0 // Аналоговый вход 1 «define AnalogPinl 1 // Аналоговый вход 2 «define AnalogPin2 2 // Аналоговый вход З
Глава 5. Конструктор графических интерфейсов 379 68 void setup() { 69 RemoteXY_Init () ;• 70} 71 72 void loop() { ReraoteXY_Handler (); int aval_0 — analogRead(AnalogPinO); nit aval_l = analogRead(AnalogPinl); int aval_2 = analogRead(AnalogPin2); // Процедура обмена данными // Считывание аналогового значения с R1 // Считывание аналогового значения с R2 // Считывание аналогового значения с R3 RemoteXY.levell = aval_0/10; // Передача значения на линейный индикатор RamoteXY.level_2 = aval_l/10; // Передача значения на стрелочный индикатор String(aval_2/2.55).toCharArray(RemoteXY.text_l, 11); // на текстовый индикатор RanoteXY.ledlr RemoteXY.ledlg RemoteXY.led 1 b aval_0/4; // Установка красной составляющей светодиода aval_l/4; // Установка зеленой составляющей светодиода aval 2/4; // Установка синей составляющей светодиода RemoteXY.onlineGraphlvarl - aval_0; RemoteXY.onlineGraph_l_var2 - aval_l; DteXY.onlineGraph_l_yar3 = aval_2; // Вывод первого графика // Вывод второго графика // Вывод третьего графика ПРИМЕЧАНИЕ. Именовать аналоговые входы не обязательно. Но поименованные элементы программы, во-первых, улучшают ее читаемость (теперь сразу понятно назначение вывода), а, во-вторых, облегчается за- мена параметров. Как II это работает I Допустим, вы захотели оперативно поменять номера входов. Теперь вам не нужно искать, где в программе цифры 0,1 и 2 имеют смысл номера аналогового входа. Особенно сложно это делать, если номер аналогового входа в программе используется несколько раз. Если входы поименованы, можно лишь поменять номер входа в команде именования. Всего в одном месте и в начале программы. Функция setupQ в окончательной версии программы зани- мает строки 68...70. Она содержит всего одну команду — команду вызова библиотечной функции RemoteXYJnitQ.
380 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Основной цикл программы loopQ занимает строки 72...89. После обязательной команды вызова функции обмена данными в строке 73, добавлены операторы, которые реализуют основной алгоритм, заданный при постановке задачи. Сначала, в строках 74...76 производится считывание кон- трольных напряжений с каждого из аналоговых входов. Каждый из трех операторов analogReadQ считывает значение уровня со своего аналогового входа и помещает его в свою отдельную переменную: ♦ значения, считанные с входа AnalogPinO, записывается в пе- ременную aval_0; ♦ значение с входа AnalogPinl помещается в aval_l; ♦ значение из AnalogPin2 — в переменную aval_2. ПРИМЕЧАНИЕ. Как известно, аналоговый выход россчитон но из- мерение напряжения от 0 до +5 В. При этом анало- гово-цифровой преобразователь выдает на выходе цифровое значение в диапазоне от 0 до 1023. I Пересчет значений При входном напряжение 0 В АЦП выдает цифру 0, а при напря- жении на входе +5 В на выходе АЦП будет 1023. Микроконтроллер модуля ARDUINO считывает это напряжение при помощи опера- тора analogReadQ. Поэтому значения переменных aval_0, aval_l, aval_2 будут лежать именно в этих пределах (от О до 1023). В строках 78 и 79 находятся операторы, присваивающие значения переменным level_l и level_2, связанным с элементами индикации: ♦ «Уровень линейный»; ♦ «Шкала дуговая стрелочная», соответственно. Обе переменные входят в структуру RemoteXY. В следующем цикле обмена данными эти значения будут переданы по Wi-Fi каналу и отобразятся на индикаторах пульта управления на смартфоне. Как вы можете видеть из программы, переменным
Глава 5. Конструктор графических интерфейсов 381 level_l и level_2 присваиваются не сами значения, считанные с аналоговых входов. В момент присвоения происходит пересчет диапазона. Как мы уже знаем, диапазон значений для элементов «Линейный индикатор» и «Шкала дуговая стрелочная» составляет 0...100 единиц. А переменные avalj) и avaljl содержат значения, изменяющиеся в интервале 0...1023. Поэтому перед присвоением это значение делится на 10 (строки 78,79). Теперь, согласно поставленной выше задаче, значение пере- менной aval__2 мы должны использовать для проверки элемента индикации «Текстовая строка». ПРИМЕЧАНИЕ. 1 N Если просто вывести число в текстовую строку, то получится не очень наглядно. Эффектнее выглядят десятичные дроби с большим количеством знаков. Поэтому было решено поделить выводимую величи- ну на какое-нибудь дробное число. Поэтому в нашей программе перед выводом в текстовый индикатор значение переменной aval_2 делится на 2,55. \ . В строке 80 мы видим сложный оператор, который выводит на текстовый индикатор число, полученное от деления значения переменной aval_2 на 2,55. Для того, чтобы полученное число поместить в текстовое поле нужно сначала преобразовать его в строку. Для этого воспользуемся специальной функцией StringQy кото- рая называется «Конструктор строкового объекта». Такой кон- структор преобразует значение переменной любого типа в тексто- вую строку. В результате своей работы функция возвращает тексто- вый объект, содержащий сформированную текстовую строку. В нашем случае конструктор StringQ преобразует число (результат деления) в символьную строку (записывает число сим- волами). Поместить символьную строку в массив символов text_l[] нам поможет метод строкового объекта toCharArray(). У этого метода два параметра: ♦ первый — это массив, куда нужно поместить строку; ♦ второй — размерность массива.
382 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Все перечисленные выше операторы объединены в одно выражение, расположенное в строке 80 программы. Выражение преобразует результат от деления в символьный вид и помещает символьное выражение в массив text_l9 входящий в структуру RemoteXY. После очередного сеанса обмена данными содержимое массива передается на мобильное приложение и отображается в поле элемента индикации «Текстовая строка». В строках 82...84 находятся три оператора присвоения, кото- рые реализуют процедуру управления яркостью и цветом све- чения элемента «Индикатор». Трем переменным, связанным с «Индикатором», присваиваются значения, пропорциональные трем контрольным значениям, считанным с аналоговых входов. Диапазон значений для каждой из трех переменных «Индикатора» должен лежать в пределах O...255 (всего 256 разных значений). Учитывая, что контрольные значения, поступающие с ана- логовых входов, лежат в пределах от 0 до 1023 (всего 1024 раз- ных значения), каждое управляющее значение мы делим на 4 (1024/4=256). Значения, считанные с аналоговых входов, распре- деляется по переменным «Индикатора» так, как это показано в табл. 5.1. Схема связи аналоговых входов и цветовых каналов «Индикатора» Таблица 5.1 Резистор R1 R2 R3 Аналоговый вход AnalogPinO, AnalogPinl AnalogPin2 Переменная хранения aval 0 aval 1 aval 2 Переменная «Индикатора» led 1 г led_l_g led 1 b Цвет Красный Зеленый Синий В строках 86...88 находятся операторы присвоения значений трем переменным элемента индикации «Онлайн график». В дан- ном случае значения присваиваются целиком без всяких коэф- фициентов. Переменные, связанные с элементом «Онлайн гра- фик», имеют тип float (вещественное число), поэтому работает с любыми вещественными величинами. В табл. 5.2 показано распределение аналоговых значений для элемента «Онлайн график».
Глава 5. Конструктор графических интерфейсов 383 Схема связи аналоговых входов и цветовых каналов «Онлайн график» Таблица 5.2 Резистор R1 R2 R3 Аналоговый вход AnalogPinO AnalogPinl AnalogPin2 Переменная хранения aval 0 aval 1 aval 2 Переменная «Индикатора» onlineGraph_l_varl onlineGraph_l_var2 onlineGraph_l_var3 Цвет графика Красный Зеленый Желтый В строке 89 заканчивается функция 1оор(). Дойдя до этого места, программа возвращается к началу основного цикла (строка 73), и цикл продолжается сначала. В начале каждого про- хода цикла происходит сеанс обмена данными. Запуск и использование | программы I Порядок работы с программой предельно прост. После компи- ляции и загрузки программы в программную память ARDUINO, она начинает работать. Если все настройки были внесены верно, то УЧЕБНЫЙ МОДУЛЬ подключается к домашней (корпоратив- ной) сети. Далее, нужно запустить мобильное приложение и подклю- читься к УЧЕБНОМУ МОДУЛЮ. Если УЧЕБНЫЙ МОДУЛЬ тот же самый, на котором мы про- бовали работу предыдущего программного примера, то для под- ключения просто используйте уже имеющуюся в приложении кнопку выбора устройства. Сразу после подключения на экране смартфона появится изо- бражение пульта с элементами индикации (рис. 5.27). Далее, просто проворачивайте рукоятки резисторов Rl, R2, R3 и наблюдайте влияние каждого из них на элементы индикации. Вы увидите: ♦ как изменяет цвет и яркость светодиод; ♦ как поворачивается стрелка на дуговой шкале; ♦ как растет и укорачивается линейный индикатор. При этом в построителе графиков все ваши операции с рези- сторами отобразятся в виде трех кривых. Кроме самих кри- вых, в окне построителя графиков в левой его части вы можете
384 Управление модулем ARDUINO по Wi-Fi с мобильных устройств видеть три полупрозрачных цифры: 1000,500 и 0. Это вертикальная шкала уровня сигналов (в относительных цифровых единицах). В нижнем левом углу окна построителя такое же полупрозрач- ное изображение — текущее время. С правой стороны напротив каждой кривой вы можете видеть цифры мгновенного уровня для каждого графика. На рис. 5.27 эти уровни равны 616,424,241. Попробуйте самостоятельно изменить настройки в редакторе интерфейсов. Например, включите у элемента «Онлайн График» режим отображения Легенд. Присвойте каж- дой легенде свое имя. Сформируйте новый исходный код программы. Затем замените в вашей уже дора- ботанной программе автоматически созданную часть на новую. Чтобы не потерять ту часть текста основной программы, которую мы внесли при ее доработке, из нового варианта исход- ного кода просто скопируйте только один неизменяемый блок «RemoteXY include library». Начиная с начального заголовка и до заголовка конечного. И вставьте скопированный текст вместо старого варианта неизменяемого блока в результирующую про- грамму. Откомпилируйте, загрузите программу и попробуйте новый вариант в работе. На этом мы заканчиваем изучение проекта RemoteXY. Надеюсь, основные моменты использования проекта и его пре- имущества вы поняли. Ну, а в следующей главе мы научимся обходиться без ARDUINO и строить микроконтроллерные системы, управляемые со смарт- фона по Wi-Fi каналу лишь на основе модуля ESP-01. Рис. 5.27. Изображение на смартфоне пульта с элементами индикации
ГЛАВА 6 ИСПОЛЬЗОВАНИЕ ESP-O1 5E3ARDUINO В этой главе мы научимся обходиться без ARDUINO. Мы будем создавать электронные устройства лишь на основе модуля ESP-01 и управлять ими со смартфона по Wi-Fi. При этом мы, как и прежде, для написания программ будем использовать знакомую нам среду разработок IDE и знакомый нам язык, используемый при программировании для ARDUINO. При программировании для ESP8266EX используется тот же самый язык, который мы использовали ранее для составле- ния програм для Ардуино. Особенности использования языка вы поймете в процессе разбора конкретных программ. Более подробно это описано в конце книги в Приложении 4.
386 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 6.1. Начинаем действовать без ARDUINO I Модули на основе микросхемы ESP8266EX - самостоятельные микроконтроллерные устройства В данной главе мы рассмотрим вопросы использования микросхемы ESP8266EX и модулей на ее основе как самостоятель- ные микроконтроллерные устройства для решения различных задач автоматизации и управления. При этом составлять про- граммы для этих устройств мы будем в уже знакомой нам среде программирования IDE ARDUINO. ПРИМЕЧАНИЕ. То есть, от ARDUINO у нас останется только среда программирования. Для того чтобы среда IDE смогла поддерживать возможность про- граммирования для ESP8266EX, необходимо скачать и установить соответствующий плагин. Скачивание и установка производится самой средой программирования. Рассмотрим, как это делается. Загрузка и установка плагина СОВЕТ. Рекомендую использовать ARDUINO IDE версии 1.6.5 или выше. Шаг 1. Запустите программу IDE, прейдите в меню «Файл/ Настройки («File/Preferences») и найдите в диалоговом окне
Глава 6. Использование ESP-O1 6e3ARDUINO 387 поле ввода «Дополнительные ссылки для Менеджера плат» («Additional Board Manager URLs»). Введите указанный ниже URL точно так, как он записан в книге, и нажмите ОК: http://arduino.esp8266.com/stable/package_esp8266comjndex.json ПРИМЕЧАНИЕ. Перед выполнением этой операции убедитесь, что ваш компьютер подключен к Интернет. Шаг 2. Далее, выберите пункт «Инструменты / Плата... / Менеджер плат» («Tools / Board... / Board Manager») и найдите в списке пункт «esp8266 by ESP8266 Community» («Получить ESP8266 из ESP8266 сообщества»). Для поиска используйте строку фильтра в верхней части окна. В строке фильтра достаточно просто набрать «8266», и нужный вам пункт останется единственным в списке. Выберите эту запись и нажмите кнопку «Установка» («Install»). Запускается процесс загрузки и установки, который будет про- должаться несколько минут. Устанавливаемый плагин, в допол- нение к базовому модулю ESP8266, обеспечивает поддержку еще нескольких платформ: ♦ NodeMCU; ♦ Huzzah; ♦ SweetPea. Возможно, что список со временем еще пополнится. Шаг 3. Когда установка закончится, нажмите кнопку «Закрыть» («Close»). Шаг 4. Далее выберите пункт меню «Инструменты» («Tools»), перейдите в список плат и выберите «Generic ESP8266 Module». СОВЕТ. Рекомендую после этого снова выбрать пункт «Инструменты» («Tools») и убедиться, что напро- тив пункта меню «Платы» выбрана плата «Generic ESP8266 Module».
388 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Загруженный плагин позволяет программировать на языке ARDUINO для любых устройств на основе контроллера ESP8266EX и загружать ее в программную память любого модуля из линейки ESP. Вместе с ним на ваш компьютер загрузится комплект про- граммных примеров. ПРИМЕЧАНИЕ. Примеры будут помещены в стандартную область примеров пакета программ IDE. Вы можете сразу выбрать и оттранслировать любой из примеров и попробовать его в работе. I Подключение модуля к компьютеру Сначала нужно подключить модуль к компьютеру. Для этого можно использовать один из USB-адаптеров. ПРИМЕЧАНИЕ. В разделе 2.4 мы уже подробно говорили о том, как подключить модуль к компьютеру для пере- прошивки его программной части SDK. Для того, чтобы среда IDE могла загружать в модуль свою прошивку, нам нужно обеспечить точно такое же подключение. А именно, для подключения модуля ESP-O1 к адаптеру вы должны использовать адаптер, имеющий переключатель режима «Работа-Программирование» и кнопку сброса. Либо, если такого USB-адаптера не найдется, доработать простой адаптер, припаяв переключатель и кнопку сброса, как это показано на рис. 2.17 и рис. 2.23. Переключатель припаивается между контактом GPIO0 и общим проводом, а кнопка сброса — между контактом RST и тем же общим проводом (GND).
Глава 6. Использование ESP-O1 6e3ARDUINO 389 +З.ЗВ Адаптер USB-TTL R1...R3 4,7 кОм Рис. 6.1. Схема адаптера для программирования модуля ESP-01 СОВЕТ. Если такой способ вам покажется не очень удоб- ным, вы можете самостоятельно собрать схему изображенную на рис. 6.1. В схеме используется стандартный универсальный адап- тер, два варианта которого мы представляли во второй главе (рис. 2.16). Такую схему можно спаять на универсальной монтаж- ной плате, на которую нужно установить: ♦ переключатель «Работа/Программирование»; ♦ кнопку сброса; ♦ разъем для подключения модуля ESP-O1. СОВЕТ. На туже плату желательно установить микросхе- му стабилизатора напряжения 3,3 В типа LM1117 или аналогичную для питания модуля ESP-O1. В крайнем случае, для питания модуля можно использовать напряжение от платы адаптера (см. схему на рис. 6.1). Но эта плата имеет слаботочный источник, который может «не потя- нуть» питание модуля на пике мощности в режиме передачи дан- ных по Wi-Fi.
390 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Загрузка программы в программную память модуля ESP-01 Порядок действий оператора в среде IDE при загрузке про- граммы в программную память модуля ESP-01 следующий. Шаг 1. Перед тем, как начинать процесс компиляции и загрузки необходимо перевести переключатель «Работа/ Программирование» на адаптере в режим программирования. Шаг 2. Далее, нужно кратковременно нажать и отпустить кнопку сброса. Шаг Z. Только после этого можно выполнить загрузку, щел- кнув на панели задач кнопку (3 или выбрав в меню «Скетч» пункт «Загрузка». Когда компиляция и загрузка закончатся, необходимо вернуть переключатель в режим «Работа» и снова нажать кнопку «Сброс». ПРИМЕЧАНИЕ. Все действия можно производить, не отключая адаптер от компьютера и не выключая питания. 6.2. Выбор программных примеров I Загрузка программного примера Попробуем выбрать, открыть и оттранслировать один из про- граммный примеров, загруженных в среду IDE вместе с плагином для микроконтроллеров ESP8266EX. Для этого нужно сделать сле- дующее. Шаг 1. Выберите пункт меню «Файл/Примеры» («File/Examples») и найдите в списке примеров под- пункт «ESP8266WiFi». В открывшемся подменю выберите, напри- мер, «WiFiScan». Откроется новое окно IDE ARDUINO с кодом примера WiFiScan.
Глава 6. Использование ESP-O1 6e3ARDUINO 391 Шаг 2. Подключите модуль ESP-O1 через адаптер к ком- пьютеру и убедитесь, что на модуле горит красный светодиод. Выберите пункт меню «Инструменты / Порт» («Tools / Port») и выберите порт, к которому подключен ESP-O1. ПРИМЕЧАНИЕ. Как определять номер порта, мы уже несколько раз говорили выше. Теперь все готово для загрузки программы. Шаг 3. Переведите переключатель «Работа-Программи- рование» в режим программирования. Кратковременно нажмите кнопку «Сброс». Шаг 4. Нажмите кнопку 0 («Загрузка») в панели инструмен- тов ARDUINO IDE или выберите пункт «Загрузка» в меню «Скетч». Скетч должен скомпилироваться и загрузиться в память модуля. Это займет примерно одну минуту. Сначала в окне системных сообщений (черное окно в нижней части экрана) вы увидите ряд сообщений, отражающих ход ком- пиляции (белым шрифтом на черном фоне окна). ПРИМЕЧАНИЕ. Такие сообщения вы могли наблюдать при компиля- ции программ для «ARDUINO UNO» (любой из при- меров из главы 4). Далее система выдаст ряд сообщений красным цветом, о ходе загрузки скомпилированной программы в память. Сначала должна появиться примерно такая надпись: «Uploading 256000 bytes from...» (Загрузка 256000 байтов из...). А за ней указан путь и имя файла, в котором содержится загружаемая в память информация.
392 Управление модулем ARDUINO по Wi-Fi с мобильных устройств 1 /* 2 * This sketch demonstrates how to scan WiFi networks. 3 * The API is almost the same as with the WiFi Shield library, 4 * the most obvious difference being the different file you need to include: 5 */ 6 #mclude "ЕЗР8266И1Г1.Ь" 7 8 void setup() { 9 Serial.begin (115200); 10 Рис. 6.2. Компиляция и загрузка программы в модуль ESP-01 Далее тем же красным цветом индицируется ход процесса загрузки. На экране будет отображаться индикатор хода загрузки в виде растущего ряда точек. Для индикации всего процесса одного ряда не достаточно. Загрузив примерно треть объема, программа начнет рисовать следующий ряд. Количество рядов зависит от объема программы. Обычно про- цесс индикации загрузки занимает 3-4 ряда точек. В конце каж- дого ряда указывается процент выполнения. Загрузка заканчи- вается, когда в конце последнего ряда точек вы увидите надпись 100% (рис. 6.2). ПРИМЕЧАНИЕ. Если вы выбрали для компиляции рекомендуемый нами пример, то по завершении, процесса загрузки на ESP-01 замигает синий светодиод.
Глава 6. Использование ESP-O1 6e3ARDUINO 393 Проверка работы | оттранслированной программы II Для проверки работы оттранслированной таким образом про- граммы: ♦ сначала переведите переключатель «Работа / Программиро- вание» в режим «Работа»; ♦ затем снова нажмите кнопку «Сброс». Откройте монитор последовательного порта. Для этого: ♦ или выберите в меню пункт «Инструменты/Монитор порта» («Tools/Serial Monitor»); ♦ или нажмите кнопку @ в правой части панели инструментов среды IDE (в верхнем правом углу экрана). Проверьте и при необходимости установите в правом нижнем углу окна монитора скорость передачи порта (115200 бод). ПРИМЕЧАНИЕ. Если у вас более ранняя версия ESP-01 (возможно на синей печатной плате), скорость передачи данных, для нее может быть равна 9600 бод. ;d $bh| Ыа| scan start scan done 3 networks found L: Wi-Flay (-91)* 2: MyWiFi (-70)* 3: Cafe (-81)* scan start scan done 3 networks found I: Wi-Flay (-91)* 2: MyWiFi (-70)* ' 3: Cafe (-81)* Ь 1м с|ЪГ д V'cb сЬыд'ц1пдк>гд Рис. 6.3. Результат работы программы WiFiScan
394 Управление модулем ARDUINO по Wi-Fi с мобильных устройав Если скорость выбрана правильно, то в окне монитора порта вы должны увидеть результаты работы модуля ESP-O1. Модуль будет сканировать ближайшие Wi-Fi сети и сообщать о резуль- татах сканирования в стандартном формате, как показано на рис. 6.3 (список найденных сетей с параметрами каждой сети: номер канала, название Wi-Fi сети, уровень сигнала в децибелах). 6.3. Программа настройки ESP-O1, режим Wi-Fi клиента ВИРТУАЛЬНЫЙ ДИСК. Пример 6.1 (папка на ВИРТУАЛЬНОМ диске Pprj&JQl) J I Начнем с конфигурации Wi-Fi подсистемы микроконтроллера В предыдущем разделе мы научились открывать, компилиро- вать и загружать результат компиляции в программную память ESP-модуля. Теперь пришло время научиться самим разраба- тывать программы для модулей на основе микроконтроллера ESP8266EX. Начнем с начала — с конфигурации Wi-Fi подсистемы микро- контроллера. В предыдущих главах мы использовали ESP-модуль в двух режимах: ♦ в режиме Wi-Fi клиента, который подключался к домашней сети; ♦ в режиме самостоятельной Wi-Fi точки доступа. В обоих режимах в ESP-модуле запускался ТСР-сервер. Приложение «WiFi Controller» или приложение «RemoteXY», уста- новленное на смартфон или планшет, подключалось к TCP сер- веру в качестве клиента. Таким образом оно получало возмож- ность управлять микроконтроллерным модулем и принимать от него информацию.
Глава 6. Использование ESP-O1 6e3ARDUINO 395 Мы покажем, как программным путем установить такие же режимы работы но уже без использования модуля ARDUINO оста- ваясь в программной среде IDE. Для начала рассмотрим случай, когда ESP-модуль будет настроен как Wi-Fi клиент. Постановка задачи Задача. Разработать программу для модуля ESP-01, которая: ♦ переведет его в режим Wi-Fi клиента; ♦ подключится при помощи этого клиента к домашней (кор- поративной) Wi-Fi сети; ♦ сконфигурирует и запустит TCP сервер. Программа не должна выполнять больше никаких других дей- ствий и послужит стандартным началом для более сложных программных примеров. Программа Пример описанной выше программы получил номер 6.1 (проект Ррг_6_01). Программа занимает две вкладки в среде разработки IDE. Основная часть программы приведена в листинге 6.1.1. В дополнительной вкладке «Setup_STA» находится функ- ция начальной настройки модуля ESP-O1 для работы в режиме клиента (режим STA), которая называется SetupSTAQ (листинг 6.1.2). Начнем рассмотрение программы с основной ее части. Согласно поставленной задаче, программа не должна выполнять никаких действий, кроме настройки ESP-модуля. Поэтому текст программы получился очень коротким.
396 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Первый листинг: основной текст программы Обратимся к листингу 6.1.1. Программа начинается с присо- единения стандартной библиотеки для работы с Wi-Fi микрокон- троллером ESP8266EX (строка 5). Библиотека называется «ESP8266WiFi.h» и присоединяется к программе при помощи оператора ^include. Эта библиотека была установлена в среду IDE вместе с плагином для работы с ESP8266EX. После присоединения этой библиотеки программист получает в свое распоряжение набор процедур и функций для работы с Wi-Fi. Далее в строках 6 и 7 определяются две константы, определя- ющие параметры домашней сети: ♦ константе ssid присваивается имя домашней сети, к которой будет подключаться модуль; ♦ константе pass присваивается значение пароля для доступа к домашней сети. В строке 8 определяется константа port типа int, ее значе- ние — это номер порта на котором будет развернут TCP сервер. На этот раз мы выберем порт номер 8888. Листинг 6.1.1. Программа настройки ESP-O1 в режим Wi-Fi клиента 6 const char* ssid = "MyWiFi"; // Имя домашней Wi-Fi сети 7 const char* pass = "ParolMyWiFi"; // Пароль для доступа к сети 8 const int port = 8888; // Номер порта TCP сервера 9 WiFiServer server(port); void SetupSTA(); 7* Программный пример 6.1. Глава б Подключение к домашней Wi-Fi сети */ Imclude <ESP8266WiFi.h> //* 13 void setup() { Serial.begin(115200); // Настройка последовательного канала Serial.println(); // Вывод символов перевода строки SetupSTA(); // Настройка Wi-Fi и подключение к сети void loop() {} // Основной цикл программы (пустой)
Глава 6. Использование ESP-O1 6e3ARDUINO 397 В строке 9 мы создаем объект типа WiFiServer, присваиваем ему имя server и, в качестве параметра, указываем номер порта. Возможность создания объекта WiFiServer появилась как раз после присоединения библиотеки «ESP8266WiFi.h». В качестве номера порта мы использовали только что опреде- ленную константу port. Далее в программе при помощи объекта server будут производиться все операции с TCP сервером. Строка 10 программы требует отдельного пояснения. В главе 4 мы широко использовали в программах дополнительные вкладки. В них мы размещали различные дополнительные функ- ции. Чаще всего эти функции вызывались из основной части про- граммы, расположенной в главной вкладке. При этом не соблю- далось правило, которое существует во многих версиях языка СИ. ПРАВИЛО. Любая функция должна быть сначала описана, и лишь потом использована. Как уже отмечалось выше, все вкладки программы в среде программирования IDE считаются одной единой программой. При трансляции содержимое вкладок объединяется в один после- довательный текст в порядке следования вкладок. То есть, к тексту основной вкладки добавляется текст вкладки, стоящей на второй позиции, к нему добавляется текст третьей вкладки и так далее. Это значит, что описание всех функций, размещенное в дополнительных вкладках, находится после текста основной вкладки, откуда все эти дополнительные функции вызываются. ВНИМАНИЕ В основной версии языка среды IDE, на котором мы до сих пор писали программы для модуля ARDUINO, это отступления от общепринятой нормы допускается. Правило «сначала описание потом применение» в этой вер- сии транслятора не обязательно. Однако, после загрузки пла-
398 Управление модулем ARDUINO no Wi-Fi с мобильных устройств гина, версия языка изменилась. Новая версия, используемая для ESP8266EX, максимально похожа на исходную версию языка, используемую для ARDUINO. Но теперь правило «сначала описание, затем применение» обязательно. Конечно, мы можем поместить все дополнительные функции в начало основной вкладки, но тогда исчезнут все пре- имущества работы с вкладками. Специально для такой ситуации в языке СИ давно уже суще- ствует стандартный способ решения проблемы. В любой версии языка СИ предусмотрена возможность предварительного объ- явления любой функции. Объявление состоит всего из одной строчки и может располагаться в начале программы (то есть до того, как функция будет использована). ПРИМЕЧАНИЕ. Если есть объявление функции, то ее описание мож- но разместить в любом удобном месте программы. Итак, в строке 10 листинга 6.1.1 мы видим объявление функ- ции SetupSTAO- От описания функции ее объявление отличается тем, что в нем отсутствует набор команд, составляющих тело этой функции, который обычно размещается в фигурных скобках. Обязательная системная функция setupQ занимает строки с 13 по 17. Она включает в себя три команды. В строке 14 производится инициализация последовательного канала. В строке 15 в последовательный канал выводится пустая строка. Используемый при этом оператор println() выводит при- знак перевода строки. Необходимость этой команды вызвана тем, что при начальном запуске ESP-модуль выдает в последователь- ный канал некую техническую информацию. Наша программа тоже будет выводить разные сообщения. ПРИМЕЧАНИЕ. , ^ Для того чтобы наши сообщения не затерялись в конце блока технической информации, нужно что- бы они начинались с новой строки.
Глава 6. Использование ESP-O1 6e3ARDUlNO 399 В строке 16 происходит вызов функции настройки Wi-Fi под- системы ESP-модуля. Ту, что объявлена в начале программы, а описание которой находится в дополнительной вкладке. Функция 1оор() расположена в строке 20 программы. Так как задача программы — это только начальная настройка, функция не содержит никаких команд. Второй листинг: II текст функции SetupSTA() II Текст функции SetupSTAQ приведен в листинге 6.1.2. Функция начинается с вывода сообщений. В строках 4 и 5 нахо- дятся два оператора печати в последовательный канал, которые выводят сообщение о том, что программа начинает процесс под- ключения к хосту с заданным нами именем. В нашем случае над- пись будет гласить «Connecting to host MyWiFi» (смотри рис. 6.4). В строке 6 Wi-Fi подсистема переводится в режим «WIFI_ STA» (т. е. режим Wi-Fi клиента). Выбор режима производится при помощи метода modeQ объекта WiFi. Этот объект появился в распоряжении программиста после присоединения библиотеки «ESP8266WiFi.h». Объект WiFi очень похож на изначально суще- ствующий в языке ARDUINO объект Serial Д с*м с<3£ д '{ЫсД ЬЬуод' Connecting to host MyWiFi Dusy .... ЭК connected IP address: 192.168.0.106 ГСР port: 8888 Рис. 6.4. Сообщение программы настройки Wi-Fi клиента
400 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Листинг 6.1.2. Текст функции SetupSTAQ у/*********************************** void SetupSTAO { Serial.print("\nConnecting to host "); // Сообщаем о начале процесса Serial.println(ssid); // подключения к сети WiFi.mode(WIFISTA); // Перевести Wi-Fi в режим клиента WiFi.begin(ssid, pass); // Подключиться к Wi-Fi сети Serial.print("busy "); // Ожидание соединения while (WiFi.status() != WLCONNECTED) { delay(200); Serial.print("."); // Вывод индикатора прогресса Serial.prmtln("\nOK connected"); // Соединение установлено Serial.print("IP address: "); // сообщаем IP-адрес Serial.println (WiFi.locallPO) ; server.begin(); // Запуск TCP сервера Serial.print("TCP port "); // сообщаем номер порта Serial.println(port); У этих двух объектов есть много одинаковых функций и мето- дов. Отличие в том, что объект WiFi управляет передачей инфор- мации в Wi-Fi канале, a Serial управляет процессом передачи информации в последовательном канале. В строке 7 находится команда, запускающая процесс подклю- чения к домашней Wi-Fi сети. Команда представляет собой метод beginQ объекта WiFi. В качестве параметров для этого метода используются две константы: ♦ ssid (имя сети); ♦ pass (пароль). Процесс подключения к сети занимает некоторое время (1—2 секунды). Набор операторов, расположенных в строках 8...12: ♦ реализует процесс ожидания успешного соединения; ♦ отображает этот процесс в виде индикатора прогресса. В строке 8 оператор печати выводит в последователь- ный канал надпись «busy» («занято»). Такая надпись обычно используется для индикации процесса ожидания во многих программах.
Глава 6. Использование ESP-O1 6e3ARDUINO 401 В строках 9...12 расположен цикл whileQ. Параметром опе- ратора while является логическое выражение. В этом выражении результат, возвращаемый методом statusQ объекта WiFi сравни- вается с системной константой WL_CONNECTED. Цикл ожидания длится до тех пор, пока результат метода statusO не окажется рав- ным значению WL_CONNECTED. Статус WL_CONNECTED озна- чает — «Соединение установлено». В теле цикла ожидания соединения мы видим команду задержки (строка 10) и команду печати символа точки (строка 11). В результате работы цикла ожидания при каждой его итерации на экране позади слова «busy» печатается очередная точка. Когда, наконец, появится соединение, на экране будет отображено: столько точек, сколько циклов ожидания совершит программа. ПРИМЕЧАНИЕ. Команда задержки служит для того, чтобы итера- ции не происходили слишком часто. Иначе цепочка точек будет расти слишком быстро и даже может выйти за пределы экрана. Когда соединение будет установлено, цикл ожидания закон- чится, и управление перейдет к строке 13. С этой строки начи- нается ряд команд, которые выводят на печать сообщения об успешном завершении процесса настройки модуля. В строке 13 программа печатает сообщение «\nOK connected» (можно перевести как «Соединение выполнено»). Символ '\п' в начале сообщения вызывает перевод строки перед печатью сооб- щения, для того, чтобы после вывода точек сообщение было напе- чатано с новой строки. В строках 14 и 15 выводится на печать IP адрес, который был присвоен ESP-модулю при подключении к домашней сети. Для этого в строке 14 печатается надпись «IP address:» без символа перевода строки в конце сообщения. А в строке 15 выводится собственно IP адрес. Для получения IP адреса используется метод locallPQ объекта WiFi. В строке 17 запускается TCP сервер. Сам объект server мы создали в начале программы (листинг 6.1.1). Теперь же мы про- сто запускаем сервер при помощи метода beginQ этого объекта. В строках 18 и 19 выводится на экран номер порта TCP сервера.
402 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Также как и в случае вывода IP-адреса, вывод номера порта производится в два этапа. В строке 18 выводится надпись «TCP port:» без символа перевода строки в конце. А в строке 19 на печать выводится номер порта (то есть значение константы port). На этом работа функции SetupSTAQ завершается. На рис. 6.4 показано окно монитора порта среды разработки IDE с результа- тами работы только что описанной программы. I Проверка работы программы После трансляции и загрузки программы в модуль вы можете проверить ее работу. Для проверки Wi-Fi подсистемы мы будем использовать уже знакомое нам мобильное приложение «Network Utilities». ПРИМЕЧАНИЕ. Работа с этим приложением подробно описана в разделе 4.3, в одноименном подразделе. Алгоритм действий такой: ♦ запустите приложение «Network Utilities»; ♦ выберите в меню пункт «IP Discover»; ♦ запустите процесс сканирования (кнопка Ц в нижней части экрана); ♦ подождите, пока пройдет сканирование всех доступных хо- стов в WiFi эфире. После завершения процесса сканирования на экране смарт- фона вы увидите список всех найденных хостов (рис. 6.5). Среди хостов должен быть хост с именем «Espressif inc». Это и есть наш ESP-модуль. Тут же вы можете узнать и проверить его адреса: ♦ IP адрес; ♦ MAC адрес. Снова откройте меню, выберите пункт «Port scanner». Заполните поля в нижней части экрана. Например, так: List of the ports: 8800-8899; IP or host: 192.168.0.106;
Глава 6. Использование ESP-O1 6e3ARDUINO 403 ВНИМАНИЕ. Программа «Network Utilities» часто обновляется, и набор полей может отличаться от описанного выше. Но смысл операции остается неизменным. На выбранном вами IP-адресе приложение ищет открытые порты в указанном вами диапазоне. Выставив параметры, запустите процесс сканирования порта при помощи кнопки Ц в нижней части экрана. Программа должна найти порт и показать его в списке. Как это выглядит на экране смартфона, вы можете видеть на рис. 6.6. Программа, которую мы только что разобрали, может служить заготовкой для создания более сложных программ, предназна- ченных для систем на основе микроконтроллера ESP8266EX. Рис. 6.5. Поиск хоста ESP модуля в приложении «Network utilities» Рис. 6.6. Поиск порта TCP сервера ESP-модуля
404 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. В данной книге мы будем использовать именно эту программу как основу для всех программных приме- ров, описанных ниже, за исключением примера 6.2. 6.4. Программа настройки ESP-01, режим Wi-Fi точки доступа ВИРТУАЛЬНЫЙ ДИСК. Пример 6.2 (папка на ВИРТУАЛЬНОМ диске PprJ>_02) J I Особенности новой программы Следующая программа аналогична предыдущей. Отличие состоит только в том, что Wi-Fi подсистема настраивается как точка доступа. Как уже говорилось ранее, первый вариант настройки (Wi-Fi клиент) удобен при работе в пределах домаш- ней сети, а второй (точка доступа) удобен для управления ESP- модулем в полевых условиях, когда нет поблизости доступных Wi-Fi сетей. Постановка задачи Задача. Разработать программу для модуля ESP-01, которая переве- дет модуль в режим Wi-Fi точки доступа, а также сконфигу- рирует и запустит TCP сервер. Программа не должна выпол- нять никаких других действий.
Глава 6. Использование ESP-O1 6e3ARDUINO 405 Эта программа, как и предыдущая, послужит стандартным началом для остальных программных примеров, в тех случаях, когда предпочтительнее режим точки доступа. Программа, реализующая вышеописанную задачу, получила название «Пример 6.2». Программа использует две вкладки в среде разработки IDE. Основной текст программы приведен в листингах 6.2.1. В дополнительной вкладке, которая называется «Setup_AP», нахо- дится функция начальной настройки Wi-Fi подсистемы SetupAPQ (листинг 6.2.2). Первый листинг: | основной текст программы II Основная часть программы (листинг 6.2.1) практически ничем не отличается от основной части программы предыду- щего примера (листинг 6.1.1). Произошли лишь некоторые изменения: ♦ изменились значения констант ssdi и pass (строки 6, 7 ли- стинга 6.2.1). Теперь это имя нашей вновь создаваемой точки доступа и пароль для доступа к ней; ♦ изменилось имя функции настройки Wi-Fi подсистемы. Те- перь, как мы уже знаем, она называется SetupAPO (имя функ- ции соответствует названию режима ее работы). Соответственно, новое имя используется: ♦ и при объявлении функции (строка 10); ♦ и при ее вызове (строка 16). ПРИМЕЧАНИЕ. В остальном текст программ в основной вкладке программного примера 6.1 и аналогичной вкладки примера 6.2 абсолютно идентичны.
406 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Листинг 6.2.1. Программа настройки ESP-01 (режим точки доступа) Ц7^ 12 Программный пример 6.2. Глава 6 Создание Wi-Fi точки доступа */ tmclude <ESP826€WiFi.h> const char* ssid - "MyESP"; // Имя домашней Wi-Fi сети const char* pass = "12345678и; // Пароль для доступа к сети const int port = 8888; // Номер порта TCP сервера 9 WiFiServer server(port); 10 void SetupAPO; 11 //* 13 void setup() { Serial.begin(115200); // Настройка последовательного канала Serial.println(); // Вывод символов перевода строки SetupAPO; // Настройка Wi-Fi в режиме точки доступа //* 20 void loop() {} 21 I Второй листинг: функция начальной настройки Wi-Fi подсистемы SetupAPO Функция SetupAPQ (листинг 6.2.2) начинается с вывода в последовательный канал сообщения о начале своей работы (строка 4). Сообщение гласит: «Creating Access Point» («Создание точки доступа»). Символ \п', нужен для того, чтобы после строки служебных кодов надпись появлялась с новой строки. Далее оператор в строке 5 выводит на экран имя создаваемой точки доступа. В строке 6 устанавливается режим Wi-Fi подсистемы контроллера. Для этого используется метод modeO объекта WiFi. В качестве параметра используется системная константа «WIFI_AP». Это специальная константа, означающая выбор режима «Точка доступа» («Access Point»). В строке 7 происходит запуск точки доступа: ♦ с именем, определяемым константой ssid; ♦ с паролем, определяемым константой pass.
Глава 6. Использование ESP-O1 6e3ARDUINO 407 Листинг 6.2.2. Текст функции SetupAPQ void SetupAPO { Serial.printCXnCreating Access Point Serial.println(ssid); WiPi.mode(WIFI_AP); // WiFi.softAP(ssid, pass); Serial.println("AP created"); Serial.print("IP address: и); Serial.println(WiFi.softAPIP()); server.begin(); Serial.print("TCP port: "); Serial.println(port); // Сообщаем о начале процесса Устанавливаем режим "Точка доступа" // Запускаем точку доступа // Точка доступа создана // сообщаем IP-адрес // Запуск TCP сервера // Сообщаем номер порта Для операции запуска используется метод softAPQ объекта WiFi. ПРИМЕЧАНИЕ. Запуск точки доступа происходит практически мгновенно, так как это не требует соединений с удаленными объектами. Поэтому индикация про- гресса, которая применялась в примере 6.1, здесь бессмысленна. Программа сразу же переходит к вы- воду сообщений о завершении данной операции. В строке 8 программа выводит сообщение «АР created» («Точка доступа создана»). В строках 9 и 10 программа выводит сообщение о том, какой IP адрес присвоен точке доступа: ♦ в строке 9 выводится заголовок сообщение («IP address:»); ♦ в строке 10 собственно сам IP адрес. При этом IP адрес программа получает при помощи метода softAPIPO объекта WiFi. В строках 12... 14 производится запуск TCP-сервера и вывод на печать номера порта этого сервера.
408 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Все эти три команды полностью соответствуют аналогичным командам примера 6.1. На этом функция SetupAPQ заканчивает свою работу. На рис. 6.7 показан экран монитора последовательного порта, с результатом работы описанной в данном разделе программы. Проверить работу программы «Пример 6.2» можно точно так же, как мы проверяли программу «Пример 6.1» — при помощи приложения «Network Utilities». Только сначала вы должны под- ключить смартфон к точке доступа ESP-модуля. Соответственно, изменится и IP адрес. В остальном при проверке этих двух про- грамм нет никаких отличий. s$ 1Ьц< „1а | „ 1д с|Ц, м >г>#Ь с„ыдоцс! Creating Access Point MyESP АР created IP address: 192.168.4.1 TCP port: 8888 Рис. 6.7. Сообщение программы в режиме Wi-Fi точки доступа
Глава 6. Использование ESP-O1 6e3ARDUINO 409 6.5. Программа обмена данными между смартфоном и ESP-01 ВИРТУАЛЬНЫЙ ДИСК. Пример 6.3 (папка на ВИРТУАЛЬНОМ диске Ppr_6J03) Переходим к созданию практических II прикладных программ I Теперь, когда у нас есть две программы-заготовки (при- мер 6.1 и пример 6.2). Мы можем брать любую из них в зависи- мости от того, в каком режиме нам удобнее работать: ♦ или в режиме клиента; ♦ или в режиме точки доступа. Выбрав нужную заготовку программы, вы должны добавить к ней основной текст программы, реализующий другие, нужные нам функции. ПРИМЕЧАНИЕ. Таким образом, мы и будем создавать любые прак- тические прикладные программы. И для начала мы создадим простую программу, которая позволит нам обмениваться сообщениями по каналу Wi-Fi между приложением в вашем смартфоне и компьютером. Для обмена информацией мы будем использовать: ♦ на стороне смартфона — приложение «WiFi Controller»; ♦ на стороне компьютера — монитор последовательного порта среды разработки IDE. ESP-модуль будет служить Wi-Fi адаптером для компьютера.
410 Управление модулем ARDUINO по Wi-Fi с мобильных устройств I Постановка задачи Задача. Создать программу для модуля ESP-01, которая должна под- держивать постоянную двухстороннюю связь между ком- пьютером, подключенным к ESP-модулю по последователь- ному каналу, и приложением «WiFi Controller», запущенным в смартфоне (планшете), подключенном к ESP-модулю по Wi-Fi каналу. Программа должна непрерывно контролировать посту- пление информации от приложения «WiFi Controller» no Wi-Fi каналу, и при поступлении хотя бы одного символа сразу же посылать принятую информацию в последователь- ный канал для отображения его в окне монитора порта. Одновременно программа должна следить за поступле- нием информации по последовательному каналу от мони- тора порта, и при поступлении хотя бы одного символа тут же отправлять всю принятую информацию в Wi-Fi канал для отображения его в окне приложения «WiFi Controller». Программа Для создания этой программы мы можем взять за основу любую из программ-заготовок: программный пример 6.1 или программный пример 6.2, и добавить команды, реализующие алгоритм, описанный при постановке задачи в основной цикл программы. ВЫБОР ОСНОВЫ. Г Для процесса обучения удобнее работать в домаш- ней сети, поэтому мы возмем за основу пример 6.1..
Глава 6. Использование ESP-O1 6e3ARDUINO 411 Листинг 6.3. Программа обмена данными между смартфоном и модулем ♦include <ESP8266WiFi.h> const char* ssid = "MyWiFi"; // Имя домашней Wi-Fi сети const char* pass = "ParolMyWiFi"; // Пароль для доступа к сети const int port =8888; // Номер порта TCP сервера 9 WiFiServer server(port); 10 void SetupSTAO; 11 12 //* 13 void setup() ( Serial.begin(115200) ; Serial.println(); SetupSTAO; Программный пример 6.3. Глава 6 Подключение к домашней Wi-Fi сети */ // Настройка последовательного канала // Вывод символов перевода строки // Настройка Wi-Fi и подключение к сети у/********************************** void loop() { WiFiClient client - server.availableQ; if (client) { i f (client.connected()) { Serial.println("Client Connected"); // // Создать Клиент и подключить к серверу // Если клиент был создан // подключем его и если удачно то // Сообщить "Клиент подключен" Обмен данными while(client.connected()) { // Пока слиент подключен while(client.available()>0) { //и если буфер клиента не пуст Serial.write(client.read()); // читаем из клиента и печатаем в serial while(Serial.available()>0) { client.write(Serial.read()); // Если буфер serial не пуст // читаем из serial и печатаем в клиент client.stop(); // Отключаем клиент Serial.println("Client disconnected"); // Сообщаем что клиент отключен В листинге 6.3 приведена программа, которую мы назвали «Пример 6.3», реализующая поставленную выше задачу. Вся начальная часть программы, а также содержимое вкладки «Setup_ STA», полностью соответствуют программному примеру 6.1. Поэтому мы их рассматривать не будем.
412 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Напомню только, что все эти начальные процеду- ры переводят Wi-Fi подсистему модуля ESP-01 в режим Wi-Fi клиента, подключают его к домашней сети и запускают в модуле ТСР-сервер. Все, что добавлено в программу при разработке примера 6.3, находятся в теле основного цикла программы 1оор(). В листинге 6.3 функция loopO занимает строки 20...38. Как уже говорилось выше, программа должна одновременно работать: ♦ и с последовательным каналом; ♦ и с каналом Wi-Fi. Работа с последовательным каналом (объект Serial) нам хорошо знакома. Мы достаточно много работали с этим кана- лом в главе 4 и в главе 5. Благодаря использованию библи- отеки «ESP8266WiFi.h», работа с Wi-Fi каналом значительно упростилась, и стала похожей на работу с последовательным каналом. Теперь для общения с Wi-Fi каналом используется TCP сервер. Мы должны подключиться к этому серверу при помощи локаль- ного клиента. При помощи специальных команд мы должны соз- дать этого клиента и подключить его к уже существующему ТСР- серверу. При помощи локального клиента программа ESP-модуля получает доступ к Wi-Fi каналу. С создания такого клиента и начинается функция loopQ. Создание клиента и подключение его к серверу происходит в строке 21 программы. Строка представляет собой объявление локальной переменной, а точнее локального объекта client типа WiFiCHent. Этому объекту в той же строке программы присваива- ется значение. Это значение возвращает функция availableQ объ- екта server. Метод availableQ запрашивает соединение с TCP сер- вером и возвращает указатель на это соединение. Значение этого указателя и присваивается объекту client. Объект типа WiFiClient, каким является наш объект client, по своим свойствам очень похож на объект Serial, который мы используем для работы с последовательным каналом.
Глава 6. Использование ESP-O1 6e3ARDUlNO 415 ПРИМЕЧАНИЕ. Объект client, также как и объект Serial, имеет бу- фер для приема данных. Только в Serial эти данные поступают по последовательному каналу, а в client по каналу Wi-Fi. Для чтения данных из буфера объектом client, как и объектом Serial используется функция readQ, для отправки байта по каналу связи и client и Serial используют метод writeQ. Для проверки наличия данных в буфере в обоих типах объектов используется метод availableQ. Так же, оба этих объекта поддерживают методы printQ и printlnQ. Наша программа использует перечисленные выше методы обоих типов объектов. Для начала в строке 22 проверяется, суще- ствует ли объект client Если предыдущая операция завершена успешно, и клиент был создан, то выполняются операторы в строках 23...36, то есть все операции обмена данными. В противном случае функция loopQ завершается, и ее выпол- нение начинается сначала. То есть, снова выполняется строка 21, в которой производится очередная попытка создать клиент и подключить его к серверу. Если клиент создан, то управление переходит к строке 23, в которой проверяется, есть ли соединение с сервером. Проверка производится при помощи метода connectedQ объекта client. Метод возвращает true, если подключение установлено. Именно в этом случае (при наличии соединения) выполняется строка 24 программы. В этой строке в последовательный канал выводится сообщение «Client Connected» («Клиент подключен»). Далее, в строках 27...34 начинается цикл обмена информа- цией. Цикл организован при помощи оператора whileQ. В каче- стве условия продолжения цикла используется результат про- верки на наличие подключения клиента к серверу. Проверка производится при помощи все того же метода connectedQ объекта client (строку 27). Проверка производится при каждом проходе цикла whileO, и в случае отсутствия соединения цикл прерывается и выполнение функция loopQ начинается сначала. А, значит, про- грамма снова пытается установить соединение.
414 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Цикл обмена информацией занимает строки 28...33. Цикл состоит из двух практически одинаковых частей. В строках 28...30 расположен цикл передачи данных из канала Wi-Fi в последова- тельный канал. Цикл начинается и продолжается только в том слу- чае, если в буфере объекта client имеется хотя бы один байт. Для организации цикла используется оператор whileO (строка 28). В качестве условия в этом операторе выступает результат, выражения client.availableQ>O. Метод availableQ возвращает коли- чество байт в буфере. Поэтому цикл продолжается, если это коли- чество больше нуля. Тело цикла — это всего одна строка (строка 29). В этой строке при помощи метода writeQ объекта Serial в последовательный канал отправляется байт, считанный посредством метода readQ объекта client, из буфера Wi-Fi канала. ПРИМЕЧАНИЕ. Цикл повторяется, пока все байты из буфера не бу- дут считаны и переданы. В строках 31...33 находится точно такой же цикл, но проверя- ющий наличие данных в объекте Serial и передающий их в объект client. To есть, передающий данные, пришедшие по последова- тельному каналу в канал Wi-Fi. Цикл выполнен абсолютно сим- метрично предыдущему-и работает точно так же. Цикл передачи информации работает, непрерывно повторяя поочередно две свои части, и передает данные как от смартфона на компьютер, так и обратно. В случае обрыва связи цикл временно прекращается, а про- грамма пытается восстановить связь. После восстановления связи передача данных возобновляется.
Глава 6. Использование ESP-O1 6e3ARDUINO 415 Проверка | работы программы I Для проверки программы воспользуемся мобильным прило- жением «WiFi Controller». Это приложение мы активно использо- вали в главе 4. Если программа (листинг 6.3) откомпилирована и загружена в модуль ESP-O1, открываем окно монитора после- довательного порта. Нажимаем кнопку «Сброс», подключенную к модулю ESP-O1. На экране монитора порта появится ряд сообщений, инфор- мирующих о ходе подключения к домашней сети (рис. 6.4). Запускаем на смартфоне приложение «WiFi Controller». Убеждаемся, что приложение настроено на подключение к нуж- ному нам IP адресу и порту. ПРИМЕЧАНИЕ. Значения IP адреса и номер порта можно видеть в окне монитора последовательного порта. Устанавливаем связь между приложением и ESP-модулем, нажав соответствующую кнопку в окне приложения «WiFi Controller». Индикатор соединения в окне приложения должен стать зеленым. При этом в окне монитора порта на компьютере должна появиться надпись «Client Connected». Теперь можно обмениваться сообщениями. На рис. 6.8 показан пример, когда две программы обменялись несколькими сообщениями. Сначала в оба направления было послано слово «proba». Затем, при помощи программы, компью- тер и смартфон обменялись более осмысленными фразами. Порядок обмена сообщениями в последнем случае был сле- дующий: ♦ сначала в поле ввода сообщений приложения «WiFi Controller» мы набрали фразу «from smart to comp», как показано на рис. 6.8; ♦ затем нажали кнопку «Send ASCII» и фраза тут же появилась в окне монитора порта на компьютере (см. там же на рис. 6.8);
416 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ другую фразу «from comp to smart» мы набрали в поле ввода сообщений монитора порта на компьютере; ♦ в завершении нажали кнопку «Отправить», и сообщение тут же появилось в окне приложения «WiFi Controller» (см. на рис. 6.8). i ?Ги?1; zh ЧсН I it "шшитш i1 ! Ь'-ССл-СГС^ь. Рис. 6.8. Процесс обмена информацией в программе «Пример 6.3»
Глава 6. Использование ESP-O1 6e3ARDUINO 417 6.6. Программа управления реле при помощи ESP-O1 ВИРТУАЛЬНЫЙ ДИСК. Пример 6.4 (папка на ВИРТУАЛЬНОМ диске Ppr_6J04) Учимся управлять мощной нагрузкой В предыдущих трех примерах мы решали скорее учебные, тре- нировочные задачи, не имеющие большого практического зна- чения. Теперь поставим перед собой более практическую задачу. В следующем примере мы научимся при помощи модуля ESP-O1 управлять внешней мощной нагрузкой. СОВЕТ. Для коммутации мощной нагрузки удобнее всего использовать электромагнитное реле. Поэтому рекомендую воспользоваться платой расширения «Модуль реле», которую мы упоминали в главе 2 (рис. 2.14). Существует огромное количество моделей модулей реле, управляемых от ESP-O1. Они отличаются схемой, конструкцией, количеством реле на плате. Чаще всего реле одно. Но существуют модули, на которых два реле. Реже встречаются специальные платы, на которых установ- лена целая линейка реле (четыре или более). Такой модуль реле имеет разъем, куда устанавливается плата ESP-O1. Модуль реле с установленной платой ESP-O1 превращается в автономное устройство, управляемое по Wi-Fi. Такому устройству нужно только внешнее питание, и он может по командам от любого мобильного устройства включать
418 Управление модулем ARDUINO по Wi-Fi с мобильных устройств и выключать внешнюю нагрузку при помощи контактов установ- ленного на нем реле. ПРИМЕЧАНИЕ. Правда, для этого в программную память ESP-O1 должна быть записана специальная управляющая программа. Модуль реле обеспечивает питание 3,3 В для модуля ESP-O1. Для этого на борту он имеет микросхему-стабилизатор напря- жения. А также силовой ключ, для управления реле. Модуль реле может содержать и другие элементы. Промышленность выпускает как простые пассивные модули, управляемые полностью от ESP-O1, так и более сложные, актив- ные модули, имеющие свой встроенный управляющий контрол- лер. В таких сложных модулях реле ESP-O1 используется в каче- стве Wi-Fi адаптера. Мы не будем использовать активные модели модуля реле. Для использования активного модуля придется разбираться с кон- троллером, стоящим на его борту, изучать его систему команд и писать программу сразу для двух контроллеров. Это не входит в задачу данной книги. НОВОЕ ОБОРУДОВАНИЕ. Поэтому для того, чтобы самостоятельно повто- рить следующие два программных примера, реко- мендую вам приобрести любой пассивный модуль реле, предназначенный для работы совместно с мо- дулем ESP-O1. ПРИМЕЧАНИЕ. К сожалению, при покупке такого модуля, особенно в Интернет-магазинах, в его описании часто не ука- зывается пассивный это модуль или активный.
Глава 6. Использование ESP-O1 6e3ARDUINO 419 Рис. 6.9. Активные модули реле Отличить пассивный модуль реле от активного можно по его внешнему виду. На рис. 6.9 показан внешний вид двух вариантов активных модулей реле. На рис. 6.10 — два варианта пассивных модулей реле. На каждом активном модуле хорошо видна микро- схема дополнительного микроконтроллера. Она имеет доста- точно много выводов (от 8 до 16 и более). На пассивной плате лишь простые элементы. Рис. 6.10. Пассивные модули реле На рис. 6.11 они показаны в увеличенном виде. Итак, пассив- ный модуль должен иметь: ♦ стабилизатор напряжения 3,3 В (на рис. 6.11 отмечен циф- рой 1);
420 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ транзисторный ключ (на рис. 6.11 отмечен цифрой 3); ♦ может применяться силовой оптрон (цифра 2 на рис. 6.11). Кроме перечисленных элементов, плата обычно еще содер- жит: ♦ несколько резисторов и конденсаторов; ♦ светодиод; ♦ кнопку сброса; ♦ само реле; ♦ разъем для подключения ESP-01; ♦ разъем для подключения питания; ♦ разъем для подключения коммутируемой нагрузки. ВНИМАНИЕ. | Других элементов пассивная плата содержать не должна. Рис. 6.11. Элементы пассивного модуля реле
Глава 6. Использование ESP-O1 6e3ARDUINO 421 Схема В нашем примере мы предлагаем использовать готовый модуль. Каждый такой модуль имеет свою схему. Но схемы всех пассивных модулей похожи друг на друга и вполне взаимозаменяемы. ПРИМЕЧАНИЕ. Важен только номер порта, который используется для управления установленным в модуле реле. При желании модуль реле легко собрать и самому. На рис. 6.12 показан простой вариант схемы блока реле, которую можно собрать самостоятельно, используя универсальную монтажную плату. Как видно из схемы, управление включением и выклю- чением реле производится сигналом, снимаемым с контакта GPIO2 модуля ESP-O1. В покупных модулях может использоваться и другой вари- ант — когда управление происходит с контакта GPIO0. СОВЕТ. Если вы используете модуль с управлением от GPIOO, то в приводимой ниже программе нужно будет про- сто поменять значение номера контакта. Далее, при описании программы мы покажем, как это сделать. На схеме рис. 6.12 транзистор VT1 (типа 2N2222) использу- ется в качестве ключа. Светодиод VD2 индицирует включение реле. Диод VD1 служит для защиты схемы от паразитных токов самоиндукции, возникающих в катушке реле при снятии с нее напряжения. Резисторы: ♦ R1...R3 — подтягивающие, для обеспечения надежного еди- ничного уровня на свободных входах модуля; ♦ R4 и R5 — согласующий делитель на входе ключа VT1; ♦ R6 — токоограничивающий резистор для светодиода.
422 Управление модулем ARDUINO по Wi-Fi с мобильных устройств +5В LM1117 2N2222 -CZH R5 47K Рис. 6.12. Схема электрическая принципиальная модуля реле I Постановка задачи Задача. Создать программу для модуля ESP-01, подключенного: ♦ или к модулю реле, собранному по схеме, показанной на рис. 6.12; ♦ или аналогичному покупному модулю реле. Программа должна позволить удаленно управлять этим реле при помощи мобильного устройства, на котором уста- новлено приложение «Wi-Fi Controller». Включение и выключение реле должно выполняться при нажатии кнопок в этом мобильном приложении. При нажа- тии одной из кнопок реле должно включаться, при нажатии другой — выключаться. Предполагается, что приложение «Wi-Fi Controller» настро- ено так, как мы это сделали в главе 4 (смотри таблицу 4.1). Для управления реле мы будем использовать кнопки, подписанные как «Start» и «Stop». Согласно табл. 4.1 при нажатии на эти кнопки мобильное приложение посылает по Wi-Fi текстовые команды «S1» и «SO», соответственно.
Глава 6. Использование ESP-O1 6e3ARDUINO 423 Программа в модуле ESP-01 должна принять и распознать эти команды. Если будет получена команда «51», программа должна включить реле, а при получении команды «SO» — выключить его. Алгоритм Алгоритм работы программы очень простой. Сначала про- грамма должна создать Wi-Fi соединение. В нашем примере мы будем использовать ESP-модуль в режиме Wi-Fi клиента, кото- рый будет подключаться к домашней или корпоративной сети. Затем программа должна запустить TCP сервер, к кото- рому будет подключаться мобильное приложение, и передавать команды. Программа должна: ♦ анализировать поток информации, приходящий от мобиль- ного приложения; ♦ выделять из него отдельные текстовые строки; ♦ искать среди этих строк команды «S1» и «SO»; ♦ обнаружив одну из этих команд, программа должна подавать соответствующий уровень на линию ввода-вывода, управля- ющую подключенным к ней реле. Для инициализации модуля ESP-O1 мы будем использовать уже знакомую нам подпрограмму SetupSTA, описанную в раз- деле 6.2 (листинг 6.1.2). Ее мы также, как в примере 6.1, поме- стим во вкладку «Setup_STA». Подпрограмма SetupSTA: ♦ переведет модуль в режим Wi-Fi-клиента; ♦ подключит к домашней (корпоративной) сети; ♦ запустит в модуле ТСР-сервер. ПРИМЕЧАНИЕ. Все это мы подробно рассматривали в разделе 6.2. Поэтому перейдем к рассмотрению остальных осо- бенностей предложенной в данном примере про- граммы.
424 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Программу управления модулем реле мы назвали «Программный пример 6.4». Проект Ррг_6_04. Мы предла- гаем при создании программы использовать заголовочный файл. Заголовочный файл применяется во многих серьезных языках программирования. Применяется он и в языке СИ. А этот язык является основой языка среды программирования IDE. ЧТО ЕСТЬ ЧТО. Основное назначение заголовочного файла - объ- единять в одно целое нескольких частей одной про- граммы (нескольких программных файлов). Если программа большая, то удобно разбить ее на части. Это облегчает работу программиста. В заголовочном файле описы- ваются все части, из которых состоит программа. Компилятор использует заголовочный файл для того, чтобы собрать все части и получить результирующий код. В среде разработки IDE используется другой механизм объ- единения разных частей программы. Для каждой программы на жестком диске компьютера создается отдельная папка. Имя папки и есть имя программы. Все файлы, составляющие программу, находятся в этой папке. Все это называется «Программный проект». Файлы программ (скетчей) имеют расширение ino. Один из файлов проекта явля- ется главным. ПРИМЕЧАНИЕ. [ Имя главного файла должно в точности повто- I рять имя папки (то есть, имя программы). В окне среды разработок IDE все файлы скетчей выглядят как вкладки. При компиляции программы система использует все файлы в папке проекта, считая их всех частями одной про- граммы. Тексты всех скетчей автоматически объединяются в порядке следования соответствующих им вкладок. Поэтому для
Глава 6. Использование ESP-O1 6e3ARDUINO 425 объединения разных частей программы заголовочный файл не нужен. Однако среда IDE все же поддерживает возможность исполь- зования заголовочного файла. СОВЕТ. В этот файл удобно поместить, например, коман- ды объявления вспомогательных функций. Таких как функция SetupSTA в нашей программе. Если таких функций достаточно много, то ряд таких объявлений сильно перегружают текст и затрудняют чтение программы. В заголовочный файл можно поместить и другие элементы, кото- рые обычно располагаются в ее начале: объявления глобальных переменных и констант, операторы инициализации глобальных объектов, операторы именования и т. п. Заголовочный файл также должен располагаться в папке про- граммы. Файл заголовка имеет расширение .h (от слова header — заголовок). В окне среды разработок заголовочный файл выгля- дит как еще одна вкладка — вкладка, при трансляции располагае- мая впереди основной части программы. Для создания заголовочного файла используется стандартный механизм управления вкладками: ♦ при помощи кнопки щ в правом верхнем углу среды разра- боток откройте меню управления вкладками; ♦ выберите пункт «Новая вкладка»; ♦ в поле для ввода имени создаваемой вкладки (в желтой по- лосе внизу экрана) наберите название заголовочного файла, указав расширение «.ft» в конце имени. Так как основной файл нашей программы называется Ppr_6_04.ino, назовем заголовочный файл «Ppr_6_04.h». Имя заголовочного файла не обязательно должно совпадать с именем программы. Но чтобы не путаться, удобнее использовать одина- ковые имена.
426 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Если в поле ввода имени вкладки ввести ее назва- ние без расширения в конце, то образуется еще один скетч (часть программы). На диске он будет записан как файл с расширением ino. Если в качестве имени вкладки указать название заголовочного файла с расширением h, то создает- ся заголовочный файл с расширением Л I Листинг первый: содержимое заголовочного файла Содержимое заголовочного файла приведено в листинге 6.4.1. В соответствии со стандартом, заголовочный файл должен всегда начинаться примерно с таких строк: #ifndef PPR_6_04__H #define PPR_6__04_H а заканчиваться строкой: #endif Листинг 6.4.1. Содержимое заголовочного файла const char* ssid = "MyWiFi"; const char* pass = "ParolMyWiFi" 6 const int port = 8888; String InputString=ww; int codcomm; ♦ifndef PPR_6_04_H ♦define PPR 6 04 H ♦define PinRelay 2 void SetupSTA(); 13 WiFiServer server(port); 14 15 #endif 16 // Имя домашней Wi-Fi сети // Пароль для доступа к сети // Номер порта TCP сервера // строка для хранения входящих данных // Код команды (1=ОЫ; 0=OFF; -1=Нет команды) // Контакт - выход на реле // Декларация функции начальных установок // Инициализация TCP/IP скрвера
Глава 6. Использование ESP-O1 6e3ARDUINO 427 Между двумя первыми строками и последней строкой должны располагаться все остальные элементы заголовочного файла. Все эти новые для нас операторы — это операторы макроязыка. Макроязык позволяет динамически изменять текст программы. Например, выбирать разные варианты программы для разных вариантов ее использования. Оператор #ifndef (расшифровывается как «if no define» — «если не определено то») предписывает, учитывать следующий за ним кусок программы вплоть до оператора #endif только в том, случае если не определен (не существует) идентификатор PPR_6J)4_H. Если такой идентификатор не был определен ранее, то все, что написано между #ifndef и #endif выполняется. И первое, что выполняется — это следующий за ним оператор #define PPR_6_04Ji. Он, как раз и определяет этот самый идентификатор, который не был до этого определен. ПРИМЕЧАНИЕ. Такой прием исключает двойное использование за- головочного файла. Если идентификатор PPR_6J)4_H уже определен, то команды, размещенные в заголовочном файле, не будут учитываться при компиляции. А, значит, и не будет выполняться. В сложных больших программах таким способом происхо- дит защита от случайного повтора заголовочного файла. По этой причине имя идентификатора должно создаваться из имени заго- ловочного файла путем перевода всех букв в верхний регистр и замены точек на символ подчеркивания. Заголовочный файл программного проекта 6.4 приведен в листинге 6.4.1. Как видите, стандартные элементы заголовоч- ного файла расположены там, где им положено — в строках 1, 2 и 15. Рассмотрим подробнее содержимое заголовочного файла. В заголовочный файл мы включили все то, что обычно включается в начало основного файла программы: ♦ определение констант и переменных; объявление функции и т. д.
428 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Так, в строках 4...6 находятся операторы объявления трех констант: ♦ имя домашней сети ssid; ♦ пароль для доступа к этой сети pass; ♦ номер порта TCP сервера — port. Далее, в строке 7, создается глобальный строковый объект InputString. Он будет использоваться в программе для хранения принятых сообщений (команд) от мобильного приложения. В строке 8 определяется глобальная переменная codcomm. Она будет использоваться в основной программе для формиро- вания текста сообщения. В строке 10 определяется имя для контакта, управляющего нашим реле. Контакту присваивается имя PinRelay. ПРИМЕЧАНИЕ. Как видите, в качестве такого контакта выбрана линия ввода вывода номер 2. Если ваша плата ис- пользует другую линию (например, номер 0), доста- точно в этой строке просто заменить 2 на 0. В строке 12 происходит объявление функции SetupSTAQ, опи- сание которой находится во вкладке SetupJSTA. Ну и, наконец, в строке 13 производится создание объекта «TCP сервер». При инициализации задается адрес, на котором будет работать сервер. Адрес определяется константой port. I Листинг второй: основной текст программы Основной текст программы приведен в листинге 6.4.2. В строках 5 и 6 основного блока программы находятся два опера- тора ^include: ♦ первый оператор присоединяет к программе библиоте- ку для работы с микроконтроллером ESP8266EX (ее имя ESP8266WiFi.h); ♦ второй оператор присоединяет к тексту программы наш, только что описанный, заголовочный файл («Ppr_6_04.h»).
Глава 6. Использование ESP-O1 6e3ARDUINO 429 Как видно из программы, имя библиотеки в первом из опера- торов ^include заключено в угловые скобки (используются знаки меньше и больше). А во втором случае — имя файла заключено в обычные кавычки. ПРИМЕЧАНИЕ. Связано это с тем, что библиотека ESP8266WiFi.h размещена в стандартном хранилище для библио- тек, а наш заголовочный файл находится в папке программы. Так как все операторы, обычно располагаемые в начале про- граммы, вошли в заголовочный файл, в строке 9 сразу же начи- нается системная функция setupQ. Функция занимает строки 9...16. Функция производит начальные настройки программы. В строке 10 производится инициализация последовательного канала микросхемы ESP8266EX. При инициализации выбирается скорость обмена канала 115200 бод. В строке 11 в канал выводится символ перевода строки. Зачем это нужно, мы рассматривали в разделе 6.2 (чтобы отде- лить последующие сообщения программы от блока технической информации). В строке 12 вызывается функция SetupSTAQ, которая произ- водит: ♦ настройку Wi-Fi канала; ♦ соединение с домашней сетью; ♦ запуск ТСР-сервера. В строке 13 производится установка режима для контакта PinRelay (контакта управления реле). Соответствующая линия ввода-вывода определяется как выход. В строке 14 на выход реле подается низкий логический уро- вень (реле выключено). В строке 15 предусмотрена небольшая технологическая задержка. Основной цикл программы занимает строки 19...47. В строке 20 создается локальный клиент и подключается к TCP серверу.
430 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Листинг 6.4.2. Основная часть программы управления модулем реле Программный пример 6.4. Глава 6. Программирование для модуля ESP-01 Управления модулем реле (вкл/выкл) при нажатии кнопок в "WiFi Controller" V ♦include <ESP8266WiFi.h> // Библиотека для ESP8266 include "Ppr_6_04.h" // Заголовочный файл /у********************************************** void setup() { Serial.begin(115200); // Настройка последовательного канала Serial.printIn(); // Вывод символов перевода строки SetupSTA(); // Настройка Wi-Fi и подключение к сети pmMode(PinRelay, OUTPUT); // Настройка контакта digitalWrite(PinRelay, LOW); // Установка начального значения на выходе delay(200); //а********************************************* void loop() { WiFiClient client = server.available(); // Создать Клиент и подключить к серверу if (client) { // Если клиент был создан то delay(200); if (client.connected()) { // Если клиент подключен то Serial.println("Client Connected"); // Сообщить "Клиент подключен" } while(client.connected()) { // Пока слиент подключен выполняем цикл codcomm = -1; // Код команды = -1 ("Нет команды") InputString = client.readStringUntil('\n'); // Выделякм строку из потока Serial.println(InputString); if (InputString.mdexOf("SI")!=-l) { // Если принята строка - "SI" digitalWrite(PinRelay, HIGH); // Включаем реле codcomra =1; // Код команды - 1 ("Вкл реле") } if (InputString.mdexOf("SO")!=-l) { // Если принята строка - "SO" digitalWrite(PinRelay, LOW); // Выключаем реле codcorara =0; • // Код команды = 0 ("Выкл реле") } if (codcorara != -1) { // Если код команды не -1 (Есть команда Serial.print("Rele "); // Выводим сообщение Serial.println ((codcoram=0) ?"OFF":"ON") ; client.stop(); // Отключаем клиент Serial.printIn("Client disconnected"); // Сообщаем что клиент отключен delay(200);
Глава 6. Использование ESP-O1 6e3ARDUINO 431 В строке 21 проверяется, создан ли клиент. ПРИМЕЧАНИЕ. Если по какой-то причине клиент не создан, остальные строки основного цикла не выполняют- ся, и цикл повторяется по новой. А, значит, снова выполняется команда создания клиента. Если кли- ент создан, выполнение программы идет дальше. В строке 22 предусмотрена задержка, дающая возможность подключиться клиенту к серверу. В строке 23 проверяется, есть ли соединение. Если есть, то выполняется строка 24, в которой происходит вывод в последовательный канал сообщения о том, что соедине- ние установлено. Все эти сообщения вы можете наблюдать при помощи монитора последовательного порта. В строке 26 начинается цикл обмена данными между мобиль- ным приложением и программой. Цикл занимает строки 26...42. Цикл длится до тех пор, пока существует соединение клиента с сервером. Это условие является параметром оператора whileQ (строку 26). Цикл обмена начинается с присвоения переменной codcomm (код команды) начального значения (строка 27). Начальное зна- чение — минус единица означает, что пока не принято ни одной из ожидаемых команд управления. Переменная будет использо- ваться далее для формирования сообщений. ПРИМЕЧАНИЕ. Переменная codcomm служит индикатором при- нятых команд. Ее значение присваивается после получения любого сообщения от мобильного при- ложения: ♦ если полученное сообщение - это команда «Включить реле» («S1»), переменной присваива- ется значение 1 (один);
432 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ если пришла команда «Выключить реле» («SO»), переменной присваивается 0; ♦ если получены другие команды или пришли по- сторонние сообщения, значение переменной остается равным -1 (минус один). В строке 28 из потока информации, приходящей от мобиль- ного приложения, выделяется очередная текстовая строка и помещается в строковый объект InputString. Выделение строки производится при помощи функции readStringUntilQj являющейся встроенной функцией строкового объекта client. Данная функция выделяет из потока байтов фраг- мент, оканчивающийся символом, переданным в эту функция в качестве параметра. В нашем случае мы используем для этой цели символ пере- вода строки (\п9). В результате работы этой функции строковый объект readStringUntil будет содержать очередную строку, пере- данную мобильным приложением, заканчивающуюся символом возврата каретки (V). ВНИМАНИЕ. В настройках мобильного приложения мы устано- вили для всех кнопок режим, когда в конце каждой команды передаются оба символа: ♦ перевод строки; ♦ возврат каретки. Для упрощения мы не будем избавляться от символа V в конце сообщения. СОВЕТ. При желании вы можете отключить передачу это- го символа в настройках «WjFi Controller». Но наша программа построена так, что этот символ ей не мешает.
Глава 6. Использование ESP-O1 6e3ARDUINO 433 В строке 29 только что полученная строка команды выво- дится в последовательный канал. Это контрольное сообщение, которое поможет нам в поиске ошибок. В строке 30 производится проверка, не содержит ли приня- тая строка команду «S1»? Проверка осуществляется при помощи функции indexOfO текстового объекта InputString. Данная функция ищет в содержимом строкового объекта InputString подстроку, переданную в функцию в качестве параметра. КАК ДЕЙСТВУЕТ ФУНКЦИЯ. Если подстрока найдена, то. функция возвращает номер позиции, с которой она начинается. В про- тивном случае функция возвращает минус единицу Оператор ifO в строке 30 проверяет, не равен ли ре- зультат работы функции indexOfO минус единице. Если не равен, то это значит, что получена команда «S1». В этом случае выполняются строки 31 и 32. В строке 31 на выход реле подается сигнал высокого логиче- ского уровня (реле включается). В строке 32 переменной codcomm присваивается значение 1, что означает — получена команда на включение реле. В строках 34...37 размещен точно такой же блок проверки, как и только что рассмотренный блок в строках 30...33. Но на этот раз программа ищет в принятой строке подстроку «SO», и в случае успеха подает на выход реле низкий логический уровень — реле выключено (строку 35). А переменной codcomm присваива- ется код 0 (строку 36). В строках 38...41 расположен блок команд формирования сообщения. Сначала в строке 38 оператор ifQ проверяет значение переменной codcomm. Если значение переменной равно минус один, это значит, что в принятом сообщении не обнаружено ни команды «S1», ни команды «SO». В этом случае строки 39 и 40 не выполняются. Если же код команды не равен минус единице, то в строке 39 в последовательный канал посылается сообщение «Rele «, а затем в строке 40 посылается либо «OFF», либо «ON», в зависимости от
434 Управление модулем ARDUINO по Wi-Fi с мобильных устройств значения переменной codcomm. Если codcomm равно 1, посыла- ется на «ON», иначе — на «OFF». Строки 43...45 выполняются в том случае, когда разрывается связь клиента с TCP сервером и обрывается цикл обмена инфор- мацией расположенный в строках 26...42. В строке 43 клиент принудительно останавливается, в строке 44 в последовательный канал отправляется сообщение о том, что клиент остановлен. В строке 45 отрабатывается технологическая задержка, даю- щая возможность полностью остановиться клиенту. На этом основной цикл программы заканчивается, и тут же сразу начи- нает работу сначала, со строки 20 программы. Заново создает локального клиента, подключает его к серверу и заново органи- зовывает процесс обмена информацией. 6.7. Управление модулем реле при помощи браузера ВИРТУАЛЬНЫЙ ДИСК. Г Пример 6.5 (папка на ВИРТУАЛЬНОМ диске Ррг_6_05) I Рассмотрим способ удаленно управлять модулем ESP-01 Во всех предыдущих примерах для подачи команд и индика- ции ответных сообщений в мобильном устройстве мы применяли то либо иное уже готовое мобильное приложение. При этом используемые приложения или не полностью удов- летворяли нашим конкретным условиям, или (в случае использо- вания RemoteXY) требовали оплаты за право их использовать в полном объеме.
Глава 6. Использование ESP-O1 6e3ARDUINO 435 ДРУГОЙ СПОСОБ. Между тем, существует способ удаленно управ- лять модулем ESP-01 или аналогичным, используя вместо мобильного приложения любой стандарт- ный Интернет браузер. Браузер имеется в любом смартфоне или планшете. Как известно, браузер предназначен для просмотра WEB-страниц в Интернете. Значит, наш ESP-модуль должен выступить в качестве WEB-сервера. Настоящий WEB-сервер это большая и сложная в настройке программа. Но в нашем случае совсем не обязательно развора- чивать полноценный WEB-сервер. Можно создать примитивный имитатор нескольких простых функций, которые обычно выпол- няет стандартный WEB-сервер. Вычислительной мощности модуля ESP-O1 вполне хватает на формирование простой WEB-страницы, при помощи которой, например, можно: ♦ отобразить состояние реле в управляемом модуле (ON — включено, OFF — выключено); ♦ подать команды на его включение и выключение. Постановка | задачи 1 Задача. Создать программу для модуля ESP-01 в среде разработки IDE ARDUINO для удаленного управления модулем реле по Wi-Fi сети с мобильного устройства при помощи стандартного Интернет браузера. Программа должна в ответ на запрос браузера выдать HTML-код управляющей страницы. При помощи этой стра- ницы должна обеспечиваться как индикация состояния реле (включено/выключено), так и возможность включения и выключения реле.
436 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Схема Исходя из поставленной задачи, схема остается такой же, как и в предыдущем программном примере (Пример 6.4). А точнее, схема представляет собой модуль ESP-O1, подключенный: ♦ либо к любому готовому пассивному модулю реле; ♦ либо к самодельному модулю, собранному по схеме, изобра- женной на рис. 6.12. Алгоритм Для того чтобы представить себе алгоритм работы такой про- граммы, нужно понять, как действует Интернет браузер в про- цессе просмотра WEB-страниц. Работа браузера начинается с того, что пользователь вводит в адресную строку браузера: ♦ либо Интернет-адрес WEB-страницы; ♦ либо IP-адрес WEB-страницы. По нажатию кнопки «Перейти» или другим способом (зави- сит от конкретного браузера) браузер осуществляет подключение к выбранной странице. Для этого, используя IP-адрес сервера, на котором в Интернет находится выбранная страница, браузер посылает на сервер имя страницы, которую он желает открыть. Если введен только адрес сервера, то это значит, что браузер запрашивает домашнюю станицу сайта. Объясним это на приме- рах. В табл. 6.1 приведены разные варианты запросов браузера к WEB-серверу для разных адресов страниц сайтов. Запросы браузера к WEB-cepeepy Таблица 6.1 №п/п 1 2 3 4 5 Адрес запрашиваемой страницы http://book.mirmk.ru/ http://book.mirmk.ru/about.htm 192.168.0.108/ 192.168.0.108/S1 192.168.0.108/S0 Запрос, посылаемый браузером на сервер GET/HTTP/1.1 GET/abouthtm HTTP/1.1 GET/HTTP/1.1 GET/S1HTTP/1.1 GET/S0HTTP/1.1
Глава 6. Использование ESP-O1 6e3ARDUINO 437 Запрос состоит из таких элементов: ♦ ключевого слова GET (Получить); ♦ адреса запрашиваемой страницы внутри адресного про- странства сервера; ♦ завершается названием версии используемого протокола (НТТР/1.1). В строке 1 таблицы приведен пример, когда сервер запраши- вает домашнюю страницу на сервере поддержки книг, к которым относится и данная книга. Браузер определяет IP адрес сервера с доменным именем http://book.mirmk.ru и посылает на него запрос «GET / НТТР/1.1». Одинокий слеш (символ «/») после запроса «GET» — это и есть адрес корневого каталога сервера. В строке 2 таблицы сервер запрашивает страницу about.htm на сервере http ://book.mirmk.ru . Как видите, адрес страницы в запросе выглядит так: /about.htm. Слеш в начале имени страницы означает, что она располо- жена в корневом каталоге сервера. ПРИМЕЧАНИЕ. Инициировать переход по любому адресу можно, просто щелкнув мышкой по соответствующей ссылке на открытой в браузере странице. Такой пе- реход равнозначен переходу по адресу вписанному в адресную строку браузера. В строках 3, 4 и 5 табл, 6.1 приведены тексты запросов, которые мы будем использовать в нашей программе. Наш мни- мый сервер будет располагаться в локальной домашней сети по адресу 192.168.0.108 (у вас может быть другой IP-адрес). Любой современный браузер допускает использование IP-адреса вместо доменного имени сайта. В строке 3 показан запрос на открытие домашней страницы. В строке 4 браузер запрашивает страницу с именем S1. В строке 5 запрашивается страница с именем SO.
438 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. На самом деле, во всех трех случаях наша про- грамма будет открывать одну и ту же страницу! Разница будет только в той строке, в которой расположена надпись, отражающая состояние реле («Relay ON» или «Relay OFF»). Но содержимое этой надписи зависит не от запроса, а только от фактического состояния реле. Разные запросы мы будем использовать для подачи команд управления реле. Программа будет анализировать запросы: ♦ если в запросе будет найдена подстрока «S1», это будет вос- приниматься, как команда «Включить реле»; ♦ если в запросе обнаружится подстрока «SO», это будет озна- чать команду «Выключить реле». I HTML код II управляющей страницы Разработку программы мы начнем с разработки самой управ- ляющей страницы, которую наша программа будет потом выда- вать на запрос браузера. Для разработки любой страницы исполь- зуется гипертекстовый язык HTML. СОВЕТ Для упрощения процессом создания страницы мож- но использовать любой HTML-редактор. Например, Dreamweaver. Можно использовать и простейший редактор «Блокнот», входящий в комплект любой версии Windows. Готовый текст управляющей страницы приведен в листинге 6.5.1. Текст максимально упрощен. Реальные тексты страниц содержат множество дополнительных тегов. Возможно, такой упрощенный текст будет не всегда правильно открываться на некоторых версиях браузеров. Программа проверена:
Глава 6. Использование ESP-O1 6e3ARDUINO 439 ♦ на стандартном браузере смартфона «Xiaomi Redmi 5 Plus»; ♦ на мобильной версии Яндекс-браузера; ♦ на Яндекс-браузере на компьютере. Если вы не знакомы с языком HTML, разберем в общих чертах текст страницы, приведенный в листинге 6.5.1. Любой текст на языке HTML должен быть заключен в два тега <html> и </html>. Листинг 6.5.1. Текст управляющей страницы <html> <head> <title>RELAY Control from ESP-OK/title> ;</head> !<body> !<font size=IT12lt><center>Relay status: <b> OFF </bxbrxbr>Change status Relay<brXbr> <a href=\"S0\">OFF</a>tabep;tabep;tobsp; |<а href=\nSl\n>ON</a></div> </centerX/font> :</body> :</html> Тегами <head> и </head> ограничивается заголовочная часть HTML-текста страницы, В нашем случае в заголовке всего один параметр — название страницы. Оно ограничено тегами <title> и </title>. Это название («RELAY Control») будет выводиться в заголовке окна браузера. Основное содержимое страницы описывается в области, называ- емой телом страницы. Эта область ограничена тегами <body> и </ body>. Далее весь текст заключен в теги <font size= " 12" > и </font>. Эти теги задают размер шрифта для всех надписей страницы. СОВЕТ. Если вас не устраивает размер шрифта, вы може- те изменить его, уменьшив или увеличив цифру 12 (размер шрифта). Внутри тегов шрифта текст страницы заключен еще в одну пару тегов: <center> и </center>. Эти теги определяют вырав-
440 Управление модулем ARDUINO по Wi-Fi с мобильных устройств нивание строк текста страницы. Благодаря им, весь текст будет выравниваться в каждой строке по центру. Остальное содержимое — это собственно текст страницы. В первой строке отображается надпись «Relay status: «. А далее стоит слово «OFF». Перенос строк в языке HTML не имеет значения. При выводе страницы в окне браузера никакого переноса не будет. Для переноса строк существует специальный тег <br>. Поэтому на странице надпись будет выведена в одну строку: «Relay status: OFF». ПРИМЕЧАНИЕ. В отдельную строку надпись «OFF» мы разместили потому что в процессе работы программы в этом месте будет выводиться либо «OFF», либо «ON», в зависимости от состояния реле. Теги <Ь> и </Ь> заставляют выводить слово «OFF» (или «ON») жирным шрифтом. Жирным шрифтом выводятся лишь те над- писи, которые расположены между двумя этими тегами. Далее два тега переноса строк <br> <br> заставляют браузер отступить две строки, перед тем, как вывести следующую над- пись. В следующей строке располагаются две ссылки. При помощи этих ссылок мы будем управлять нашим реле. Первая ссылка выводится при помощи тегов <а href=\"S0V> и </а>. Вторая ссылка формируется похожим образом. Текст между тегами <а ...> и </а> будет выделен в окне браузера в виде ссылки. Адрес перехода указывается в виде параметра href. Текст первой ссылки — «OFF», текст второй — «ON». Адрес перехода первой ссылки — « S0\ », а второй — « Sl\ ». ПРИМЕЧАНИЕ. Не смотря на то, что в HTML тексте эти ссылки находятся на разных строках, при выводе страни- цы в окно браузера они окажутся в одной строке.
Глава 6. Использование ESP-O1 6e3ARDUINO 441 Рис. 6.13. Внешний вид управляющей страницы Запись &nbsp; означает жесткий пробел. Три жестких про- бела раздвигают ссылки друг от друга, что бы их было удобнее нажимать. Создав при помощи текстового редактора «Блокнот» файл «esp.htm» и заполнив его текстом из листинга 6.5.1, вы можете щелкнуть по имени этого файла в проводнике Windows, и соз- данная вами страница откроется в браузере вашего компьютера. Как выглядит описанная страница в окне мобильного Яндекс- браузера, мы можем видеть на рис. 6.13. Программа | Теперь все готово для того, чтобы приступить к созданию программы для модуля ESP-O1. И начнем мы так же, как в пре- дыдущем примере с заголовочного файла. Текст заголовочного файла приведен в листинге 6.5.2. Как видите, он почти не отли- чается от аналогичного файла в предыдущем примере (листинг 6.4.1). Поэтому не будем останавливаться на нем подробно.
442 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Приведем лишь одно небольшое замечание: ЗАМЕЧАНИЕ. Как вы можете видеть из листинга в данном про- граммном примере для TCP-сервера мы используем адрес 80. ПРИЧИНА СМЕНЫ АДРЕСА. Это стандартный адрес, на котором обычно рабо- тает WEBjoepeep. При использовании этого адреса вам не нужно будет при обращении к модулю спе- циально указывать адрес порта. Если вы захоти- те использовать какой-нибудь другой адрес, напри- мер, 8888, то к серверу придется обращаться так: 192.168.0.109:8888. Программа использует в своей работе уже знакомую нам функцию SetupSTAQ, которая помещена во вкладку SetupJSTA. Эту вкладку мы полностью скопируем из примера 6.1 (смотри листинг 6.1.2). Там же есть ее подробное описание. Поэтому здесь мы ее также не будем повторно описывать. Листинг 6.5.2. Заголовочный файл программы управления реле браузером lpifndef PPR_6_05_H 2 #define PPR 6 05 H 3 4 const char* ssid - "MyWiFi" 5 const char* pass - "ParolMyWiFi"; 6 const int port - 80; ♦define PinRelay 2 8 WiFiServer server(port); 9 String InputString-1*"; 10 11 12 13 14 void SetupSTAO; «endif // Имя домашней Wi-Fi сети // Пароль для доступа к сети // Номер порта TCP сервера // Пин к которому подключен датчик // Указываем порт Web-сервера // строка для хранения входящих данных // Объявление функции начальной установки
Глава 6. Использование ESP-O1 6e3ARDUINO 443 Текст основного тела программы приведен в листинге 6.5.3. Основная программа начинается так же, как в предыдущем при- мере. Операторы #include в строках 5 и 6 полностью аналогичны соответствующим операторам в примере 6.4 (листинг 6.4.2). А функция начальных настроек setup() в строках 8...15 и вовсе полностью идентична той же функции предыдущего при- мера (листинг 6.4.2). Поэтому рассматривать подробно мы будем основной цикл программы 1оор(), который занимает строки 17...53. ВНИМАНИЕ. При написании текста основного цикла программы необходимо было учитывать особенность работы с браузером. Дело в том, что после каждого запро- са и получения ответа, браузер сам в односторон- нем порядке закрывает соединение с клиентом. Поэтому каждый раз приходится заново откры- вать соединение и ждать нового запроса. Именно поэтому основной цикл начинается с команды соз- дания клиента и подключения его к серверу (строка 18 про- граммы листинг 6.5.3). Затем в строках 19...21 проверяется успешность создания клиента. Если клиент не создан (условие '.client имеет значение «истина»), выполняется команда return в строке 20. По этой команде происходит завершение функции 1оор(). Однако, функ- ция loopQ — основной цикл программы. ВНИМАНИЕ. В языке ARDUINO выход из этого цикла невозмо- жен. Команда лишь приводит к перезапуску функ- ции 1оорО> Функция начинает выполняться снача- ла. То есть, при неудачном создании клиента, про- цесс начинается заново, с новой попытки создать клиента.
444 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Если клиент создан успешно, то управление переходит к строке 22. В этой строке происходит вывод в последовательный канал сообщения о том, что новый клиент успешно создан. В строках 23—25 расположен цикл ожидания запроса от браузера. Цикл организован при помощи оператора while(). Цикл выполняется до тех пор, пока буфер входных данных канала Wi-Fi пуст. Проверка содержимого буфера производится при помощи функции availableQ объекта client. Функция availableQ возвра- щает количество байтов в буфере обмена. Пока это количество равно нулю^ цикл продолжается. В теле цикла предусмотрена небольшая задержка (строка 24) для того, чтобы проверка не происходила слишком часто. Когда по Wi-Fi каналу будет получен хотя бы один байт, цикл ожидания прервется и управление перейдет к строке 27. В строке 27 из потока информации идущей по Wi-Fi каналу выделяется строка и помещается в строковый объект InputString. Эта опера- ция нам уже знакома. В строке 28 только что считанная строка выводится сообще- нием в последовательный канал. В строке 29 стоит команда ожидания завершения процесса передачи информации flushQ. Это метод объекта client. Команда нужна для того, чтобы дождаться, пока браузер перестанет пере- давать информацию, чтобы последующие запросы не помешали передаче текста страницы. В строке 30 объявляется переменная rstat (статус реле). Сюда будет записываться тот же уровень, который будет подаваться на выход реле. При выводе HTML-страницы эта переменная будет использоваться для индикации состояния реле. Там же, в строке 30 только что объявленной переменной, присваивается значение по умолчанию — LOW (низкий логический уровень)., В строках 31...35 происходит проверка наличия в принятом сообщении команды «S1». В случае ее обнаружения в строке 32 в последовательный канал выводится сообщение «Relay ON». В строке 33 на выход реле подается высокий логический уро- вень. А в строке 34 тот же уровень присваивается переменной rstat В строках 36...40 размещен такой же блок команд, но осу- ществляющий поиск команды «SO». В случае обнаружения в последовательный канал выводится «Relay OFF» (строка 37), на выход реле подается низкий логический уровень (строка 38). Такой же уровень записывается в переменную rstat (строки 39).
Глава 6. Использование ESP-O1 6e3ARDUINO 445 Листинг 6.5.3. Текст программы управления реле браузером ♦include <ESP8266WiFi.h> ♦include "Ppr_6_05.h" void setup(){ Serial.begin(115200); Serial.printIn (); SetupSTAO; pinMode(PinRelay, OUTPUT); digitalWrite(PinRelay, LOW); delay(200); void loop() { WiFiClient client if (!client) { return; Программный пример 6.5. Глава 6. Программирование для модуля ESP-01 Управления модулем реле (вкл/выкл) при помощи браузера // Подключаем библиотеку ESP8266WiFi // Настройка последовательного канала // Вывод символов перевода строки // Настройка Wi-Fi и подключение к сети // Настройка контакта // Установка начального значения на выходе server.available(); Serial.println("New client"); while(!client.available()) { delay(1); // Создать Клиент и подключить к серверу // Если клиент не был создан то // Завершение функции loop // Сообщение о создании клиента // Пока буфер данных пуст, ожидаем // задержка повторной проверки String InputString = client.readStnngUntil('\r'); // Считывание строки Serial.println(InputString); client.flush(); mt rstat = LOW; if (InputString. mdexOf ("SI") ! Serial.println("Relay ON"); digitalWrite(PinRelay,HIGH); rstat = HIGH; if (InputString. mdexOf ("SO") ! Serial.println("Relay OFF"); digitalWrite(PinRelay,LOW); rstat = LOW; // Печать принятой строки // Ожидаем окончание приема информации // Устанавливаем статус реле "выключено" = -1) { // Есть ли команда "S1" (Пуск) // Сообщение "Реле включается" // Высокий уровень на выход реле // Статус реле "Включено" = -1) { // Есть ли команда "SO" (Пуск) // Сообщение "Реле выключается" // Низкий уровень на выход реле // Статус реле "Выключено" // Вывод HTML-страницы client, print In ("<html><head><title>Relay Control from ESP-OK/titlex/head>") ; client.println("<bodyxfont size=\"12\"xcenterxbr>Relay status: <b>") ; client.println((rstat == HIGH)?"ON":"OFF"); client, print In ("</bxbrXbr>Change status Relay<brxbr>") ; client.println("<a href=\"Sl\"X)N</a>&nbsp;&nbsp;&nbsp;"); client.println ("<a href=\"S0\">OFF</ax/div>") ; client .println ("</centerx/fontx/bodyx/html>") ; delay (1); Serial.println("Client disonnected"); Serial.println (" "); // Задержка // Сообщение "Клиент отключен" // Вывод пустой строки
446 Управление модулем ARDUINO по Wi-Fi с мобильных устройств В строках 42...48 происходит вывод в браузер текста HTML- страницы. Текст выводится строка за строкой при помощи функ- ции printlnQ объекта client. \ ВНИМАНИЕ. В некоторых местах HTML-текста (листинг 6.5.1) применяются кавычки. Для того, чтобы эти кавыч- ки поместить в строковый литерал, для вывода его при помощи функции printlnO, перед такими ка- вычками нужно поставить левый слеш. Например, HTML строка <body><font size="12"><center><br>Relay status: <b> превращается в литерал "<body><font size=V12\n><center><br>Relay status: <b>M В строке 44 происходит вывод статуса реле. Программа выво- дит либо «ON», либо «OFF» в зависимости от значения перемен- ной rstat. Для переключения используется оператор условного выбора: (ycjiOBHe)?nOFFw:wONft. Мы уже встречали этот оператор в разделе 5.3 книги. Если переменная rstat равна HIGH, оператор возвращает «ON», в про- тивном случае — «OFF». После вывода текста страницы в строке 50 выполняется небольшая задержка: ♦ в строке 51 в последовательный канал посылается сообщение о том, что соединение разорвано; ♦ в строке 52 туда же выводится пустая строка для того, чтобы на экране отдельные сеансы работы отделялись друг от друга. На рис. 6.14 показан вид экрана монитора последовательного порта при старте программы «Пример 6.5». В первой строке сообщений вы видите набор служебной информации, которую при рестарте выдает модуль ESP-01. Мы видим лишь малую часть этой бессмысленной для нас последо- вательности знаков.
Глава 6. Использование ESP-O1 6e3ARDUINO 447 {1 1к,ц| м 'sHc,, #Дуг Connecting to host MyWiFi busy . OK connected IP address: 192.168.0.108 TCP port 80 New client GET / HTTP/1.1 Client disonnected New client GET /favicon.ico HTTP/1.1 Client disonnected Рис. 6.14. Сообщения при старте программы Начиная со строки «Connecting to host MyWiFi» и до строки «TCP Port 80» — это сообщения, выводимые функцией SetupSTAO при старте модуля. Каждый запрос браузера сопровождается: ♦ сообщением «New client» перед запросом; ♦ сообщением «Client disconnected» после запроса. ПРИМЕЧАНИЕ. Мы уже говорили, что перед каждым запросом кли- ент создается заново, а после ответа на запрос со- единение автоматически обрывается. Как видно из рис. 6.14, после запроса страницы браузер выдает еще один запрос — запрашивает файл favicon.ico. Это файл минииконки, которую браузер помещает в заголовке окна страницы. Браузер всегда ищет ее в корневой директории сайта, и в случае ее наличия выводит эту иконку для придания странице индивидуальности.
448 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ПРИМЕЧАНИЕ. Вообще то, при открытии реальной страницы, получив в ответ на основной запрос HTML-текст страницы, браузер обычно начинает подавать на сервер массу запросов, вызывая все картинки и дру- гие элементы, обычно расположенные на странице. В нашем случае страница не имеет никаких лиш- них элементов. Поэтому запрашивается только иконка. На рис. 6.15 показан экран монитора порта при передаче команд «SO» и «S1». Предлагаем проанализировать выводимые в этом случае сообщения самостоятельно. Скажу только, что при получении команды программа выводит сообщение «Relay ON» или «Relay OFF». New client GET /SI HTTP/1.1 Relay ON Client disconnected New client GET /favicon.ico HTTP/1.1 Client disonnected New client GET /SO HTTP/1.1 Relay OFF Client disonnected New client GET /favicon.ico HTTP/1.1 Client disonnected Рис. 6.15. Сообщения при получении команд
Глава 6. Использование ESP-01 6e3ARDUINO 449 6.8. Программа управления климатическим модулем ВИРТУАЛЬНЫЙ ДИСК. Г Пример 6.6 (папка на ВИРТУАЛЬНОМ диске Ррг__6_06) Учимся использовать | климатический модуль II В этом примере мы научимся использовать климатиче- ский модуль, специально разработанный для использования совместно и под управлением модуля ESP-O1. Мы уже упоминали этот модуль в главе 2. Внешний вид климатического модуля при- веден на рис. 2.15. Основа модуля — климатический датчик DHT11 (рис. 6.16). Датчик позволяет измерять два климатических параметра окру- жающего воздуха: ♦ температуру; ♦ влажность. Tfvi£ Ц • ! i 2~JL^ | [.^ « ж i t ^^Kt1 ; | ;-m v- '-с :« m- ■- ; j .m ^ :'? ш т m Zj: к \ ^ш » « a * f I ! Puc. 6.16. Внешний вид лицевой и обратной стороны датчика DHT11
450 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Модуль имеет следующие параметры: ♦ диапазон измерения температуры: от 0 до +50 °С; ♦ точность измерения температуры ±2 °С; ♦ диапазон измерения относительной влажности: .. от 20 до 90 %; ♦ точность измерения влажности ±5%; ♦ напряжение питания 5 В (3—5,5 В); ♦ ток потребления 0,5—2,5 мА. Датчик выпускается в пластмассовом корпусе размерами 12x15,5х5,5 мм. Легкий корпус имеет отверстия для свободной циркуляции воздуха, а внутри корпуса расположена миниатюр- ная плата с радиоэлементами. Датчик имеет 4 вывода: ♦ вывод 1 — напряжение питания (+5 В); ♦ вывод 2 — линия обмена данными; ♦ вывод 3 — не используется; ♦ вывод 4 — общий провод. Для двунаправленной передачи данных используется прото- кол 1-Ware. Протокол позволяет подключать множество ведомых устройств на одну двухпроводную линию. Туда же подключается одно ведущее устройство. Ведущее устройство может: ♦ устанавливать двухстороннюю связь с любым ведомым устройством; ♦ передавать на него данные (например, адрес нужного реги- стра или ячейки памяти); ♦ читать данные из регистра или ячейки памяти. ПРИМЕР. Подобный протокол, например, используется в электронных брелках («таблетках»), выполняющих роль ключа в электронных замках в подъездах мно- гоквартирных домов. В нашем случае: ♦ ведомое устройство — это климатический модуль; ♦ в качестве ведущего устройство выступает модуль ESP-01.
Глава 6. Использование ESP-O1 6e3ARDUIN0 451 Схема Схема климатического модуля, в котором и установлен дат- чик DHT11, приведена на рис. 6.17. Климатический модуль имеет разъем, при помощи которого к нему подключается модуль ESP- 01. В результате получается автономное миниатюрное устрой- ство, которое требует лишь подключения внешнего напряжения питания 3,7—12 В. Как видно из схемы, климатический модуль имеет стабилизатор напряжения 3.3 В, от которого питается и датчик, и плата ESP-01. Кроме этого, модуль имеет: ♦ кнопку сброса S1; ♦ светодиод индикации наличия напряжения питания VD1; ♦ несколько подтягивающих резисторов и конденсаторов фильтра по питанию. В процессе разработки (или просто при повторении) описан- ной программы необходимо соблюдать порядок работы, указан- ный ниже. 1. Сначала модуль ESP-01 подключается к компьютеру для загрузки управляющей программы. Для подключения модуля к компьютеру используется описанный в предыду- +5В U1 IL336 +З.ЗВ Z2 | С3[ С1...СЗ 1 мкф VD1 Рис. 6.17. Схема принципиальная электрическая климатического модуля
452 Управление модулем ARDUINO по Wi-Fi с мобильных устройств щих разделах адаптер, имеющий переключатель режимов, и кнопку сброса. В адаптере необходимо выбрать режим «Программирование». 2. Затем, на компьютере запускается среда разработки IDE, при помощи которой в программную память модуля загружается управляющая программа. 3. После этого ESP-модуль отключается от адаптера и подключа- ется к климатическому модулю. 4. Климатический модуль подключается к источнику питания. ПРИМЕЧАНИЕ. 1 N. В качестве источника питания можно использо- вать комплект батареек или аккумулятор. Также удобно использовать блок питания от любого мо- бильного телефона. Или просто шнур питания, подключенный к любому USB выходу. ч у Но сначала нам нужно разработать эту самую управляющую программу. II Постановка II задачи Задача. Разработать в среде IDE программу для модуля ESP-01, которая по команде, переданной из мобильного приложения, должна считать из климатического модуля значения тем- пературы и влажности, и передать эти значения назад на мобильное устройство. В качестве управляющей программы со стороны мобиль- ного устройства должно использоваться приложение «WiFi Controller». Для инициации считывания климатических параметров мы будем использовать кнопку «PUSK» в мобильном приложении (табл. 4.1).
Глава 6. Использование ESP-O1 6e3ARDUINO 453 Получив запрос, посылаемый при нажатии этой кнопки, разра- батываемая программа должна послать в ответ сообщение, содер- жащее измеренные температуру и влажность, которое мы увидим в окне поступившей информации приложения. Алгоритм II Алгоритм работы программы очень похож на алгоритм пре- дыдущей задачи. Программа в ESP-модуле должна: ♦ перевести модуль в режим Wi-Fi клиента; ♦ подключиться к домашней Wi-Fi сети; ♦ запустить на модуле ТСР-сервер; ♦ после этого — принимать все сообщения от мобильного устройства, анализировать их и искать среди полученных со- общений команду от кнопки «PUSK». Как следует из табл. 4.1, при нажатии этой кнопки прило- жение «WiFi Controller» посылает на ESP-модуль сообщение, состоящее из двух символов: «SP». ♦ Получив это сообщение, программа в ESP-модуле должна считать значения температуры и влажности и послать назад на мобильное устройство. Дополнительные | библиотеки II Для того чтобы наша программа могла считывать данные из климатического модуля DHT11, нужно скачать специальную библиотеку, содержащую готовые функции для работы с подоб- ными датчиками. ПРИМЕЧАНИЕ. Вернее, библиотек этих две.
454 Управление модулем ARDUINO no Wi-Fi с мобильных устройств Первая называется «Adafruit_Sensor.h». Это универсальная библиотека для работы со всеми известными типами датчиков. Она поддерживает протокол 1-Ware и встроенные функции, при помощи которых можно считывать данные из различных ячеек внутренней памяти, в которых содержатся результаты измерения. Библиотека поддерживает широкий спектр моделей датчиков: ♦ акселерометры; ♦ гироскопы; ♦ световые датчики; ♦ магнитометры; ♦ датчики ориентации; ♦ датчики давления; ♦ комплексные модули, содержащие сразу целый набор датчиков. ПРИМЕЧАНИЕ. Все эти датчики чаще всего используют протокол 1-Ware. Однако каждый из датчиков по своему ко- дирует считанные им данные, имеет свою размер- ность измеряемых величин и помещает считанные величины в разные ячейки памяти. Поэтому, для каждого конкретного датчика разработана своя дополнительная библиотека. Для датчиков температуры и влажности типа DHT11, DHT21 и DHT22 создана специальная библиотека, которая называется «DHT.h». Обе описанные выше библиотеки, как и любые дру- гие библиотеки для среды программирования IDE ARDUINO распространяются бесплатно, и их можно свободно скачать из Интернета. ВИРТУАЛЬНЫЙ ДИСК. Проще всего скачать обе эти библиотеки с вирту- ального диска книги. После скачивания каждая би- блиотека представляет собой ZIP-apxue, содержа- щий папку с библиотечными файлами.
Глава 6. Использование ESP-O1 6e3ARDUINO 455 Нужно по очереди установить сначала одну, затем другую библиотеку в среду IDE. Для установки библиотеки просто выберите в меню среды IDE пункт меню: «Скетч / Подключить библиотеку / Добавить ZIP библиотеку». В открывшемся окне нужно найти и выбрать ранее загружен- ный ZIP-файл библиотеки, и библиотека установится в систему. То же самое нужно повторить и для второй библиотеки. Программа Программа управления климатическим датчиком выпол- нена по образу программы управления реле. В листинге 6.6.1 приведен текст заголовочного файла климатической программы. В строках 1,2 и 18 мы вредим стандартные макросы заголовоч- ного файла. В строках 4...7 — уже знакомые нам по многим про- граммам команды объявления глобальных констант и объектов. В строках 15 и 16 также уже знакомые нам объявление функции начальной установки и оператор инициализации ТСР- сервера. Новые для нас команды расположены в строках 9... 13. В строке 9 определяется имя DHTPIN для линии ввода- вывода, посредством которой будет производиться обмен инфор- мации с модулем DHT11. В строке 10 определяется константа DHTTYPE (Тип модуля DHT). В нашем случае тип модуля — DHT11. В строках 11 и 12 размещены примеры строк, которыми нужно заменить строку 10 в том случае, если применяется дру- гой тип датчика. Эти строки закомментированы (двойной слеш в начале строки), и в данной программе не учитываются. Ну и наконец, в строке 13 расположена команда, объявляющая объект типа DHT с именем dht. При помощи этого объекта далее в программе мы будем обращаться к датчикам температуры и влаж- ности. Параметры, используемые при создании объекта: ♦ номер контакта для подключения датчика (DHTPIN); ♦ тип датчика (DHTTYPE).
456 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Листинг 6.6.1. Текст заголовочного файла программы климатических измерений ♦ifndef PPR_6_06_H ♦define PPR_6_06_H const char* ssid - "MyWiFi"; const char* pass = "ParolMyWiFi* const int port = 8888; String InputString=nif; ♦define DHTPIN 2 ♦define DHTTYPE DHT11 // ♦define DHTTYPE DHT21 // ♦define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void SetupSTA(); 16 WiFiServer server(port); 17 18 ♦endif 19 // Имя домашней Wi-Fi сети // Пароль для доступа к сетиои // Номер порта TCP сервера // строка для хранения входящих данных // Пин к которому подключен датчик // Используемый датчик DHT 11 // Создаем объект "Метео датчик" // Декларация функции начальных установок // Инициализация TCP/IP скрвера Кроме заголовочного файла наша программа, как и многие предыдущие, использует дополнительную вкладку Setup_STA, содержащую описание функции начальной установки ESP-модуля SetupSTAQ. ПРИМЕЧАНИЕ. Эту вкладку и эту функцию мы уже описывали ранее. Основной текст программы приведен в листинге 6.6.2. Как уже говорилось выше, структура новой программы аналогична структуре программного примера 6.4 (листинг 6.4.2). Далее, мы подробно разберем работу программы управления климатиче- ским модулем, приведенную в листинге 6.6.2. В строках 5...7 программы расположен ряд команд ^include, при помощи которых производится присоединение всех необхо- димых библиотек и заголовочного файла.
Глава 6. Использование ESP-O1 6e3ARDUINO 457 Первая из команд (строка 5) присоединяет библиотеку для работы с микросхемой ESP8266. В строках 6 и 7 присоединяются основная и дополнительная библиотеки для работы с датчиком DHT11. В строке 8 присоединяется заголовочный файл. ВАЖНО. 1 N Присоединять заголовочный файл нужно только после того, как будут присоединены все библио- теки. То есть, в ряду команд #indude эта команда должна быть последней. Системная функция setupQ занимает строки 11...18. В строке 12 производится инициализация последовательного канала. В работе программы последовательный канал не исполь- зуется, но он может помочь при отладке программы. Если после компиляции и загрузки программы не отключать модуль от компьютера и запустить программу, то, благодаря сооб- щениям в мониторе порта, можно: ♦ во-первых, убедиться, что начальная настройка и подключе- ние к домашней сети происходит нормально; ♦ во-вторых, узнать IP-адрес, выданный вашему модулю и ис- пользуемый порт для ТСР-сервера; ♦ в-третьих, даже подключиться к модулю с мобильного устройства и послать запрос при помощи кнопки «PUSK». Если программа работает правильно, то вы получите в ответ текстовое сообщение (такое, как показано на рис. 6.18), только вместо значений температуры и влажности вы увидите слово «поп». В строке 13 формируется задержка, как это было сделано и в предыдущих программах. В строке 14 в последовательный порт посылается символ новой строки. В строке 15 вызывается функция начальной настройки SetupSTAQ. В строке 16 производится инициализация объекта dht. Ну и завершается функция setupQ еще одной командой задержки (строка 17).
458 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Листинг 6.6.2. Основной текст программы климатических измерений /* ♦include <ESP8266WiFi.h> tinclude "Adafruit_Sensor.h" ♦include "DHT.h" ♦include "Ppr_6_06.h" //♦*♦*♦*♦*♦************* void setup() { Serial.begin(115200); delay(10); Serial.println(); SetupSTAO; dht.begin(); delay(200); Программный пример 6.6. Глава 6. Программирование для модуля ESP-01 Управления метео модулем (температура влажность) через "WiFi Controller" */ // Библиотека для ESP8266 // Adafruit_Sensor // Подключаем библиотеку DHT // Заголовочный файл // Настройка последовательного канала // Пауза 10 мкс // Вывод символов перевода строки // Настройка Wi-Fi и подключение к сети // Инициализация DHT //*♦*♦*♦*♦******************************** void loop() { WiFiClient client - server.available(); if (client) { delay(200); if(client.connected()) { Serial.printin("Client Connected"); // Создать Клиент и подключить к серверу // Если клиент был создан то // Если клиент подключен то // Сообщить "Клиент подключен" while(client.connected()) ( // Пока слиент подключен выполняем цикл InputString = client.readStringUntil('\n'); // Выделякм строку из потока Serial.println(InputString); if (InputString.indexOf("SP")!—1) { // Если принята строка - "SP" float t - dht.readTeraperatureO; // Считывание температуры float h = dht.readHumidityO; // Считывание влажности client.println(»**************** client.print("Temperature - "); client.print(t); client.print(char (176)); client.pnntln("C"); client.print("Humidity - "); client.print(h); client.println("%RH"); client.println(); client.stop(); Serial.printIn("Client disconnected"); delay(200); "); // Начало печати сообщения // Температура // Значение температуры // Символ градуса // Символ "Целсия" // Влажность // Значерие влажности // Размерность влажности // пустая строка // Отключаем клиент // Сообщаем что клиент отключен
Глава 6. Использование ESP-O1 6e3ARDUINO 459 Основной цикл программы занимает строки 21...50. Начинается основной цикл с инициализации клиента и подклю- чения его к TCP-серверу (строка 22). В строке 23 проверяется успешность создания клиента. Вся оставшаяся часть основного цикла программы, расположенная в строках 24...48, выполняется только в том случае, если клиент создан. В строке 24 снова задержка, позволяющая завершиться про- цессам подключения клиента к домашней сети. В строке 25 проверяется, есть ли подключение клиента к сер- веру. Если подключение существует, то выполняется строка 26, в которой в последовательный порт выдается сообщение об успеш- ном подключении. В строках 28...44 расположен цикл обмена информацией. Цикл выполняется до тех пор, пока существует подключение клиента. Внутри цикла сначала в строке 29 из потока информации, поступающей по Wi-Fi каналу, выделяется очередная текстовая строка. Выделенная таким образом строка команды помещается в строковый объект InputString. В строке 10 программы принятая только что команда выводится в последовательный канал. ПРИМЕЧАНИЕ. Как вы можете видеть, вплоть до этого момента наша климатическая программа полностью по- вторяет программу управления реле (пример 6.4). Изменения мы увидим только в оставшейся части цикла обмена данными. В строке 31 производится оценка принятой команды. Если текст команды содержит подстроку «SP», это значит, что пришла команда «PUSK». При получении команды «PUSK» выполняется часть программы, расположенная в строках 32...43, которая и производит считывание значений из датчика и передачу их в мобильное приложение. В строке 32 производится считывание значения темпера- туры. Для считывания используется функция readTemperatureQ объекта dht. Считанное значение помещается в переменную t, имеющую тип float.
460 Управление модулем ARDUINO по Wi-Fi с мобильных устройств В строке 33 точно также считывается значение относитель- ной влажности. Считывание производится при помощи другой функции объекта dht Она называется readHumidityQ. Считанное значение помещается в переменную ft, также имеющую тип float В строках 35...43 производится собственно вывод информа- ции по Wi-Fi каналу. Сначала (в строке 35) выводится раздели- тельная полоса из цепочки символов «звездочка» («*»). Затем выводится по очереди температура (строки 36...39) и влажность (строки 40...42). Как это выглядит на экране смарт- фона, показано на рис. 6.18. Каждая величина предваряется ее названием, а заканчивается единицей измерения. В строке 38 выводится символ градуса. Символ формируется при помощи функции charQy использующей в качестве параметра код этого символа (176). В строке 43 выводится пустая строка, которая отделяет теку- щее сообщение от последующего. Рис. 6.18. Работа программы метеоконтроля в окне WiFi Controller
Глава 6. Использование ESP-O1 6e3ARDUINO 461 Строки 46...48 выполняются в том случае, если соедине- ние с клиентом оборвано. В строке 46 клиент останавливается, в строке 47 в последовательный канал выводится сообщение о завершении подключения, в строке 48 выдерживается техноло- гическая пауза. Это окончание основного цикла также повторяет соответствующее место программного примера 6.4. После завершения соединения основной цикл программы повторяется сначала. Снова создается клиент, устанавливается соединение, и запускается цикл обмена. 6.9. Управление метео-модулем при помощи браузера ВИРТУАЛЬНЫЙ ДИСК. Пример 6.7 (папка на ВИРТУАЛЬНОМ диске Ррг_6_07) Постановка | задачи || В последнем примере этой книги мы создадим программу для получения информации от климатического модуля при помощи Интернет браузера. В каком-то смысле это будет синтез про- граммных примеров 6.5 и 6.6. Структуру программы возьмем из программного при- мера 6.5. Эту программу мы использовали для управления моду- лем реле при помощи Интернет браузера. Мы заменим в про- грамме текст HTML странички. Полностью уберем управляющие ссылки, которыми мы вклю- чали и выключали реле. Страница просто будет открываться при обращении браузера к IP-адресу модуля, и индицировать темпе- ратуру и влажность. Для того чтобы видеть изменения измеряе- мых параметров во времени, мы просто добавим в HTML-текст страницы команду автоматической перезагрузки страницы каж- дые 15 секунд.
462 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Листинг 6.7.1. Текст управляющей HTML-страницы метеоконтроля <html> <head> <title>METEO Control from ESP-OK/title> <meta http-equiv="Refresh" content=lf15f?/> </head> <body>| <font size=ff12lfXcenter>Meteo control<br> <br>Meteo sensor DHTll<brXbr> Temperature = 27.30 *deg;C<br> Humidity = 36.20 %RH </centerx/font> </body> </html> I! HTML текст I страницы В листинге 6.7.1 показан текст HTML-страницы, который будет выдавать при обращении браузера наша программа. На рис. 6.19 показан внешний вид этой страницы. В структуре HTML-файла вы, надеюсь, уже разобрались. В строке 3 листинга выводится заголовок новой страницы («Meteo Control from ESP-01 «). В основном теле HTML кода (в строке 7 листинга) выводится заголовок, размещаемый в верхней части самой страницы «Meteo control» (Метеоконтроль). В строке 8 выводится информирующая надпись «Meteo sensor DHT11» (Метеодатчик DHT11). Сообщение о температуре выво- дится в строках 9—11 кода. А сообщение о влажности в строках 12-14. Каждое из этих сообщений специально разбито на три части: ♦ название индицируемой величины; ♦ цифровое значение; ♦ размерность. Цифровое значение каждой величины (строки 10 и 13) дано условно. При выводе страницы по запросу браузера, программа
Глава 6. Использование ESP-O1 6e3ARDUINO 463 Mete о control Meteo censor Bill' Temperature •- 31.0 Рис. 6.19. Внешний вид HTML-страницы метеоконтроля должна заменить эти значения на истинные, считанные с клима- тического датчика. Выражением &deg; в строке 11 закодирован символ градуса. Это один из спецкодов языка HTML. В строке 4 листинга 6.7.2 мы видим мета тег «Refresh». Этот тэг после открытия страницы в браузере периодически вызывает автоматическую перезагрузку страницы. Параметр «content» мета тега определяет период времени, спустя который происхо- дит перезагрузка. Программа Программа для управления метеомодулем при помощи Интернет браузера, как и программы предыдущих примеров, имеет три вкладки:
464 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ♦ основной текст программы; ♦ заголовочный файл; ♦ дополнительная вкладка Setup_STA, содержащая функцию SetupSTAQ. Текст заголовочного файла приведен в листинге 6.7.2. Он практически полностью повторяет аналогичный файл предыду- щего примера (листинг 6.6.1). ПРИМЕЧАНИЕ. В новом файле изменено лишь имя параметра в ма- крокомандах (строки 1 и 2, листинга 5.7.2). Главное изменение - для TCP-сервера указан другой номер порта. В новой программе используется стандарт- ный порт для web-сервера - порт номер 80. Основной текст программы управления метеомодулем приве- ден в листинге 6.7.3. Он построен по образу программного при- мера 6.5 (управление модулем реле при помощи Интернет браузера). Программы очень похожи. Поэтому мы разберем только отличия. Листинг 6.7.2. Заголовочный файл программы метеоконтроля 1]#lfndef PPR_6_0 7_H 2J#defme PPR_6_07_H з! 4iconst char* ssid = "MyWiFi"; // Имя домашней Wi-Fi сети ISiCoiisf char* pass = "ParolMyWiFi"; // Пароль для доступа к сети 6jconst int port = 80; // Номер порта TCP сервера 7|WiFiServer server(port); 8]Stiing InputStrmg=ffl?; // Указываем порт Web-сервера // Строка для хранения входящих данных 10j#define DHTPIN 2 llifdefme DHTTYPE DHT11 121 // #defme DHTTYPE DHT21 131 // #define DHTTYPE DHT22 14|dHT dht(DHTPIN, DHTTYPE); 15 16 void SetupSTAO ; 17 18 #endif 19 // Пин к которому подключен датчик // Используемый датчик DHT 11 // Создаем объект "Метео датчик" // Объявление функции начальной установки
Глава 6. Использование ESP-O1 6e3ARDUINO 465 Листинг 6.7.3. Основной текст программы метеоконтроля Программный пример 6.7. Глава 6. Программирование для модуля ESP-01 Управления метео модулем (температура влажность) при помощи браузера V ♦include <ESP8266WiFi.h> // Подключаем библиотеку ESP8266WiFi ♦include "Adafruit_Sensor.h" // AdafruitjSensor ♦include "DHT.h" // Подключаем библиотеку DHT ♦include "Ppr_6_07.h" void setup(){ Serial.begin(115200); // Настройка последовательного канала Serial.printIn(); // Вывод символов перевода строки SetupSTA(); // Настройка Wi-Fi и подключение к сети dht.begin(); // Инициализация DHT delay(200); void loop(){ WiFiClient client = server.available(); // Создать Клиент и подключить к серверу if (!client) { // Если клиент не был создан то return; // Завершение функции loop (начать с начала) } Serial.println("New client1*); // Сообщение о создании клиента while(!client.available()) { // Пока буфер данных пуст, ожидаем delay(1); // задержка повторной проверки String InputString = client.readStringUntil('\r'); // Считывание строки Serial.printIn(InputString); // Печать принятой строки client.flush(); // Ожидаем окончание приема информации» float t = dht.readTemperature(); // Считывание температуры float h = dht.readHuraidity(); // Считывание влажности // Вывод HTML-страницы cl lent, print In (ff<htmlxheadxtitle>Meteo Control from ESP-0K/title>"); client.println(lt<meta http-equiv=\"Refresh\" content=\"15\"/>") ; client.prmtln(lf</headxbodyxfont size=\if12\fI><center>Meteo control<br>") ; client.println("<br>Meteo sensor DHTll<brxbr>Temperature = ") ; client.println(t); client.println("&deg;C<br>Huraidity = "); client.println(h); client .println (lf%RH</center></font></bodyx/html>lt) ; d>") ; de1ay(1); // Задержка Serial.println("Client disonnected"); // Сообщение "Клиент отключен" Serial.println(""); // Вывод пустой строки
466 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Во-первых, в начале программы управления метеомодулем (листинг 6.7.3) добавлены два оператора «include, присоеди- няющие к программе библиотеки для работы с датчиком DHT11 (строки 6 и 7). Во-вторых, в функцию setupO добавлена строка инициализа- ции объекта dht (строка 14) и убраны команды настройки вывода на реле (так как реле теперь нет). В-третьих, в основном цикле программы loopQ полностью отсутствует блок поиска команд управления. Программа лишь: ♦ создает клиент (строка 19); ♦ проверяет успешность создания клиента (строки 20...22). В строке 23 программа выводит сообщение о создании кли- ента. Далее, программа ждет, пока в буфере обмена появится какие-нибудь данные (строки 24...26). В строке 28 из принятого потока данных выделяется строка команды. Но выделяется она лишь для того, чтобы в строке 29 передать ее в последовательный канал в целях отладки. Данные вообще не оцениваются. При поступлении любого запроса программа приступает к передаче текста страницы на мобильное устройство. Перед началом передачи текста страницы в строках 31 и 32: ♦ считываются значения температуры и влажности; ♦ записываются, соответственно, в переменные t и h (обе пере- менные имеют тип float). Блок команд, выводящих текст HTML страницы, расположен в строках 35...42, Строки HTML-страницы выводятся при помощи функции printlnO объекта client Кавычки, которые присутствуют в HTML-тексте при вставке в функцию printlnO предваряются лево- сторонним слешем. В строках 39 и 41 выводятся реальные значения температуры и влажности. В строках 44.. .46 находятся заключительные команды основ- ного цикла программы. Эти команды выполняются в случае обрыва связи. Технологическая задержка — строка 44. Вывод контрольных сообщений в последовательный канал — строки 45 и 46. После того, как программа откомпилирована и загружена в программную память модуля ESP-01, нужно: ♦ отключить модуль от USB адаптера; ♦ подключить к метеомодулю;
Глава 6. Использование ESP-O1 6e3ARDUINO 467 ♦ подать на метеомодуль питание; ♦ нажать (желательно) на модуле кнопку сброса. После этого: ♦ открываете в смартфоне любой браузер; ♦ набираете в адресной строке присвоенный модулю IP-адрес; ♦ нажимаете кнопку «Перейти». Откроется страница, изображенная на рис- 6.19. Далее, каж- дые 15 секунд, страница будет автоматически перегружаться. Но обновление страницы будет не очень заметно. Ведь температура и влажность изменяются не так быстро. Однако работа датчиков не очень стабильна. Особенно датчика влажности. Поэтому изме- нения вы все же увидите. Некоторые II выводы II Как видите, способ управления модулем при помощи Интернет браузера очень гибок и удобен. Он позволяет: ♦ самостоятельно создать удобные в работе управляющие стра- ницы специально для каждого проекта; ♦ управлять микроконтроллерным устройством не только с мобильного приложения, но и с компьютера. Теоретически, создать эмулятор WEB-сервера можно и для случая, когда ESP-модуль управляется при помощи ARDUINO. Но тогда программа усложняется многократно, потому что управ- ление всеми операциями придется выполнять при помощи АТ-команд.
ПРИЛОЖЕНИЕ! СПИСОК ЛИТЕРАТУРЫ И ИСПОЛЬЗОВАННЫХ РЕСУРСОВ СЕТИ ИНТЕРНЕТ I Литература и ссылки на литературу в Интернет 1. Белов А.В. ARDUINO: от азов программирования до созда- ния практических устройств. — СПб.: Наука и Техника. — 2018. http://book.mirmk.ru/lnk.php?nom=01 2.БеловА.В. Микроконтроллеры AVR от азов программирования до создания практическихустройств.—СПб.: Наука и Техника.—2018. http://book.mirmk.ru/lnk.php ?nom=02 3. Белое А.В. Программирование ARDUINO: создаем прак- тические устройства. — СПб.: Наука и Техника. — 2018. http ://book.mirmk.ru/lnk.php?nom=03 I Ссылки в Интернет на страницы установки мобильных приложений 4. Сканер OR и штрих кодов (русский). Рекомендуем устано- вить его на ваше мобильное устройство взамен стандартного ска- нера. Преимущества — быстрая работа, возможность настроить режим работы таким образом, что бы при наведении смартфона на QR-код сразу открывалась картинка в Интернете (обычно автоматически открывается только страница загрузки приложения). https://play.google.com/store/apps/details?id=com. teacapps.barcodescanner&hl=ru
Приложения 469 5. Приложение для смартфона TCP/UDP TEST TOOL Набор утилит для проверки работы по сети Wi-Fi по про- токолам TCP и UDP. В книге используется в главе 3 для про- верки работы модуля при помощи АТ-команд. Отсканируйте QR-код справа своим смартфоном, и смартфон перейдет к странице загрузки этого приложения. https ://play.google.com/store/apps/ details?id=jp.gr.java__conf.tcp__udp__testtool 6. Приложение для смартфона WIFI Controller ESP8266 Удобное универсальное приложение для управления модулем на основе микроконтроллера ESP8266 по сети Wi-Fi. Используется в главе 4 книги для проверки и отладки программ- ных примеров. Отсканируйте QR-код справа своим смартфоном, и смартфон перейдет к стра- нице загрузки этого приложения. https ://play.google.com/store/apps/ details?id=com.mightyit.gops.wificontroller 7. Приложение для смартфона Network Utilities. Набор утилит для работы в сетях Wi-Fi. Используется в книге для сканирова- ния Wi-Fi сети с целью узнать IP-адрес учебного модуля, а также для обнаружения открытых пор- тов. Отсканируйте QR-код, и смартфон перейдет к странице загрузки этого приложения. https ://play.google.com/store/apps/ details?id=com.myprog.netutils 8. Приложение для смартфона RemoteXY Free. Предназначено для управления микроконтроллерным модулем Arduino и не только... С использованием связи по Wi - Fi и по другим каналам связи, в том числе и через Интернет. Приложение требует создания образа панели управления на ON-LINE редакторе, размещенном в Интернете по адресу http ://remotexy.com/ru/editor/ http ://remotexy.com/ru
470 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Интернет-ссылки, на которые в книге сгенерированы QR-коды 9. http://book.mirmk.ru 10. http://remotexy.com/ 11. http://remotexy.com/ru 12. http://remotexy.com/ru/editor/ 13. http ://arduino.esp8266.com/stable/package_esp8266comJndex. json 14. http://arduino.ru/ 15. http://bbs.espressif.com/ 16. book.mirmk.ru/lnk.php?nom=12 17. http ://www.espressif.com/en/support/download/sdks-demos 18.http://www.espressif.conVsupport/download/other-tools 19.https://blynk.io 20. https ://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvd DExVFNrUXM&usp=sharing 21.https://github.com/espressif/ESP8266JOT_PlJm7ORM 22. https ://github.com/espressif/ESP8266_RTOS_SDK 23. https ://ru.aliexpress.com/ 24. https ://sites.google.com/site/terminalbpp/ 25. https ://www.espressif.com/en/products/hardware/esp8266ex/ resources 26. https ://www.virtualbox.org/wiki/Downloads 27. www.espressif.com 28.www.espressif.com/en/products/hardware/esp8266ex/overview 29. www.nit.com.ru
ПРИЛОЖЕНИЕ 2 ОБЗОР САЙТОВ В ИНТЕРНЕТ, РЕКОМЕНДУЕМЫХ АВТОРОМ КНИГИ КАК ИСТОЧНИК ДОПОЛНИТЕЛЬНОГО МАТЕРИАЛА ПО ТЕМЕ КНИГИ Сайт Esp8266 -1 Сообщество разработчиков 1 Адрес сайта: https://esp8266.ru/ Тематика сайта — все о микроконтроллере ESP8266EX. По утверждению авторов сайта: на этом сайте представлена инфор- мация, которая будет интересна, в основном, профессиональным разработчикам и любителям, которые умеют держать в руках паяльник. На сайте имеется широкий набор файлов для загрузки: Документация ESP826621, Прошивки ESP8266, Скетчи для Arduino IDE, Утилиты, Готовые проекты, Распиновка (pinout) модулей и плат и другая информация. Тут же, на сайте можно купить любой модуль на основе микроконтроллера ESP8266. Имеется специальный раздел, посвященный созданию про- грамм для модулей на основе ESP8266EX в среде IDE Arduino (без использования модуля Ардуино). Прямая ссылка на этот раздел: https://esp8266.ru/arduino-ide-esp8266/ Сайт All Arduino (Все про Ардуино) Адрес сайта: https://all-arduino.ru/ Сайт содержит разделы: Ардуино для начинающих (набор уроков по программированию и схемотехнике), Железо (описа-
472 Управление модулем ARDUINO по Wi-Fi с мобильных устройств ние всех вариантов модуля и всего спектра вспомогательных плат расширения), Программирование Ардуино (полный справочник по языку Ардуино), Библиотеки Ардуино (набор дополнительных библиотек для Ардуино, доступный для скачивания), Статьи (под- борка полезных статей по Ардуино). II Сайт I RobotChip Адрес сайта: http://robotchip.ru/ Русскоязычный сайт, посвященный как модулю Ардуино, так и модулям на основе микросхемы ESP8266EX. Сайт содержит массу простых примеров готовых проектов (схемы и программы) с описанием и советами по созданию. Эти проекты могут служить примером и основой для более сложных проектов. II Сайт I Arduino + Адрес сайта: https://arduinoplus.ru/ Сайт содержит следующие разделы: Уроки, Публикации, Справочник программиста Arduino, Умный дом, Библиотеки, Инструментарий, Вакансии. I Официальный сайт Ардуино Адрес сайта: https://www.arduino.cc/ На английском языке. Рекомендуем смотреть сайт при помощи браузера со встроенным переводчиком. Например, Яндекс-браузером. Сайт содержит самую свежую информацию по модулю Ардуино.
Приложения 475 Официальный сайт | фирмы Epressif II Адрес сайта: https://www.espressif.com/ Сайт разработчика микроконтроллера ESP8266EX. Рекомендуем смотреть при помощи браузера с переводчиком. На сайте вы можете найти статьи о микроконтроллерах данной фирмы. В том числе о микроконтроллере ESP8266EX. Скачать программное обеспечение, прошивки и многое другое. Группа ESP8266 | на сайте «Вконтакте» II Адрес сайта: https://vk.com/esp8266 Сообщество профессионалов и любителей электроники. Основные обсуждения ведутся вокруг WiFi модуля esp8266. Группу ведут администраторы сайта http://esp8266.ru. Группы ESP8266 II на FaceBook II Адрес сайта: https://www. facebook.com/groups/ 1606743019578078/ англоязычная версия Адрес сайта: https://www.facebook.com/esp8266/ русскоязыч- ная версия Две страницы на Facebook. Первая — международная и имеет 29 тыс. участников, вторая русскоязычная и имеет 1,3 тыс. участ- ников.
ПРИЛОЖЕНИЕ 3 ПОЛНЫЙ СПИСОК ESP8266 AT КОМАНД НА РУССКОМ ЯЗЫКЕ ДЛЯ ВЕРСИИ ATV0.22SDKV1.0.0 ВНИМАНИЕ. Приведенный ниже в таблице список ESP8266 AT ко- манд актуален для версии AT v0.22 SDK vl.0.0. Все АТ-команды начинаются с префикса «AT». Затем, идет символ «+» и собственно само имя команды. Иногда знак «+» не используется. Многие АТ-команды существуют в двух или трех модификациях: ♦ если после имени команды стоит символ «=», это ВЫПОЛ- НЯЕМАЯ КОМАНДА. Она устанавливает один из параме- тров микросхемы ESP8266 или запускает какой-либо про- цесс; ♦ если вместо «=» в конце команды стоит символ «?», то это КОМАНДА ЗАПРОСА. При помощи команды такого вида можно запрашивать текущее значение того параметра, ко- торый мы устанавливали КОМАНДОЙ ВЫПОЛНЕНИЯ; ♦ если после имени команды стоит сочетание символов «=?», то это ТЕСТ. Тест позволяет запросить набор параметров команды и диапазон значений каждого из параметров. При помощи команды такого вида оператор может оператив-
Приложения 475 но получить справку о наборе параметров, который потом можно использовать в КОМАНДЕ ВЫПОЛНЕНИЯ и КОМАН- ДЕ ЗАПРОСА. Для некоторых команд введена возможность использовать команду в двух разных режимах. Для этого в конце команды добавляется приставка из трех букв, предваренных символом подчеркивания. Приставка может иметь два значения: ♦ или «J3EF»; ♦ или « CUR». ПРИМЕЧАНИЕ. Приставка применяется только для КОМАНД ВЫПОЛНЕНИЯ. Приставка «_DEF» означает Default (ПО УМОЛЧАНИЮ). Команда с такой приставкой устанавливает параметр и одно- временно записывает это значение во Flash-память в качестве значения по умолчанию. В результате значение сохраняется даже после выключения питания. Если команда оканчивается приставкой «_CUR» (CURRENT — текущее значение), команда устанавливает зна- чение, но в память не записывает. В результате после полного сброса или после выключения питания значение не сохраня- ется, и устанавливается значение по умолчанию.
Команда AT AT+RST AT+GMR AT+GSLP ATE AT+RESTORE AT+UART_CUR Описание Проверка модуля Перезапуск модуля Отобразить версию прошивки Переход в режим пониженного энергопотребления Включить/ выключить эхо Сбросить на заводские настройки Настройка последовательного интерфейса для текущего сеанса (current, т.е. без сохранения во flash память) Тип базовая базовая базовая базовая базовая базовая базовая Выполнение AT AR+RST AT+GMR AT+GSLP=<epeMfl в мс> АТЕО АТЕ1 AT+RESTORE АТ+ UART_CUR= baudrate, databits, stopbits, parity, flow control Запрос /тест - - - Параметры Если модуль успешно стартовал, то отвечает «ОК» После успешного перезапуска возвращает «ОК» Версия отображается в виде 8 цифр: Первая группа 4 цифры - версия AT (например, 0022); Вторая группа 4 цифры - версия SDK (например, 0100) Пример: AT+GSLP=5000 (5 с) Для того чтобы модуль вышел из режима сна, необходимо соединить выводы XPD DCDC и EXT RSTB Замечание: ATE без 0 или 1 приводит к ошибке Примечание: после сброса настроек произойдет перезагрузка модуля скорость 4400- 4608000 биты данных 5: 5 бИТ 6: 6 бИТ 7: 7 бИТ 8: 8 бИТ стоп биты 1: 1 СТОП бИТ 2: 1.5 СТОП бИТ 3: 2 СТОП бИТ контроль четности 0:нет 1: Odd 2: EVEN flow control 0: flow control отключен 1: включен RTS 2: включен CTS 3: включены оба RTS и CTS (МТСК - UARTO CTS , MTDO - UARTO RTS) Пример: AT+UART=115200,8,l,0,0
Команда AT+UART.DEF AT+CWMODE CUR AT+CWMODE DEF AT+CWJAP CUR AT+CWJAP DEF Описание Команда полностью аналогична AT+UART CUR Переключение режима wifi для текущего сеанса (current, т.е. без сохранения во flash память) Команда полностью аналогична AT+CWMODE CUR Подключение к АР, точке доступа (current, т.е. без сохранения во flash память) Команда полностью аналогична AT+CWJAP CUR Тип базовая wifi wifi wifi wifi Выполнение AT+CWMODE_ CUR=<pe>KHM> AT+CWJAP_CUR =< идентификатор сети>,<пароль> Запрос /тест AT+CWMODE CUR? AT+CWMODE CUR=? AT+CWJAP CUR? Возвращает имя сети, к которой подключены Параметры Параметры команды сохраняются во flash память и загружаются при следующем старте модуля l=Station (WiFi клиент); 2=SoftAP (точка доступа); 3=Оба режима (Station+SoftAP) Пример: AT+CWMODE__CUR=1 Параметры команды сохраняются во flash память и загружаются при следующем старте модуля Возвращает ОК или ERROR. SSID WiFi сети и пароль указываются в двойных кавычках, пароль до 64 символов ASCII. Команда недоступна в режиме SoftAP (точка доступа). Данные сети НЕ сохраняются во flash памяти. В случае наличия в SSID или пароле специальных символов (!,\ '"' и\) их необходимо экранировать обратным слешем. Например, если SSID"ab\,c" и пароль "0123456789Л"то команда примет вид AT+CWJAP_CUR=aab\\\,Ca0123456789\AV Параметры команды сохраняются во flash память и загружаются при следующем старте модуля
Команда AT+CWLAP AT+CWQAP AT+CWSAP CUR Описание Отобразить список доступных точек доступа Отключение от точки доступа Создать SoftAP (точку доступа) для текущего сеанса Тип wifl wifi wifi Выполнение AT+CWLAP показывает все доступные точки доступа AT+CWQAP AT+CWSAP_CUR= идентификатор сети>,<пароль>, <канал>, <тип шифрования> Запрос /тест AT+CWLAP = ssid,mac,ch показывает точки доступа, только соответст- вующие заданным параметрам AT+CWQAP=? тест команды AT+CWSAP CUR? возвращает текущие параметры точки доступа Параметры Выводит SSID, метод шифрования, силу сигнала, MAC адрес, номер канала. Типы шифрования: ОгОреп; 1:WEP; 2:WPA PSK; 3:WPA2 PSK; 4:WPA_WPA2_PSK Примеры: AT+CWLAP="witr,"ca:d 7:19:d8:a6:44",6 или поиск WiFi сети с именем «home» AT+CWLAP="homev - Команда доступна, только когда модуль находится в режиме SoftAP (точка доступа). Требуется AT+RST. SSID и пароль указываются в двойных кавычках. Пароль не более 64 символов. Типы шифрования: ОЮреп; 2:WPA PSK; 3:WPA2 PSK; 4:WPA_WPA2J>SK (Шифрование WEP недоступно в этой версии) Пример: AT+CWSAP CUR= "ESP8266vl234567890",5,3 00 5 1 о о I о; X
Команда АТ+ CWSAP_DEF AT+CWLIF AT+ CWDHCPJIUR AT+ CWDHCP_DEF AT+ CWAUTOCONN AT+ CIPSTAMAC CUR Описание Команда полностью аналогична AT+CWSAP CUR Отобразить IP адреса станций, подключенных к ESP8266 SoftAP точке доступа Включить или выключить DHCP сервер для текущего сеанса Команда полностью аналогична AT+CWDHCP CUR Автоматическое подключение к точке доступа (сохраняется во flash память) посмотреть/ установить MAC адрес в режиме station для текущего сеанса Тип wifi wifi wifi wifi wifi wifi Выполнение AT+CWLIF AT+CWDHCP_CUR= <режим>,<вкл> AT+ CWAUTOCONN= <вкл> AT+CIPSTAMAC= Запрос/тест - AT+ CIPSTAMAC CUR? отображает текущий MAC адрес Station Параметры Параметры команды сохраняются во flash память и загружаются при следующем старте модуля. (только для режимов 2-SoftAP и 3-Station+SoftAP) <режим> 0:ESP8266 SoftAP 1:ESP8266 station 2 : SoftAP и station <вкл> 0: Выключить DHCP 1: Включить DHCP Пример: AT+CWDHCP CUR=O,1 Параметры команды сохраняются во flash память и загружаются при следующем старте модуля <вкл> 0 : не подключаться автоматически к точке доступа после старта модуля 1: подключаться автоматически к точке доступа после старта модуля По умолчанию ESP8266 station автоматически подключается к точке доступа Пример: AT+CIPSTAMAC_CUR="18:fe:35:98:d3:7b" ZJ ■о I
Команда АТ+ CIPSTAMAC DEF AT+ CIPAPMAC CUR AT+ CIPAPMAC DEF AT+CIPSTA CUR AT+CIPSTA DEF AT+CIPAP_CUR AT+CIPAP_DEF Описание Команда полностью аналогична AT+CIPSTAMAC CUR посмотреть/ установить MAC адрес в режиме SoftAP (точка доступа) для текущего сеанса Команда полностью аналогична AT+CIPAPMAC CUR посмотреть/ установить IP адрес в режиме station для текущего сеанса Команда полностью аналогична AT+CIPSTA_CUR Посмотреть/ установить IP адрес в режиме SoftAP (точка доступа) для текущего сеанса Команда полностью аналогична AT+CIPAP CUR Тип wifi wifi wifi wifi wifi wifi wifi Выполнение AT+CIPAPMAC CUR= AT+CIPSTA_CUR= [,<шлюз>, <маска>] AT+CIPAP_CUR= Запрос/тест AT+CIPAPMAC CUR? отображает текущий MAC адрес точки доступа SoftSP AT+CIPSTA CUR? отображает текущий IP адрес station AT+CIPAP CUR? отображает текущий IP адрес SoftAP (точки доступа) Параметры Параметры команды сохраняются во flash память и загружаются при следующем старте модуля Пример: AT+CIPAPMAC_CUR=Mla.fe:36:97:d5:7b" Параметры команды сохраняются во flash память и загружаются при следующем старте модуля ip - ip адрес в виде строки, <шлюз> - шлюз по умолчанию, <маска> - маска подсети. Пример: AT+CIPSTA CUR="192.168.6.100", "192.168.6.1 ","255.255.255.0" Параметры команды сохраняются во flash память и загружаются при следующем старте модуля. Пример: AT+CIPAP_CUR="192.168.5.1" Параметры команды сохраняются во flash память и загружаются при следующем старте модуля.
Команда АТ+ CWSTARTSMART АТ+ CWSTOPSMART AT+CIPSTATUS Описание Команда запускает процесс SmartConfig Команда останавливает процесс SmartConfig Отобразить статус подключения Тип wifi wifi TCP/IP Выполнение АТ+ CWSTARTSMART =<тип протокола> АТ+ CWSTOPSMART AT+CIPSTATUS Запрос /тест - Параметры <тип протокола> -1: ESP TOUCH 2: AirKiss 1. Прочтите дополнительную документацию о SmartConfig от Espressif. 2. Для ESP8266 должен быть активирован режим Station 3. После получения сообщения "Smart get wifi info" SmartConfig успешно завершен, вы можете использовать команду "AT+CIFSR" для проверки полученного ip адреса от маршрутизатора 4. ESP8266 не отвечает на команды во время выполнения SmartConfig, используйте команду "AT +CWSTOPSMART/yifl остановки процесса. Пример: AT+CWMODE=3 AT+CWSTARTSMART=1 Независимо от результатов работы команды AT+CWSTARTSMART всегда используйте после ее завершения команду AT+CWSTOPSMART для освобождения ресурсов Возвращает =Ю соединения 0-4, <тип>=тип соединения (2 - получен IP, 3 - подключен, 4 - отключен) "ТСР-илиПЮР", ^удаленный IP адрес, ^удаленный порт,=тип связи: 0: подсоединен как клиент, 1: как сервер ТЗ I
Команда AT+CIPSTART AT+CIPSEND Описание Установить подключение TCP или UDP или получить информацию о текущем соединении Отправить данные Тип TCP/IP TCP/IP Выполнение 1. Одиночное подключение (+CIPMUX=0) AT+CIPSTART= <тип>,<адрес>, <порт> [,(<локальный порт>),(<режим>)] 2. Множественное подключение: (+CIPMUX=1) AT+CIPSTART= <тип>, [,(<локальный порт>),0] 1. Одиночное подключение (+CIPMUX=O) AT+CIPSEND= <длина> 2. Множественное подключение: (+CIPMUX=1) AT+CIPSEND= <идентификатор>, <длина> 3. Для «unvarnished transmission mode» AT+CIPSEND Запрос/тест АТ+ CIPSTART=? AT+CIPSEND=? только для теста Параметры ID соединения 0-4, <тип>=ТСР или UDP, <адрес>=1Р адрес удаленного хоста, <порт>= порт удаленного хоста. [<локальный порт>] только для UDP [<режим>] только для UDP Возвращает «OK», «ERROR» или «ALREADY CONNECT» 0 : destination peer entity of UDP will not change. 1: destination peer entity of UDP can change once. 2 : destination peer entity of UDP is allowed to change, используется только совместно Пример: AT+CIPSTART=T СР7192.168.101.110-Д000 Дополнительная информация в документе «Espressif AT Command Examples» Длина данных в пакете - до 2048 байт. После получения данной команды модуль выводит приглашение «>» и переходит в режим приема данных через UART, после приема данных необходимой длины передает их в радиоканал. При успешной передаче возвращает «SEND OK». При неудаче - «ERROR». В режиме «unvarnished transmission mode» прервать режим приема данных и перейти в командной режим можно последовательностью «+++» в отдельном пакете. Между пакетами интервал 20 мс. Примеры можно найти в документе "Espressif AT Command Examples"
Команда AT+CIPCLOSE AT+CIFSR AT+CIPMUX AT+CIPSERVER Описание Закрыть соединение TCP или UDP Отобразить локальные IP адреса, адрес, который получили отточки доступа, к которой подключены и IP адрес ESP8266 SoftAP (локальной точки доступа) Выбрать режим одиночного или множественных подключений Запустить (перезапустить) TCP сервер Тип TCP/IP TCP/IP TCP/IP TCP/IP Выполнение 1. Множественное подключение: (+CIPMUX=1) AT+CIPCLOSE= 2. Одиночное подключение (+CIPMUX=0) AT+CIPCLOSE AT+CIFSR AT+CIPMUX= <режим> AT+CIPSERVER= <режим>[,<порт> ] Запрос /тест АТ+ CIPCLOSE=? возвращает ОК AT+CIFSR=? Только для теста AT+CIPMUX? Возвращает текущий режим 1 или 0 - Параметры Возвращает «LINK IS NOT» или «UNLINK», если ID соединения уже разорвано, ERROR - если соединения нет. Если в режиме клиента =5, то закрываются все соединения Возвращает IP адрес ESP8266 SoftAP и IP address ESP8266 Station 0=одиночные подключение, 1=множественные подключения. Изменить режим можно только после закрытия всех подключений. Если запущен сервер, то требуется перезагрузка модуля. aAT+CIPMUX=l" команда доступна только при aAT+CIPMODE=0" 0=сервер отключен, 1=сервер запущен. Порт указывать необязательно, по умолчанию: 333. Для запуска сервера модуль должен быть в режиме множественных подключений AT+CIPMUX=1. Примеры: АТ+ CIPMUX=1 AT+CIPSERVER=1,1OO1
Команда AT+CIPSTO AT+CIPMODE AT+ SAVETRANSUNK AT+CIUPDATE AT+PING +IPD Описание Установить/ посмотреть таймаут сервера Установить сквозной режим «unvarnished transmission mode» Save transparent transmission link to Flash Обновление прошивки через облако. Модуль должен быть в режиме 1 или 3 и быть подключен к точке доступа с выходом в интернет. Пингпо имени хоста или IP адресу Получить данные Тип TCP/IP TCP/IP TCP/IP TCP/IP TCP/IP Выполнение AT+CIPSTO <таймаут> AT+CIPMODE= <режим> АТ+ SAVETRANSLINK= <режим>„<порт> AT+CIUPDATE AT+PING=ip (+CIPMUX=0) +IPD,: (+CIPMUX=1) +IPD,,: Запрос/тест AT+CIPSTO? возвращает установлен- ный таймаут AT+CIPMODE? - Параметры таймаут в секундах от 0 до 7200. Пример: AT+CIPMUX=1 AT+CIPSERVER=1,1OO1 AT+CIPSTO=10 0-обычный режим, l=unvarnished transmission mode (режим 1 доступен только при AT+CIPMUX=O). Пример: AT+CIPMODE=1 <режим>0-погта1 mode 1-transparent transmission mode удаленный ip адрес <порт> удаленный порт. Пример: AT+SAVETRANSLI NK=i;i92.168.6.110w,1002 1 found server 2 connect server 3 got edition 4 start update Примеры: AT+PING="192.168.1.1" AT+PING="esp8266.ru" 1. Одиночные подключения (+CIPMUX=1) +1Р[),<длина>:<данные> 2. Множественные подключения (+CIPMUX=1) +1Р0„<длина>,<данные> Когда модуль получает данные по сети, то он их отправляет в UART командой +IPD "2 § X п> 1 О о о
ПРИЛОЖЕНИЕ 4 ПРОГРАММИРОВАНИЕ В ARDUINO IDE ДЛЯ ESP8266: КРАТКИЙ ОБЗОР РЕАЛИЗОВАННЫХ В НАСТОЯЩЕЕ ВРЕМЯ ФУНКЦИЙ Базовые II функции языка II Управление линиями ввода-вывода GPIO осуществля- ется точно также, как и управление контактами для ARDUINO. Для этого используются уже знакомые нам функции: pinMode, digitalRead, digitalWrite, analogWrite. Эти функции используются точно так же, как и при програм- мировании для ARDUINO. При этом вместо номера контакта под- ставляется номер GPIO. ПРИМЕР. Для чтения состояния GPIO2 нужно использовать команду digitalRead(2). Однако режимов работы линий ввода-вывода стало больше. Линии GPIO0...GPIO15 могут быть переведены в режимы: INPUT; OUTPUT; INPUT_PULLUP; INPUT.PULLDOWN. Исключение составляет линия GPIO16. Она может быть пере- ведена только в режимы: INPUT; OUTPUT; INPUTJ>ULLDOWN. Команда analogRead(AO) считывает аналоговое значение с единственного входа АЦП (ADC) — с линии TOUT.
486 Управление модулем ARDUINO по Wi-Fi с мобильных устройств Команда analogWrite(pin, value) включает программный ШИМ (PWM) на одном из контактов, поддерживающих ШИМ. А именно на контактах GPIO4, GPIO12, GPIO14, GPIO15. Переменная pin — номер GPIO. Команда analogWrite(pin, 0) отключает ШИМ. Значение параметра value может лежать в диа- пазоне от 0 до PWMRANGE. Системная константа PWMRANGE в настоящее время имеет значение 1023. Поддержка прерываний обеспечивается функциями attachlnterrupt, detachlnterrupt. Прерывания могут быть назна- чены на любой GPIO, кроме GPIO16. Также поддерживаются стан- дартные прерывания ARDUINO: CHANGE; RISING; FALLING. Тайминг и delay Функции millisQ и microsQ возвращают миллисекунды и микросекунды соответственно, прошедшие с момента старта модуля. Функция delayO также присутствует. Она приостанавли- вает выполнение скетча на указанное время в миллисекундах. При этом она и позволяет отработать операциям WiFi и TCP/IP. Функция delayMicrosecondsQ используется аналогично, только время задается в микросекундах. ВНИМАНИЕ. Помните о том, что когда модуль поддерживает Wi-Fi соединение, ему приходится выполнять мно- жество фоновых задач, кроме вашего скетча. WiFi и TCP/IP функции библиотек SDK имеют возможность обработать все события в очереди после завершения каждого цикла вашей функции loopO или во время выполнения delayO- Если в вашем коде есть фрагменты, которые выполняются более 50 миллисекунд, то необходимо использовать delayO для сохранения нормальной работоспособности стека WiFi. Также вы можете использовать функцию yield()9 кото- рая эквивалентна delay(O). С другой стороны, функция
Приложения 487 delayMicrosecondsQ блокирует выполнение других задач, поэ- тому ее использование для временных задержек свыше 20 мил- лисекунд не рекомендуется. Последовательные порты | Serial и Seriall (UART0 и UART1) II Объект Serial работает точно так же, как и с ARDUINO. Помимо аппаратного FIFO (по 128 байт для приема и передачи) определен и программный буфер размером по 256 байт для приема и передачи данных. Прием и передача данных происходит по прерываниям, прозрачно для вашего скетча. Функции записи и чтения блоки- руют выполнение скетча только в том случае, когда аппаратный FIFO и программный буфер переполняются. Serial использует аппаратный UART0, работающий на GPIO1 (ТХ) и GPIO3 (RX). Но может быть переназначен на контакты GPIO15 (ТХ) и GPIO13 (RX) вызовом функции SeriaLswapO; после Serial.begin()\. Повторный вызов SeriaLswapO; вернет все на свои места. Seriall использует аппаратный UART1, работающий только на передачу. UART1 ТХ это GPIO2. Для включения Seriall используйте SerialLbeginQ; По умолчанию, отладочная информация библиотек WiFi выключается, когда вы вызываете функцию SerialbeginQ;. Для включения отладочной информации на UART0 используйте SerialsetDebugOutput(true); Для перенаправления вывода отла- дочной информации на UART1 используйте команду Seriall. setDebugOutput(true); И Serial и Seriall поддерживают 5,6,7,8 бит данных, odd (О), even (E), и no (N) режимы четности, и 1 или 2 стоп бита. Для выбора нужного режима вызывайте Serial.be&nQoaudrate, SERIALJSN1)\ или Serial.be&nQoaudrate, SERIAL_6E2); и т.д. Макрос PROGMEM II Макрос PROGMEM работает точно так же, как в ARDUINO, помещая read only данные и строковые константы (литералы) во флеш-память, высвобождая HEAP.
488 Управление модулем ARDUINO по Wi-Fi с мобильных уаройств ОТЛИЧИЕ. Важное отличие состоит в том, что в ESP8266 одинаковые литералы не хранятся в одном месте. Поэтому использование строковых констант внутри кон- струкций F(«») и/или PSTR(«») приводит к расходованию флеш- памяти при каждом вызове этих функций. Вы должны самосто- ятельно управлять одинаковыми строками для экономичного расходования места во флеш-памяти. II Библиотека II WiFi ESP8266 (ESP8266WiFi) Функции библиотеки WiFi ESP8266 очень схожи с функци- ями библиотеки для обычного WiFi шилда. Список отличий: ♦ WiFLmode(m): выбрать режим WIFI_AP (точка доступа), WIFI_STA (клиент), или WIFI_AP_STA (оба режима одновре- менно); ♦ WiFLsoftAP(ssid) создает открытую точку доступа; ♦ WiFLsoftAP(ssid, password) создает точку доступа с WPA2-PSK шифрованием, пароль должен быть не менее 8 символов; ♦ WiFLmacAddress(mac) позволяет получить MAC адрес в ре- жиме клиента; ♦ WiFLSQftAPmacAddress(mac) позволяет получить MAC адрес в режиме точки доступа; ♦ WiFUocallPO позволяет получить IP адрес в режиме клиента; ♦ WiFi.softAPIPQ позволяет получить IP адрес в режиме точки доступа; ♦ WiFLRSSIO пока не реализована; ♦ WiFi.printDiag(Serial); выводит диагностическую информацию. Класс WiFiUDP поддерживает прием и передачу multicast пакетов в режиме клиента. Для передачи multicast пакета используйте вместо udp.beginPacket(addr, port) функцию udp.beg inPacketMulticast(addr,port,WiFUocalIPO). Когда вы ожидаете multicast пакеты, используйте вместо udp. begin(port) функцию udp.beginMulticast(WiFUocalIPO,multicast_ip_
Приложения 489 addr, port). Вы можете использовать udp.destinationlPO для опре- деления того, был ли пакет отправлен на multicast адрес или предназначался именно вам. Multicast функции не поддержи- ваются в режиме точки доступа. WiFiServer, WiFiClient, и WiFiUDP работаю точно так же, как и с библиотекой обычного WiFi шилда. Четыре примера идет в комплекте с этой библиотекой. Библиотека | Ticker II Библиотека Ticker может быть использована для выполне- ния периодически повторяющихся событий через определен- ное время. Два примера включено в поставку. В настоящее время не рекомендуется блокировать опе- рации ввода-вывода (сеть, последовательный порт, файловые операции) в callback функциях тикера. Вместо блокирования устанавливайте флаг в callback функциях и проверяйте этот флаг в основном цикле. Библиотека | EEPROM II Эта библиотека немного отличается от стандартной ARDUINO EEPROM. Необходимо вызвать функцию EEPROM. begin(size) каждый раз перед началом чтения или записи, размер (указывается в байтах) соответствует размеру данных, которые вы намереваетесь использовать в EEPROM. Размер данных дол- жен быть в диапазоне от 4 до 4096 байт. Функция EEPROM.writeQ не производит запись данных во флеш-память немедленно. Вы должны использовать функцию EEPROM.commitQ каждый раз, когда вы хотите сохранить дан- ные в память. Функция EEPROM.endQ тоже производит запись данных, а также освобождает оперативную память от данных, запись которых произведена. Библиотека EEPROM использует один сектор во флеш- памяти, начиная с адреса 0х7Ь000 для хранения данных. В поставку включено три примера работы с EEPROM.
490 Управление модулем ARDUINO по Wi-Fi с мобильных устройств II II Библиотека Wire Реализован только режим ведущего, частота ориентиро- вочно до 450 кГц. Перед использованием шины 12С, нужно выбрать пины SDA и SCL путем вызова функции Wire.pins(int sda, int scl)f например Wire.pins(0,2) для модуля ESP-01. Для дру- гих модулей — пины по умолчанию 4(SDA) и 5(SCL). I Библиотека SPI Библиотека SPI поддерживает весь ARDUINO SPI API, вклю- чая транзакции, в том числе фазу синхронизации (СРНА). Пока не поддерживается Clock polarity (CPOL) (SPIJV10DE2 и SPI_ MODE3 не работают). ESP8266 API Поддержка функций, специфичных для ESP8266 (режим глу- бокого сна и сторожевой таймер), реализована в объекте ESP. Функция ESP.deepSleep(microseconds,mode) переводит модуль в режим глубокого сна. Параметр mode может принимать значения: WAKE_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED. Линия GPIO16 должна быть соединена с RESET для выхода из режима глубокого сна. Функции ESP.wdtEnableQ, ESP.wdtDisableQ, и ESP.wdtFeedQ управляют сторожевым таймером. ESP.resetQ перезагружает модуль. ESP.getFreeHeapO возвращает размер свободной памяти. ESP.getFreeHeapQ возвращает размер свободной памяти. ESP.getChipIdO возвращает ESP8266 chip IDE, int 32bit. ESPgetFlashChipIdQ возвращает flash chip ID, int 32bit. ESP.getFlashChipSizeQ возвращает размер флеш-памяти в байтах, так, как его определяет SDK (может быть меньше реаль- ного размера).
Приложения 491 ESP.getFlashChipSpeed(void) возвращает частоту флеш- памяти, в герцах. ESP.getCycleCount() возвращает количество циклов CPU с момента старта, unsigned 32-bit. Может быть полезна для точ- ного тайминга очень коротких операций. Библиотека | OneWire II Библиотека OneWire была адаптирована для ESP8266 (вне- сены изменения в OneWire.h) Если у вас установлена библио- тека OneWire в папку ARDUINO/Hbraries, то будет использо- ваться именно она, а не из комплекта поставки. mDNS библиотека | ESP8266mDNS II Библиотека позволяет реализовать в вашей программе ответ на мультикастовые DNS запросы для локальной зоны, например «esp8266.1ocal». В настоящее время поддерживается только одна зона. Позволяет обращаться к WEB серверу ESP8266 по имени, а не только по IP адресу. Дополнительную информа- цию вы можете найти в прилагаемом примере и в файле readme данной библиотеки. Библиотека | Servo II Библиотека позволяет управлять сервомоторами. Поддерживает до 24 сервоприводов на любых доступных GPIO. По умолчанию первые 12 сервоприводов будут использовать TimerO и будут независимы от любых других процессов. Следующие 12 сервоприводов будут использовать Timer 1 и будут разделять ресурсы с другими функциями, использую- щими Timer 1. Большинство сервоприводов будут работать с управляющим сигналом ESP8266 3,3 В. Те, что не смогут рабо-
492 Управление модулем ARDUINO по Wi-Fi с мобильных устройств тать на напряжении 3,3 В, потребуют использования отдельного источника питания. ВНИМАНИЕ. Не забудьте соединить общий провод GND этого источника с GND ESP8266. I Другие библиотеки, не включенные в поставку ARDUINO IDE Почти все библиотеки, которые не используют низкоуров- невый доступ к регистрам микропроцессора AVR, должны рабо- тать без каких-либо доработок. На сегодняшний день можно точно сказать, что протестированы и полностью работоспо- собны следующие библиотеки: ♦ ARDUINOWebSockets — WebSocket сервер и клиент для esp8266 (RFC6455); ♦ aREST REST API handler — библиотека, позволяет управ- лять GPIO через http запросы вида http://192.168.L101/ digital/6/l; ♦ Blynk — легкий в освоении IoT фреймворк (страница на Kickstarter).; ♦ DallasTemperature - для работы с DS18B20, DS1820, DS18S20, DS1822, DHT11. Используйте для инициализации следую- щие параметры DHT dht(DHTPIN, DHTTYPE,15); ♦ NeoPixelBus — ARDUINO NeoPixel библиотека для esp8266; ♦ PubSubCUent — Библиотека средств управления устройст- вами на основе ESP8266 через Интернет по протоколу MQTT при помощи специального приложения на смартфоне с ОС Android. ♦ RTC — библиотека for Dsl307 & Ds3231 для esp8266, Souliss, Smart Home — фреймворк для Умного Дома, построенный на ARDUINO, Android и ОрепНАВ.
ПРИЛОЖЕНИЕ 5 ПОДВОДЯ ИТОГИ, или о виртуальном диске... Разобравшись и попробовав самостоятельно собрать и испы- тать каждую из схем, предложенных в книге, вы, как мы наде- емся, уже стали достаточным специалистом в этой отдельной, но очень перспективной области микроэлектроники. И теперь уже самостоятельно сможете осуществлять свои собственные разра- ботки и реализовать свои идеи. Большим подспорьем вам будут два ВИРТУАЛЬНЫХ ДИСКА, специально разработанных для данной книги (варианты для ПК и для смартфона). Виртуальные диски находятся в свободном доступе в Интернете. Как зайти на них? Перейти к ВИРТУАЛЬНОМУ ДИСКУ, ПРЕДНАЗНАЧЕННОМУ ДЛЯ РАБОТЫ СО СМАРТФОНА или планшета, можно, отскани- ровав при помощи мобильного устройства QR-код, расположен- ный ниже (book.mirmk.ru/wdisk2/rn). Для перехода к виртуальному диску за- пустите приложение «Сканер QR и штрих-кодов» на смартфоне (планше- те) и наведите его камеру на располо- женное справа изображение QR-кода. Чтобы открыть ВАРИАНТ ВИРТУАЛЬНОГО ДИСКА ДЛЯ КОМПЬЮТЕРА, перейдите по адресу ЬЦр:/^оок.т1гтк.ги/\ус118к2
494 Управление модулем ARDUINO по Wi-Fi с мобильных устройств На виртуальном диске размешены указанные ниже раз- делы. 1. Тексты всех программных примеров из книги в элек- тронном виде Вы можете не набирать вручную тексты программ, приведен- ных в книге, а просто перенести с диска на ваш компьютер, под- ключить проекты к программной среде и сразу же пробовать их в работе. 2. Набор видео презентаций Видео презентации дополняют материал, описанный в книге. Они позволяют наглядно увидеть, как работает та либо иная программа, как выглядит собранная схема и как правильно ее использовать. 3. Набор файлов для скачивания На диске вы найдете полный набор всех вспомогательных программ, подгружаемых библиотек, прошивки для модуля ESP- 01, необходимые для повторения на практике предложенных в книге программных примеров. 4. Ссылки на все необходимые компьютерные программы Для повторения на практике программных примеров вам понадобятся, во-первых, программная среда разработок IDE Arduino. Во-вторых, там находятся несколько вспомогательных программ, устанавливаемых на компьютер. На диске указаны все ссылки на страницы в Интернете, где можно скачать каждую из программ. 5. QR-ссылки на все необходимые для книги мобильные приложения Кроме программ для компьютера при изучении книги вам понадобится установить на ваше мобильное устройство несколько мобильных приложений для взаимодействия с Wi-Fi модулем, и для проверки его работоспособности. Ссылки на мобильные приложения на виртуальном диске даны в виде QR-кодов, при помощи которых установить программу на ваше мобильное устройство можно просто отсканировав соответству- ющий QR-код. 6. Справочная информация
У КНИЖНОЙ ПОЛКИ ARDUINO Белов А.В. Программирование ARDUINO. Создаем практические устройства + виртуальный диск ISBN 978-5-94387-882-4 Г ~~^- Автор БЕСТСЕЛЛЕРА разработал для этой книги практические схемы и изде- лия, работая с которыми читатель научится писать программы и создавать свои устрой- ства на основе модуля ARDUINO. ПРОГРАММИРОВАНИЕ Вы узнаете: ♦ как создается алгоритм; ♦ как разрабатывается схема; ♦ как пишется программа. На тех же примерах идет изучение языка программирования Ардуино. Функции, операторы и другие его элементы описыва- ются, используются в очередной конкретной программе. ВИРТУАЛЬНЫЙ ДИСК КНИГИ содержит тексты всех программных примеров из книги, инсталляционный па- кет среды разработки IDE, архивы используемых в книге программных библиотек, видеоролики, набор вспомога- тельной справочной информации и многое другое. Приобрести книгу можно в сети книжных магазинов, Интернет-магазинах или на сайте Издательства www.niLcom.ru. Ч Для автоматического перехода на стра- ницу продажи книги сайта Издательства запустите Приложение «Сканер QR и штрих-кодов» на смартфоне (планшете) и наведите его камеру на расположенный рядом QR-КОД.
Издательство «Наука и Техника» КНИГИ ПО КОМПЬЮТЕРНЫМ ТЕХНОЛОГИЯМ, МЕДИЦИНЕ, РАДИОЭЛЕКТРОНИКЕ Уважаемые читатели! Книги издательства «Наука и Техника» вы можете: > заказать в нашем интернет-магазине БЕЗ ПРЕДОПЛАТЫ по ОПТОВЫМ ценам www.nit.com.ru • более 3000 пунктов выдачи на территории РФ, доставка 3—5 дней • более 300 пунктов выдачи в Санкт-Петербурге и Москве, доставка — на следующий день Справки и заказ: • на сайте WWW.nitCOm.ru • по тел. (812) 412-70-26 • по эл. почте nitmail@nit.com.ru > приобрести в магазине издательства по адресу: Санкт-Петербург, пр. Обуховской обороны, д. 107 М. Елизаровская, 200 м за ДК им. Крупской Ежедневно с 10.00 до 18.30 Справки и заказ: тел. (812) 412-70-26 > приобрести в Москве: «Новый книжный» Сеть магазинов тел. (495) 937-85-81, (499) 177-22-11 ТД «БИБЛИО-ГЛОБУС» ул. Мясницкая, д. 6/3, стр. 1, ст. М «Лубянка» тел. (495) 781 -19-00,624-46-80 Московский Дом Книги, ул. Новый Арбат, 8, ст. М «Арбатская», «ДК на Новом Арбате» тел. (495) 789-35-91 Московский Дом Книги, Ленинский пр., д.40, ст. М «Ленинский пр.», «Дом технической книги» тел. (499) 137-60-19 Московский Дом Книги, Комсомольский пр., д. 25, ст. М «Фрунзенская», «Дом медицинской книги» тел. (499) 245-39-27 Дом книги «Молодая гвардия» ул. Б. Полянка, д. 28, стр. 1, ст. М «Полянка» тел. (499) 238-50-01 > приобрести в Санкт-Петербурге: Санкт-Петербургский Дом Книги Невский пр. 28, тел. (812) 448-23-57 Буквоед. Сеть магазинов тел. (812) 601 -0-601 > приобрести в регионах России: г. Воронеж, «Амиталь» Сеть магазинов тел. (473) 224-24-90 г. Екатеринбург, «Дом книги» Сеть магазинов тел. (343) 289-40-45 г. Нижний Новгород, «Дом книги» Сеть магазинов тел. (831) 246-22-92 г. Владивосток, «Дом книги» Сеть магазинов тел. (423) 263-10-54 г. Иркутск, «Продалить» Сеть магазинов тел. (395) 298-88-82 г. Омск, «Техническая книга» ул. Пушкина, д.101 тел. (381) 230-13-64 Мы рады сотрудничеству с Вами!