Last active
July 4, 2017 01:56
-
-
Save naimrajib07/866300d6ba95e77d91bc45f799bb053d to your computer and use it in GitHub Desktop.
Arduino and Node MCU ESP-8266 12E webserver.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <ESP8266WiFi.h> | |
#include <WiFiClient.h> | |
#include <ESP8266WebServer.h> | |
#include <ESP8266mDNS.h> | |
#define LISTEN_PORT 80 | |
// Set your wifi credential | |
const char *ssid = "Your Wifi Name"; | |
const char *password = "Your Wifi Password"; | |
// Config Veraible | |
const int ledOn = 1; | |
const int ledOff = 0; | |
const char *ledBlink = "blink"; | |
const char *blinkOnTime = "blinkOnTime"; | |
const char *blinkOffTime = "blinkOffTime"; | |
const int ledOne = D3; | |
char *ledOneName = "ledOne"; | |
const char *ledOneOnPath = "/led/1/on"; | |
const char *ledOneOffPath = "/led/1/off"; | |
int ledOneNoOfBlink = 0; | |
int ledOneBlinkOn = 0; | |
int ledOneBlinkOff = 0; | |
const int ledTwo = D2; | |
char *ledTwoName = "ledTwo"; | |
const char *ledTwoOnPath = "/led/2/on"; | |
const char *ledTwoOffPath = "/led/2/off"; | |
int ledTwoNoOfBlink = 0; | |
int ledTwoBlinkOn = 0; | |
int ledTwoBlinkOff = 0; | |
const int ledThree = D1; | |
char *ledThreeName = "ledThree"; | |
const char *ledThreeOnPath = "/led/3/on"; | |
const char *ledThreeOffPath = "/led/3/off"; | |
int ledThreeNoOfBlink = 0; | |
int ledThreeBlinkOn = 0; | |
int ledThreeBlinkOff = 0; | |
char *ledStatusPath = "/led/status"; | |
const int statusOn = 1; | |
const int statusOff = 0; | |
char *statusMessageOn = "On"; | |
char *statusMessageOff = "Off"; | |
const char *statusParam = "name"; | |
int noOfRequest; | |
ESP8266WebServer server ( LISTEN_PORT ); | |
void handleNotFound() { | |
noOfRequest = noOfRequest + 1; | |
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 ledStatus() { | |
// Count Request | |
noOfRequest = noOfRequest + 1; | |
String statusMessage = ""; | |
String statusMessageLedOne = digitalRead(ledOne) == HIGH ? "High" : "Low"; | |
String statusMessageLedTwo = digitalRead(ledTwo) == HIGH ? "High" : "Low"; | |
String statusMessageLedThree = digitalRead(ledThree) == HIGH ? "High" : "Low"; | |
if (server.args()) { | |
for ( uint8_t i = 0; i < server.args(); i++ ) { | |
Serial.println("Status Debug..."); | |
Serial.println(server.argName ( i )); | |
Serial.println(server.arg ( i )); | |
if (server.argName ( i ) == statusParam) { | |
if (server.arg ( i ) == ledOneName) { | |
statusMessage = statusMessageLedOne; | |
Serial.println(statusMessage); | |
} else if (server.arg ( i ) == ledTwoName) { | |
statusMessage = statusMessageLedTwo; | |
} else if (server.arg ( i ) == ledThreeName) { | |
statusMessage = statusMessageLedThree; | |
} | |
} | |
} | |
} else { | |
char temp[2500]; | |
int sec = millis() / 1000; | |
int min = sec / 60; | |
int hr = min / 60; | |
snprintf ( temp, 2500, | |
"<html>\ | |
<head>\ | |
<title>ESP8266 WIFI WebServer</title>\ | |
</head>\ | |
<body>\ | |
<h1>Hello from ESP8266!</h1>\ | |
<table width='250px' border='1px solid black' >\ | |
<tr>\ | |
<th>LED</th>\ | |
<th>Status</th>\ | |
</tr>\ | |
<tr>\ | |
<td>#1</td>\ | |
<td>%s</td>\ | |
</tr>\ | |
<tr>\ | |
<td>#2</td>\ | |
<td>%s</td>\ | |
</tr>\ | |
<tr>\ | |
<td>#3</td>\ | |
<td>%s</td>\ | |
</tr>\ | |
</table>\ | |
<p><b>Device Uptime:</b> %02d:%02d:%02d</p>\ | |
<p><b>Number Of Request:</b> %02d</p>\ | |
<b>Command Documentation</b>\ | |
<table border='1px solid black' width='100%' height='350px'>\ | |
<tr>\ | |
<th>Command Title</th>\ | |
<th>REST Command</th>\ | |
<th>Description</th>\ | |
<th>Example</th>\ | |
</tr>\ | |
<tr>\ | |
<td>Check Status</td>\ | |
<td>/led/status</td>\ | |
<td>List all the available LED status and the available REST functionality.</td>\ | |
<td>http://192.168.0.4/led/status</td>\ | |
</tr>\ | |
<tr>\ | |
<td>Check LED Status</td>\ | |
<td>/led/status?name=ledOne</td>\ | |
<td>To Check individual LED Status, have to provide Query Parameter: <b>name</b> <br>The available options are: <ul><li>ledOne</li><li>ledTwo</li><li>ledThree</li></ul></td>\ | |
<td>http://192.168.0.4/led/status?name=ledOne , http://192.168.0.4/led/status?name=ledTwo , http://192.168.0.4/led/status?name=ledThree</td>\ | |
</tr>\ | |
<tr>\ | |
<td>Turn On LED</td>\ | |
<td>/led/(1|2|3)/on</td>\ | |
<td>Turn On Specific LED.</td>\ | |
<td>http://192.168.0.4/led/1/on, http://192.168.0.4/led/2/on, http://192.168.0.4/led/3/on</td>\ | |
</tr>\ | |
<tr>\ | |
<td>Turn Off LED</td>\ | |
<td>/led/(1|2|3)/off</td>\ | |
<td>Turn On Specific LED.</td>\ | |
<td>http://192.168.0.4/led/1/off, http://192.168.0.4/led/2/off, http://192.168.0.4/led/3/off</td>\ | |
</tr>\ | |
<tr>\ | |
<td>Set Blink</td>\ | |
<td>/led/1/on?blinkOnTime=Duration&blinkOffTime=Duration&blink=NoOfBlinks</td>\ | |
<td>To set blink option, there are threee options: <br> <ul><li>blinkOnTime: 500ms</li><li>blinkOffTime: 500ms</li><li>blink: 5</li></ul></td>\ | |
<td>http://192.168.0.4/led/1/on?blinkOnTime=500&blinkOffTime=300&blink=5</td>\ | |
</tr>\ | |
</table>\ | |
</body>\ | |
</html>", statusMessageLedOne.c_str(), statusMessageLedTwo.c_str(), statusMessageLedThree.c_str(), hr, min % 60, sec % 60, int(noOfRequest)); | |
server.send ( 200, "text/html", temp ); | |
} | |
server.send ( 200, "text/plain", statusMessage ); | |
} | |
void handleLed() { | |
// Count Request | |
noOfRequest = noOfRequest + 1; | |
if (server.uri() == ledOneOnPath) { | |
if (server.args()) { | |
setAnimationConfig(ledOneName); | |
ledAnimate(ledOneName, ledOneNoOfBlink, ledOneBlinkOn, ledOneBlinkOff); | |
} else { | |
digitalWrite(ledOne, ledOn); | |
} | |
} else if (server.uri() == ledOneOffPath) { | |
digitalWrite(ledOne, ledOff); | |
} else if (server.uri() == ledTwoOnPath) { | |
if (server.args()) { | |
setAnimationConfig(ledTwoName); | |
ledAnimate(ledTwoName, ledTwoNoOfBlink, ledTwoBlinkOn, ledTwoBlinkOff); | |
} else { | |
digitalWrite(ledTwo, ledOn); | |
} | |
} else if (server.uri() == ledTwoOffPath) { | |
digitalWrite(ledTwo, ledOff); | |
} else if (server.uri() == ledThreeOnPath) { | |
if (server.args()) { | |
setAnimationConfig(ledThreeName); | |
ledAnimate(ledThreeName, ledThreeNoOfBlink, ledThreeBlinkOn, ledThreeBlinkOff); | |
} else { | |
digitalWrite(ledThree, ledOn); | |
} | |
} else if (server.uri() == ledThreeOffPath) { | |
digitalWrite(ledThree, ledOff); | |
} | |
server.sendHeader("Location", String("/"), true); | |
server.send ( 302, "text/plain", ""); | |
} | |
void setAnimationConfig(char *led) { | |
// Led nuber of Blink | |
for ( uint8_t i = 0; i < server.args(); i++ ) { | |
if (server.argName ( i ) == ledBlink) { | |
if (led == ledOneName) { | |
ledOneNoOfBlink = server.arg ( i ).toInt(); | |
} else if (led == ledTwoName) { | |
ledTwoNoOfBlink = server.arg ( i ).toInt(); | |
} else if (led == ledThreeName) { | |
ledThreeNoOfBlink = server.arg ( i ).toInt(); | |
} | |
} | |
// Led Blink on duration | |
if (server.argName ( i ) == blinkOnTime) { | |
if (led == ledOneName) { | |
ledOneBlinkOn = server.arg ( i ).toInt(); | |
} else if (led == ledTwoName) { | |
ledTwoBlinkOn = server.arg ( i ).toInt(); | |
} else if (led == ledThreeName) { | |
ledThreeBlinkOn = server.arg ( i ).toInt(); | |
} | |
} | |
// Led Blink off duration | |
if (server.argName ( i ) == blinkOffTime) { | |
ledOneBlinkOff = server.arg ( i ).toInt(); | |
if (led == ledOneName) { | |
ledOneBlinkOff = server.arg ( i ).toInt(); | |
} else if (led == ledTwoName) { | |
ledTwoBlinkOff = server.arg ( i ).toInt(); | |
} else if (led == ledThreeName) { | |
ledThreeBlinkOff = server.arg ( i ).toInt(); | |
} | |
} | |
} | |
} | |
void ledAnimate(char *led, int ledNoOfBlink, int ledBlinkOn, int ledBlinkOff) { | |
int ledToBlink; | |
if (led == ledOneName ) { | |
ledToBlink = ledOne; | |
} else if (led == ledTwoName) { | |
ledToBlink = ledTwo; | |
} else if (led == ledThreeName) { | |
ledToBlink = ledThree; | |
} | |
for (int i = 0; i < ledNoOfBlink; i++ ) { | |
digitalWrite(ledToBlink, ledOn); | |
delay(ledBlinkOn); | |
digitalWrite(ledToBlink, ledOff); | |
delay(ledBlinkOff); | |
} | |
} | |
void setup ( void ) { | |
// Initialize Led Pin, defualt off/low | |
pinMode ( ledOne, OUTPUT ); | |
digitalWrite ( ledOne, 0 ); | |
pinMode ( ledTwo, OUTPUT ); | |
digitalWrite ( ledTwo, 0 ); | |
pinMode ( ledThree, OUTPUT ); | |
digitalWrite ( ledThree, 0 ); | |
Serial.begin ( 115200 ); | |
Serial.println("Debugging enabled...."); | |
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 ( "esp8266" ) ) { | |
Serial.println ( "MDNS responder started" ); | |
} | |
// Initialize No Of Request | |
noOfRequest = 0; | |
// Route Config | |
server.on ( "/", ledStatus ); | |
server.on ( ledOneOnPath, handleLed ); | |
server.on ( ledOneOffPath, handleLed ); | |
server.on ( ledTwoOnPath, handleLed ); | |
server.on ( ledTwoOffPath, handleLed ); | |
server.on ( ledThreeOnPath, handleLed ); | |
server.on ( ledThreeOffPath, handleLed ); | |
server.on(ledStatusPath, ledStatus); | |
server.onNotFound ( handleNotFound ); | |
server.begin(); | |
Serial.println ( "HTTP server started" ); | |
} | |
void loop ( void ) { | |
server.handleClient(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment