Мега вай фай

Приступим?

Предлагаю придерживаться следующего плана:

  1. Подготовка WiFi модуля ESP8266;
  2. Сборка схемы;
  3. Регистрация в сервисе и создание контроллера;
  4. Прошивка контроллера и отладка.

Подготовка WiFi модуля ESP8266

Обмен между Arduino и ESP происходит через последовательный порт (serial port) он же UART. Наша задача состоит в том, что бы скорость портов наших двух плат совпадала. Бытует мнение, что при использовании в Arduino различных библиотек с прерываниями, работа порта на скоростях выше 19 200 бод может быть нестабильной. Предлагаю обойти стороной возможные грабли и настроить обмен на скорости 9600. Мне известно два пути подключения ESP8266 к компьютеру:

  • Использование USB-TTL конвертора (сейчас я пользуюсь таким, потому что как-то он попался на Aliexpress и был куплен за 50 руб. ссылка: Aliexpress);
  • Использование Arduino который у нас уже имеется.

Останавливаться подробно на первом варианте не вижу смысла, т.к. если у Вас есть это «девайс» вероятнее всего пользоваться им вы умеете, если нет – информации полно в сети, сложностей возникнуть не должно. Ориентируясь, как мне кажется на более широкую аудиторию, давайте изменим базовую скорость ESP с помощью имеющейся у нас Arduino. Идея такова: нам нужно воспользоваться штатным USB-TTL (UART) преобразователем который распаянным на плате arduino, а для того, что бы сам контроллер ATmega нам не мешал – мы переводим его в режим сброса одной единственной перемычкой, в общем собираем схему:

Если уже установлена, открываем Arduino IDE, если нет, скачиваем с https://www.arduino.cc и устанавливаем. Подключаем собранную схему, ждем пока Windows установит драйвера для COM-порта и запускаем программу. Указываем к какому порту подключена Arduino (у меня она определилась как COM18)Далее открываем монитор порта и выставляем скорость 115200 (как правило, ESP в базовой прошивке настроена именно на эту скорость, если в ответ на команду Вы увидите абракадабру или вообще ничего можно попробовать 57600) и отправляем команду: ATВ ответ ESP должна отправить OK. Если Вы получили заветное сообщение “OK”, можно изменить скорость на 9600, делается это командой: AT+UART_DEF=9600,8,1,0,0На этом настройка ESP8266 закончена, можно изменить скорость монитора порта на 9600 и снова отправить команду: AT, если все сделано правильно, ESP снова ответит, что все OK.

Сборка схемы

Добавить особо нечего, схема приведена ниже. Обратите внимание, что когда мы настраивали ESP – то ТХ соединяли с ТХ, а RX с RX. В этой схеме связи крестятся.На макетной плате это может выглядеть например так

Регистрация в сервисе http://open-monitoring.online и создание контроллера

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

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

Заключение

На этом разбор примера закончен. Освоив этот материал, не составит большого труда добавить дополнительные параметры: температуру, ток, напряжение, мощность и т.д. Для этого придется немного разобраться в коде программы. Надеюсь кому-то данный сервис поможет решить его задачу, проблему или мечту (как это было в моем случае). Делитесь своими проектами, задавайте вопросы, помогайте новичкам и подписывайтесь на мой канал в YouTube — все обновления сервиса в первую очередь будут выкладываться там: ПОДПИСАТЬСЯ! Открыть код для Arduino// ***************** nsk-electro.ru ***** Семерков Николай **** 2018 // Пример кода осуществляющий чтение температуры датчиков DS18B20, измерение напряжения АКБ // и передачу для визуализации и логгирования на сервис open-monitoring.online // Строки требующие редактирования в комментариях отмечены (!) //*— Подключение библиотек #include <SoftwareSerial.h> #include <OneWire.h> #include <DallasTemperature.h> long nextTime = 100000; // Служебная переменная //*— Настройки контроллера #define SSID «********» // Название точки доступа (!) #define PASS «********» // Пароль (!) String IP = «open-monitoring.online»; // Адрес сервера (не менять) #define esp_bitrate 9600 // Скорость передачи данных между arduino и ESP8266 #define rxpin 10 //RX #define txpin 11 //TX #define one_wire_pin 2 // Вход для подключения датчиков тем-ры //#define AnalogIn1 A0 // Аналоговый вход 1 (Напряжение АКБ) //*— Параметры полученные при регистрации на http://open-monitoring.online String ID = «***»; // ID (!) String KEY = «******»; // Код доступа (!) long interval = 120000; // Периодичность отправки пакетов на сервер (120 секунд) //*— Работа с несколькими датчиками по одной шине OneWire oneWire(one_wire_pin); DallasTemperature sensors(&oneWire); //*— Software Serial SoftwareSerial espSerial( rxpin, txpin ); // RX, TX //*— GET Information String GET = «GET /get?cid=» + ID + «&key=» + KEY; // GET request String HOST = «Host: » + IP + «\r\n\r\n»; void setup() { Serial.begin(esp_bitrate); espSerial.begin(esp_bitrate); sensors.begin(); //Инициализация опроса датчиков температуры DS18B20 (если используются) sendespSerial(«AT»); delay(2000); if (espSerial.find(«OK»)) { Serial.println(«RECEIVED ESP: OK\nData ready to sent!»); connectWiFi(); } } void loop() { //*— Измерение температуры sensors.requestTemperatures(); int t1 = round(sensors.getTempCByIndex(0)); delay(2000); int t2 = round(sensors.getTempCByIndex(1)); delay(2000); // int t3 = round(sensors.getTempCByIndex(2)); String T1 = String(t1); // turn integer to string String T2 = String(t2); // turn integer to string // String T3 = String(t3); // turn integer to string //*— Измерение напряжения делителем (делается 100 замеров и усредняется) // float Volt = 0; // for (int i = 0; i < 100; i++) { // Volt = Volt + (0.0304 * analogRead(AnalogIn1)) / 100; // Пропорция 25,22/3,9В // delay(1); // } // String Uakb = String(Volt); Serial.println(millis()); Serial.print(«Температура датчика 1: «); Serial.println(T1); Serial.print(«Температура датчика 2: «); Serial.println(T2); if ( millis() — nextTime > (interval — 4215) ) { update_param(T1, T2); // Отправляем пакет на сервер, если добавляются еще параметры — дописать через запятую nextTime = millis(); } } //*— Функции —*// //*—Функция отправки в порт ESP и терминал void sendespSerial(String cmd) { Serial.print(«SEND: «); Serial.println(cmd); espSerial.println(cmd); } //*— Соединение с точкой доступа boolean connectWiFi() { espSerial.println(«AT+CWMODE=1»); // Режим работы «клиент» delay(2000); String cmd = «AT+CWJAP=\»»; // Подключение к точке доступа cmd += SSID; cmd += «\»,\»»; cmd += PASS; cmd += «\»»; sendespSerial(cmd); delay(5000); if (espSerial.find(«OK»)) { Serial.println(«Connect: OK»); return true; } else { Serial.println(«Connect: Error»); return false; } cmd = «AT+CIPMUX=0»; // Режим одиночного соединения sendespSerial( cmd ); if ( espSerial.find( «Error») ) { Serial.print( «RECEIVED: Error» ); return false; } } //*— Отправка данных на сервер, если есть параметры, так же дописать через запятую с указанием типа, например: String T3 void update_param( String T1, String T2) { String cmd = «AT+CIPSTART=\»TCP\»,\»»;// Setup TCP connection cmd += IP; cmd += «\»,80″; sendespSerial(cmd); delay(1000); if ( espSerial.find( «Error» ) ) { Serial.print( «RECEIVED: Error\nExit1» ); return; } // Отправка строки на сервер cmd = GET + «&p1=» + T1 + «&p2=» + T2 ; // // cmd += «&p3=» + T3 ; // Раскомментировать для 3-го датчика cmd += » HTTP/1.1\r\n» + HOST; espSerial.print( «AT+CIPSEND=» ); espSerial.println( cmd.length() ); if (espSerial.find( «>» ) ) { Serial.print(«>»); Serial.print(cmd); espSerial.print(cmd); delay(30); } else { sendespSerial( «AT+CIPCLOSE» );//close TCP connection } if ( espSerial.find(«OK») ) { Serial.println( «RECEIVED: OK» ); } else { Serial.println( «RECEIVED: Error\nExit2» ); } serialread(); // Закомментировать после отладки } //*— Отладочная функция (закомментировать после наладки) String s = «»; void serialread() { while (espSerial.available()) { delay(20); if (espSerial.available() > 0) { char c = espSerial.read(); s += c; } } Serial.println(s); Serial.println(«\r\n»); s = «»; } Полное или частичное копирование материалов данной статьи разрешено только при обязательном указании прямой гиперссылки на сайт вида: https://nsk-electro.ru. (Не редирект и не закрыта от индексации поисковиками)

ESP8266 — подключение к Arduino


Продолжение ESP8266.
В предыдущей публикации мы познакомились с Wifi-модулем ESP, научились прошивать, и управлять им с помощью АТ-команд. Сейчас подключим к нему ардуину, которая будет управлять переферией и формировать ответ для клиента. Сам модуль (с заводской прошивкой) делать этого не умеет.
Некоторые действия, предложенные в статье, могут показаться лишними, но я решил быть последовательным в описании сабжа.

Как всё будет работать

Модуль ESP будет подключён к ардуине через программный порт (SoftwareSerial) и обмениваться с ней данными, а сама ардуина будет подключена к компьютеру стандартным способом, чтоб можно было через терминал следить за происходящим.
Компьютер подключён к домашнему роутеру (провод или wifi) и ESP будет подключаться к тому же роутеру по wifi.
Поскольку модуль будет подключаться к программному порту, то необходимо настроить ESP на скорость 9600. (вся инфа по работе с модулем находится )
AT+CIOBAUD=9600
После этого не забудте переправить скорость терминала.

Ардуина

Подключите ESP к ардуине согласно рисунку…


И залейте скетч:
#include <SoftwareSerial.h> SoftwareSerial ESPport(10, 11); ////////////////////// RX, TX // если у вас MEGA, то закомментируйте верхние две строчки и раскомментируйте нижеследующую. // ESP подключите к Serial1 (18, 19), скорость можно сделать 57600 // HardwareSerial & ESPport = Serial1; const int ledPin = 13; int ledState = HIGH; #define BUFFER_SIZE 128 char buffer; String vklotkl; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); // Терминал ESPport.begin(9600); // ESP8266 clearSerialBuffer(); // очистка буфера Serial Serial.println(«RESET 3,5 sek»); Serial.println(GetResponse(«AT+RST»,3400)); // перезагрузка ESP Serial.println(GetResponse(«AT+CWMODE=1»,300)); // режим клиента connectWiFi(«myrouter»,»parolparol»); // подключаемся к домашнему роутеру (имя точки, пароль) Serial.println(GetResponse(«AT+CIPMODE=0»,300)); // сквозной режим передачи данных. Serial.println(GetResponse(«AT+CIPMUX=1»,300)); // multiple connection. Serial.print(«Start TCP-server: «); Serial.println(GetResponse(«AT+CIPSERVER=1,88», 300)); // запускаем ТСР-сервер на 88-ом порту Serial.println(GetResponse(«AT+CIPSTO=2», 300)); // таймаут сервера 2 сек Serial.println(GetResponse(«AT+CIFSR», 300)); // узнаём адрес digitalWrite(ledPin,ledState); } ///////////////////основной цикл, принимает запрос от клиента/////////////////// void loop() { int ch_id, packet_len; // объявляем переменные char *pb; ESPport.readBytesUntil(‘\n’, buffer, BUFFER_SIZE); // читаем строку из есп в переменную «buffer» if(strncmp(buffer, «+IPD,», 5)==0) // если в «buffer» есть строка из пяти символов — «+IPD,» тогда — { // (СИшная функция «strncmp» сравнивает содержимое «buffer» с заданой строкой «+IPD,») sscanf(buffer+5, «%d,%d», &ch_id, &packet_len); // — вычитываем из «buffer» и засовываем в переменные (ch_id и packet_len) id клиента и длину пакета if (packet_len > 0) // (СИшная функция «sscanf») { pb = buffer+5; while(*pb!=’:’) pb++; pb++; if(strncmp(pb, «GET / «, 6) == 0) // если в «pb» есть фраза «GET / «, то { Serial.println(buffer); // выводим в консоль содержимое buffer (просто чтоб поглядеть чего прилетело, для работы эти пять строк можно закомментировать) Serial.print(«get led from ch :»); Serial.println(ch_id); delay(100); clearSerialBuffer(); if(ledState == LOW) // узнаём состояние светика { ledState = HIGH; vklotkl = «VKL»; } else { ledState = LOW; vklotkl = «OTKL»; } digitalWrite(ledPin, ledState); // инвертируем состояние светика otvet_klienty(ch_id); // отправляемся в функцию формирования ответа клиенту (и передаём ей id клиента) } } } clearBuffer(); } //////////////////////формирование ответа клиенту//////////////////// void otvet_klienty(int ch_id) { // собираем строку для клиента (заголовок пакета) String Header; Header = «HTTP/1.1 200 OK\r\n»; Header += «Content-Type: text/html\r\n»; Header += «Connection: close\r\n»; // содержимое пакета String Content; Content = «LED 13: » + vklotkl; Header += «Content-Length: «; Header += (int)(Content.length()); Header += «\r\n\r\n»; ESPport.print(«AT+CIPSEND=»); // ответ клиенту: ат-команда, id-клиента, , , длина пакета ESPport.print(ch_id); ESPport.print(«,»); ESPport.println(Header.length()+Content.length()); delay(20); if(ESPport.find(«>»)) // ожидание от esp приглашения ввода { ESPport.print(Header); // отправка заголовка ESPport.print(Content); // отправка содержимого пакета delay(110); } } /////////////////////отправка АТ-команд///////////////////// String GetResponse(String AT_Command, int wait) { String tmpData; ESPport.println(AT_Command); delay(wait); while (ESPport.available() >0 ) { char c = ESPport.read(); tmpData += c; if ( tmpData.indexOf(AT_Command) > -1 ) tmpData = «»; else tmpData.trim(); } return tmpData; } //////////////////////очистка ESPport//////////////////// void clearSerialBuffer(void) { while ( ESPport.available() > 0 ) { ESPport.read(); } } ////////////////////очистка буфера//////////////////////// void clearBuffer(void) { for (int i =0;i<BUFFER_SIZE;i++ ) { buffer=0; } } ////////////////////подключение к wifi///////////////////// boolean connectWiFi(String NetworkSSID,String NetworkPASS) { String cmd = «AT+CWJAP=\»»; cmd += NetworkSSID; cmd += «\»,\»»; cmd += NetworkPASS; cmd += «\»»; Serial.println(cmd); Serial.println(GetResponse(cmd,6500)); }

При включении, ардуина настраивает модуль АТ-командами:
Сначала ресет, потом задаёт режим (клиент), конектится к домашнему роутеру, устанавливает ещё пару режимов, запускает ТСР-сервер, таймаут сервера (через сколько секунд он будет обрывать соединение) и показавает ip-адрес.
Когда клиент отправляет запрос модулю, модуль передаёт его в ардуину по UARTу, ардуина разбирает его, формирует ответ, отдаёт его обратно модулю (по UARTу) и модуль возвращает ответ клиенту. То есть реализуется обычный HTML протокол.
Откройте терминал, нажмите кнопочку ресет на ардуине и подождите несколько секунд, пока не загорится D13.
Если всё хорошо, то на все команды, модуль будет отвечать ОК. Если появятся надпись «busys» (это один из «глюков» заводской прошивки), то придётся передёрнуть питание или кратковременно закоротить пин RESET на «землю».

Всё ОК…
Зайдите в браузере по адресу 192.168.5.193:88 и увидите LED 13: OTKL, обновите страничку (нажмите F5) — надпись поменяется на LED 13: VKL и светодиод загорится. При этом в терминал будет выдаваться инфа:

Разберём поробнее информацию предоставленную модулем — +IPD,0,339:GET / HTTP/1.1.
Собственно ради этих строчек мы и подключали модуль к программному порту.
+IPD — это служебная команда ESP, сообщающая нам (в данном случае ардуине), что был получен пакет.
0 — это id соединения, как писалось выше, кол-во одновременных соединений (клиентов) может быть не больше четырёх.
339 — это длина пакета (видна только часть, остальное обрезано).
После двоеточия идут сами данные — GET-запрос и версия протокола.
Как только ардуина получает этот запрос от ESP, она его разбирает, включает/отключает светодиод:
void loop() { int ch_id, packet_len; char *pb; ESPport.readBytesUntil(‘\n’, buffer, BUFFER_SIZE); if(strncmp(buffer, «+IPD,», 5)==0) { sscanf(buffer+5, «%d,%d», &ch_id, &packet_len); … digitalWrite(ledPin, ledState); otvet_klienty(ch_id); …
Формирует и отправляет ответ в ESP, который в свою очередь отдаёт его клиенту:
void otvet_klienty(int ch_id) { String Header; Header = «HTTP/1.1 200 OK\r\n»; Header += «Content-Type: text/html\r\n»; Header += «Connection: close\r\n»; String Content; Content = «<body><form action=» method=’GET’><input type=’submit’ value=’VKL/OTKL’> » + vklotkl; Content += «</form></body></html>»; Header += «Content-Length: «; Header += (int)(Content.length()); Header += «\r\n\r\n»; ESPport.print(«AT+CIPSEND=»); …
И так по кругу, запрос-ответ…
Управление ардуиной с помощью обновления страницы не самое удобное решение ))), поэтому нужно приделать кнопку.
Для этого залейте новый скетч…
#include <SoftwareSerial.h> SoftwareSerial ESPport(10, 11); ////////////////////// RX, TX // если у вас MEGA, то закомментируйте верхние две строчки и раскомментируйте нижеследующую. // ESP подключите к Serial1 (18, 19), скорость можно сделать 57600 // HardwareSerial & ESPport = Serial1; const int ledPin = 13; int ledState = HIGH; #define BUFFER_SIZE 128 char buffer; String vklotkl; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); // Терминал ESPport.begin(9600); // ESP8266 clearSerialBuffer(); Serial.println(«RESET 3,5 sek»); Serial.println(GetResponse(«AT+RST»,3400)); // перезагрузка ESP Serial.println(GetResponse(«AT+CWMODE=1»,300)); // режим клиента connectWiFi(«myrouter»,»parolparol»); // подключаемся к домашнему роутеру (имя точки, пароль) Serial.println(GetResponse(«AT+CIPMODE=0»,300)); // сквозной режим передачи данных. Serial.println(GetResponse(«AT+CIPMUX=1»,300)); // multiple connection. Serial.print(«Start TCP-server: «); Serial.println(GetResponse(«AT+CIPSERVER=1,88», 300)); // запускаем ТСР-сервер на 88-ом порту Serial.println(GetResponse(«AT+CIPSTO=2», 300)); // таймаут сервера 2 сек Serial.println(GetResponse(«AT+CIFSR», 300)); // узнаём адрес digitalWrite(ledPin,ledState); } ///////////////////основной цикл, принимает запрос от клиента/////////////////// void loop() { int ch_id, packet_len; char *pb; ESPport.readBytesUntil(‘\n’, buffer, BUFFER_SIZE); if(strncmp(buffer, «+IPD,», 5)==0) { sscanf(buffer+5, «%d,%d», &ch_id, &packet_len); if (packet_len > 0) { pb = buffer+5; while(*pb!=’:’) pb++; pb++; if((strncmp(pb, «GET / «, 6) == 0) || (strncmp(pb, «GET /?», 6) == 0)) { Serial.println(buffer); Serial.print(«get led from ch :»); Serial.println(ch_id); delay(100); clearSerialBuffer(); if(ledState == LOW) { ledState = HIGH; vklotkl = «VKL»; } else { ledState = LOW; vklotkl = «OTKL»; } digitalWrite(ledPin, ledState); otvet_klienty(ch_id); } } } clearBuffer(); } //////////////////////формирование ответа клиенту//////////////////// void otvet_klienty(int ch_id) { String Header; Header = «HTTP/1.1 200 OK\r\n»; Header += «Content-Type: text/html\r\n»; Header += «Connection: close\r\n»; String Content; Content = «<body><form action=» method=’GET’><input type=’submit’ value=’VKL/OTKL’> » + vklotkl; Content += «</form></body></html>»; Header += «Content-Length: «; Header += (int)(Content.length()); Header += «\r\n\r\n»; ESPport.print(«AT+CIPSEND=»); // ответ клиенту ESPport.print(ch_id); ESPport.print(«,»); ESPport.println(Header.length()+Content.length()); delay(20); if(ESPport.find(«>»)) { ESPport.print(Header); ESPport.print(Content); delay(200); } } /////////////////////отправка АТ-команд///////////////////// String GetResponse(String AT_Command, int wait) { String tmpData; ESPport.println(AT_Command); delay(wait); while (ESPport.available() >0 ) { char c = ESPport.read(); tmpData += c; if ( tmpData.indexOf(AT_Command) > -1 ) tmpData = «»; else tmpData.trim(); } return tmpData; } //////////////////////очистка ESPport//////////////////// void clearSerialBuffer(void) { while ( ESPport.available() > 0 ) { ESPport.read(); } } ////////////////////очистка буфера//////////////////////// void clearBuffer(void) { for (int i =0;i<BUFFER_SIZE;i++ ) { buffer=0; } } ////////////////////подключение к wifi///////////////////// boolean connectWiFi(String NetworkSSID,String NetworkPASS) { String cmd = «AT+CWJAP=\»»; cmd += NetworkSSID; cmd += «\»,\»»; cmd += NetworkPASS; cmd += «\»»; Serial.println(cmd); Serial.println(GetResponse(cmd,6500)); }

Изменения коснулись этих частей:
… pb = buffer+5; while(*pb!=’:’) pb++; pb++; if((strncmp(pb, «GET / «, 6) == 0) || (strncmp(pb, «GET /?», 6) == 0)) …
… String Content; Content = «<body><form action=» method=’GET’><input type=’submit’ value=’VKL/OTKL’> » + vklotkl; Content += «</form></body></html>»; …
… и зайдите в браузер…

Нажатие на кнопку будет включать/отключать D13 и менять статус.
В силу того, что заводская прошивка несколько «сыровата» Вы столкнётесь с различными ошибками.
Например, если быстро нажимать на кнопкуили зажатьна клавиатуре, то модуль очень скоро зависнет. Выражается это по разному, может просто не отвечать и не выводить ничего не на страницу, не в терминал, а может ничего не выводить на страницу, но при этом управлять светодиодом на ардуине (если просто обновлять страницу). Может вывести в терминал надпись «busys» и не реагировать не на что, а может и работать при этом. Одним словом, происходит масса непонятных вещей.
Одной из причин нестабильного поведения является ардуина, а точнее низкая скорость программного UARTа (SoftwareSerial) и как следствие не способность быстро отдавать ответ в ESP. Из-за чего на ТСР-сервере ESP увеличивается кол-во соединений (а их может быть не больше четырёх) и он «отваливается».
Частично можно решить проблемы следующим способом:
Не много модифицируем скетч, а точнее переключим общение ардуины с модулем на аппаратный UART и поднимим скорость до 115200.
Предварительно необходимо изменить скорость UARTа у ESP. Сделать это можно просто сбросив модуль к заводским настройкам (при условии, что у Вас стоит прошивка из предыдущей части), после этого скорость будет 115200.
Для этого в скетче, в функции void setup() замените
Serial.println(GetResponse(«AT+RST»,3400));
на
Serial.println(GetResponse(«AT+RESTORE»,3400));
и прошейте ардуину. Теперь у модуля будет скорость 115200.
Далее залейте вот этот скетч:
HardwareSerial & ESPport = Serial; const int ledPin = 13; int ledState = HIGH; #define BUFFER_SIZE 128 char buffer; String vklotkl; void setup() { pinMode(ledPin, OUTPUT); //Serial.begin(9600); // Терминал ESPport.begin(115200); // ESP8266 clearSerialBuffer(); GetResponse(«AT+RST»,3400); // перезагрузка ESP GetResponse(«AT+CWMODE=1»,300); // режим клиента connectWiFi(«myrouter»,»parolparol»); // подключаемся к домашнему роутеру (имя точки, пароль) GetResponse(«AT+CIPMODE=0»,300); // сквозной режим передачи данных. GetResponse(«AT+CIPMUX=1»,300); // multiple connection. GetResponse(«AT+CIPSERVER=1,88», 300); // запускаем ТСР-сервер на 88-ом порту GetResponse(«AT+CIPSTO=2», 300); // таймаут сервера 2 сек GetResponse(«AT+CIFSR», 300); // узнаём адрес digitalWrite(ledPin,ledState); } ///////////////////основной цикл, принимает запрос от клиента/////////////////// void loop() { int ch_id, packet_len; char *pb; ESPport.readBytesUntil(‘\n’, buffer, BUFFER_SIZE); if(strncmp(buffer, «+IPD,», 5)==0) { sscanf(buffer+5, «%d,%d», &ch_id, &packet_len); if (packet_len > 0) { pb = buffer+5; while(*pb!=’:’) pb++; pb++; if((strncmp(pb, «GET / «, 6) == 0) || (strncmp(pb, «GET /?», 6) == 0)) { clearSerialBuffer(); if(ledState == LOW) { ledState = HIGH; vklotkl = «VKL»; } else { ledState = LOW; vklotkl = «OTKL»; } digitalWrite(ledPin, ledState); otvet_klienty(ch_id); } } } clearBuffer(); } //////////////////////формирование ответа клиенту//////////////////// void otvet_klienty(int ch_id) { String Header; Header = «HTTP/1.1 200 OK\r\n»; Header += «Content-Type: text/html\r\n»; Header += «Connection: close\r\n»; String Content; Content = «<body><form action=» method=’GET’><input type=’submit’ value=’VKL/OTKL’> » + vklotkl; Content += «</form></body></html>»; Header += «Content-Length: «; Header += (int)(Content.length()); Header += «\r\n\r\n»; ESPport.print(«AT+CIPSEND=»); // ответ клиенту ESPport.print(ch_id); ESPport.print(«,»); ESPport.println(Header.length()+Content.length()); delay(20); if(ESPport.find(«>»)) { ESPport.print(Header); ESPport.print(Content); delay(200); } } /////////////////////отправка АТ-команд///////////////////// String GetResponse(String AT_Command, int wait) { String tmpData; ESPport.println(AT_Command); delay(wait); while (ESPport.available() >0 ) { char c = ESPport.read(); tmpData += c; if ( tmpData.indexOf(AT_Command) > -1 ) tmpData = «»; else tmpData.trim(); } return tmpData; } //////////////////////очистка ESPport//////////////////// void clearSerialBuffer(void) { while ( ESPport.available() > 0 ) { ESPport.read(); } } ////////////////////очистка буфера//////////////////////// void clearBuffer(void) { for (int i =0;i<BUFFER_SIZE;i++ ) { buffer=0; } } ////////////////////подключение к wifi///////////////////// boolean connectWiFi(String NetworkSSID,String NetworkPASS) { String cmd = «AT+CWJAP=\»»; cmd += NetworkSSID; cmd += «\»,\»»; cmd += NetworkPASS; cmd += «\»»; ESPport.println(cmd); delay(6500); }

Подключите ардуину к ESP вот так:

Нажмите ресет на ардуине, откройте терминал (115200) и ступайте в браузер.
Понажимайте часто кнопку, зажмитеи подержите, после этих «насильственных» действий модуль (скорее всего) будет по прежнему оставаться работоспособным.
В терминал будет сыпаться та инфа, которая «бегает» между ардуиной и ESP.

Если что-то не работает, «передёрните» питание на модуле.
В целях улучшения надёжности, можно активировать встроенный «сторожевой таймер», который будет перегружать модуль при зависаниях.
Однако нужно помнить, что после перезагрузки модуля прейдётся перегружать и ардуину, чтоб она дала команду запуска ТСР-сервера (AT+CIPSERVER=1,88).
Для активации таймера добавьте в void setup() вот эту строчку — GetResponse(«AT+CSYSWDTENABLE»,300);
… GetResponse(«AT+RST»,3400); // перезагрузка ESP GetResponse(«AT+CWMODE=1»,300); // режим клиента GetResponse(«AT+CSYSWDTENABLE»,300); // сторож connectWiFi(«myrouter»,»parolparol»); // подключаемся к домашнему роутеру (имя точки, пароль) …
В общем-то, если добавить в код ещё пару кнопок для управления пинами и вывод информации с каких-нибудь датчиков, то для «домашнего» использования, система вполне сойдёт…
Прошейте в ардуину новый скетч: (не забудте отключить RX,TX)
HardwareSerial & ESPport = Serial; const int ledPin = 13; const int ledPin12 = 12; const int ledPin9 = 9; int ledState = HIGH; int ledState12 = HIGH; int ledState9 = HIGH; #define BUFFER_SIZE 128 char buffer; String vklotkl; String vklotkl12; String vklotkl9; int temp = 22; // переменная, которой будет присваиваться значения например с датчика температуры void setup() { pinMode(ledPin, OUTPUT); pinMode(ledPin12, OUTPUT); pinMode(ledPin9, OUTPUT); ESPport.begin(115200); // ESP8266 clearSerialBuffer(); GetResponse(«AT+RST»,3400); // перезагрузка ESP GetResponse(«AT+CWMODE=1»,300); // режим клиента GetResponse(«AT+CSYSWDTENABLE»,300); // сторож connectWiFi(«myrouter»,»parolparol»); // подключаемся к домашнему роутеру (имя точки, пароль) GetResponse(«AT+CIPMODE=0»,300); // сквозной режим передачи данных. GetResponse(«AT+CIPMUX=1»,300); // multiple connection. GetResponse(«AT+CIPSERVER=1,88», 300); // запускаем ТСР-сервер на 88-ом порту GetResponse(«AT+CIPSTO=3», 300); // таймаут сервера 3 сек GetResponse(«AT+CIFSR», 300); // узнаём адрес digitalWrite(ledPin,ledState); digitalWrite(ledPin12,ledState12); digitalWrite(ledPin9,ledState9); } ///////////////////основной цикл, принимает запрос от клиента/////////////////// void loop() { int ch_id, packet_len; char *pb; ESPport.readBytesUntil(‘\n’, buffer, BUFFER_SIZE); if(strncmp(buffer, «+IPD,», 5)==0) { sscanf(buffer+5, «%d,%d», &ch_id, &packet_len); if (packet_len > 0) { pb = buffer+5; while(*pb!=’:’) pb++; pb++; if(strncmp(pb, «GET / «, 6) == 0) { clearSerialBuffer(); otvet_klienty(ch_id); } //D13 if(strncmp(pb, «GET /a», 6) == 0) { clearSerialBuffer(); if(ledState == LOW) { ledState = HIGH; vklotkl = «VKL»; } else { ledState = LOW; vklotkl = «OTKL»; } digitalWrite(ledPin, ledState); otvet_klienty(ch_id); } //D12 if(strncmp(pb, «GET /b», 6) == 0) { clearSerialBuffer(); if(ledState12 == LOW) { ledState12 = HIGH; vklotkl12 = «VKL»; } else { ledState12 = LOW; vklotkl12 = «OTKL»; } digitalWrite(ledPin12, ledState12); otvet_klienty(ch_id); } //D9 if(strncmp(pb, «GET /c», 6) == 0) { clearSerialBuffer(); if(ledState9 == LOW) { ledState9 = HIGH; vklotkl9 = «VKL»; } else { ledState9 = LOW; vklotkl9 = «OTKL»; } digitalWrite(ledPin9, ledState9); otvet_klienty(ch_id); } } } clearBuffer(); } //////////////////////формирование ответа клиенту//////////////////// void otvet_klienty(int ch_id) { String Header; Header = «HTTP/1.1 200 OK\r\n»; Header += «Content-Type: text/html\r\n»; Header += «Connection: close\r\n»; String Content; Content = «<html><body>»; Content += «<form action=’a’ method=’GET’>D13 <input type=’submit’ value=’VKL/OTKL’> » + vklotkl + «</form>»; Content += «<form action=’b’ method=’GET’>D12 <input type=’submit’ value=’VKL/OTKL’> » + vklotkl12 + «</form>»; Content += «<form action=’c’ method=’GET’>D9 <input type=’submit’ value=’VKL/OTKL’> » + vklotkl9 + «</form>»; Content += «<br />Temp: » + String(temp) + » C»; Content += «</body></html>»; Header += «Content-Length: «; Header += (int)(Content.length()); Header += «\r\n\r\n»; ESPport.print(«AT+CIPSEND=»); // ответ клиенту ESPport.print(ch_id); ESPport.print(«,»); ESPport.println(Header.length()+Content.length()); delay(20); if(ESPport.find(«>»)) { ESPport.print(Header); ESPport.print(Content); delay(200); } } /////////////////////отправка АТ-команд///////////////////// String GetResponse(String AT_Command, int wait) { String tmpData; ESPport.println(AT_Command); delay(wait); while (ESPport.available() >0 ) { char c = ESPport.read(); tmpData += c; if ( tmpData.indexOf(AT_Command) > -1 ) tmpData = «»; else tmpData.trim(); } return tmpData; } //////////////////////очистка ESPport//////////////////// void clearSerialBuffer(void) { while ( ESPport.available() > 0 ) { ESPport.read(); } } ////////////////////очистка буфера//////////////////////// void clearBuffer(void) { for (int i =0;i<BUFFER_SIZE;i++ ) { buffer=0; } } ////////////////////подключение к wifi///////////////////// boolean connectWiFi(String NetworkSSID,String NetworkPASS) { String cmd = «AT+CWJAP=\»»; cmd += NetworkSSID; cmd += «\»,\»»; cmd += NetworkPASS; cmd += «\»»; ESPport.println(cmd); delay(6500); }
Подключите обратно RX,TX, перегрузите модуль, зайдите в браузер и увидите…

На этом пока всё, добавить ещё кнопок или датчиков, я думаю не составит труда.
Как говорилось выше, заводская прошивка пока ещё «сырая», поэтому не стоит доверять ей ответственные задачи.
Обсудить на форуме…