Содержание

Arduino IDE для ESP8266 – esp8266

Arduino IDE для ESP8266 позволяет писать скетчи и загружать их одним кликом в ESP8266 в знакомой среде (я бы даже сказал «до боли знакомой») Arduino IDE. Для тех кому интерфейс Arduino IDE не очень по душе, есть поддержка плагина для Eclipse. Итак, обо всем по порядку. Самые нетерпеливые могут сразу перейти к Arduino IDE для ESP8266: быстрый старт

Arduino IDE для ESP8266 позволяет создавать прошивки и прошивать их в ESP8266 точно так же, как вы это делаете с Arduino. При этом никаких плат Arduino не требуется, это не тот случай, когда ESP8266 используется в качестве WiFi шилда для Arduino. Кроме того, вы можете использовать практически все Arduino библиотеки с ESP8266 после небольшой доработки. В настоящее время уже достаточно много библиотек адаптировано для использования с ESP8266, но о них чуть ниже.

Arduino IDE для ESP8266 поддерживает все существующие на сегодняшний день модули ESP8266 (потому что они особо и не отличаются), включая модули с флеш бОльшего, чем 512k объема. Поддерживаются модули NodeMCU (всех версий), Olimex-MOD-WiFi-ESP8266.

Поддерживается режим авторестарта и прошивки по RTS+DTR, как у обычной Arduino, для этого потребуется USB-TTL адаптер с разведенными пинами DTR и RTS. Если у вас только RX, TX и GND на USB-TTL, то придется по-старинке вручную притягивать к земле GPIO0 и передергивать питание модуля для прошивки.

Arduino IDE для ESP8266: краткий обзор реализованных в настоящее время функций

Базовые функции языка Wiring

Управление GPIO осуществляется точно также, как и управление pin для arduino: pinMode, digitalRead, digitalWrite,   analogWrite функционируют как обычно. GPIO нумеруются так, как мы уже привыкли: для чтения состояния GPIO2 нужно использовать команду digitalRead(2)

GPIO0-GPIO15 могут быть INPUT, OUTPUT, INPUT_PULLUP, и INPUT_PULLDOWN. GPIO16 может быть только INPUT, OUTPUT или INPUT_PULLDOWN. Команда analogRead(A0) считывает значение ADC (АЦП) с TOUT.

Команда analogWrite(pin, value) включает программный PWM (ШИМ) на указанном GPIO. Команда analogWrite(pin, 0) отключает PWM. value может быть в диапазоне от 0 до PWMRANGE. Константа PWMRANGE в настоящее время равна 1023.

Поддержка прерываний обеспечивается функциями attachInterrupt, detachInterrupt. Прерывания могут быть назначены на любой GPIO, кроме GPIO16. Стандартные прерывания Arduino CHANGE, RISING, FALLING тоже поддерживаются.

ESP8266 — функции пинов

Тайминг и delay

Функции millis и micros возвращают миллисекунды и микросекунды соответственно, прошедшие с момента старта модуля. Любимая многими функция delay также присутствует и приостанавливает выполнение скетча на указанное время в миллисекундах и позволяет отработать операциям WiFi и TCP/IP. Функция delayMicroseconds используется аналогично, только время задается в микросекундах.

Помните о том, что когда модуль поддерживает WiFi соединение, ему приходится выполнять множество фоновых задач, кроме вашего скетча. WiFi и TCP/IP функции библиотек SDK имеют возможность обработать все события в очереди после завершения каждого цикла вашей функции loop() или во время выполнения delay(…). Если в вашем коде есть фрагменты, которые выполняются более 50 миллисекунд, то необходимо использовать  delay(…) для сохранения нормальной работоспособности стека WiFi.

Также вы можете использовать функцию yield(), которая эквивалентна delay(0). С другой стороны, функция delayMicroseconds блокирует выполнение других задач, поэтому ее использование для временных задержек свыше 20 миллисекунд не рекомендуется.

Последовательные порты Serial и Serial1 (UART0 и UART1)

Объект Serial работает точно также, как и с Arduino. Помимо аппаратного FIFO (по 128 байт для приема и передачи) определен и программный буфер размером по 256 байт для приема и передачи данных. Прием и передача данных происходит по прерываниям, прозрачно для вашего скетча. Функции записи и чтения блокируют выполнение скетча только когда аппаратный FIFO и программный буфер переполняются.

Serial использует аппаратный UART0, работающий на GPIO1(TX) и GPIO3(RX). Эти пины могут быть переназначены на GPIO15 (TX) и GPIO13 (RX) вызовом функции Serial.swap(); после Serial.begin();. Повторный вызов Serial.swap(); вернет все на свои места.

Serial1 использует аппаратный UART1, работающий только на передачу. UART1 TX это GPIO2. Для включения Serial1 используйте Serial1.begin();

По умолчанию, отладочная информация библиотек WiFi выключается, когда вы вызываете функцию Serial.begin();. Для включения отладочной информации на UART0 используйте Serial.setDebugOutput(true); Для перенаправления вывода отладочной информации на UART1 используйте команду Serial1.setDebugOutput(true);

И Serial и Serial1 поддерживают 5, 6, 7, 8 бит данных, odd (O), even (E), и no (N) режимы четности, и 1 или 2 стоп бита. Для выбора нужного режима вызывайте Serial.begin(baudrate, SERIAL_8N1); или Serial.begin(baudrate, SERIAL_6E2); и т.д.

PROGMEM

Макрос PROGMEM работает точно также, как в Arduino, помещая read only данные и строковые константы (литералы) во флеш память, высвобождая HEAP. Важное отличие состоит в том, что в ESP8266 одинаковые литералы не хранятся в одном месте, поэтому использование строковых констант внутри конструкций F(«») и/или PSTR(«») приводит к расходованию флеш памяти при каждом вызове этих функций. Вы должны самостоятельно управлять одинаковыми строками для экономичного расходования места во флеш памяти.

Библиотека WiFi ESP8266 (ESP8266WiFi)

Функции библиотеки WiFi ESP8266 очень схожи с функциями библиотеки для обычного WiFi шилда.

Список отличий:

  • WiFi.mode(m): выбрать режим WIFI_AP (точка доступа), WIFI_STA (клиент), или WIFI_AP_STA (оба режима одновременно).
  • WiFi.softAP(ssid) создает открытую точку доступа
  • WiFi.softAP(ssid, password) создает точку доступа с WPA2-PSK шифрованием, пароль должен быть не менее 8 символов
  • WiFi.macAddress(mac) позволяет получить MAC адрес в режиме клиента
  • WiFi.softAPmacAddress(mac) позволяет получить MAC адрес в режиме точки доступа
  • WiFi.localIP() позволяет получить IP адрес в режиме клиента
  • WiFi.softAPIP() позволяет получить IP адрес в режиме точки доступа
  • WiFi.RSSI() пока не реализована
  • WiFi.printDiag(Serial); выводит диагностическую информацию
  • Класс WiFiUDP поддерживает прием и передачу multicast пакетов в режиме клиента. Для передачи multicast пакета используйте вместо udp.beginPacket(addr, port) функцию udp.beginPacketMulticast(addr, port, WiFi.localIP()). Когда вы ожидаете multicast пакеты, используйте вместо udp.begin(port) функцию udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port). Вы можете использовать udp.destinationIP() для определения того, был ли пакет отправлен на multicast адрес или предназначался именно вам. Multicast функции не поддерживаются в режиме точки доступа.

WiFiServer, WiFiClient, и WiFiUDP работаю точно так же, как и с библиотекой обычного WiFi шилда. Четыре примера идет в комплекте с этой библиотекой.

Тикер

Библиотека Ticker может быть использована для выполнения периодически повторяющихся событий через определенное время. Два примера включено в поставку.

В настоящее время не рекомендуется блокировать операции ввода-вывода (сеть, последовательный порт, файловые операции) в callback функциях тикера. Вместо блокирования устанавливайте флаг в callback функциях и проверяйте этот флаг в основном цикле.

EEPROM

Эта библиотека немного отличается от стандартной Arduino EEPROM. Необходимо вызвать функцию EEPROM.begin(size) каждый раз перед началом чтения или записи, размер (указывается в байтах) соответствует размеру данных, которые вы намереваетесь использовать в EEPROM. Размер данных должен быть в диапазоне от 4 до 4096 байт.

Функция EEPROM.write не производит запись данных во флеш память немедленно, вы должны использовать функцию EEPROM.commit() каждый раз, когда вы хотите сохранить данные в память. Функция EEPROM.end() тоже производит запись данных, а также освобождает оперативную память от данных, запись которых произведена. Библиотека EEPROM использует один сектор во флеш памяти, начиная с адреса 0x7b000 для хранения данных. В поставку включено три примера работы с EEPROM.

I2C (Библиотека Wire)

Реализован только режим ведущего, частота ориентировочно до 450 кГц. Перед использованием шины I2C, нужно выбрать пины SDA и SCL путем вызова функции Wire.pins(int sda, int scl), например Wire.pins(0, 2) для модуля ESP-01. Для других модулей пины по умолчанию 4(SDA) и 5(SCL).

SPI

Библиотека SPI поддерживает весь Arduino SPI API, включая транзакции, в том числе фазу синхронизации (CPHA). Clock polarity (CPOL) пока не поддерживается (SPI_MODE2 и SPI_MODE3 не работают).

ESP8266 API

Поддержка функций, специфичных для ESP8266 (режим глубокого сна и сторожевой таймер), реализована в объекте ESP. Функция ESP.deepSleep(microseconds, mode) переводит модуль в режим глубокого сна. Параметр mode может принимать значения: WAKE_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED. GPIO16 должен быть соединен с RESET для выхода из режима глубокого сна.

Функции ESP.wdtEnable(), ESP.wdtDisable(), и ESP.wdtFeed() управляют сторожевым таймером.

ESP.reset() перезагружает модульESP.getFreeHeap() возвращает размер свободной памятиESP.getFreeHeap() возвращает размер свободной памятиESP.getChipId() возвращает ESP8266 chip IDE, int 32bitESP.getFlashChipId() возвращает flash chip ID, int 32bitESP.getFlashChipSize() возвращает размер флеш памяти в байтах, так, как его определяет SDK (может быть меньше реального размера).ESP.getFlashChipSpeed(void) возвращает частоту флеш памяти, в Гц.ESP.getCycleCount() возвращает количество циклов CPU с момента старта, unsigned 32-bit. Может быть полезна для точного тайминга очень коротких операций

Библиотека OneWire

Библиотека OneWire была адаптирована для ESP8266 (внесены изменения в OneWire.h) Если у вас установлена библиотека OneWire в папку Arduino/libraries, то будет использоваться именно она, а не из комплекта поставки.

mDNS библиотека ESP8266mDNS

Библиотека позволяет реализовать в вашей программе ответ на мультикастовые DNS запросы для локальной зоны, например «esp8266.local». В настоящее время поддерживается только одна зона. Позволяет обращаться к WEB серверу ESP8266 по имени, а не только по IP адресу. Дополнительную информацию вы можете найти в прилагаемом примере и в файле readme данной библиотеки.

Библиотека Servo

Библиотека позволяет управлять сервомоторами. Поддерживает до 24 сервоприводов на любых доступных GPIO. По умолчанию первые 12 сервоприводов будут использовать Timer0 и будут независимы от любых других процессов. Следующие 12 сервоприводов будут использовать Timer1 и будут разделять ресурсы с другими функциями, использующими Timer1. Большинство сервоприводов будут работать с управляющим сигналом ESP8266 3,3в, но не смогут работать на напряжении 3,3в и потребуют отдельный источник питания. Не забудьте соединить общий провод GND этого источника с GND ESP8266

Другие библиотеки, не включенные в поставку Arduino IDE

Почти все библиотеки, которые не используют низкоуровневый доступ к регистрам микропроцессора AVR должны работать без каких-либо доработок. На сегодняшний день можно точно сказать, что протестированы и полностью работоспособны следующие библиотеки:

  • arduinoWebSockets — WebSocket сервер и клиент для esp8266 (RFC6455)
  • aREST REST API handler библиотека, позволяет управлять GPIO через http запросы вида http://192.168.1.101/digital/6/1
  • Blynk — легкий в освоении IoT фреймворк (страница на Kickstarter). Статья на нашем сайте об этой библиотеке и мобильном приложении ESP8266 – Управляем со смартфона через Blynk
  • DallasTemperature DS18B20, DS1820, DS18S20, DS1822
  • DHT11 — используйте для инициализации следующие параметры DHT dht(DHTPIN, DHTTYPE, 15)
  • NeoPixelBus — Arduino NeoPixel библиотека для esp8266
  • PubSubClient Библиотека MQTT by @Imroy. Статья на нашем сайте об этой библиотеке ESP8266 подключаемся к OpenWRT+Mosquitto+mqttwarn и передаем данные на ThingSpeak, EMAIL, Android, iOS, Twitter, CloudMQTT в 100 строчек кода в Arduino IDE
  • RTC — библиотека for Ds1307 & Ds3231 для esp8266
  • Souliss, Smart Home — фреймворк для Умного Дома, построенный на Arduino, Android и OpenHAB

Установка Arduino IDE через Boards Manager

  1. Установите Arduino IDE с официального сайта Arduino.cc
  2. Запустить Arduino IDE, далее Файл — Настройки — в поле Additional Boards Manager URLs вставить ссылку на стабильную версию http://arduino.esp8266.com/package_esp8266com_index.jsonили для nightly build http://arduino.esp8266.com/staging/package_esp8266com_index.json, нажать OK (В это поле вы можете вводить несколько ссылок, разделенных запятой)
  3. Инструменты — Плата — Boards Manager
  4. В Boards Manager в поле фильтра введите esp8266 или вручную пролистайте список и кликните на ESP8266 by ESP8266 Community Forum
  5. Кликните Install и дождитесь окончания загрузки (около 130 Мегабайт). Если загрузка произошла слишком быстро, возможно, что вы уже устанавливали Arduino IDE для ESP8266 и потребуется почистить кэш Boards Manager, иначе у вас останется установленной старая версия. Нужно сначала деинсталлировать старую версию, а потом необходимо удалить файлы кэша. Для Win7 x64 удалите файлы из папки C:\Users\Пользователь\AppData\Roaming\Arduino15 и повторите все, начиная с п.2
  6. Закройте Boards Manager и в меню Инструменты выберите Плата — Generic ESP8266
  7. Установите частоту вашего модуля 80 или 160Mhz, размер флеш памяти и выберите последовательный порт, к которому подключен ваш USB-TTL адаптер

Схема подключения ESP8266

Оптимальное подключение ESP8266 для Arduino IDE

Оптимальное подключение ESP8266

Подключение ESP8266ПримечаниеUSB-TTL
VCCESP8266 подключайте к внешнему источнику питания >300мА, 3,3V
GNDвсе контакты GND должны быть соединены вместе: ESP8266, USB-TTL и источника питанияGND
TX (UTXD)RX
RX (URXD)TX
GPIO0подтягивающий к питанию резистор 10kDTR (если на вашем USB-TTL не разведен пин DTR, то вам придется вручную переключать GPIO0 на землю для перевода ESP8266 в режим прошивки)
RESET (RSBT, REST)подтягивающий к питанию резистор 10k, также можете добавить кнопку, соединяющую RESET и GND для ручного сброса модуляRTS (если на вашем USB-TTL не разведен пин RTS, то вам придется вручную перезагружать модуль )
CH_PD (CH_EN)подтягивающий к питанию резистор 10k
GPIO15 (MTDO)подтягивающий к земле резистор 10k
(для тех модулей, где выведен пин GPIO15)
GPIO2подтягивающий к питанию резистор 10k
(на схеме не показан, но рекомендуется для увеличения стабильности)
GPIO16для успешного выхода из режима Deep Sleep необходимо соединить пины ESP8266 GPIO16 и RESET через резистор 470 Ом (на схеме не показан)

Примечания.

1. Не на всех модулях выведены все пины. Перед приобретением модуля ознакомьтесь с видами модулей и их распиновкой.

2. Если на вашем USB-TTL конвертере выведены пины CTS и DSR — для автозагрузки прошивки они вам не помогут, т.к. работают только на вход.

3. Для стабильной работы ESP8266 требуется источник стабилизированного питания 3,3 вольт, ток более 250 миллиампер. Использование питания от USB-TTL конвертера может привести к нестабильности в работе.

Минимальное подключение ESP8266

Минимальное подключение ESP8266 (повышенная стабильность)

Более подробно, со всеми деталями, о подключении ESP8266 вы можете прочитать в нашей статье ESP8266 – подключение и обновление прошивки

Arduino IDE для ESP8266: быстрый старт

1. Подключить USB-TTL к USB

2. Подключить ESP8266 к USB-TTL как обычно. Если вы подключили ESP8266 по схеме без поддержки автозагрузки прошивки (не подключены DTR и RTS), то вручную соедините GPIO0 с землей, передерните питание модуля — все готово для  прошивки

3. Запускаем Arduino IDE

4. В меню ИнструментыПлатаGeneric ESP8266 board (в самом низу)

5. В меню Инструменты выбираем порт, к которому подключен наш USB-TTL

6. В меню Инструменты — выбираете частоту, размер флеш памяти вашего модуля

7. В меню Файл — Примеры (Образцы) — ESP8266WiFi — WiFiWebServer

8. В скетче заполняете SSID и пароль вашей WiFi сети

9. Жмем кнопку компиляции и загрузки скетча

10. Ждем окончании процесса прошивки. После прошивки, если модуль подключен по схеме без поддержки автопрошивки, отсоедините GPIO0 от земли и передерните питание модуля без отключения USB-TTL от питания

11. В меню Инструменты — Монитор последовательного порта

12. Выбираем скорость 115200

13. Смотрим что происходит в терминале

14. Когда модуль подключится к сети, то появятся надписи в мониторе «WiFi connected» и «Server started»

15. Ниже будет IP адрес вашего модуля ESP8266, например 192.168.1.248

16. Открываете любой браузер, в строке адреса вбиваете «http://192.168.1.248/gpio/1»

17. Смотрите монитор последовательно порта и если к ESP8266 к GPIO2 у вас подключен светодиод (через резистор, разумеется), то он включится.

18. Profit!

Автором этого проекта адаптации Arduino IDE для ESP8266 является наш соотечественник из Санкт-Петербурга Иван Грохотков.

Скачать Arduino IDE для ESP8266 с github

Скачать Arduino IDE для ESP8266 с build сервера

Скачать исходный код Arduino IDE для ESP8266

Задать вопросы автору проекта Ивану Грохоткову aka igrr или сообщить об ошибке в Arduino IDE для ESP8266 можно в специальном разделе на нашем форуме.

esp8266.ru

Программирование ESP8266 в среде Arduino IDE

Волшебная палочка POW на ESP8266

Проект который Вы можете сделать со своим ребенком на новогодних каникулах 🙂

Прошивка: MagicWandPOW
Схема: Волшебная палочка POW на ESP8266

ESP8266 Библиотека WebSocketsServer

Скетч: Step14-WebSockedServer

Программирование по порядку.
Как установить плагин в среду ARDUINO IDE, который позволяет загрузить файловую систему в ESP8266.
Если у нас есть возможность использовать файловую систему прямо на кристалле ESP8266 зачем нам SD карты и веб страницы помещенные в код?

Ссылка на загрузку плагине здесь:  ESP8266FS-0.3.0.zip

Программирование по порядку.
Пример использования библиотеки TickerScheduler.
Библиотека позволяет выполнять различные задачи с различными промежутками времени.

Скетч: Step13-TickerScheduler

Программирование по порядку.
Пример связи Web страницы и датчиков DHT11, DHT22/AM2302/RHT03   – передаем данные температуры и влажности на страницу из ESP8266 в виде графика.
Возможности page.htm?*

Step12-Graf-DHT

 

Программирование по порядку.
Как создать свои WEB страницы не используя HTML продолжение – передаем данные на страницу из ESP8266 в виде графика.
Возможности page.htm?*

Step11-GrafNoHTML

Программирование по порядку.
Как создать свои WEB страницы не используя HTML продолжение – передаем данные на страницу из ESP8266.
Возможности page.htm?*

Step10-DataNoHTML

Программирование по порядку.
Как создать свои WEB страницы не используя HTML.
Возможности page.htm?*

Step9-CodNoHTML

Архив качать здесь: https://github.com/tretyakovsa/Sonoff_Loader

esp8266-arduinoide.ru

Программирование ESP8266 в среде Arduino IDE

Автор проекта адаптации Arduino IDE для программирования модулей на основе Espressif ESP8266

— Иван Грохотков «igrr» (Санкт-Петербург)

Страница проекта на GitHub | Форум поддержки (англ.)

 

Для тех, кто привык работать в среде программирования Arduino IDE, теперь есть возможность писать скетчи и для контроллеров на базе чипа ESP8266, точно также, как и для плат Arduino. Arduino IDE позволяет писать скетчи и загружать их одним кликом в ESP8266 в знакомой среде.

Arduino IDE позволяет создавать программы и прошивать их в ESP8266 точно так же, как вы это делаете с Arduino. При этом самих контроллеров Arduino не требуется. В этой ситуации ESP8266 уже используется не в качестве WiFi шилда для Arduino. Также, имеется возможность использовать практически все Arduino библиотеки. Могут конечно потребоваться небольшие доработки. На данный момент уже большое количество библиотек адаптировано для применения с ESP8266.

 

Список типов ESP плат поддерживаемых в Arduino IDE

Adafruit HUZZAH ESP8266 (ESP-12), ESPresso Lite 1.0, ESPresso Lite 2.0, NodeMCU 0.9, NodeMCU 1.0, Olimex WIFI-ESP8266, Phoenix 1.0, Phoenix 2.0, SparkFun ESP8266 Thing, SweetPea ESP-210, ESPino, WifInfo, Generic ESP8266 modules, Generic ESP8285 modules, WeMos D1, WeMos D1 mini, ESPino by ThaiEasyElec

Все перечисленные платы можно программировать в Arduino IDE, точно также, как сам Ардуино.

 

Как установить поддержку ESP8266?

Запустите Arduino IDE

Зайдите в меню ФайлНастройки

 

В поле Дополнительные ссылки для менеджера плат (Additional Boards Manager URLs)

нужно вставить ссылку на стабильную версию

http://arduino.esp8266.com/stable/package_esp8266com_index.json

или на release candidate

http://arduino.esp8266.com/staging/package_esp8266com_index.json

 

Затем переходим в меню ИнструментыПлата Менеджер плат (Boards Manager)

 

В строке поиска пишем esp8266, выбираем последнюю версию и нажимаем Установка

 

Дождитесь окончания загрузки. Вы установили библиотеки ESP8266 для Arduino IDE! Можно переходить к выбору платы.

 

 

smartmodules.ru

Рисуем программы для связи с ESP8266

Поддержать сайт

Как написать программу для Windows?

я рисую программы с помощью HiAsm. Очень быстро можно нарисовать программу в редакторе и получить исполняемый файл.

Компилятор качаем здесь.. 

Сайт HiAsm

Схема HiAsm:

Add(MainForm,5342179,35,63)
{
 Left=20
 Top=105
 Width=501
 Height=585
 Point(onClose)
 link(onCreate,8595080:doEvent1,[(72,83)(72,111)])
 link(onClose,3474948:doWork2,[])
}
Add(Button,13254290,35,161)
{
 Left=15
 Top=5
 Caption="Найти"
 link(onClick,3291399:doEvent2,[(75,167)(75,160)])
}
Add(Memo,13733955,287,147)
{
 Left=290
 Top=335
 Width=175
 Height=200
 ScrollBars=2
}
Add(Hub,3291399,84,147)
{
 InCount=2
 OutCount=4
 link(onEvent1,13733955:doClear,[(192,153)(192,160)])
 link(onEvent2,3474948:doWork3,[(119,160)(119,97)])
}
Add(MultiElement,3474948,140,77)
{
 @Hint=#43:Получаем список arduino устройств Имя;Адрес|
 link(onEvent1,10013583:doAdd,[(230,83)(230,6)])
 link(onEvent2,13733955:doAdd,[(230,90)(230,153)])
}
BEGIN_SDK
  Add(EditMulti,13463220,21,21)
  {
   EventCount=2
   WorkCount=3
   Width=755
   Height=291
   link(doWork1,16740130:doOpen,[(101,27)(101,167)])
   link(doWork2,16740130:doClose,[(101,34)(101,188)])
   link(doWork3,16740130:doSendTo,[(101,41)(101,195)])
  }
  Add(UDP,16740130,182,161)
  {
   RemotePort=1900
   LocalIP="0"
   RemoteIP="239.255.255.250"
   BroadCast=0
   Point(doSendTo)
   Point(onError)
   link(onReceive,2266035:doEvent1,[])
   link(Data,14492679:Value,[])
  }
  Add(Memory,14492679,182,98)
  {
   Default=String(M-SEARCH * HTTP/1.1\r\nHost:239.255.255.250:1900\r\nST:upnp:rootdevice\r\nMan:"ssdp:discover"\r\nMX:3\r\n\r\n)
  }
  Add(BlockFind,2727975,308,112)
  {
   @Hint=#67:Выделяем имя устройства, обрезаем пробелы и сохраняем в переменную.|
   IncludeBlock=1
   StartBlock="SERVER:"
   EndBlock="/"
   link(onSearch,6159092:doTrim,[])
  }
  Add(BlockFind,2565995,294,189)
  {
   @Hint=#19:Получаем IP адрес и|
   IncludeBlock=1
   StartBlock="LOCATION: "
   EndBlock="\r\n"
   link(onSearch,7297985:doCompare,[(366,195)(366,174)])
  }
  Add(Hub,2266035,224,161)
  {
   OutCount=4
   link(onEvent1,5438701:doSearch,[(256,167)(256,97)])
   link(onEvent2,2727975:doSearch,[(273,174)(273,118)])
   link(onEvent3,2565995:doSearch,[(256,181)(256,195)])
   link(onEvent4,13463220:onEvent2,[(507,188)(507,34)])
  }
  Add(If_else,7297985,406,168)
  {
   Op2=String(Arduino)
   link(onTrue,11061185:doSearch,[(454,174)(454,202)])
   link(Op1,9795099:Value,[(412,156)(447,156)])
  }
  Add(Trim,6159092,378,112)
  {
   link(onTrim,9795099:doValue,[])
  }
  Add(Memory,9795099,441,112)
  {
  }
  Add(BlockFind,11061185,469,196)
  {
   IncludeBlock=1
   StartBlock="http://"
   EndBlock=":"
   link(onSearch,6513812:doStrCatDlm,[(551,202)(551,188)])
  }
  Add(BlockFind,5438701,511,91)
  {
   @Hint=#48:Поиск ответа от arduino SSDP. Сохраняем признак.|
   IncludeBlock=1
   StartBlock="Arduino/1.0 UPNP/1.1"
   EndBlock="/"
   link(onSearch,2332799:doValue,[])
  }
  Add(Memory,2332799,623,91)
  {
  }
  Add(StrCatDelim,6513812,602,182)
  {
   Delimiter=";"
   link(onStrCatDlm,13463220:onEvent1,[(705,188)(705,27)])
   link(Str1,2332799:Value,[(608,142)(629,142)])
  }
END_SDK
Add(Hub,8595080,77,105)
{
 link(onEvent1,3474948:doWork1,[(115,111)(115,83)])
 link(onEvent2,3291399:doEvent1,[(103,118)(103,136)(72,136)(72,153)])
}
Add(FormatStr,9072925,427,91)
{
 Mask="http://%1:%2"
 Point(FString)
 link(Str2,15775524:Text,[])
}
Add(Edit,15775524,434,34)
{
 Left=380
 Top=5
 Text="8080"
}
Add(MultiStrData,10070503,329,84)
{
 link(Str,10013583:String,[(335,47)(272,47)])
 link(onPart2,15909423:doEvent1,[(373,97)(373,132)])
}
Add(HTTP_Get,10823916,322,280)
{
 Wait=0
 link(onDownload,16033274:doConvert,[(362,293)(362,286)])
}
Add(Convertor,16033274,371,280)
{
 Mode=11
 link(onResult,13496232:doText,[(415,286)(415,287)])
}
Add(StrCat,4217139,175,259)
{
 Str1="http://192.168.0.100:8080"
 link(onStrCat,16573918:doText,[(237,265)(237,284)])
 link(Str1,9072925:FString,[(181,198)(433,198)])
}
Add(Edit,13496232,427,281)
{
 Left=100
 Top=60
 Width=370
 Text=""
 link(onChange,4129826:doEvent1,[(531,287)(531,286)])
}
Add(Edit,16573918,266,278)
{
 Left=100
 Top=35
 Width=370
 Text=""
 link(onChange,10823916:doDownload,[(303,284)(303,286)])
}
Add(ChildPanel,5759541,78,361)
{
 link(onEvent1,3613272:doWork2,[])
}
BEGIN_SDK
  Add(EditMulti,5890585,21,21)
  {
   EventCount=1
   Width=447
  }
  Add(Panel,7688554,35,105)
  {
   Left=289
   Top=100
   Width=179
   Height=108
  }
  Add(Button,974701,201,98)
  {
   Left=120
   Top=55
   Width=50
   Caption="3"
   Data=String(3)
   link(onClick,16516817:doWork3,[(249,104)])
  }
  Add(Button,11727135,136,175)
  {
   Left=65
   Top=80
   Width=50
   Caption="5"
   Data=String(5)
   link(onClick,284611:doWork3,[(179,181)])
  }
  Add(Button,8843707,150,98)
  {
   Left=65
   Top=55
   Width=50
   Caption="2"
   Data=String(2)
   link(onClick,7321461:doWork3,[(186,104)])
  }
  Add(Button,13296124,99,81)
  {
   Left=10
   Top=55
   Width=50
   Caption="1"
   Data=String(1)
   link(onClick,7321461:doWork2,[])
  }
  Add(Button,14983282,159,32)
  {
   Left=65
   Top=30
   Caption="0"
   Data=String(0)
   link(onClick,5253491:doWork1,[(281,38)])
  }
  Add(Button,2526109,199,168)
  {
   Left=120
   Top=80
   Width=50
   Caption="6"
   Data=String(6)
   link(onClick,15104077:doWork3,[(263,174)])
  }
  Add(Label,7126958,33,35)
  {
   Left=15
   Top=5
   Width=43
   Height=17
   Caption="Люстра"
  }
  Add(Button,6290793,89,154)
  {
   Left=10
   Top=80
   Width=50
   Caption="4"
   Data=String(4)
   link(onClick,284611:doWork2,[])
  }
  Add(StrCat,2942270,371,126)
  {
   Str1="/lam?volume="
   link(onStrCat,5890585:onEvent1,[(435,132)(435,27)])
  }
  Add(HubEx,9152571,322,126)
  {
   link(onEvent,2942270:doStrCat,[])
  }
  Add(HubEx,284611,175,154)
  {
   link(onEvent,15104077:doWork2,[])
  }
  Add(HubEx,15104077,259,154)
  {
   link(onEvent,9152571:doWork3,[(326,160)])
  }
  Add(HubEx,5253491,277,84)
  {
   Angle=1
   link(onEvent,9152571:doWork2,[(281,132)])
  }
  Add(HubEx,7321461,182,81)
  {
   link(onEvent,16516817:doWork2,[(205,87)(205,90)])
  }
  Add(HubEx,16516817,245,84)
  {
   link(onEvent,5253491:doWork2,[])
  }
END_SDK
Add(LED,9617473,560,357)
{
 Left=440
 Top=5
 link(onChange,1471209:doCompare,[(628,363)(628,370)])
}
Add(If_else,1471209,665,364)
{
 Op2=Integer(1)
 link(onTrue,205950:doData,[(709,370)(709,394)(205,394)(205,419)])
}
Add(Memory,11064231,217,357)
{
 link(onData,9617473:doOn,[(405,363)(405,377)])
}
Add(DoData,205950,217,413)
{
 link(onEventData,4217139:doStrCat,[(261,419)(261,342)(163,342)(163,265)])
 link(Data,11064231:Value,[])
}
Add(ComboBox,10013583,259,0)
{
 Left=75
 Top=5
 Width=295
 Height=21
 Text="Выбери устройство"
 link(onClick,10070503:doSplit,[(310,13)(310,90)])
}
Add(ChildPanel,9510462,77,407)
{
 link(onEvent1,5619053:doWork2,[])
}
BEGIN_SDK
  Add(EditMulti,11383916,21,21)
  {
   EventCount=1
  }
  Add(Panel,5397409,35,105)
  {
   Left=290
   Top=230
   Width=178
   Height=97
  }
  Add(Button,2631611,157,141)
  {
   Left=143
   Top=35
   Width=30
   Caption=">"
   link(onClick,11371450:doString,[(221,147)(221,160)])
  }
  Add(Edit,6423435,202,87)
  {
   Left=11
   Top=35
   Width=130
   Text="551489775"
  }
  Add(Label,13544285,119,89)
  {
   Left=15
   Top=10
   Width=40
   Height=17
   Caption="ИК код"
  }
  Add(FormatStr,11371450,252,154)
  {
   DataCount=1
   Mask="/irc?volume=%1"
   link(onFString,11383916:onEvent1,[(302,160)(302,27)])
   link(Str1,6423435:Text,[(258,136)(208,136)])
  }
END_SDK
Add(HubEx,3613272,154,361)
{
 link(onEvent,11064231:doValue,[(167,367)(167,363)])
}
Add(ChildGroupBox,1847388,80,467)
{
 link(onEvent1,5619053:doWork3,[(144,473)])
}
BEGIN_SDK
  Add(EditMulti,15059386,21,21)
  {
   EventCount=1
   Width=734
   Height=529
  }
  Add(GroupBox,7245683,35,105)
  {
   Left=15
   Top=90
   Width=264
   Height=449
   Caption="Пульт"
   Point(doBringToFront)
  }
  Add(Button,4810261,77,140)
  {
   Left=15
   Top=42
   Caption="TV/RAD"
   Data=String(20DF0FF0)
   link(onClick,11292064:doWork2,[(205,146)(205,195)])
  }
  Add(Button,6577152,167,140)
  {
   Left=70
   Top=42
   Caption="RATIO"
   Data=String(20DF9E61)
   link(onClick,9107267:doWork2,[(251,146)(251,167)])
  }
  Add(Button,12126316,117,139)
  {
   Left=125
   Top=42
   Caption="INPUT"
   Data=String(20DFD02F)
   link(onClick,11826244:doWork2,[(225,145)(225,181)])
  }
  Add(Button,15405225,210,139)
  {
   Left=180
   Top=42
   Width=70
   Caption="AV/MODE"
   Data=String(20DF0CF3)
   link(onClick,11062608:doWork2,[(272,145)(272,160)])
  }
  Add(Button,1652248,77,179)
  {
   Left=175
   Top=63
   Width=75
   Caption="3"
   Data=String(20DFC837)
   link(onClick,5359472:doWork2,[(205,185)(205,237)])
  }
  Add(Button,1571508,118,180)
  {
   Left=15
   Top=63
   Width=75
   Caption="1"
   Data=String(20DF8877)
   link(onClick,10690858:doWork2,[(226,186)(226,230)])
  }
  Add(Button,4229944,119,219)
  {
   Left=95
   Top=63
   Width=75
   Caption="2"
   Data=String(20DF48B7)
   link(onClick,884633:doWork2,[(227,225)(227,279)])
  }
  Add(Button,3460367,80,217)
  {
   Left=175
   Top=83
   Width=75
   Caption="6"
   Data=String(20DF6897)
   link(onClick,5398013:doWork2,[(207,223)(207,286)])
  }
  Add(Button,4739731,79,253)
  {
   Left=15
   Top=83
   Width=75
   Caption="4"
   Data=String(20DF28D7)
   link(onClick,7263941:doWork2,[(229,259)(229,195)])
  }
  Add(Button,15494092,122,257)
  {
   Left=95
   Top=83
   Width=75
   Caption="5"
   Data=String(20DFA857)
   link(onClick,15037656:doWork2,[(250,263)(250,223)])
  }
  Add(Button,5631519,167,182)
  {
   Left=175
   Top=103
   Width=75
   Caption="9"
   Data=String(20DF9867)
   link(onClick,7472381:doWork2,[(251,188)(251,223)])
  }
  Add(Button,3759811,166,225)
  {
   Left=15
   Top=103
   Width=75
   Caption="7"
   Data=String(20DFE817)
   link(onClick,4225500:doWork2,[(250,231)(250,272)])
  }
  Add(Button,269065,167,264)
  {
   Left=95
   Top=103
   Width=75
   Caption="8"
   Data=String(20DF18E7)
   link(onClick,10174689:doWork2,[(273,270)(273,216)])
  }
  Add(Button,509388,212,185)
  {
   Left=175
   Top=123
   Width=75
   Caption="Q.VIEW"
   Data=String(20DF58A7)
   link(onClick,5976158:doWork2,[(273,191)(273,216)])
  }
  Add(Button,2596496,253,221)
  {
   Left=15
   Top=123
   Width=75
   Caption="LIST"
   Data=String(20DFCA35)
   link(onClick,9442755:doWork2,[(293,227)(293,251)])
  }
  Add(Button,3160358,254,183)
  {
   Left=95
   Top=123
   Width=75
   Caption="0"
   Data=String(20DF08F7)
   link(onClick,12117516:doWork2,[(294,189)(294,209)])
  }
  Add(Button,3621173,213,266)
  {
   Left=95
   Top=143
   Width=75
   Caption="FAV"
   Data=String(20DF7887)
   link(onClick,4197217:doWork2,[(295,272)(295,202)])
  }
  Add(Button,14909640,209,308)
  {
   Left=95
   Top=165
   Width=75
   Caption="3D"
   Data=String(20DF3BC4)
   link(onClick,9125029:doWork2,[(293,314)(293,251)])
  }
  Add(Button,3492603,163,304)
  {
   Left=95
   Top=187
   Width=75
   Caption="MUTE"
   Data=String(20DF906F)
   link(onClick,16498150:doWork2,[(271,310)(271,258)])
  }
  Add(Button,3146079,122,299)
  {
   Left=95
   Top=218
   Width=75
   Caption="INFO"
   Data=String(20DF55AA)
   link(onClick,4540256:doWork2,[(250,305)(250,272)])
  }
  Add(Button,94205,123,423)
  {
   Left=95
   Top=240
   Width=75
   Caption="^"
   Data=String(20DF02FD)
   link(onClick,636662:doWork2,[(251,429)(251,384)])
  }
  Add(Button,11221169,210,460)
  {
   Left=175
   Top=261
   Width=75
   Caption=">"
   Data=String(20DF609F)
   link(onClick,10646490:doWork2,[(294,466)(294,405)])
  }
  Add(Button,2580413,209,419)
  {
   Left=15
   Top=261
   Width=75
   Caption="<"
   Data=String(20DFE01F)
   link(onClick,10906462:doWork2,[(293,425)(293,363)])
  }
  Add(Button,3955852,245,416)
  {
   Left=95
   Top=261
   Width=75
   Caption="OK"
   Data=String(20DF22DD)
   link(onClick,10671287:doWork2,[(311,422)(311,349)])
  }
  Add(Button,14025825,80,461)
  {
   Left=95
   Top=282
   Width=75
   Caption=""
   Data=String()
   link(onClick,1707022:doWork2,[(229,467)(229,426)])
  }
  Add(Button,9361615,82,302)
  {
   Left=15
   Top=218
   Width=75
   Caption="SETTINGS"
   Data=String(20DFC23D)
   link(onClick,8524756:doWork2,[(230,308)(230,209)])
  }
  Add(Button,20963,255,266)
  {
   Left=175
   Top=218
   Width=75
   Caption="Q.MENU"
   Data=String(20DFA25D)
   link(onClick,15970471:doWork2,[(295,272)(295,258)])
  }
  Add(Button,9183921,164,376)
  {
   Left=175
   Top=303
   Width=75
   Caption="EXIT"
   Data=String(20DFDA25)
   link(onClick,9824463:doWork2,[(271,382)(271,321)])
  }
  Add(Button,8529380,79,419)
  {
   Left=15
   Top=303
   Width=75
   Caption="BACK"
   Data=String(20DF14EB)
   link(onClick,16495474:doWork2,[(229,425)(229,391)])
  }
  Add(Button,16113687,248,381)
  {
   Left=95
   Top=303
   Width=75
   Caption="GUIDE"
   Data=String(20DFD52A)
   link(onClick,16195284:doWork2,[(313,387)(313,286)])
  }
  Add(Button,14132760,78,380)
  {
   Left=15
   Top=330
   Color=255
   Caption="*"
   Data=String(20DF4EB1)
   link(onClick,833088:doWork2,[(228,386)(228,342)])
  }
  Add(Button,9061170,126,499)
  {
   Left=75
   Top=330
   Caption="**"
   Data=String(20DF8E71)
   link(onClick,13198312:doWork2,[(252,505)(252,447)])
  }
  Add(Button,10379286,83,498)
  {
   Left=135
   Top=330
   Caption="***"
   Data=String(20DFC639)
   link(onClick,3787149:doWork2,[(231,504)(231,461)])
  }
  Add(Button,16103809,176,498)
  {
   Left=195
   Top=330
   Caption="****"
   Data=String(20DF8679)
   link(onClick,4346900:doWork2,[(277,504)(277,440)])
  }
  Add(Button,10892637,211,224)
  {
   Left=175
   Top=143
   Width=75
   Height=30
   Caption="^"
   Data=String(20DF00FF)
   link(onClick,4634660:doWork2,[(273,230)(273,265)])
  }
  Add(Button,7889017,249,143)
  {
   Left=175
   Top=172
   Width=75
   Height=35
   Caption=""
   Data=String(20DF807F)
   link(onClick,11062608:doWork1,[(305,149)])
  }
  Add(Button,16467757,208,383)
  {
   Left=15
   Top=143
   Width=75
   Height=30
   Caption="^"
   Data=String(20DF40BF)
   link(onClick,6087144:doWork2,[(293,389)(293,307)])
  }
  Add(Button,8430689,253,309)
  {
   Left=15
   Top=172
   Width=75
   Height=35
   Caption=""
   Data=String(20DFC03F)
   link(onClick,6230764:doWork2,[(315,315)(315,237)])
  }
  Add(Button,9519553,250,344)
  {
   Left=175
   Top=355
   Width=75
   Caption="SUBTITLE"
   Data=String(20DF9C63)
   link(onClick,10339715:doWork2,[(314,350)(314,244)])
  }
  Add(Button,5573454,123,380)
  {
   Left=15
   Top=355
   Width=75
   Caption="TEXT"
   Data=String(20DF04FB)
   link(onClick,7710006:doWork2,[(251,386)(251,335)])
  }
  Add(Button,13188534,208,342)
  {
   Left=95
   Top=355
   Width=75
   Caption="T.OPT"
   Data=String(20DF847B)
   link(onClick,2445281:doWork2,[(293,348)(293,265)])
  }
  Add(Button,11605744,162,340)
  {
   Left=175
   Top=376
   Width=75
   Caption="="
   Data=String(20DF5DA2)
   link(onClick,10366333:doWork2,[(270,346)(270,279)])
  }
  Add(Button,1406744,77,341)
  {
   Left=15
   Top=376
   Width=75
   Caption=""
   Data=String(20DF8D72)
   link(onClick,12804699:doWork2,[(227,347)(227,293)])
  }
  Add(Button,463348,120,338)
  {
   Left=95
   Top=376
   Width=75
   Caption=">"
   Data=String(20DF0DF2)
   link(onClick,10498277:doWork2,[(249,344)(249,328)])
  }
  Add(Button,3934881,249,459)
  {
   Left=175
   Top=398
   Width=75
   Caption="SIMPLINK"
   Data=String(20DF7E81)
   link(onClick,15650034:doWork2,[(313,465)(313,398)])
  }
  Add(Button,13709816,171,460)
  {
   Left=15
   Top=398
   Width=75
   Caption="<<"
   Data=String(20DFF10E)
   link(onClick,5835604:doWork2,[(275,466)(275,412)])
  }
  Add(Button,4342382,123,464)
  {
   Left=95
   Top=398
   Width=75
   Caption=">>"
   Data=String(20DF718E)
   link(onClick,6125946:doWork2,[(251,470)(251,419)])
  }
  Add(Button,14972769,167,421)
  {
   Left=15
   Top=420
   Width=75
   Caption="AD"
   Data=String(20DF8976)
   link(onClick,14984260:doWork2,[(273,427)(273,370)])
  }
  Add(Convertor,1594064,609,28)
  {
   Mode=5
   link(onResult,518370:doString,[])
  }
  Add(HubEx,11062608,301,154)
  {
   Angle=1
   link(onEvent,9107267:doWork1,[])
  }
  Add(HubEx,9107267,301,161)
  {
   Angle=1
   link(onEvent,11826244:doWork1,[])
  }
  Add(HubEx,11826244,301,175)
  {
   Angle=1
   link(onEvent,11292064:doWork1,[])
  }
  Add(HubEx,11292064,301,189)
  {
   Angle=1
   link(onEvent,12117516:doWork1,[])
  }
  Add(HubEx,12117516,301,203)
  {
   Angle=1
   link(onEvent,5976158:doWork1,[])
  }
  Add(HubEx,5976158,301,210)
  {
   Angle=1
   link(onEvent,7472381:doWork1,[])
  }
  Add(HubEx,7472381,301,217)
  {
   Angle=1
   link(onEvent,10690858:doWork1,[])
  }
  Add(HubEx,10690858,301,224)
  {
   Angle=1
   link(onEvent,5359472:doWork1,[])
  }
  Add(HubEx,5359472,301,231)
  {
   Angle=1
   link(onEvent,9442755:doWork1,[])
  }
  Add(HubEx,9442755,301,245)
  {
   Angle=1
   link(onEvent,15970471:doWork1,[])
  }
  Add(HubEx,4634660,301,259)
  {
   Angle=1
   link(onEvent,4225500:doWork1,[])
  }
  Add(HubEx,4225500,301,266)
  {
   Angle=1
   link(onEvent,884633:doWork1,[])
  }
  Add(HubEx,884633,301,273)
  {
   Angle=1
   link(onEvent,5398013:doWork1,[])
  }
  Add(HubEx,5398013,301,280)
  {
   Angle=1
   link(onEvent,7263941:doWork1,[(305,295)(349,295)])
  }
  Add(FormatStr,518370,665,28)
  {
   DataCount=1
   Mask="/irc?volume=%1"
   link(onFString,15059386:onEvent1,[(726,34)(726,27)])
  }
  Add(HubEx,4197217,345,196)
  {
   Angle=1
   link(onEvent,8524756:doWork1,[])
  }
  Add(HubEx,10174689,345,210)
  {
   Angle=1
   link(onEvent,15037656:doWork1,[])
  }
  Add(HubEx,15037656,345,217)
  {
   Angle=1
   link(onEvent,6230764:doWork1,[])
  }
  Add(HubEx,6230764,345,231)
  {
   Angle=1
   link(onEvent,10339715:doWork1,[])
  }
  Add(HubEx,9125029,345,245)
  {
   Angle=1
   link(onEvent,16498150:doWork1,[])
  }
  Add(HubEx,16498150,345,252)
  {
   Angle=1
   link(onEvent,2445281:doWork1,[])
  }
  Add(HubEx,4540256,345,266)
  {
   Angle=1
   link(onEvent,10366333:doWork1,[])
  }
  Add(HubEx,7263941,345,189)
  {
   Angle=1
   link(onEvent,4197217:doWork1,[])
  }
  Add(HubEx,8524756,345,203)
  {
   Angle=1
   link(onEvent,10174689:doWork1,[])
  }
  Add(HubEx,10339715,345,238)
  {
   Angle=1
   link(onEvent,9125029:doWork1,[])
  }
  Add(HubEx,2445281,345,259)
  {
   Angle=1
   link(onEvent,4540256:doWork1,[])
  }
  Add(HubEx,10366333,345,273)
  {
   Angle=1
   link(onEvent,16195284:doWork1,[])
  }
  Add(HubEx,12804699,345,287)
  {
   Angle=1
   link(onEvent,6087144:doWork1,[])
  }
  Add(HubEx,16195284,345,280)
  {
   Angle=1
   link(onEvent,12804699:doWork1,[])
  }
  Add(HubEx,6087144,345,301)
  {
   Angle=1
   link(onEvent,9824463:doWork1,[])
  }
  Add(HubEx,9824463,345,315)
  {
   Angle=1
   link(onEvent,10498277:doWork1,[])
  }
  Add(HubEx,10498277,345,322)
  {
   Angle=1
   link(onEvent,7710006:doWork1,[])
  }
  Add(HubEx,7710006,345,329)
  {
   Angle=1
   link(onEvent,833088:doWork1,[])
  }
  Add(HubEx,833088,345,336)
  {
   Angle=1
   link(onEvent,10671287:doWork1,[])
  }
  Add(HubEx,10671287,345,343)
  {
   Angle=1
   link(onEvent,10906462:doWork1,[])
  }
  Add(HubEx,10906462,345,357)
  {
   Angle=1
   link(onEvent,14984260:doWork1,[])
  }
  Add(HubEx,14984260,345,364)
  {
   Angle=1
   link(onEvent,636662:doWork1,[])
  }
  Add(HubEx,636662,345,378)
  {
   Angle=1
   link(onEvent,16495474:doWork1,[])
  }
  Add(HubEx,16495474,345,385)
  {
   Angle=1
   link(onEvent,15650034:doWork1,[])
  }
  Add(HubEx,15650034,345,392)
  {
   Angle=1
   link(onEvent,10646490:doWork1,[])
  }
  Add(HubEx,10646490,345,399)
  {
   Angle=1
   link(onEvent,5835604:doWork1,[])
  }
  Add(HubEx,5835604,345,406)
  {
   Angle=1
   link(onEvent,6125946:doWork1,[])
  }
  Add(HubEx,6125946,345,413)
  {
   Angle=1
   link(onEvent,1707022:doWork1,[])
  }
  Add(HubEx,1707022,345,420)
  {
   Angle=1
   link(onEvent,4346900:doWork1,[])
  }
  Add(HubEx,4346900,345,434)
  {
   Angle=1
   link(onEvent,13198312:doWork1,[])
  }
  Add(HubEx,13198312,345,441)
  {
   Angle=1
   link(onEvent,3787149:doWork1,[])
  }
  Add(HubEx,3787149,345,455)
  {
   Angle=1
   link(onEvent,10333387:doWork1,[])
  }
  Add(Button,2704989,104,32)
  {
   Left=20
   Top=17
   Width=75
   Caption="( I )"
   Data=String(20DF10EF)
   link(onClick,10333387:doWork2,[(293,38)(293,468)])
  }
  Add(HubEx,15970471,301,252)
  {
   Angle=1
   link(onEvent,4634660:doWork1,[])
  }
  Add(HubEx,10333387,345,462)
  {
   Angle=1
   link(onEvent,1594064:doConvert,[(349,34)])
  }
END_SDK
Add(HubEx,5619053,140,407)
{
 link(onEvent,3613272:doWork3,[(158,413)])
}
Add(Hub,4129826,602,280)
{
 InCount=2
 link(onEvent1,9617473:doOff,[(623,286)(623,370)])
}
Add(Hub,15909423,385,126)
{
 link(onEvent1,9072925:doString,[(413,132)(413,97)])
 link(onEvent2,4129826:doEvent2,[(501,139)(501,293)])
}
Add(Label,4741516,21,364)
{
 Left=30
 Top=35
 Width=60
 Height=17
 Caption="Get запрос"
}
Add(Label,3393693,16,418)
{
 Left=30
 Top=60
 Width=34
 Height=17
 Caption="Ответ"
}

 

Поддержать сайт

esp8266-arduinoide.ru

Беспроводной адаптер для программирования Arduino или AVR с загрузчиком на базе ESP8266

Небольшая заметка о самодельном адаптере на базе ESP8266, позволяющем загрузить прошивку в микроконтроллер с установленным UART загрузчиком или Arduino.
Последнее время при проектировании устройств на микроконтроллерах AVR, для программирования вывожу только один 6-пиновый разъем (не ISP) для FTDI адаптера. Он позволяет и загрузить прошивку, и отладиться по UART после прошивки. Именно так сделано в Arduino, идея позаимствована оттуда. Это удобно.
Тем временем, не раз приходилось сталкиваться с ситуацией, когда нужно загрузить прошивку в микроконтроллер, но он уже в корпусе который не помещается на рабочем месте/лежит на антресоли/в другом городе/замурован в стену. В таких случаях адаптер FTDI не применим из-за короткого USB шнурка и приходилось изворачиваться с ноутбуком. Задумался о беспроводном программаторе. Тут как нельзя лучше подойдет ESP8266, ведь он обладает UART и в любом исполнении имеет хотя бы один GPIO, пригодный для перезагрузки контроллера и входа в режим программирования.

В сети был найден следующий материал по теме:

  1. Programming an Arduino via WiFi with the ESP8266 — модуль типа ESP-01 подключается на проводках к Arduino pro mini, затем для загрузки прошивки используется python скрипт
  2. Programando un Arduino remotamente con el módulo ESP8266 — тут, как я понял, не вдаваясь в подробности, один из GPIO Arduino соединен с RESET. Сначала микроконтроллеру передается команда перезагрузить себя самого, а потом уже начинается загрузка прошивки
  3. ESP8266-transparent-bridge — прошивка для ESP8266 делающая из модуля прозрачный Wi-Fi — UART мост с поддержкой AT команд для управления GPIO2. Автор предлагает нажимать кнопку reset на Arduino, а затем запускать avrdude c параметрами -c avrisp и -P net:x.x.x.x:23, но это позволяют автоматизировать AT. Именно эту прошивку я и взял за основу

Характеристики адаптера следующие:

  • Шести-пиновый разъем c распиновкой как у адаптера FTDI
    Скрытый текст
  • Работа в схемах с напряжением питания микроконтроллера 3.3В или 5В, выбирается джамперами
  • Стабильная работа на скорости до 57600 включительно
  • Перезагрузка микроконтроллера при помощи AT команд для входа в режим программирования

Работоспособность проверялась на китайской Arduino pro mini со стоковым загрузчиком и на ATmega8 c установленным optiboot и скоростях 9600, 19200 и 57600. На скорости по умолчанию (115200) прошиваться контроллер отказался.

Для тех, кто не хочет паять и делать плату

В случае применения в схемах с питанием 3.3В достаточно просто присоединить модуль в исполнение esp-01 к Arduino проводками (VCC—>VCC, GND—>GND, RX—>TX, TX—>RX, GPIO2—>DTR). Плата сделана для удобства подключения и возможности работы в схемах с напряжением питания микроконтроллера 5В.

Принципиальная схема и печатная плата


Применяется модули типа esp-02, но подойдет и распространенный esp-01, только плату перетрассировать нужно будет слегка. Джамперами выбирается режим работы 3.3/5В. U1 — стабилизатор преобразующий 5В в 3.3В в случае необходимости. R2 и R3 — делитель, тоже для 5В режима. После сборки нужно установить джампер RPOG и при помощи того же FTDI или любого другого UART адаптера загрузить ESP8266-transparent-bridge.
Шаблон односторонней печатной платы (SVG вектор):

Если нужен негатив достаточно открыть текстовым редактором и заменить #000000 на #FFFFFF и наоборот.
В формате KiCad на github

Прошивка микроконтроллера

Обычно, чтобы загрузить прошивку следует перезагрузить микроконтроллер. FTDI адаптер делает это импульсом на ноге DTR (первая в разъеме), она через емкость соединена с ногой RESET микроконтроллера. В нашем случае на место DTR выведена GPIO2 (см. UPD). Для перезагрузки микроконтроллера используются AT команды «+++AT GPIO2 1» и затем «+++AT GPIO2 0», которые меняют уровень на GPIO2 ESP8266. Одного перепада достаточно, чтобы перезагрузить контроллер. Сразу после перезагрузки некоторое время работает загрузчик и ждет образ прошивки по UART, его можно передать с помощью утилиты avrdude. Ниже приведен скрипт выполнение которого прошивает контроллер:

#!/bin/bash

HEXILE="firmware.hex"
ADDRESS=x.x.x.x
BAUD=57600

echo "+++AT BAUD $BAUD" | nc $(ADDRESS) 23
echo "+++AT GPIO2 1" | nc $(ADDRESS) 23
echo "+++AT GPIO2 0" | nc $(ADDRESS) 23
avrdude -P net:$(ADDRESS):23 -F -U flash:w:$(HEXILE):i

Данные команды можно включить в Makefile.
Беспроводную прошивку можно провернуть и в Windows, установив утилиты nc и avrdude.

Видео, демонстрирующее работу на примере китайской Arduino pro mini

UPD:
sav13 предложил в качестве прошивки для ESP8266 использовать esp-link, она совместима с текущей схемой адаптера. Данная прошивка имеет ряд преимуществ по сравнению с ESP8266-transparent-bridge, в т.ч. WEB интерфейс для конфигурации, нет необходимости использовать AT команды, дополнительный функционал, более подробно тут.

habr.com

Программирование ESP8266 с помощью FLPROG – FLProg

Доброго времени суток Уважаемые коллеги Хочу поделится с Вами своими опытами проектирования и загрузки проектов в ESP8266 с помощью FLPROG. Создал вот такой пример и загрузил в ESP8266 напрямую через Ардуино IDE. Все делается легко и просто как мы привыкли загружать скетчи в ардуино. Точно так же мы выберем ESP8266 смотря
какая плата у Вас и нажимаем загрузить и вуаля радуемся достигнутому результату.
Но прежде чем начать радоваться нужно будет  загрузить библиотеку которая весит
примерно 160Мб для этого делаем не хитрые манипуляции:
1.Войти  в
настройки Arduino IDE;
2.В поле Дополнительные ссылки для Менеджера плат пишем такую
ссылку:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
3.Жмем ОК и переходим в окно менеджера плат;
4.В строке поиска менеджера плат пишем «esp».
5.В самом низу будет нужный нам пакет «esp8266 by ESP8266
Community». Выбираем, затем выберем последнею   и жмем
кнопку
«Установка».
Это схема подключения моргания 10ю выходами при нажатии на пин1 он же GPIO1.

СХЕМА СБОРКИ ПРОГРАММАТОРА

 

РАСПИНОВКА esp8266-node-mcu

ТАБЛИЦА СООТВЕТСТВИЯ ESP8266 К АРДУИНО.

Теперь осталось дождаться когда автор программы “FLPROG” Много уважаемый Сергей Глушенко  добавит  ESP8266  в список контроллеров для выбора и использования в будущих проектах, а так же хотелось бы что бы у него хватило терпения и сил довести до конца, версию 2.5.1 управление веб страницей.
Желаю Всем Удачи!

Автор Sher2104

Publication author

359

Comments: 11Publics: 307Registration: 04-02-2018

flprog.ru

Макетирование и программирование платы ESP-01 с помощью Arduino IDE

Добавлено 18 августа 2017 в 19:48

Сохранить или поделиться

ESP8266 – микроконтроллер / микросхема с модулем Wi-Fi

Новый микроконтроллер привлек внимание профессиональных разработчиков и любителей, и он может стать потенциальным лидером в интернете вещей. Микросхема под названием «ESP8266» представляет собой 32-битный RISC процессор со всеми свистелками и перделками, которые вы могли бы ожидать от полнофункционального микроконтроллера, но это еще не всё. ESP8266 также включает в себя встроенную схему Wi-Fi 802.11 b/g/n, которая готова к непосредственному подключению к антенне.

Микроконтроллер ESP8266

ESP8266 в настоящее время доступен только в 32-выводном корпусе QFN, в данном семействе присутствует только одна микросхема. Разработчик, Espressif, Шанхай, Китай, решил в полной мере использовать эффективность масштабного производства и предложить одну микросхему, которая подходит для использования в различных сборках печатных плат. В настоящее время существует более десятка печатных плат модулей ESP, которые отличаются в основном типом антенн и количеством доступных входов/выходов. Из-за QFN корпуса ESP8266, большинство любителей довольны этим решением, тем более, что рыночные цены начинаются с менее 5 долларов США за модель младшего класса, получившей название ESP-01 и изображенной ниже.

Модуль ESP-01 (вид сверху и снизу)

Для ESP8266 существует форум поддержки очень активного сообщества, который является отличным источником идей и информации. Первоначально документация была доступна только на китайском языке, а информацию по прошивкам до сих пор бывает трудно найти. В настоящее время многие DIY проекты работают в режиме «проб и ошибок», но есть много поставщиков, которые продают платформы разработки и другие аксессуары. Однако, как вы увидите ниже в этой статье, запустить ESP8266 на макетной плате совсем не трудно.

Варианты программирования

От поставщика многие (возможно, все) модули ESP8266 загружаются с прошивкой «AT» и могут программироваться через простую программу консоли. Если вы используете модуль в первую очередь для использования его Wi-Fi возможностей и управления им с помощью другого микроконтроллера, это может быть всё, что вам нужно.

Более сложный вариант доступен от NodeLua, который предлагает прошивку с открытым исходным кодом на основе языка программирования Lua. NodeLua всё еще находится в разработке, но уже содержит обширные возможности. Другие варианты включают в себя Python, BASIC и Arduino IDE, которая представлена в данной статье.

Входы и выходы ESP-01

Модуль ESP-01 содержит микроконтроллер ESP8266 и чип флэш-памяти. На нем также есть два светодиода: красный (указывает наличие питания) и синий (указывает на наличие потока данных и может также управляться программно пользователем). Wi-Fi антенна – это дорожка на печатной плате на верхней части модуля; она носит название MIFA-антенна (Meandered Inverted-F Antenna), и, на удивление, она эффективна и только слегка направлена.

Расположение выводов модуля ESP-01

В нижней части модуля находятся восемь контактов; на рисунке выше указан их функционал. Обычно на задней части модуля установлены два 4-пиновых разъема, которые припаяны сверху. Это делает входы/выходы доступными, но не очень подходящими для макетной платы, и требует перемычек между ESP-01 и макетной платой. Альтернативный способ размещения разъемов показан ниже.

Размещение разъемов модуля ESP-01

Разъем на передней части печатной платы использует стандартные прямоугольные выводы без каких-либо изменений. Разъем на задней части использует удлиненные выводы, которые были согнуты под прямым углом, чтобы выдержать корректное расстояние между рядами разъемов. Этот способ позволяет вставлять ESP-01 в беспаечную макетную плату в вертикальном положении над центральным зазором платы и делает все восемь контактов независимыми.

Собираем всё вместе

На приведенной ниже схеме показаны соединения, необходимые для ESP-01, а на фотографиях показан завершенный макет на беспаечной макетной плате. Цвета проводов на схеме соответствуют цветам проводов на фотографиях.

Соберите макет, как показано на рисунке, но не подключайте кабель USB-TTL конвертера к компьютеру, пока не установите перемычку на плате конвертера в положение 3,3В, и дважды перепроверьте правильность всех соединений. Использование 5В для питания ESP-01 может вывести модуль из строя, после чего тот не будет подлежать ремонту.

Более надежная схема прошивки приведена в этой статье.

Схема подключения модуля ESP-01 к компьютеруМакет подключения модуля ESP-01 к компьютеру (вид сверху)Макет подключения модуля ESP-01 к компьютеру (вид спереди)Макет подключения модуля ESP-01 к компьютеру (вид сзади)

Для сборки макета вам может понадобиться дополнительная информация:

  • USB-TTL конвертер, показанный на фотографиях, использует UART микросхему FTDI232 и хорошо работает с операционными системами Windows, Mac и Linux. Он также предоставляет напряжение 3,3В для питания ESP-01. Убедитесь, что перемычка на печатной плате преобразователя установлена в положение 3,3В; что обеспечит как напряжение питания 3,3В, так и правильное напряжение на линии TxD. Использование более высокого напряжения может повредить ESP-01.
  • Независимо от того, какой USB-TTL конвертер вы решите использовать, он должен быть проверен перед использованием с ESP-01. Драйвера устройств на FTDI можно найти на сайте FTDI.
  • Величина тока, необходимого для ESP-01 во время работы Wi-Fi, варьируется от 250 мА до 750 мА. Ток, поставляемый USB-TTL преобразователем, должен быть достаточным для программирования ESP-01, но может оказаться недостаточным для длительного использования. Лучшим выбором является стабилизированный источник постоянного напряжения 3,3В, рассчитанный на ток 1 А и выше.
  • Выводы DTR и CTS USB-TTL конвертера остаются неподключенными.
  • Два коммутатора на схеме – это нормально разомкнутые однополюсные кнопки.
  • Одним из расхождений в доступных источниках информации об ESP-01 является то, должен ли CH_PD быть подключен к +3,3В напрямую или через подтягивающий резистор 10 кОм. Автор протестировал оба способа, и оба они работают. После того, как вы собрали и проверили схему, как показано здесь (с CH_PD, подключенным к +3,3В напрямую), попробуйте использовать подключение через резистор 10 кОм. Если схема работает с подтягивающим резистором 10 кОм, то оставьте его в схеме.

Как видите на приведенных выше фотографиях, использование свободных проводов от USB-TTL конвертера не оптимально. Лучшим вариантом является замена шести загнутых выводов разъема конвертера на шесть прямых выводов на нижней части печатной платы. Эта модификация позволит устанавливать преобразователь USB-TTL непосредственно в беспаечную макетную плату, что приведет к значительно более аккуратной и менее хрупкой сборке макета, как показано на фотографии ниже.

Альтернативная сборка макета подключения ESP-01 к компьютеру

Включение питания

Перед подключением USB-TTL конвертера к компьютеру убедитесь, что перемычка выбора напряжения находится в положении 3,3В, и что все провода в макете установлены правильно и надежно. Затем подключите USB кабель; красный светодиод на ESP-01 должен загореться и продолжать гореть, а синий светодиод должен мигать каждый раз, когда между ESP-01 и компьютером происходит обмен данными. Затем проверьте кнопку сброса, нажав и удерживая ее. Посмотрите на ESP-01, когда вы отпустите кнопку, синий светодиод должен мигнуть два раза. Если всё прошло хорошо, отключите схему от компьютера и перейдите к следующему разделу.

Arduino IDE

Для использования совместно с ESP8266 рекомендуется использовать Arduino IDE версии 1.6.5. Если у вас более ранняя версия, то можете попробовать и её или обновить IDE до версии 1.6.5.

  • Как только у вас будет установлена подходящая версия Arduino IDE, запустите программу, перейдите в меню File (Файл) → Preferences (Настройки) и найдите в диалоговом окне поле ввода Additional Board Manager URLs (Дополнительные ссылки для Менеджера плат). Введите следующий URL точно, как он написан, и нажмите OK:

    • http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Затем нажмите Tools (Инструменты) → Board Manager (Менеджер плат) и прокрутите список вниз, чтобы найти «esp8266 by ESP8266 Community«. Выберите эту запись и нажмите кнопку Install (Установка); загрузка и установка начнутся и будут продолжаться несколько минут. Пока дополнение устанавливается, взгляните на поддерживаемые платформы. В дополнение к базовому модулю ESP826 обеспечивается поддержка NodeMCU, Huzzah и SweetPea. К тому моменту, когда вы будете читать данную статью, этот список возможно расширится.
  • Когда установка закончится, нажмите кнопку Close (Закрыть).
  • Теперь нажмите Tools (Инструменты), перейдите в список плат и выберите «Generic ESP8266 Module«.
  • Снова нажмите Tools (Инструменты) и убедитесь, что выбран Generic ESP8266 Module.
  • Нажмите File (Файл), Examples (Примеры) и прокрутите список вниз, пока не дойдете до ESP8266WiFi, а затем выберите WiFiScan. После этого должно будет открыться новое окно IDE со кодом примера WiFiScan.

Снова подключите схему к компьютеру и убедитесь, что на ESP-01 горит красный светодиод. Нажмите Tools (Инструменты), Port (Порт) и выберите порт, к которому подключен ESP-01. Наконец, вы готовы запрограммировать ESP-01.

Нажмите и удерживайте кнопку Reset, а затем нажмите и удерживайте кнопку Flash. Отпустите кнопку Reset и, удерживая нажатой кнопку Flash, нажмите кнопку со стрелкой Загрузка в Arduino IDE. Скетч должен скомпилироваться и загрузиться примерно за минуту, и когда компилирование будет завершено, отпустите кнопку Flash. Скомпилированный код будет отправлен в ESP-01; когда отправка будет завершена, на ESP-01 замигает синий светодиод.

Чтобы посмотреть результаты всех этих нажатий и выбираний, нажмите Tools (Инструменты), Serial Monitor (Монитор порта) и установите скорость передачи в правом нижнем углу окна монитора порта на 115200. Если у вас более ранняя версия ESP-01 (возможно на синей печатной плате), скорость передачи данных, скорее всего, равна 9600.

ESP-01 должен сканировать Wi-Fi сети и сообщать о результатах в окне монитора порта, как показано на примере ниже.

Результаты сканирования Wi-Fi сетей модулем ESP-01

Среди сообщений вы должны увидеть свою собственную сеть и все остальные сети, которые сумел поймать ESP-01. Числа в скобках показывают уровень сигнала сети (обратите внимание, что эти числа отрицательные; следовательно, уровень сигнала -41 выше, чем -92).

Двери открыты

Возможность программирования ESP8266 с использованием Arduino IDE значительно расширяет базу пользователей этих чипов с поддержкой Wi-Fi. ESP-01 и его более крупные собратья предоставляют чрезвычайно эффективную аппаратную платформу за низкую цену. Добавьте простоту использования Arduino IDE, и разработка приложения для интернета вещей станет доступной практически любому человеку.

Оригинал статьи:

Сохранить или поделиться

radioprog.ru

alexxlab

Отправить ответ

avatar
  Подписаться  
Уведомление о