Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Webserver for Arduino ESP8266
//Leonardo
Serial_ & dbgTerminal = Serial;
HardwareSerial & espSerial = Serial1;
////UNO & M328P
//#include <SoftwareSerial.h>
//SoftwareSerial dbgTerminal(10, 11); // RX, TX
//HardwareSerial & espSerial = Serial;
//
////MEGA2560
//HardwareSerial & dbgTerminal = Serial;
//HardwareSerial & espSerial = Serial1;
// set pin numbers:
const int ledPin = 13; // the number of the LED pin
const int ESP8266_CHPD = 4;
// Variables will change:
int ledState = HIGH; // ledState used to set the LED
#define BUFFER_SIZE 128
char buffer[BUFFER_SIZE];
void setup() {
pinMode(ledPin, OUTPUT);
//pinMode(ESP8266_CHPD, OUTPUT);
dbgTerminal.begin(9600); // Serial monitor
espSerial.begin(115200); // ESP8266
//while (!dbgTerminal) {
// ; // wait for serial port to connect. Needed for Leonardo only
//}
dbgTerminal.println(F("ESP8266 demo."));
//hardReset();
//delay(2000);
clearSerialBuffer();
//connect to router
//connectWiFi("YOUR_SSID", "YOUR_PASSWORD");
//test if the module is ready
//dbgTerminal.print("AT : ");
//dbgTerminal.println( GetResponse("AT",100) );
//Change to mode 1
//dbgTerminal.print("AT+CWMODE=1 : ");
//dbgTerminal.println( GetResponse("AT+CWMODE=1",10) );
//set the multiple connection mode
dbgTerminal.print(F("AT+CIPMUX=1 : "));
dbgTerminal.println( GetResponse("AT+CIPMUX=1",10) );
//set the server of port 80 check "no change" or "OK"
dbgTerminal.print(F("AT+CIPSERVER=1,8888 : "));
dbgTerminal.println( GetResponse("AT+CIPSERVER=1,8888", 10) );
//set time out
//dbgTerminal.print("AT+CIPSTO=15 : ");
//dbgTerminal.println( GetResponse("AT+CIPSTO=15",10) );
//print the ip addr
dbgTerminal.print(F("ip address : "));
dbgTerminal.println( GetResponse("AT+CIFSR", 10) );
delay(200);
dbgTerminal.println();
dbgTerminal.println(F("Start Webserver"));
digitalWrite(ledPin,ledState);
}
void loop() {
int ch_id, packet_len;
char *pb;
espSerial.readBytesUntil('\n', buffer, BUFFER_SIZE);
if(strncmp(buffer, "+IPD,", 5)==0) {
// request: +IPD,ch,len:data
sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
if (packet_len > 0) {
// read serial until packet_len character received
// start from :
pb = buffer+5;
while(*pb!=':') pb++;
pb++;
if (strncmp(pb, "GET /led", 8) == 0) {
dbgTerminal.print(millis());
dbgTerminal.print(" : ");
dbgTerminal.println(buffer);
dbgTerminal.print( "get led from ch :" );
dbgTerminal.println(ch_id);
delay(100);
clearSerialBuffer();
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
homepage(ch_id);
} else if (strncmp(pb, "GET / ", 6) == 0) {
dbgTerminal.print(millis());
dbgTerminal.print(" : ");
dbgTerminal.println(buffer);
dbgTerminal.print( "get Status from ch:" );
dbgTerminal.println(ch_id);
delay(100);
clearSerialBuffer();
homepage(ch_id);
}
}
}
clearBuffer();
}
void homepage(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";
//Header += "Refresh: 5\r\n";
String Content;
Content = "D";
Content += String(ledState);
Header += "Content-Length: ";
Header += (int)(Content.length());
Header += "\r\n\r\n";
espSerial.print("AT+CIPSEND=");
espSerial.print(ch_id);
espSerial.print(",");
espSerial.println(Header.length()+Content.length());
delay(10);
// for debug buffer serial error
//while (espSerial.available() >0 ) {
// char c = espSerial.read();
// dbgTerminal.write(c);
// if (c == '>') {
// espSerial.print(Header);
// espSerial.print(Content);
// }
//}
if (espSerial.find(">")) {
espSerial.print(Header);
espSerial.print(Content);
delay(10);
}
// Serial1.print("AT+CIPCLOSE=");
// Serial1.println(ch_id);
}
// Get the data from the WiFi module and send it to the debug serial port
String GetResponse(String AT_Command, int wait){
String tmpData;
espSerial.println(AT_Command);
delay(10);
while (espSerial.available() >0 ) {
char c = espSerial.read();
tmpData += c;
if ( tmpData.indexOf(AT_Command) > -1 )
tmpData = "";
else
tmpData.trim();
}
return tmpData;
}
boolean hardReset() {
String tmpData;
digitalWrite(ESP8266_CHPD,LOW);
delay(100);
digitalWrite(ESP8266_CHPD,HIGH);
delay(1000);
while ( espSerial.available() > 0 ) {
char c = espSerial.read();
tmpData +=c;
espSerial.write(c);
if ( tmpData.indexOf("Ready") > -1 ) {
//Serial.println("Ready");
clearBuffer();
return 1;
}
}
}
void clearSerialBuffer(void) {
while ( espSerial.available() > 0 ) {
espSerial.read();
}
}
void clearBuffer(void) {
for (int i =0;i<BUFFER_SIZE;i++ ) {
buffer[i]=0;
}
}
boolean connectWiFi(String NetworkSSID,String NetworkPASS) {
String cmd = "AT+CWJAP=\"";
cmd += NetworkSSID;
cmd += "\",\"";
cmd += NetworkPASS;
cmd += "\"";
dbgTerminal.println(cmd);
dbgTerminal.println(GetResponse(cmd,10));
}
@jonspieg

This comment has been minimized.

Copy link

jonspieg commented Nov 13, 2014

Thanks for sharing this! This is exactly what I was looking for!
I'm running this code on my arduino nano, and as long as there's a single client everything works great.
Whenever I connect from two (or more) different clients it works for a little while and then stops responding. Usually closing all web browsers and re-opening the url seems to work, but sometimes a full reset (for the arduino) is needed. What can be the problem?

Thanks again!

@thenetimp

This comment has been minimized.

Copy link

thenetimp commented Dec 5, 2014

Has anyone figured out if this thing can act as a SSL web server? I have found information of SSL support, but no any real information as to if it can act like a web server with SSL support.

@pupazzognappo

This comment has been minimized.

Copy link

pupazzognappo commented Dec 9, 2014

Hi! This example brings the lights on all my doubts!!! there's just one thing i'm trying to achieve and is not working for now. How can i get only the "command" itself passed by the url?
For Example, i can i trim the buffer char array to get only the word "led" ?
I replaced the following line : while(_pb!=':') pb++; with this line : while(_pb!='/') pb++;
so now, i can print the following statement : "led HTTP/1.1" . But i'd like to get rid of the final part " HTTP/1.1"
Sorry if my question sound just stupid but i'm a newbye and i cannot undestand the code entirely
Thank you so much for this great example!

@DoodlePain

This comment has been minimized.

Copy link

DoodlePain commented Feb 22, 2016

Which version of firmware needs to work? (Awesome work)

@Dimitris1123

This comment has been minimized.

Copy link

Dimitris1123 commented Apr 3, 2016

Hi everyone,
I have arduino leonardo and the code works fine to me. I have connected a temperature sensor and works fine with all together. Now i want to show in homepage more the data from sensor. How can i edit the code?

@socolaaa

This comment has been minimized.

Copy link

socolaaa commented May 23, 2016

Hi all, I have just compiled this code to lenardo with esp8266, it's great. But I don't know how i run a html to control led via wifi. Every boddy please help me. I'm stater..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.