Часть 1

Последовательный WIFI модуль для Arduino

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

ESP8266 – это, наверное, самый универсальный модуль с последовательным интерфейсом для соединения различных физических предметов («вещей») с интернетом, поэтому он так популярен в сфере «Интернета вещей». Это законченный модуль, который состоит из микропроцессора, доступного для программирования напрямую через ArduinoIDE (C++), или в любой другой среде программирования (обычно используется язык высокого уровня “LUA”).

Для управления «вещами» не нужна сама плата Arduino в качестве интерфейса, потому что ESP8266 уже имеет 2 GPIO (Интерфейс ввода/вывода общего назначения). Множество дополнительной важной информации вы сможете найти на форуме, посвященном ESP8266.

Характеристики:

  • 802.11 b / g / n
  • Wi-FiDirect (P2P), программная точка доступа soft-AP
  • Интегрированный стек протоколов TCP / IP
  • Интегрированный TR свитч, балун, LNA, усилитель мощности и согласующая сеть (matchingnetwork)
  • Интегрированные PLL, регуляторы, DCXO и системы управления мощностью
  • + 19.5 дБ выходная мощность в режиме 802.11b
  • Отключение при превышении утечки тока <10uA
  • 1MB флэш память
  • Интегрированный 32-битный центральный процессор с низким энергопотреблением, может быть использован как процессор приложений
  • SDIO 1.1 / 2.0, SPI, UART STBC, 1 × 1 MIMO, MIMO 2 × 1
  • A-MPDU и A-MSDU агрегирование, 0.4 мс пустой промежуток
  • Wakeup пакеты и передача <2мс
  • Потребление энергии в режиме ожидания <1.0мВт (DTIM3)

Вышеуказанные данные включают в себя много технической информации, которая вам не понадобится в большинстве ваших проектов, однако лучше, чтобы она была под рукой, на всякий случай.

До сих пор я изучал только ESP8266 в соединении с Arduino, заменяя необходимость в более дорогих WiFi шилдах. (Шилд – это печатная плата, которую вы устанавливаете на Arduino для увеличения его функциональности).

Шаг 1: ESP 8266 характеристики и пины



Итак, сначала необходимо протестировать модуль AT командами, которые являются стандартными. Как правило, модуль поставляется от производителя с установленными настройками скорости передачи данных в 115200 бодов. Иногда это создает неудобства, например, в случае с ArduinoUNO, только однажды HWSerial “0” (пины 0 и 1) мог работать на такой скорости. Проблема в том, что программа SerialMonitor для PC также использует этот последовательный порт. («PC» используется здесь как усредненный термин, надеюсь, мой Macне слышит меня;) Решение для ArduinoUNO нашлось в виде использования библиотеки "SoftwareSerial", чтобы заставить два других универсальных пина (GPIO) работать в режиме последовательного порта (SW). Это хорошо работает тогда, когда скорость передачи данных не превышает 19200 бодов. Отлично! Но что делать, если ESP8266 изначально запрограммирован на работу с более высокой скоростью? Решением может быть перепрограммирование. Но не все прошивки, которые загружены в устройство на заводе, поддерживают перепрограммирование модуля. Таким образом, сначала нужно обновить прошивку. В некоторых постах в интернете описывается, как это сделать. Я не буду загружать вас перепрошивкой, скоростью и т.д., для упрощения процесса будет использована плата ArduinoMEGA, на которой есть 4 аппаратных последовательных порта (4 HWserialports) .

Порты на плате MEGA:

  • TX0 / RX0 ==> Pin 1, 0 (то же, что UNO) ==> "Serial 0"
  • TX1 / RX1 ==> Pin 18, 19 ==> "Serial1"
  • TX2 / RX2 ==> Pin 16, 17 ==> "Serial2"
  • TX3 / RX3 ==> Pin 14, 15 ==> "Serial3"

Для моих тестов я буду использовать последовательный порт 2 (Serial 2) (пины 16 и 17).

Давайте подробнее рассмотрим модуль:

  • Питание: 3.3 В. Это важно, т.к. модуль не работает с напряжением в 5 В, и может сгореть. Входные пины также не поддерживают напряжение 5 В, поэтому при получении сигнала Arduino важно использовать конвертер уровня напряжения (как раньше их называли «делитель напряжения»). Другая важная вещь – это иметь независимый источник питания на 3.3 В, т.к. не всегда Arduino выдает требуемый ток для корректной работы модуля.
  • Модуль имеет 6 пинов:
    • TX: он будет подсоединен к RX2 на плате MEGA (может быть соединен напрямую, т.к. MEGA интерпретирует 3.3 В как HIGH)
    • RX: TX2 подсоединен к MEGA через конвертер уровня напряжения
    • VCC: 3.3В
    • GND: Земля. Важно помнить, что необходимо подсоединять GND платы ESP8266 к GND на плате MEGA.
    • CH_PD (*) : подсоединен к пину 4 последовательного порта на плате MEGA, сброс для начала обмена данными
    • RST: Сброс, обычно подсоединяется к VCC
    • GPIO0: свободно (Интерфейс ввода/вывода общего назначения)
    • GPIO2: свободно (Интерфейс ввода/вывода общего назначения)

(*)На некоторых сайтах в интернете показано, что этот пин напрямую подсоединен к VCC. В моем случае без «сброса» по последовательному порту SW (устанавливает пин в значение LOW) ESP8266 не работает.

Продаются адаптеры для включения модуля в макетную плату, т.к. физически расстояние между пинами ESP8266 не совпадает с отверстиями на макетной плате. Для соединения я использовал обычный кабель «мама/папа» типа FTDI (см. ниже). Цвета совпадают с диаграммой соединений.

Шаг 2: Цепь, которая будет использована в тестах

Ничего особенного в диаграмме аппаратных последовательных соединений (HW). Красная пластина – это независимый источник питания 3.3 В, смонтированный на макетной плате. Обратите внимание, что желтый провод соединен с TX2 на Arduino, проходит через делитель напряжения (1K и 2.2K резисторы), таким образом TX2 – это HIGH (5В), ESP8266 получает примерно 3.3В (для него это HIGH).

Шаг 3: Тестирование ESP8266 с помощью AT-команд

Идея этого скетча состоит в тестировании и настройке модуля, который позволяет вводить AT-команды и видеть вывод в программе SerialMonitor.

В части «комментарии» перечислены основные AT-команды. В начале загрузки программы после имени модуля вы увидите много ненужного для нас текста в окне SerialMonitor, затем слово «ready». С этого момента вы можете вводить AT-команды.

Начните с простого «АТ», модуль должен ответить «ОК», протестируйте другие команды.

Картинка показывает, что должно появляться в окне SerialMonitor после того, как вы ввели различные команды.

  • AT для тестовых примеров:
    • AT =====> ESP8266 возвращает OK
    • AT + RST =====> ESP8266 рестарт и возврат OK
    • AT + GMR =====> ESP8266 возвращает версию AT; SDK version; id; OK
    • AT + CWMODE? => ESP8266 возвращает режим работы
    • AT + CWLAP ===> ESP8266 возвращает обнаруженные точки доступа
    • AT + CIFSR ===> ESP8266 возвращает установленный IP
    • AT + CIPMUX = 1 ==> Устанавливает плате ESP8266 режим работы с несколькими соединениями
    • AT + CIOBAUD = 9600 ==> Изменить скорость обмена данными ==> ESP8266 возвращает OK
    • AT + CIPSERVER = 1.80 ==> Устанавливает режим SERVER порт: 4040
    • AT + CWMODE = 3 ==> Работа ESP8266 в комбинированном режиме (точка доступа (2) и сервер (1))
    • AT + CWSAP = "Acc_Point_name", "password", wifi_Channel, cript # ==> j.
    • AT + CWSAP = "ESP_8266_AP," 1234 ", 3.0
    • AT + CWJAP = "SSID", "password" ==> Подключается к сети WiFi
    • * = AT + CWJAP "ROVAI TIMECAP", "-1 mjr747"

****************************************************************** /

С модулем Wi-Fi.

На Arduino Uno WiFi предусмотрено всё для удобной работы с микроконтроллером: 14 цифровых входов/выходов (6 из них могут использоваться в качестве ШИМ-выходов), 6 аналоговых входов, разъём USB, разъём питания, разъём для внутрисхемного программирования (ICSP) и кнопка сброса микроконтроллера.

Изюминка платы - модуль WiFi ESP8266, который позволяет Arduino обмениваться информацией с другими модулями по беспроводным сетям стандартов 802.11 b/g/n.

ESP8266 позволяет прошивать плату Arduino без использование USB-шнура в режиме OTA (Firmware Over The Air - «микропрограммы по воздуху»).

Видеообзор платы

Подключение и настройка

Для начало работы с платой Arduino Uno WiFi в операционной системе Windows скачайте и установите на компьютер интегрированную среду разработки Arduino - Arduino IDE.

Что-то пошло не так?

Настройка модуля WiFi

Прошивка Arduino по WiFi

Arduino Uno WiFi имеет в своём запасе ещё один приятный бонус - возможность загружать скетчи без использование USB-шнура в режиме OTA (Firmware Over The Air). Рассмотрим подробнее как это сделать.


Для этого необходимо войти в меню: Инструменты Порт и выбирать нужный порт.

Так как мы прошиваем Arduino по WiFi, плата определиться как удалённое устройство с IP-адресом

Среда настроена, плата подключена. Можно переходить к загрузке скетча. Arduino IDE содержит большой список готовых примеров, в которых можно подсмотреть решение какой-либо задачи. Выберем среди примеров мигание светодиодом - скетч «Blink».
Прошейте плату нажав на иконку загрузки программы.
После загрузки светодиод начнёт мигать раз в секунду. Это значит, что всё получилось.

Теперь можно переходить к примерам использования .

Примеры использования

Web-сервер

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

web-server.ino /* Пример простого web-сервера, работающего на Arduino Uno WiFi. Сервер показывает значения на аналоговых входах и обновляет информацию каждые две секунды. Обратитесь к серверу по адресу http:///arduino/webserver/ Обратите внимание: пример работает только с Arduino Uno WiFi Developer Edition. */ #include #include void setup() { Wifi.begin () ; Wifi.println ("Web Server is up" ) ; // Выводим сообщение о старте сервера в wifi-консоль } void loop() { while (Wifi.available () ) { process(Wifi) ; } delay(50 ) ; } void process(WifiData client) { String command = client.readStringUntil ("/" ) ; if (command == "webserver" ) { WebServer(client) ; } } void WebServer(WifiData client) { client.println ("HTTP/1.1 200 OK" ) ; client.println ("Content-Type: text/html" ) ; client.println ("Connection: close" ) ; client.println ("Refresh: 2" ) ; // Заголовок, который задаёт период обновления страницы в секундах client.println () ; client.println ("" ) ; // Формируем страницу client.println (" UNO WIFI Web-server " ) ; client.print ("

Пример вывода значений с аналоговых пинов

"
) ; client.print ("
    " ) ; for (int analogChannel = 0 ; analogChannel < 4 ; analogChannel++ ) { int sensorReading = analogRead(analogChannel) ; client.print ("
  • на аналоговом входе " ) ; client.print (analogChannel) ; client.print (": " ) ; client.print (sensorReading) ; client.print ("
  • " ) ; } client.println ("
" ) ; client.print (DELIMITER) ; // Не забудьте закрыть соединение! }

Элементы платы

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

Сердцем платформы Arduino Uno WiFi является 8-битный микроконтроллер семейства AVR - ATmega328P.

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

Микроконтроллер ATmega16U2 обеспечивает связь микроконтроллера ATmega328P с USB-портом компьютера. При подключении к ПК Arduino Uno WiFi определяется как виртуальный COM-порт. Прошивка микросхемы 16U2 использует стандартные драйвера USB-COM, поэтому установка внешних драйверов не требуется.

Пины питания

    VIN: Напряжение от внешнего источника питания (не связано с 5 В от USB или другим стабилизированным напряжением). Через этот вывод можно как подавать внешнее питание, так и потреблять ток, если к устройству подключён внешний адаптер.

    5V: На вывод поступает напряжение 5 В от стабилизатора платы. Данный стабилизатор обеспечивает питание микроконтроллера ATmega328. Запитывать устройство через вывод 5V не рекомендуется - в этом случае не используется стабилизатор напряжения, что может привести к выходу платы из строя.

    3.3V: 3,3 В от стабилизатора платы. Максимальный ток вывода - 1 А.

    GND: Выводы земли.

    IOREF: Вывод предоставляет платам расширения информацию о рабочем напряжении микроконтроллера. В зависимости от напряжения, плата расширения может переключиться на соответствующий источник питания либо задействовать преобразователи уровней, что позволит ей работать как с 5 В, так и с 3,3 В устройствами.

Порты ввода/вывода

    Цифровые входы/выходы: пины 0 – 13
    Логический уровень единицы - 5 В, нуля - 0 В. Максимальный ток выхода - 40 мА. К контактам подключены подтягивающие резисторы, которые по умолчанию выключены, но могут быть включены программно.

    ШИМ: пины 3 , 5 , 6 , 9 , 10 и 11
    Позволяют выводить 8-битные аналоговые значения в виде ШИМ-сигнала.

    АЦП: пины A0 – A5
    6 аналоговых входов, каждый из которых может представить аналоговое напряжение в виде 10-битного числа (1024 значений). Разрядность АЦП - 10 бит.

    TWI/I²C: пины SDA и SCL
    Для общения с периферией по синхронному протоколу, через 2 провода. Для работы - используйте библиотеку Wire .

    SPI: пины 10(SS) , 11(MOSI) , 12(MISO) , 13(SCK) .
    Через эти пины осуществляется связь по интерфейсу SPI. Для работы - используйте библиотеку SPI .

    UART: пины 0(RX) и 1(TX)
    Эти выводы соединены с соответствующими выводами микроконтроллера ATmega16U2, выполняющей роль преобразователя USB-UART. Используется для коммуникации платы Arduino с компьютером или другими устройствами через класс Serial .

Светодиодная индикация

Разъём USB Type-B

Разъём USB Type-B предназначен для прошивки платформы Arduino Uno WiFi с помощью компьютера.

Разъём для внешнего питания

Разъём для подключения внешнего питания от 7 В до 12 В.

Регулятор напряжения 5 В

Когда плата подключена к внешнему источнику питания, напряжение проходит через стабилизатор MPM3610 . Выход стабилизатора соединён с пином 5V . Максимальный выходной ток составляет 1 А.

Регулятор напряжения 3,3 В

Стабилизатор MPM3810GQB-33 с выходом 3,3 вольта. Обеспечивает питание модуля WiFi ESP8266 и выведен на пин 3,3V . Максимальный выходной ток составляет 1 А.

ICSP-разъём для ATmega328P

ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega328P. С использованием библиотеки SPI данные выводы могут осуществлять связь с платами расширения по интерфейсу SPI. Линии SPI выведены на 6-контактный разъём, а также продублированы на цифровых пинах 10(SS) , 11(MOSI) , 12(MISO) и 13(SCK) .

ICSP-разъём для ATmega16U2

ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega16U2.

В этой статье вы узнаете, как создать систему, которая может включать и выключать нагрузки постоянного тока с помощью мобильного приложения. Вы также узнаете, как выполнить эту задачу мгновенно или по таймерам, заранее установленным для включения и выключения нагрузок.

Обзор проекта

Вы можете реализовать эту систему там, где вам нужно включать нагрузку постоянного тока на определенное время. В этом вам поможет наше Android приложение, не требуя аппаратного интерфейса, клавиатуры и LCD дисплея.

Комплектующие

Сборка макетной платы ESP8266

ESP8266 - недорогой SoC-чип со встроенным микроконтроллером и полным стеком протоколов TCP/IP, что означает, что он может напрямую обращаться к вашей Wi-Fi сети.

Поскольку у этого чипа есть свой микроконтроллер, вы можете поместить в него код своего приложения или можете использовать модуль просто как Wi-Fi приемопередатчик, что мы и собираемся сделать в данном проекте. Более эффективно было бы использовать этот модуль и как приемопередатчик, и как контроллер, но в целях обучения мы будем взаимодействовать с модулем, используя Arduino.

Чип ESP8266 поставляется в разных модулях. Мы будем использовать модуль ESP-01. Конечно, вы можете использовать любой другой модуль.

Во-первых, вы должны знать, что модуль работает с напряжением 3,3 В, и напряжение высокого логического уровня от Arduino должно быть таким же, чтобы не повредить наш модуль. Для этого требуется преобразователь уровня напряжения между платой Arduino (которая работает на 5 В) и модулем. Хорошей новостью является то, что в преобразователе будет нуждаться только вывод для передачи на Arduino, поскольку приемный вывод обычно распознает логические сигналы с напряжением 3,3 В от ESP8266.

Одним из простейших способов выполнения этого преобразования является схема от Sparkfun. Вы можете заказать готовый модуль .

Преобразователь уровня 5В → 3,3В

На рисунке ниже показана распиновка нашего модуля на ESP8266:

Вывод Назначение
UTXD Передача данных через UART
URXD Прием данных через UART. Выход, к которому он подключается, должен быть 3,3 В.
CH_PD Выключение: низкий уровень на входе выключает чип, высокий уровень на входе включает его; для нормальной работы модуля необходимо подтянуть его к линии питания.
GPIO0 При загрузке: должен быть высокий уровень, чтобы входить в нормальный режим загрузки; низкий уровень вводит в специальные режимы загрузки.
GPIO2 При загрузке: низкий уровень заставляет загрузчик войти в режим загрузки флеш-памяти; высокий уровень вызывает нормальный режим загрузки.
RST Сброс; активный уровень - низкий.
GND Земля.
VCC Питание/3,3В.

Я использовал LM317, настраиваемый линейный регулятор напряжения с выходным током до 1,5 А, для обеспечения модуля подходящим источником питания 3,3 В.

Примечание: Не используйте вывод 3,3 В от Arduino, так как стабилизатор напряжения 3,3 В на плате Arduino не может обеспечить необходимую для модуля величину тока, особенно при пиковом потреблении энергии во время передачи.

Я использовал BS170 (вместо BSS138) для преобразователя логических уровней; оба работают хорошо.

Теперь вы можете подключить свой модуль к компьютеру, используя USB-TTL преобразователь, и испытать его.

Сборка макетной платы реле

Для управления реле я использовал биполярный NPN транзистор BC337 с резистором 1 кОм на базе. Для защиты от обратного напряжения катушки я использовал диод 1n4007.

Нормально замкнутый (NC) контакт реле я решил подключить к земле.

Код Arduino

Теперь мы сталкиваемся с проблемой. ESP8266 использует UART в качестве интерфейса для AT-команд, а Arduino Uno (которая использует Atmega328) имеет только один порт UART. Этот порт уже подключен к мосту USB-TTL, а также к выводам 0 и 1.

В качестве решения вы можете использовать эмулятор для UART порта на другом цифровом выводе Arduino с помощью библиотек AltSoftSerial или SoftwareSerial. Это позволит вам по-прежнему иметь аппаратный порт UART для отладки и печати сообщений в консоли, а программный порт - для связи с модулем.

Многие люди (включая меня) сообщают о проблемах с программным последовательным портом при высоких скоростях передачи - как на тех, что мы будем использовать с esp8266, 115200 бит/с. Я могу сказать, что у вас 50% принятых от модуля данных будет повреждено, если вы используете программный UART, а из переданных от Arduino к модулю данных почти 100% будет корректно. Я получил эти результаты после отслеживания сигналов на линиях RX и TX.

В качестве решения я добавил в код несколько директив define , чтобы облегчить вам выбор между аппаратным и программным UART портами. Имейте в виду, что вы не можете использовать один и тот же порт для отладки и общения с модулем, поэтому вам нужно выбирать между ними.

//раскомментируйте Serial.*** , если хотите для связи с ESP использовать аппаратный последовательный порт (выводы 0,1) //раскомментируйте esp8266.*** , если хотите для связи с ESP использовать программный последовательный порт (выводы 2,3) #define esp8266_Available() Serial.available() //esp8266.available() #define esp8266_Find(ARG) Serial.find(ARG) //esp8266.find(ARG) #define esp8266_Read() Serial.read() //esp8266.read() #define esp8266_Write(ARG1,ARG2) Serial.write(ARG1,ARG2) //esp8266.write(ARG1,ARG2) #define esp8266_Print(ARG) Serial.print(ARG) //esp8266.print(ARG)

В исходнике вы найдете часть кода, которая устанавливает модуля с вашим роутером:

SendCommand("AT+RST\r\n", 2000, DEBUG); // перезапустить модуль sendCommand("AT+CWMODE=1\r\n", 1000, DEBUG); // настроить как точку доступа sendCommand("AT+CWJAP=\"tur\",\"341983#tur\"\r\n", 3000, DEBUG); //**** ИЗМЕНИТЬ SSID и ПАРОЛЬ В СООТВЕТСТВИИ С ВАШЕЙ СЕТЬЮ ******// delay(10000); sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // получить ip адрес sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); // настроить для нескольких соединений sendCommand("AT+CIPSERVER=1,1337\r\n", 1000, DEBUG); // включить сервер на порту 1337

Цикл скетча ожидает команды, которые должны прийти через Wi-Fi соединение. В настоящее время поддерживаются следующие команды:

  • ‘con’ для получения состояния выводов, высокий или низкий логический уровень;
  • ‘on=’ включить соответствующий вывод;
  • ‘of=’ выключить соответствующий вывод;
  • ‘Tm=n/fS’ установить таймер включения (n) или выключения (f) соответствующего вывода.

Все команды имеют отклик подтверждения.

Примечания:

  • некоторые части скетча основаны на ;
  • если вы используете модули со старым SDK, у вас могут быть такие же ошибки, как и у меня. Единственным решением в этом случае является обновление вашей прошивки до последней версии. Посмотрите , для получения помощи в обновлении прошивки модуля на ESP8266. Я обновил прошивку с версии 1.3 до 1.5.4.

Полный код программы:

#include #define DEBUG 0 // если вы для связи с ESP используете аппаратный последовательный порт, измените значение на 0 #define ESPBaudRate 115200 #define HWSBaudRate 115200 #define OUTPUT1 11 #define OUTPUT2 12 #define OUTPUT3 13 //раскомментируйте Serial.*** , если для связи с ESP хотите использовать аппаратный последовательный порт (выводы 0,1) //раскомментируйте esp8266.*** , если для связи с ESP хотите использовать программный последовательный порт (выводы 2,3) #define esp8266_Available() Serial.available() //esp8266.available() #define esp8266_Find(ARG) Serial.find(ARG) //esp8266.find(ARG) #define esp8266_Read() Serial.read() //esp8266.read() #define esp8266_Write(ARG1,ARG2) Serial.write(ARG1,ARG2) //esp8266.write(ARG1,ARG2) #define esp8266_Print(ARG) Serial.print(ARG) //esp8266.print(ARG) // Делает RX линию Arduino выводом 2, а TX линию Arduino выводом 3. // Это означает, что вам необходимо подключить TX линию от ESP к выводу 2 Arduino, // а RX линию от ESP к выводу 3 Arduino. SoftwareSerial esp8266(2, 3); /*************/ byte OUTPUTstate; byte OUTPUTTMRIsSet ; byte OUTPUTTMRState ; long OUTPUTTimer; /*************/ /***Commands**/ String GETSTATE = "con"; // Строка запроса от мобильного приложения, чтобы узнать состояние каждого выхода String SETON = "on="; // Строка запроса от мобильного приложения, чтобы включить выход String SETOFF = "of="; // Строка запроса от мобильного приложения, чтобы выключить выход String TIMER = "tm="; // Строка запроса от мобильного приложения, чтобы задать таймер для выхода /*************/ void setup() { Serial.begin(HWSBaudRate); // Последовательный порт для отправки сообщений от Arduino на компьютер esp8266.begin(ESPBaudRate); // Программный последовательный порт для отправки сообщений от Arduino на ESP8266 pinMode(OUTPUT1, OUTPUT); digitalWrite(OUTPUT1, LOW); pinMode(OUTPUT2, OUTPUT); digitalWrite(OUTPUT2, LOW); pinMode(OUTPUT3, OUTPUT); digitalWrite(OUTPUT3, LOW); // перезапустить модуль sendCommand("AT+RST\r\n", 2000, DEBUG); // настроить как точку доступа sendCommand("AT+CWMODE=1\r\n", 1000, DEBUG); //**** ИЗМЕНИТЬ SSID и ПАРОЛЬ В СООТВЕТСТВИИ С ВАШЕЙ СЕТЬЮ ******// sendCommand("AT+CWJAP=\"tur\",\"341983#tur\"\r\n", 3000, DEBUG); delay(10000); // получить ip адрес sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // настроить для нескольких соединений sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); // включить сервер на порту 1337 sendCommand("AT+CIPSERVER=1,1337\r\n", 1000, DEBUG); if (DEBUG == true) Serial.println("Server Ready"); } void loop() { if (esp8266_Available()) // проверить, послал ли esp сообщение { if (esp8266_Find("+IPD,")) { // ждать, когда последовательный буфер заполнится (прочитаются все последовательные данные) delay(1000); // получить id подключения, чтобы мы могли отключиться int connectionId = esp8266_Read() - 48; // вычитаем 48 потому, что функция read() возвращает // десятичное значение в ASCII, а 0 (первое десятичное число) начинается с 48 String closeCommand = "AT+CIPCLOSE="; // создание команды закрытия подключения closeCommand += connectionId; // добавить id подключения closeCommand += "\r\n"; esp8266_Find("?"); // Этот символ определяет начало команды теле нашего сообщения String InStream; InStream = (char) esp8266_Read(); InStream += (char) esp8266_Read(); InStream += (char) esp8266_Read(); if (DEBUG == true) Serial.println(InStream); if (InStream.equals(GETSTATE)) { // отклик на команду Status=<состояние_выхода_1><состояние_выхода_2><состояние_выхода_3> String response = "Status="; response += OUTPUTstate; response += OUTPUTstate; response += OUTPUTstate; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else if (InStream.equals(SETON)) { int pinNumber = (esp8266_Read() - 48); // получить первую цифру, т.е., если вывод 13, то 1-ая цифра равна 1 int secondNumber = (esp8266_Read() - 48); if (secondNumber >= 0 && secondNumber <= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (pinNumber == OUTPUT1) OUTPUTstate = 1; else if (pinNumber == OUTPUT2) OUTPUTstate = 1; else if (pinNumber == OUTPUT3) OUTPUTstate = 1; digitalWrite(pinNumber, 1); String response = "Confg="; // Отклик на команду Confg=<номер_вывода> response += pinNumber; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else if (InStream.equals(SETOFF)) { int pinNumber = (esp8266_Read() - 48); // получить первую цифру, т.е., если вывод 13, то 1-ая цифра равна 1 int secondNumber = (esp8266_Read() - 48); if (secondNumber >= 0 && secondNumber <= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (pinNumber == OUTPUT1) OUTPUTstate = 0; else if (pinNumber == OUTPUT2) OUTPUTstate = 0; else if (pinNumber == OUTPUT3) OUTPUTstate = 0; digitalWrite(pinNumber, 0); // изменить состояние вывода String response = "Confg="; // Отклик на команду Confg=<номер_вывода> response += pinNumber; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else if (InStream.equals(TIMER)) { int pinNumber = (esp8266_Read() - 48); // получить первую цифру, т.е., если вывод 13, то 1-ая цифра равна 1 int secondNumber = (esp8266_Read() - 48); if (secondNumber >= 0 && secondNumber <= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (esp8266_Read() == "n") { if (DEBUG == true) Serial.println("on"); if (pinNumber == OUTPUT1) OUTPUTTMRState = 1; else if (pinNumber == OUTPUT2) OUTPUTTMRState = 1; else if (pinNumber == OUTPUT3) OUTPUTTMRState = 1; } else { if (DEBUG == true) Serial.println("off"); if (pinNumber == OUTPUT1) OUTPUTTMRState = 0; else if (pinNumber == OUTPUT2) OUTPUTTMRState = 0; else if (pinNumber == OUTPUT3) OUTPUTTMRState = 0; } int j = 0; byte Atime; // Таймер может настроен на максимальное значение в 1 сутки // поэтому программа может принять 5 цифр, так как 1 сутки равны 86400 секундам long Time; // Прочитать секунды, значение имеет переменное количество цифр, поэтому читать, пока не получим "s", // что является символом завершения в теле моего сообщения от мобильного телефона while (1) { Time = esp8266_Read(); if (Time == "s") break; Atime[j] = Time - 48 ; j++; } switch (j) // секунды... { case 1: // одна цифра Time = Atime; break; case 2: // две цифры Time = Atime * 10 + Atime; break; case 3: // три цифры Time = Atime * 100 + Atime * 10 + Atime; break; case 4: // четыре цифры Time = Atime * 1000 + Atime * 100 + Atime * 10 + Atime; break; case 5: // пять цифр Time = Atime * 10000 + Atime * 1000 + Atime * 100 + Atime * 10 + Atime[j]; break; } if (DEBUG == true) { Serial.println("Timer:"); Serial.println(Time); } Time = Time * 1000 + millis(); if (DEBUG == true) { Serial.println("Pin:"); Serial.println(pinNumber); } if (pinNumber == OUTPUT1) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } else if (pinNumber == OUTPUT2) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } else if (pinNumber == OUTPUT3) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } String response = "tConfg="; // Отклик на команду tConfg=<номер_вывода> response += pinNumber; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else // принята неподдерживаемая команда { String response = "ERROR"; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } } } /*****Проверить таймер для каждого выхода******/ if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT1, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT2, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT3, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } /***************************************/ } /* Name: sendData Description: Функция, используемая для отправки данных на ESP8266. Params: command - данные/команда для отправки; timeout - время ожидания отклика; debug - печатать в консоль?(true = да, false = нет) Returns: Отклик от esp8266 (если есть отклик) */ String sendData(String command, const int timeout, boolean debug) { String response = ""; int dataSize = command.length(); char data; command.toCharArray(data, dataSize); esp8266_Write(data, dataSize); // передача символов на esp8266 if (debug) { Serial.println("\r\n====== HTTP Response From Arduino ======"); Serial.write(data, dataSize); Serial.println("\r\n========================================"); } long int time = millis(); while ((time + timeout) > millis()) { while (esp8266_Available()) { // У esp есть данные, поэтому вывести их в консоль char c = esp8266_Read(); // прочитать следующий символ. response += c; } } if (debug) { Serial.print(response); } return response; } /* Name: sendHTTPResponse Description: Функция, которая посылает HTTP 200, HTML UTF-8 отклик */ void sendHTTPResponse(int connectionId, String content) { // создать HTTP отклик String httpResponse; String httpHeader; // HTTP заголовок httpHeader = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n"; httpHeader += "Content-Length: "; httpHeader += content.length(); httpHeader += "\r\n"; httpHeader += "Connection: close\r\n\r\n"; httpResponse = httpHeader + content + " "; // Здесь в коде баг: последний символ в "content" не посылается, поэтому я добавил дополнительный пробел sendCIPData(connectionId, httpResponse); } /* Name: sendCIPDATA Description: посылает команду CIPSEND=,<данные> */ void sendCIPData(int connectionId, String data) { String cipSend = "AT+CIPSEND="; cipSend += connectionId; cipSend += ","; cipSend += data.length(); cipSend += "\r\n"; sendCommand(cipSend, 1000, DEBUG); sendData(data, 1000, DEBUG); } /* Name: sendCommand Description: Функция, используемая для отправки данных на ESP8266. Params: command - данные/команда для отправки; timeout - время ожидания отклика; debug - печатать в консоль?(true = да, false = нет) Returns: Отклик от esp8266 (если есть отклик) */ String sendCommand(String command, const int timeout, boolean debug) { String response = ""; esp8266_Print(command); // передача символов на esp8266 long int time = millis(); while ((time + timeout) > millis()) { while (esp8266_Available()) { // У esp есть данные, поэтому вывести их в консоль char c = esp8266_Read(); // прочитать следующий символ. response += c; } } if (debug) { Serial.print(response); } return response; }

Android приложение

Чтобы управлять всеми выше перечисленными аппаратными компонентами, мы будем использовать простое приложение для Android. Это приложение позволит нам включать или выключать выход напрямую или через определенный период времени.

Примечание: Приложение требует Android 4.0 (IceCreamSandwich) или выше.

  • Прежде всего, вы должны знать IP адрес своего модуля. Если вы использовали программный последовательный порт, IP адрес будет напечатан в консоли. Если вы использовали аппаратный последовательный порт, то вы должны использовать кабель для отслеживания данных на линиях RX и TX, чтобы увидеть IP адрес. Вам также нужно знать номер порта, который был указан в скетче для Arduino. После этого нажмите "connect", чтобы получить состояние всех трех выходов. Вам нужно убедиться, что ваш Wi-Fi роутер включен, и вы подключены к локальной сети.
  • Теперь нажмите на любой переключатель, который вы хотите включить/выключить. Всякий раз, когда захотите, вы можете нажать "refresh", чтобы обновить состояние всех выходов.
  • На вкладке "Timers" вы можете установить любой из этих трех выходов для включения/выключения через определенный промежуток времени (от 0 до 24 часов).
  • После любого действия вы получите сообщение с подтверждением о том, выполнилась ли команда успешно, или возникла какая-то ошибка.

Демонстрационное видео

Вот и всё! Надеюсь, статья оказалась полезной. Оставляйте комментарии!

Модуль ESP8266 будет сконфигурирован как самостоятельная точка доступа WiFi. Для такого режима работы не требуется привязка к существующей WiFi сети. Для соединения смартфон должен подключиться к созданной точке доступа.

Шаг 1. Создайте проект графического интерфейса

Шаг 4. Настройте ESP8266

Модуль ESP8266 нуждается в настройке. Возможно ваш модуль уже имеет необходимые настройки по умолчанию, но лучше это проверить.

Что необходимо проверить:

  • Модуль имеет прошивку с поддержкой AT команд версии не ниже v0.40;
  • Модуль настроен на скорость работы 115200.

Шаг 5. Подключите ESP8266 к Arduino Uno

Подключите ESP8266 к Arduino Uno по схеме приведенной ниже. Обратите внимание, что контакты RX-TX соединяются перекрестием.

Так как уровни сигналов модуля ESP8266 составляют 3.3В а у Arduino они 5В, необходимо использовать резистивный делитель напряжения для преобразования уровня сигнала.


Шаг 6. Загрузите скетч в Arduino.

Скетч загружается в Arduino обычным способом. Однако из за того что модуль ESP8266 подключен к контактам 0 и 1, программирование становится невозможным. Компилятор будет показывать ошибку.

Перед программированием отсоедините провода идущие к ESP8266 от контактов 0 и 1. Произведите программирование. Затем верните контакты на место. Нажмите кнопку сброса Arduino.

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

Шаг 7. Подключитесь с мобильного приложения.

Если инициализация проходит успешно и вы видите последнюю команду AT+CIPSERVER=1,6377, но при попытке подключения с мобильного приложения возникает ошибка, возможно, что модуль ESP8266 имеет устаревшую прошивку.

Проверьте объем памяти вашего ESP8266. Это можно сделать так же посмотрев маркировку чипа памяти, который находится на плате рядом с чипом ESP8266. Если размер памяти составляет 4 Mbit и меньше (установлен чип 25Q40), скорее всего этот модуль не будет работать как точка доступа для RemoteXY.

Проверьте питание ESP8266

Так же возможно, что вашей ESP8266 не хватает мощности источника питания. Некоторые платы Arduino имеют слабый стабилизатор напряжения 3.3 В, который не способен выдавать 200-300 мА в пиковых режимах. В этом случае в Serial Monitor вы так же увидите обрыв последовательности команд.

Проверьте особенности вашего смартфона

Некоторые модели смартфонов на Android имеют особенности подключения точек доступа WiFi, и возможно точка доступа не включается автоматически. Попробуйте подключиться к точке доступа предварительно в ручную, используя системные настройки. После этого попробуйте соединиться с устройством из приложения RemoteXY. Если в этом случае соединение устанавливается, значит ваш смартфон имеет такую особенность. Сообщите нам об этом.

Всё больше набирает популярности, и уже Arduino подхватывает инициативу - добавляя эти Wi-Fi модули в список поддерживаемых плат.
Но как же его подключить к ардуино? И возможно как-то обойтись вообще без ардуино? Сегодня именно об этом и пойдёт речь в этой статье.

Забегая наперёд, скажу, что будет вторая статья, уже более практическая, по теме прошивки и программирования модуля ESP8266 в среде разработки Arduino IDE . Но, обо всём по порядку.

Этот видеоролик, полностью дублирует материал, представленный в статье.



На данный момент, существует много разновидностей этого модуля, вот некоторые из них:

А вот распиновка ESP01, ESP03, ESP12:


* Данную картинку можно посмотреть в хорошем качестве на офф. сайте pighixxx.com .

Лично мне, больше всего нравится версия ESP07. Как минимум за то, что тут есть металлический экран (он защищает микросхемы от внешних наводок, тем самым обеспечивает более стабильную работу), своя керамическая антенна, разъём для внешней антенны. Получается, подключив к нему внешнюю антенну, например типа биквадрат , то можно добиться неплохой дальности. К тому же, тут есть немало портов ввода вывода, так называемых GPIO(General Purpose Input Output - порты ввода-вывода общего назначения), по аналогии с ардуино - пинов.

Давайте вернёмся к нашим баранам Wi-Fi модулям и Arduino. В этой статье, я буду рассматривать подключение ESP8266(модели ESP01) к Arduino Nano V3.

Но, данная информация будет актуальна для большинства модулей ESP8266 и так же разных Arduino плат, например самой популярной Arduino UNO.

Пару слов по ножкам ESP01:

Vcc и GND (на картинке выше это 8 и 1) - питание, на ножку Vcc можно подавать, судя по документации , от 3 до 3.6 В , а GND - земля (минус питания). Я видел, как один человек подключал этот модуль к двум AA аккумуляторам (напряжение питания в этом случае было примерно 2.7 В) и модуль был работоспособным. Но всё же разработчики указали диапазон напряжений, в котором модуль должен гарантированно работать, если вы используете другой - ваши проблемы.

Внимание! Этот модуль основан на 3.3 В логике, а Arduino в основном - 5 В логика. 5 В запросто могут вывести из строя ESP8266, потому на него нужно отдельно от ардуино подавать питание .

- На моей ардуинке есть ножка, где написано 3.3 В, почему бы не использовать её?

Наверное подумаете вы. Дело в том, что ESP8266 довольно таки прожорливый модуль, и в пиках может потреблять токи до 200 мА, и почти никакая ардуинка по умолчанию не способна выдать такой ток, разве что исключением является Arduino Due , у которой ток по линии 3.3 В может достигать 800 мА, чего с запасом хватит, в других же случаях советую использовать дополнительный стабилизатор на 3.3 В, например AMS1117 3.3 В . Таких валом как в Китае, так и у нас.

Ножка RST 6 - предназначена «железной» для перезагрузки модуля, кратковременно подав на неё низкий логический уровень, модуль перезагрузиться. Хоть и на видео я этим пренебрёг, но всё же вам советую «прижимать» данную ногу резистором на 10 кОм к плюсу питания , дабы добиться лучшей стабильности в работе модуля, а то у меня перезагружался от малейших наводок.

Ножка CP_PD 4(или по-другому EN ) - служит, опять же, для «железного» перевода модуля в энергосберегающий режим, в котором он потребляет очень маленький ток. Ну и снова - не будет лишним «прижать» эту ногу резистором на 10 кОм к плюсу питалова. На видео я тупо закоротил эту ногу на Vcc, потому как под рукой не оказалось такого резистора.

Ноги RXD0 7 TXD0 2 - аппаратный UART, который используется для перепрошивки, но ведь никто не запрещает использовать эти порты как GPIO(GPIO3 и GPIO1 соотвественно). GPIO3 на картинке почему-то не размечен, но в даташите он есть:

К стати, к ножке TXD0 2 подключен светодиод «Connect», и горит он при низком логическом уровне на GPIO1, ну или когда модуль отправляет что-то по UART.

GPIO0 5 - может быть не только портом ввода/вывода, но и переводить модуль в режим программирования. Делается это подключив этот порт к низкому логическому уровню(«прижав» к GND) и подав питание на модуль. На видео я делаю это обычной кнопкой. После перепрошивки - не забудьте вытащить перемычку/отжать кнопку(кнопку во время перепрошивки держать не обязательно, модуль при включении переходит в режим программирования, и остаётся в нём до перезагрузки).

GPIO2 3 - порт ввода/вывода.

И ещё один немаловажный момент, каждый GPIO Wi-Fi модуля может безопасно выдавать ток до 6 мА , чтобы его не спалить, обязательно ставьте резисторы последовательно портам ввода/вывода на… Вспоминаем закон Ома R = U/I = 3.3В / 0.006 А = 550 Ом, то есть, на 560 Ом . Или же пренебрегайте этим, и потом удивляйтесь почему оно не работает.

В ESP01 все GPIO поддерживают ШИМ, так что к нашим четырём GPIO, то есть GPIO0-3 можно подключить драйвер двигателя, аля L293 / L298 и рулить двумя двигателями, например катера, или же сделать RGB Wi-Fi приблуду. Да, да, данный модуль имеет на борту много чего, и для простеньких проектов скрипач Arduino не нужен, только для перепрошивки. А если использовать ESP07 то там вообще портов почти как у Uno, что даёт возможность уже уверенно обходиться без ардуино. Правда есть один неприятный момент, аналоговых портов у ESP01 вообще нет, а у ESP07 только один, ADC зовётся. Это конечно усугубляет работу с аналоговыми датчиками. В таком случае ардуино аналоговый мультиплексор в помощь.

Всё вроде как по распиновке пояснил, и вот схема подключения ESP8266 к Arduino Nano:

Видите на Arduino Nano перемычка на ножках RST и GND? Это нужно для того, чтобы ардуинка не мешала прошивке модуля, в случае подключения ESP8266 при помощи Arduino - обязательное условие.

Так же если подключаете к Arduino - RX модуля должен идти к RX ардуинки, TX - TX. Это потому, что микросхема преобразователь уже подключена к ножкам ардуино в перекрестном порядке.

Так же немаловажен резистивный делитель, состоящий из резисторов на 1 кОм и 2 кОм (можно сделать из двух резисторов на 1 кОм последовательно соединив их) по линии RX модуля. Потому как ардуино это 5 В логика а модуль 3.3. Получается примитивный преобразователь уровней. Он обязательно должен быть, потому что ноги RXD TXD модуля не толерантные к 5 В.

Ну и можно вообще обойтись без ардуино, подключив ESP8266 через обычный USB-UART преобразователь. В случае подключения к ардуино, мы, по сути, используем штатный конвертер интерфейсов usb и uart, минуя мозги. Так зачем тратиться лишний раз, если можно обойтись и без ардуино вообще? Только в этом случае, мы подключаем RXD модуля к TXD конвертора, TXD - RXD.

Если вам лениво заморачиваться с подключением, возится с резисторами и стабилизаторами - есть готовые решения NodeMcu:

Тут всё значительно проще, воткнул кабель в компьютер, установил драйвера и программируй, только не забывай задействовать перемычку/кнопку на GPIO0 для перевода модуля в режим прошивки.

Ну вот, с теорией наверное всё, статья получилась пожалуй довольно таки большая, и практическую часть, аля прошивка и программирование модуля, я опубликую немного позже.