-
-
Save bbx10/5a2885a700f30af75fc5 to your computer and use it in GitHub Desktop.
/* | |
* Demonstrate using an http server and an HTML form to control an LED. | |
* The http server runs on the ESP8266. | |
* | |
* Connect to "http://esp8266WebForm.local" or "http://<IP address>" | |
* to bring up an HTML form to control the LED connected GPIO#0. This works | |
* for the Adafruit ESP8266 HUZZAH but the LED may be on a different pin on | |
* other breakout boards. | |
* | |
* Imperatives to turn the LED on/off using a non-browser http client. | |
* For example, using wget. | |
* $ wget http://esp8266webform.local/ledon | |
* $ wget http://esp8266webform.local/ledoff | |
*/ | |
#include <ESP8266WiFi.h> | |
#include <WiFiClient.h> | |
#include <ESP8266WebServer.h> | |
#include <ESP8266mDNS.h> | |
// Fill in your WiFi router SSID and password | |
const char* ssid = "xxxxxxxxx"; | |
const char* password = "yyyyyy"; | |
MDNSResponder mdns; | |
ESP8266WebServer server(80); | |
const char INDEX_HTML[] = | |
"<!DOCTYPE HTML>" | |
"<html>" | |
"<head>" | |
"<meta name = \"viewport\" content = \"width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0\">" | |
"<title>ESP8266 Web Form Demo</title>" | |
"<style>" | |
"\"body { background-color: #808080; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }\"" | |
"</style>" | |
"</head>" | |
"<body>" | |
"<h1>ESP8266 Web Form Demo</h1>" | |
"<FORM action=\"/\" method=\"post\">" | |
"<P>" | |
"LED<br>" | |
"<INPUT type=\"radio\" name=\"LED\" value=\"1\">On<BR>" | |
"<INPUT type=\"radio\" name=\"LED\" value=\"0\">Off<BR>" | |
"<INPUT type=\"submit\" value=\"Send\"> <INPUT type=\"reset\">" | |
"</P>" | |
"</FORM>" | |
"</body>" | |
"</html>"; | |
// GPIO#0 is for Adafruit ESP8266 HUZZAH board. Your board LED might be on 13. | |
const int LEDPIN = 0; | |
void handleRoot() | |
{ | |
if (server.hasArg("LED")) { | |
handleSubmit(); | |
} | |
else { | |
server.send(200, "text/html", INDEX_HTML); | |
} | |
} | |
void returnFail(String msg) | |
{ | |
server.sendHeader("Connection", "close"); | |
server.sendHeader("Access-Control-Allow-Origin", "*"); | |
server.send(500, "text/plain", msg + "\r\n"); | |
} | |
void handleSubmit() | |
{ | |
String LEDvalue; | |
if (!server.hasArg("LED")) return returnFail("BAD ARGS"); | |
LEDvalue = server.arg("LED"); | |
if (LEDvalue == "1") { | |
writeLED(true); | |
server.send(200, "text/html", INDEX_HTML); | |
} | |
else if (LEDvalue == "0") { | |
writeLED(false); | |
server.send(200, "text/html", INDEX_HTML); | |
} | |
else { | |
returnFail("Bad LED value"); | |
} | |
} | |
void returnOK() | |
{ | |
server.sendHeader("Connection", "close"); | |
server.sendHeader("Access-Control-Allow-Origin", "*"); | |
server.send(200, "text/plain", "OK\r\n"); | |
} | |
/* | |
* Imperative to turn the LED on using a non-browser http client. | |
* For example, using wget. | |
* $ wget http://esp8266webform/ledon | |
*/ | |
void handleLEDon() | |
{ | |
writeLED(true); | |
returnOK(); | |
} | |
/* | |
* Imperative to turn the LED off using a non-browser http client. | |
* For example, using wget. | |
* $ wget http://esp8266webform/ledoff | |
*/ | |
void handleLEDoff() | |
{ | |
writeLED(false); | |
returnOK(); | |
} | |
void handleNotFound() | |
{ | |
String message = "File Not Found\n\n"; | |
message += "URI: "; | |
message += server.uri(); | |
message += "\nMethod: "; | |
message += (server.method() == HTTP_GET)?"GET":"POST"; | |
message += "\nArguments: "; | |
message += server.args(); | |
message += "\n"; | |
for (uint8_t i=0; i<server.args(); i++){ | |
message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; | |
} | |
server.send(404, "text/plain", message); | |
} | |
void writeLED(bool LEDon) | |
{ | |
// Note inverted logic for Adafruit HUZZAH board | |
if (LEDon) | |
digitalWrite(LEDPIN, 0); | |
else | |
digitalWrite(LEDPIN, 1); | |
} | |
void setup(void) | |
{ | |
pinMode(LEDPIN, OUTPUT); | |
writeLED(false); | |
Serial.begin(115200); | |
WiFi.begin(ssid, password); | |
Serial.println(""); | |
// Wait for connection | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
Serial.println(""); | |
Serial.print("Connected to "); | |
Serial.println(ssid); | |
Serial.print("IP address: "); | |
Serial.println(WiFi.localIP()); | |
if (mdns.begin("esp8266WebForm", WiFi.localIP())) { | |
Serial.println("MDNS responder started"); | |
} | |
server.on("/", handleRoot); | |
server.on("/ledon", handleLEDon); | |
server.on("/ledoff", handleLEDoff); | |
server.onNotFound(handleNotFound); | |
server.begin(); | |
Serial.print("Connect to http://esp8266WebForm.local or http://"); | |
Serial.println(WiFi.localIP()); | |
} | |
void loop(void) | |
{ | |
server.handleClient(); | |
} |
handleClient() is part of the ESP8266WebServer library, it handles some of the background stuff of having a client connect to the server. If handleClient() detects that a client has sent a valid request to the server, and is attempting to access the root of the server ("/"), the function assigned in the server.on("/", handleRoot); line gets called, in this case, "handleRoot".
Great example, thanks. This is the key I was looking for to figure out radio buttons. Still need to spend a lot of time figuring out all the details...
Very helpful to me
Good example. I test dozens of examples and only this one had stability and did not crash. I'm using it now for all my home controls. I tried and failed to implement FIXED IP in this example and I could not. If anybody can help me. FIXED IP is essential for my controls. Thank you
Another thing: I use 2 reles and this example is for only 1. Any suggestions?
Does server.handleClient() run handleRoot()? Having trouble following program flow here