- Как у меня заработал WIFI для Arduino ESP8266 ESP-12E
- Платы, которые использовались при написании статьи:
- Материалы со страницы «Инструкция 1».
- Почему бы не использовать совмещенную плату UNO+ESP8266?
- UPD
- Дружимся с ESP
- Настройка среды программирования Arduino IDE
- Код прошивки
- Модули на базе ESP8266
- 1. ESP-01
- Внешний вид
- Питание
- Подключение периферии
- Распиновка
- Подключение к IoT
- Аппаратная часть
- Arduino Due + ESP8266 ESP-12E c адаптером — быстрый старт
Как у меня заработал WIFI для Arduino ESP8266 ESP-12E
Плата ESP8266 ESP-12 ESP-12E UART Wi-Fi устанавливается сверху на плату Arduino UNO R3 и позволяет получать доступ к управлению и состоянием Arduino из интернет. И я заставил этот слоеный пирог заработать.
Компоненты Arduino для работы покупал в магазине All Electronics Trading Company.
Все быстро пришло. Почти все из того что заказал в этом магазине было отличного качества.
Исключение составляла комбинированная плата с разными датчиками, светодиодами и кнопками s.click.aliexpress.com/e/ct9JuGza. Эта плата была какой-то ручной пайки, но полностью работала.
Платы, которые использовались при написании статьи:
Закачал пустой скетч в Arduino U3.
void setup () <
// поместите здесь свой установочный код, чтобы запустить его один раз:
>
void loop () // поместите ваш основной код здесь для повторного запуска:
>
Действуя по инструкции 1 я ничего не достиг. Все комбинации перепробовал.
Раньше где-то слышал, что процедура прошивки требует намного большей мощности, чем штатная работа, и мощности питания от Arduino не всегда хватает.
На момент прошивки нужен отдельный источник питания. Заподозрил что у меня именно эта ситуация.
Esp8266 питается от 3.3V, а Uno использует 5V. В инструкции 1 написано, что 5V не трогаем. Автор инструкции 2 подключает на свой страх и риск (о чем говорит) плату Esp8266 к 5V выходу UNO R3. Я тоже так решил сделать, подключив все вот так.
Тут дело сдвинулось с мертвой точки, почти сразу же опять застопорившись.
Плата синхронизировалась, но как-то не до конца.
Содержимое окна FLASH_DOWNLOAD_TOOLS_v2.4_150924 было почти такое же, как в инструкции 1:
но у меня поле MAC adress заполнилось, а вот DETECTED IINFO оставалось пустым.
В логе содержалась фраза «error read crystal«. Подумал было что все-таки сжег плату, подав напряжение 5V на свой страх и риск.
Но нашел подобную проблему в ветке форума ERROR FLASHING FIRMWARE. Проблему решили, записав в Arduino U3 пустой скетч.
Да я же делал это в самом начале!
Снова записал пустой скетч и на этом этапе все заработало. А именно — содержимое окна FLASH_DOWNLOAD_TOOLS_v2.4_150924 стало таким же, как в инструкции 1.
И прошивка залилась в плату ESP8266 ESP-12 ESP-12E UART Wi-Fi.
Может, когда на первом этапе ничего не получалось, что-то залил в Arduino R3?
Начал дальше следовать инструкции 1, поместив плату ESP8266 на Arduino UNO R3 — и опять ничего не ладилось. Что бы не делал с переключателями Р1, Р2 — не проходили команды.
Снова обратился к инструкции 2.
Вернул подключение ESP8266 к UNO через Debug Port, но уже с использованием 3.3V — flash загрузчик уже не надо было использовать и решил не испытывать плату на прочность.
И отправил при таком подключении команду «AT+UART_DEF=9600,8,1,0,0». Вернуло ERROR.
Тут оказалось, что внимательно надо следить за регистрами и за отсутствием пробелов. Команды копировал с сайтов, а там были пробелы и поэтому возвращало ERROR.
Также нужно следить за регистрами. Команда «AT» принимается как в верхнем, так и в нижнем регистре. Остальные команды только в верхнем.
Дальше действовал по инструкции 1.
Небольшой трудностью на этом этапе было привязать статичный IP адрес — пришлось выяснять пароль от модема ZyXel Keenetic 4G II.
Теперь можно было с Web-страницы при помощи кнопки управлять светодиодом, подключенным к Arduino UNO R3, и видеть его состояние.
Материалы со страницы «Инструкция 1».
На данный момент на странице инструкции 1 www.instructables.com/id/ESP8266-ESP-12E-UART-Wireless-WIFI-Shield-TTL-Conv/ такие версии используемых файлов:
Почему бы не использовать совмещенную плату UNO+ESP8266?
Есть в природе плата, аналогичная вроде-бы двум описываемым выше.
UNO + WiFi R3 ATmega328P + ESP8266 (32 Мб памяти), USB-TTL CH340G. Совместимость Uno, NodeMCU, WeMos ESP8266.
Получается дешевле на 100р, чем описываемые выше в паре.
UPD
С ней оказалось все немного по другому.
Дружимся с ESP
Последние пару лет практически все прототипирование несложных IoT-устройств я делаю на NodeMCU, хотя зачастую она и великовата по размеру, и дороговата, и избыточна по функционалу. А все потому, что имела неудачный опыт с ESP-01, которая совершенно не поддавалась прошивке. Сейчас пришло время преодолеть этот барьер и освоить другие железки, от которых мне нужно следующее — Wi-Fi и пины для подключения периферии.
В этой статье разберем подключение к платформе Интернета вещей наиболее популярных плат с интерфейсом Wi-Fi. Их можно использовать, чтобы управлять своим устройством дистанционно или чтобы снимать показания с сенсоров через интернет.
Несколько представленных в статье модулей (ESP-01, ESP-07, ESP-12E, ESP-12F) и плат (Goouuu Mini-S1, WeMos D1 mini и NodeMCU V2) базируются на контроллере ESP8266, использование которого позволяет простым и дешевым способом добавить в своё устройство беспроводную связь через Wi-Fi.
Так выглядит модельный ряд модулей на базе чипа ESP8266.
Последняя плата из тех, о которых я расскажу (ESP32 WROOM DevKit v1), построена на контроллере семейства ESP32 — более продвинутой по своим возможностям версии ESP8266.
Все представленные модели можно программировать и загружать прошивки через Arduino IDE точно так же, как при работе с Arduino.
Настройка среды программирования Arduino IDE
По умолчанию среда IDE настроена только на AVR-платы. Для платформ, представленных ниже, необходимо добавить в менеджере плат дополнительную поддержку.
1) Открываем среду программирования Arduino IDE.
http://arduino.esp8266.com/stable/package_esp8266com_index.json, https://dl.espressif.com/dl/package_esp32_index.json
4) В пункте меню Tools (Инструменты) -> Board (Плата) выбираем Boards manager (Менеджер плат).
Находим в списке платформы на ESP8266 и нажимаем на кнопку Install (Установить).
6) Надпись INSTALLED сообщает, что дополнения успешно установлены.
7) Аналогичным образом устанавливаем дополнение для ESP32.
8) Теперь нам доступны к программированию платформы с модулем ESP8266 и ESP32.
9) Для подключения плат к платформе Интернета вещей используем библиотеку EspMQTTClient. Чтобы ее установить, в пункте меню Tools (Инструменты) выбираем Manage Libraries (Управлять библиотеками). Находим и устанавливаем библиотеку EspMQTTClient. Может появиться сообщение об установке дополнительных библиотек. Выбираем “Install all”.
Примечание — Также для работы с платами понадобится установить драйверы CH340 (WeMos и Goouuu) и CP2102 (для остальных). Их отсутствие повлияет на то, найдет ли Arduino IDE COM-порт, к которому подключена плата.
Код прошивки
Для прошивки всех используемых ниже модулей используем один и тот же код.
- Установка Wi-Fi соединения
- Подключение к объекту на платформе Rightech IoT Cloud по протоколу MQTT
- Отправка рандомных значений по температуре («base/state/temperature») и влажности («base/state/humidity») каждые 5 секунд (PUB_DELAY)
- Получение сообщений о переключении света («base/relay/led1»)
#include "Arduino.h" #include "EspMQTTClient.h" /* https://github.com/plapointe6/EspMQTTClient */ /* https://github.com/knolleary/pubsubclient */ #define PUB_DELAY (5 * 1000) /* 5 seconds */ EspMQTTClient client( "", "", "dev.rightech.io", "" ); void setup() < Serial.begin(9600); >void onConnectionEstablished() < client.subscribe("base/relay/led1", [] (const String &payload) < Serial.println(payload); >); > long last = 0; void publishTemperature() < long now = millis(); if (client.isConnected() && (now - last >PUB_DELAY)) < client.publish("base/state/temperature", String(random(20, 30))); client.publish("base/state/humidity", String(random(40, 90))); last = now; >> void loop()
Работоспособность кода будем проверять на платформе Rightech IoT Cloud, именно поэтому в качестве адреса MQTT-брокера указан dev.rightech.io. Идентификаторами клиентов служат идентификаторы объектов, созданных на платформе. Под каждую проверку я завела на платформе отдельный объект, именно поэтому во всех скринах кодов, которые будут далее представлены, отличается только строка .
Прим. — Можно подключаться и к одному и тому же объекту, тогда можно использовать один и тот же код для прошивки всех плат без изменений, однако следите, чтобы в таком случае платы не подключались к одному и тому же объекту одновременно, иначе случится коллизия.
Модули на базе ESP8266
Для работы с модулями на базе ESP8266 есть два варианта:
- Работа с AT командами (в стандартной прошивке Wi-Fi модуль общается с управляющей платой через «AT-команды» по протоколу UART);
- Wi-Fi модуль как самостоятельный контроллер (все представленные модули очень умные: внутри чипа прячется целый микроконтроллер, который можно программировать на языке C++ через Arduino IDE).
В статье будем рассматривать второй вариант — прошивка модулей в виде самостоятельного полноценного устройства. Здесь также есть два варианта прошивки с точки зрения железа:
Рассмотрим второй вариант — использовать адаптер на базе чипа CP2102 (например, такой https://www.chipdip.ru/product/cp2102-usb-uart-board-type-a?frommarket=https%3A%2F%2Fmarket.yandex.ru%2Fsearch%3Frs%3DeJwzSvKS4xKzLI&ymclid=16146772489486451735000001). Обязательно обратите внимание на то, чтобы адаптер позволял выдавать выходное напряжение 3.3 В, не больше!
1. ESP-01
ESP-01 — самый популярный модуль на ESP8266. PCB антенна обеспечивает дальность до 400 м на открытом пространстве.
Внешний вид
Питание
Родное напряжение модуля — 3,3 В. Его пины не толерантны к 5 В. Если вы подадите напряжение выше, чем 3,3 В на пин питания, коммуникации или ввода-вывода, модуль выйдет из строя.
Подключение периферии
2 порта ввода-вывода общего назначения
Распиновка
Подключение к IoT
Аппаратная часть
Arduino Due + ESP8266 ESP-12E c адаптером — быстрый старт
Код взят отсюда. Но меня сразу смутило наличие внешнего источника питания и мне пришлось поменять скорость серийного порта с 9600 на 115200 не считая небольших правок.
Код показывает работу с Wi-Fi модулем на низком уровне, но для того, чтобы не усложнять пример, используются задержки. Так что для реальных проектов я рекомендую использовать библиотеку, которая скрывает взаимодействие с модулем.
Due Serial (Tx/Rx) — используется для коммуникации с компьютером по USB
Due Serial3 (Tx3/Rx3) — подключен к ESP8266 в обратном порядке (Rx/Tx):
Due Tx3 — ESP8266 Rx
Due Rx3 — ESP8266 Tx
Due VCC 3.3V — ESP8266 VCC
Due GND — ESP8266 GND
#define ESP8266 Serial3 String SSID = "WIFI"; String PASSWORD = "PassWord"; int LED = 13; boolean FAIL_8266 = false; //Очистка буфера и его вывод void clearESP8266SerialBuffer(String title = "") < Serial.println("= clearESP8266SerialBuffer(" + title + ") =============================="); >void setup() < pinMode(LED, OUTPUT); digitalWrite(LED, LOW); Serial.begin(115200); ESP8266.begin(115200); //Ждем открытия окна консоли для вывода лога while(!Serial); Serial.println("--- Start ---"); do< Serial.println("--- Reset ---"); ESP8266.println("AT+RST"); delay(4000); if(ESP8266.find("ready")) < Serial.println("Module is ready"); ESP8266.println("AT+CWMODE=1"); delay(2000); if(cwJoinAP()) < Serial.println("CWJAP Success"); FAIL_8266 = false; // Тут должно быть достаточно времени что бы подключиться к роутеру delay(5000); //Получение и вывод IP адреса sendESP8266Cmdln("AT+CIFSR", 1000); //Выбрать режима множественного подключения sendESP8266Cmdln("AT+CIPMUX=1", 1000); //Установка сервера на порт 80 sendESP8266Cmdln("AT+CIPSERVER=1,80",1000); Serial.println("Server setup finish"); >else < Serial.println("CWJAP Fail"); delay(500); FAIL_8266 = true; >>else < Serial.println("Module have no response."); delay(500); FAIL_8266 = true; >>while(FAIL_8266); digitalWrite(LED, HIGH); > void loop()< if(ESP8266.available()) < Serial.println("Something received"); delay(1000); if(ESP8266.find("+IPD,")) < String action; Serial.println("+IPD, found"); int connectionId = ESP8266.read()-48; Serial.println("connectionId: " + String(connectionId)); ESP8266.find("led="); char s = ESP8266.read(); if(s=='0')< action = "led=0"; digitalWrite(LED, LOW); >else if(s=='1')< action = "led=1"; digitalWrite(LED, HIGH); >else < action = "led=?"; >Serial.println(action); sendHTTPResponse(connectionId, action); //Закрытие TCP/UDP String cmdCIPCLOSE = "AT+CIPCLOSE="; cmdCIPCLOSE += connectionId; sendESP8266Cmdln(cmdCIPCLOSE, 1000); > > > void sendHTTPResponse(int id, String content) < String response; response = "HTTP/1.1 200 OK\r\n"; response += "Content-Type: text/html; charset=UTF-8\r\n"; response += "Content-Length: "; response += content.length(); response += "\r\n"; response +="Connection: close\r\n\r\n"; response += content; String cmd = "AT+CIPSEND="; cmd += id; cmd += ","; cmd += response.length(); Serial.println("--- AT+CIPSEND ---"); sendESP8266Cmdln(cmd, 1000); Serial.println("--- data ---"); sendESP8266Data(response, 1000); >boolean waitOKfromESP8266(int timeout) < do< Serial.println("wait OK. "); delay(1000); if(ESP8266.find("OK")) < return true; >>while((timeout--)>0); return false; > boolean cwJoinAP() < String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASSWORD + "\""; ESP8266.println(cmd); return waitOKfromESP8266(10); >//Отправка команд на ESP8266, предположительный ответ OK, без проверок ошибок //wait some time and display respond void sendESP8266Cmdln(String cmd, int waitTime) < ESP8266.println(cmd); delay(waitTime); clearESP8266SerialBuffer("sendESP8266Cmdln"); >//То же что и sendESP8266Cmdln() //Но используется ESP8266.print() вместо ESP8266.println() void sendESP8266Data(String data, int waitTime)
— Start — — Reset — Module is ready
wait OK…
CWJAP Success
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
WIFI CONNECTED
WIFI GOT IP
AT+CWJAP=«WIFI»,«PassWord»
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
OK
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPMUX=1
OK
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPSERVER=1,80
OK
==============================
Server setup finish
Something received
+IPD, found
connectionId: 0
led=0
— AT+CIPSEND — = clearESP8266SerialBuffer(sendESP8266Cmdln) =
HTTP/1.1
Host: 192.168.1.12
Connection: keep-alive
Cache-Control: max-age=0
Accept: teAT+CIPSEND=0,102
OK
> ==============================
— data — = clearESP8266SerialBuffer(sendESP8266Data) =
+IPD,0,349:GET /favicon.ico HTTP/1.1
Host: 192.168.1.12
Connection: keep==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPCLOSE=0
OK
==============================
Something received
+IPD, found
connectionId: 0
led=1
— AT+CIPSEND — = clearESP8266SerialBuffer(sendESP8266Cmdln) =
HTTP/1.1
Host: 192.168.1.12
Connection: keep-alive
Accept: text/html,application/xhtml+AT+CIPSEND=0,102
OK
> ==============================
— data — = clearESP8266SerialBuffer(sendESP8266Data) =
+IPD,0,349:GET /favicon.ico HTTP/1.1
Host: 192.168.1.12
Connection: keep==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPCLOSE=0
Дальше открываем браузер и вводим 192.168.1.12/?led=0 или 192.168.1.12/?led=1. IP будет варьироваться в зависимости от настроек DHCP.
В случае не правильных имя сети или пароля:
— Start — — Reset — Module is ready
wait OK…
CWJAP Success
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
WIFI CONNECTED
WIFI GOT IP
AT+CWJAP=«WIFI»,«WrongPassWord»
busy p…
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPMUX=1
busy p…
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPSERVER=1,80
busy p…
==============================
Server setup finish
Something received