This page is to Setup and Config Serial ESP8266 and Arduino
Hardware and Software
Hardware
Serial ESP8266 and Arduino
Software
Arduino IDE
Example :
Case 1 : Control By Arduino (Programming only on Arduino) (Example 2)
Upload standard frimware to ESP-01 (ESP8266的固件将更改为V0.9.2.3版本)
[System Ready, Vendor:www.ai-thinker.com]
AT+GMR
0018000902
Modify ESP-01 SoftAP (SSID and Password for Client connect)
Case 2 : Send and Receive Data between Arduino and ESP-01
Upload Program to Arduino and ESP-01 (Example)
Case 3 : Only ESP-01 for Software Server
SoftwareSerial on Arduino
This example is very simple Serial Communication ESP8266 and Arduino
ESP8266 ESP-01 have to update frimware to AT Command Mode
Very Good for Web Client ---> ESP-01 Server --> Arduino (By AT Command Call)
Beware Different SDK Version ( This Example Version is : SDK 1.5.3 as at 2016) Check Here
This Sample Have Client and SoftAP but both IP can go into same Service by Arduino Programming
Preset on ESP-01
Client and SoftAP Mode : AT+CWMODE=3
SoftAP : AT+CWSAP="<SSID>","<Password>",11,3
(Two ESP-01 have two SSID)
SoftAP IP : AT+CIPAP="192.168.167.1"
Active DHCP : AT+CWDHCP=2,0
Set MultiConnect : AT+CIPMUX=1
Create Server Port : AT+CIPSERVER=1,80
Set Client :
AT+CWJAP="<SSID>","<Password>"
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
Set Client IP : AT+CIPSTA="192.168.0.150"
CHECK
Check SoftAP
AT+CIPAP="192.168.167.1"
OK
AT+CIPAP?
+CIPAP:ip:"192.168.167.1"
+CIPAP:gateway:"192.168.167.1"
+CIPAP:netmask:"255.255.255.0"
OK
AT+CWSAP?
+CWSAP:"<SSID>","<Password>",11,3,4,0
OK
Check Client
AT+CWJAP?
+CWJAP:"<SSID>","64:71:02:8e:be:42",9,-73
OK
AT+CIPSTA?
+CIPSTA:ip:"192.168.0.150"
+CIPSTA:gateway:"192.168.0.1"
+CIPSTA:netmask:"255.255.255.0"
Last update : 20160505
#include <SoftwareSerial.h>
SoftwareSerial ESPserial(2, 3); // RX | TX
void setup()
{
Serial.begin(9600); // communication with the host computer
//while (!Serial) { ; }
// Start the software serial for communication with the ESP8266
ESPserial.begin(9600);
Serial.println("");
Serial.println("Remember to to set Both NL & CR in the serial monitor.");
Serial.println("Ready");
Serial.println("");
}
void loop()
{
// listen for communication from the ESP8266 and then write it to the serial monitor
if ( ESPserial.available() ) { Serial.write( ESPserial.read() ); }
// listen for user input and send it to the ESP8266
if ( Serial.available() ) { ESPserial.write( Serial.read() ); }
}
/*
Arduino Due - ESP 8266 WiFi Module
Act as AP mode, CWMODE=2
Serial (Tx/Rx) communicate to PC via USB
Serial3 (Tx3/Rx3) connect to ESP8266
Arduino Pin 2 --- Tx3 - ESP8266 Rx
Arduino Pin 3 --- Rx3 - ESP8266 Tx
ESP8266 CH_PD Connect to ESP8266 VCC
#include <SoftwareSerial.h>
SoftwareSerial ESP8266(2, 3); // RX | TX
for firmware:
"v0.9.5.2 AT Firmware"
(http://goo.gl/oRdG3s)
AT version:0.21.0.0
SDK version:0.9.5
How to Use
post : http://<Server>/len=0 or len=1
Respore : message after post
Link
+IPD,0,443:GET /len=1 HTTP/1.1
Host: 192.168.4.1
Conn
*/
#include <SoftwareSerial.h>
SoftwareSerial ESP8266(2, 3); // RX | TX
//#define ESP8266 Serial3
int LED = 13;
boolean FAIL_8266 = false;
#define BUFFER_SIZE 128
char buffer[BUFFER_SIZE];
void setup() {
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
do{
Serial.begin(9600);
ESP8266.begin(9600);
//Wait Serial Monitor to start
while(!Serial);
Serial.println("--- Start ---");
ESP8266.println("AT+RST");
delay(1000);
if(ESP8266.find("OK"))
{
delay(5000);
Serial.println("Module is ready");
ESP8266.println("AT+CWMODE=2");
delay(1000);
clearESP8266SerialBuffer();
//Get and display my IP
sendESP8266Cmdln("AT+CIFSR", 1000);
//Get and display my IP
/* Arduino Due - ESP 8266 WiFi Module Act as AP mode, CWMODE=2 Serial (Tx/Rx) communicate to PC via USB Serial3 (Tx3/Rx3) connect to ESP8266 Arduino Pin 2 --- Tx3 - ESP8266 Rx Arduino Pin 3 --- Rx3 - ESP8266 Tx ESP8266 CH_PD Connect to ESP8266 VCC #include <SoftwareSerial.h> SoftwareSerial ESP8266(2, 3); // RX | TX for firmware: AT version:1.0.0.0 SDK version:1.5.2 How to Use post : http://<Server>/len=0 or len=1 Respore : message after post Link +IPD,0,443:GET /len=1 HTTP/1.1 Host: 192.168.4.1 Conn In This Programming ----- Receive Data from Serial ESP8266 to Arduino Find Postion : Serial.println("+IPD, found"); Read Next char : int connectionId = ESP8266.read()-48; ------------------------------------------------------- Default Setup on ESP8266 ESP-01 SSID : RemoteServer Password : <password> SoftAP IP : 192.168.167.1 SoftAP Gateway : "192.168.167.1" SoftAP netmask : 255.255.255.0 Setup ------ AT+CWSAP="RemoteServer","<password>",11,3 Testing --------- AT+CWSAP? +CWSAP:"RemoteServer","<password>",11,3,4,0 */ #include <SoftwareSerial.h> SoftwareSerial ESP8266(2, 3); // RX | TX //#define ESP8266 Serial3 int LED = 13; boolean FAIL_8266 = false; #define BUFFER_SIZE 128 char buffer[BUFFER_SIZE]; void setup() { pinMode(LED, OUTPUT); digitalWrite(LED, LOW); delay(300); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(300); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(300); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); do{ Serial.begin(115200); ESP8266.begin(115200); //Wait Serial Monitor to start while(!Serial); Serial.println("--- Start ---"); ESP8266.println("AT+RST"); delay(1000); /* Serial.println("--------------- DEBUG ----------------ORGINIAL"); while (ESP8266.available()) Serial.print(char(ESP8266.read())); Serial.println("\n--------------- END DEBUG ----------------"); */ if(ESP8266.find("OK")) { delay(5000); Serial.println("Module is ready"); /* ESP8266.println("AT+CWMODE=2"); delay(1000); clearESP8266SerialBuffer(); //Get and display my IP sendESP8266Cmdln("AT+CIFSR", 1000); //Get and display my IP //sendESP8266Cmdln("AT+CIPSTA=\"192.168.10.1\"", 1000); //ESP8266.println("AT+RST"); */ //Set multi connections sendESP8266Cmdln("AT+CIPMUX=1", 1000); //Setup web server on port 80 sendESP8266Cmdln("AT+CIPSERVER=1,80",1000); Serial.println("Server setup finish"); FAIL_8266 = false; }else{ Serial.println("Module have no response."); delay(500); FAIL_8266 = true; } }while(FAIL_8266); digitalWrite(LED, HIGH); ESP8266.setTimeout(1000); } void loop(){ if(ESP8266.available()) // check if the esp is sending a message { Serial.println("Something received"); delay(1000); //while (ESP8266.available()) // Serial.print(char(ESP8266.read())); //Serial.println(""); /* * --------------- DEBUG ----------------ORGINIAL 1,CLOSED 1,CONNECT +IPD,1,444:GET /len=1 HTTP/1.1 Host: 19 --------------- END DEBUG ---------------- */ /* ----------------------------------------------------------------------- String str = ""; Serial.println("--------------- DEBUG ----------------ORGINIAL"); // // String Control // while (ESP8266.available()) { str += char(ESP8266.read()); } Serial.println(str); // // Serial Control // //while (ESP8266.available()) { // Serial.print(char(ESP8266.read())); //} Serial.println("\n--------------- END DEBUG ----------------"); //------------------------------------------------------------------------------- */ if(ESP8266.find("+IPD,")) { String action; Serial.println("+IPD, found"); int connectionId = ESP8266.read()-48; Serial.println("connectionId: " + String(connectionId)); Serial.println("--------------- DEBUG ----------------A"); char temp = char(ESP8266.read()); while ((temp != '/') && (ESP8266.available())) { Serial.print(temp); temp = char(ESP8266.read()); } Serial.println("\n--------------- END DEBUG ----------------"); boolean isFound = ESP8266.find("len="); Serial.print("is Found : "); Serial.println(isFound); /* Serial.println("--------------- DEBUG ----------------B"); while (ESP8266.available()) Serial.print(char(ESP8266.read())); Serial.println("\n--------------- END DEBUG ----------------"); */ 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); //Close 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 = "\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n"; response += "<body align=center>"; //response += "<img src=\"http://www.imediabank.com/_/rsrc/1462251563655/home/title.png\" />"; //response += "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAALVBMVEX///8EBwfBwsLw8PAzNjaCg4NTVVUjJiZDRUUUFxdiZGSho6OSk5Pg4eFydHTCjaf3AAAAZElEQVQ4je2NSw7AIAhEBamKn97/uMXEGBvozkWb9C2Zx4xzWykBhFAeYp9gkLyZE0zIMno9n4g19hmdY39scwqVkOXaxph0ZCXQcqxSpgQpONa59wkRDOL93eAXvimwlbPbwwVAegLS1HGfZAAAAABJRU5ErkJggg==\" />"; response += "<p></p>"; response += "<a href=\"\len=1\"><font size=\"6\">ON</font></a><p>"; response += "<a href=\"\len=0\"><font size=\"6\">OFF</font></a><p>"; response += "<font size=\"6\">"; response += content; response += "</font>"; response += "</body></html>\n"; 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; } //Send command to ESP8266, assume OK, no error check //wait some time and display respond void sendESP8266Cmdln(String cmd, int waitTime) { ESP8266.println(cmd); delay(waitTime); clearESP8266SerialBuffer(); } //Basically same as sendESP8266Cmdln() //But call ESP8266.print() instead of call ESP8266.println() void sendESP8266Data(String data, int waitTime) { ESP8266.print(data); delay(waitTime); clearESP8266SerialBuffer(); } //Clear and display Serial Buffer for ESP8266 void clearESP8266SerialBuffer() { Serial.println("= clearESP8266SerialBuffer() ="); while (ESP8266.available() > 0) { char a = ESP8266.read(); Serial.write(a); //Serial.write(char(ESP8266.read())); } Serial.println(""); Serial.println("==============================\n"); }
//sendESP8266Cmdln("AT+CIPSTA=\"192.168.10.1\"", 1000);
//ESP8266.println("AT+RST");
//Get and display my IP
sendESP8266Cmdln("AT+CIFSR", 1000);
//Set multi connections
sendESP8266Cmdln("AT+CIPMUX=1", 1000);
//Setup web server on port 80
sendESP8266Cmdln("AT+CIPSERVER=1,80",1000);
Serial.println("Server setup finish");
FAIL_8266 = false;
}else{
Serial.println("Module have no response.");
delay(500);
FAIL_8266 = true;
}
}while(FAIL_8266);
digitalWrite(LED, HIGH);
ESP8266.setTimeout(1000);
}
void loop(){
if(ESP8266.available()) // check if the esp is sending a message
{
Serial.println("Something received");
delay(1000);
//while (ESP8266.available())
// Serial.print(char(ESP8266.read()));
//Serial.println("");
/*
Serial.println("--------------- DEBUG ----------------ORGINIAL");
while (ESP8266.available())
Serial.print(char(ESP8266.read()));
Serial.println("\n--------------- END DEBUG ----------------");
*/
if(ESP8266.find("+IPD,"))
{
String action;
Serial.println("+IPD, found");
int connectionId = ESP8266.read()-48;
Serial.println("connectionId: " + String(connectionId));
Serial.println("--------------- DEBUG ----------------A");
char temp = char(ESP8266.read());
while ((temp != '/') && (ESP8266.available())) {
Serial.print(temp);
temp = char(ESP8266.read());
}
Serial.println("\n--------------- END DEBUG ----------------");
boolean isFound = ESP8266.find("len=");
Serial.print("is Found : ");
Serial.println(isFound);
/*
Serial.println("--------------- DEBUG ----------------B");
while (ESP8266.available())
Serial.print(char(ESP8266.read()));
Serial.println("\n--------------- END DEBUG ----------------");
*/
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);
//Close 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 = "\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
response += "<body align=center>";
response += "<p>";
response += "<a href=\"http://192.168.4.1/len=1\">ON</a><p>";
response += "<a href=\"http://192.168.4.1/len=0\">OFF</a><p>";
response += content;
response += "</body></html>\n";
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;
}
//Send command to ESP8266, assume OK, no error check
//wait some time and display respond
void sendESP8266Cmdln(String cmd, int waitTime)
{
ESP8266.println(cmd);
delay(waitTime);
clearESP8266SerialBuffer();
}
//Basically same as sendESP8266Cmdln()
//But call ESP8266.print() instead of call ESP8266.println()
void sendESP8266Data(String data, int waitTime)
{
ESP8266.print(data);
delay(waitTime);
clearESP8266SerialBuffer();
}
//Clear and display Serial Buffer for ESP8266
void clearESP8266SerialBuffer()
{
Serial.println("= clearESP8266SerialBuffer() =");
while (ESP8266.available() > 0) {
char a = ESP8266.read();
Serial.write(a);
}
Serial.println("==============================");
}