Pull to refresh

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



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



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

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



В том же Феврале 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

Код взят отсюда. Но меня сразу смутило наличие внешнего источника питания и мне пришлось поменять скорость серийного порта с 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 + ") =");
  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 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)
{
  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 или 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»

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.