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[BUFFER_SIZE];
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[i]=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[BUFFER_SIZE];
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[i]=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 и менять статус.
В силу того, что заводская прошивка несколько «сыровата» Вы столкнётесь с различными ошибками.
Например, если быстро нажимать на кнопку


Одной из причин нестабильного поведения является ардуина, а точнее низкая скорость программного 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[BUFFER_SIZE];
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[i]=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[BUFFER_SIZE];
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[i]=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, перегрузите модуль, зайдите в браузер и увидите...

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

- +432
- stD
105542
Поддержать автора
Комментарии (38)
Еще момент, если у меня роутер требует для подключения ip адрес и DNS, как их указать модулю перед подключением?
В чем дело?
#include <SoftwareSerial.h>
SoftwareSerial ESPport(10, 11);
void setup() {
Serial.begin(9600);
ESPport.begin(9600);
Serial.println(GetResponse(«AT+RST»,3400));
Serial.println(GetResponse(«AT+CWMODE=1»,300));
connectWiFi(«Evgen»,«985223ea»);
Serial.println(GetResponse(«AT+CIPMODE=0»,300));
Serial.println(GetResponse(«AT+CIPMUX=1»,300));
Serial.println(GetResponse(«AT+CIPSERVER=1,666»,300));
Serial.println(GetResponse(«AT+CIFSR», 300));
}
boolean connectWiFi(String NetworkSSID,String NetworkPASS)
{
String cmd = «AT+CWJAP=\»";
cmd += NetworkSSID;
cmd += "\",\"";
cmd += NetworkPASS;
cmd += "\"";
Serial.println(cmd);
Serial.println(GetResponse(cmd,6500));
}
String GetResponse(String AT_Command, int wait)
{
String tmpData;
ESPport.println(AT_Command);
delay(wait);
while (ESPport.available() >0 )
{
char c = ESPport.read();
Serial.println(1);
tmpData += c;
if ( tmpData.indexOf(AT_Command) > -1 )
tmpData = "";
else
tmpData.trim();
}
return tmpData;
}
void loop() {
Serial.println(GetResponse(«AT+CIpsend=0,10»,2000));
Serial.println(GetResponse(«Privet»,2000));
}
Попробуйте давать команды через serial monitor, что будет?