- PVSM.RU - https://www.pvsm.ru -

Arduino Due + ESP8266 ESP-12E c адаптером — быстрый старт

Arduino Due + ESP8266 ESP-12E c адаптером — быстрый старт - 1

Для начал нужен Arduino. В моем случае Arduino Due:

Arduino Due + ESP8266 ESP-12E c адаптером — быстрый старт - 2

В Феврале 2016 года на Aliexpress он стоил 12.19$.

И сам Wi-Fi модуль c адаптером.

Arduino Due + ESP8266 ESP-12E c адаптером — быстрый старт - 3

В том же Феврале 2016г. на Aliexpress он стоил 3.45$.

Вывод AT+GMR:

AT version:0.40.0.0(Aug 8 2015 14:45:58)
SDK version:1.3.0
Ai-Thinker Technology Co.,Ltd.
Build:1.3.0.2 Sep 11 2015 11:48:04
OK

Код взят отсюда [1]. Но меня сразу смутило наличие внешнего источника питания и мне пришлось поменять скорость серийного порта с 9600 на 115200 не считая небольших правок.
Код показывает работу с Wi-Fi модулем на низком уровне [2], но для того, чтобы не усложнять пример, используются задержки. Так что для реальных проектов я рекомендую использовать библиотеку, которая скрывает взаимодействие с модулем.

Подключение:

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 + ") =");
  while (ESP8266.available() > 0) {
    char a = ESP8266.read();
    Serial.write(a);
  }
  Serial.println("==============================");
}

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 OKrn";
  response += "Content-Type: text/html; charset=UTF-8rn"; 
  response += "Content-Length: ";
  response += content.length();
  response += "rn";
  response +="Connection: closernrn";
  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)
{
  ESP8266.print(data);
  delay(waitTime);
  clearESP8266SerialBuffer("sendESP8266Data");
}

Вывод в консоль:

— 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

AT+CIFSR

+CIFSR:STAIP,«192.168.1.12»
+CIFSR:STAMAC,«10:fe:04:d2:c0:2b»

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) =

Recv 102 bytes

SEND OK
0,CLOSED
0,CONNECT

+IPD,0,349:GET /favicon.ico HTTP/1.1
Host: 192.168.1.12
Connection: keep==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPCLOSE=0

0,CLOSED

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) =

Recv 102 bytes

SEND OK
0,CLOSED
0,CONNECT

+IPD,0,349:GET /favicon.ico HTTP/1.1
Host: 192.168.1.12
Connection: keep==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPCLOSE=0

0,CLOSED

OK
==============================

Дальше открываем браузер и вводим 192.168.1.12/?led=0 [3] или 192.168.1.12/?led=1 [4]. IP будет варьироваться в зависимости от настроек DHCP.

В случае не правильных имя сети или пароля:

— Start — --- Reset — Module is ready
wait OK…
CWJAP Success
= clearESP8266SerialBuffer(sendESP8266Cmdln) =

WIFI CONNECTED
WIFI GOT IP
AT+CWJAP=«WIFI»,«WrongPassWord»

WIFI DISCONNECT
AT+CIFSR

busy p…
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPMUX=1

busy p…
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPSERVER=1,80

busy p…
==============================
Server setup finish
Something received

Автор:

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/pesochnitsa/117254

Ссылки в тексте:

[1] отсюда: http://arduino-er.blogspot.com/2015/05/arduino-due-esp8266-web-control-led.html

[2] низком уровне: http://esp8266.ru/esp8266-at-commands-v022/

[3] 192.168.1.12/?led=0: http://192.168.1.12/?led=0

[4] 192.168.1.12/?led=1: http://192.168.1.12/?led=1

[5] Источник: http://geektimes.ru/sandbox/3478/