Для начал нужен 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 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 IPOK
AT+CIFSR
+CIFSR:STAIP,«192.168.1.12»
+CIFSR:STAMAC,«10:fe:04:d2:c0:2b»OK
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPMUX=1OK
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPSERVER=1,80OK
==============================
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,102OK
> ==============================
— 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=00,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,102OK
> ==============================
— 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=00,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+CIFSRbusy p…
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPMUX=1busy p…
==============================
= clearESP8266SerialBuffer(sendESP8266Cmdln) =
AT+CIPSERVER=1,80busy p…
==============================
Server setup finish
Something received
Автор: