HTTP Server serving a simple webpage which enables to remotely turn LED1 on/off. Compile, download, run and type 'IP_address/secret/' (don't forget the last '/') into your web browser and hit ENTER.

Dependencies:   W5500Interface mbed

Turn LED1, or other digital output, on/off using a web browser.

In this example we create a HTTP server that will serve a simple Web page to remotely turn LED1, or other digital output on the mbed board, on/off by using a web browser. A WIZ550io module or W5500 Network-Shielld is used to assure connection between the mbed module and the Ethernet network (Internet).

Needed parts:

  • mbed board
  • WIZ550io module or W5500 Network-Shield
  • Wires
  • Web browser (Internet Explorer, Safari, Firefox, Chrome ...) running on Windows, Mac, Linux, iPhone or Android device.
/media/uploads/hudakz/webswitch_wiz.jpg/media/uploads/hudakz/webswitch_mobile01.jpg

The project was inspired by the Tuxgraphics Web Switch. Thank you Guido!

NOTE:

Revision:
6:3d74cb156c5c
Parent:
5:458d9d7b5c1b
--- a/main.cpp	Mon Feb 08 22:52:27 2016 +0000
+++ b/main.cpp	Mon May 01 20:04:30 2017 +0000
@@ -13,6 +13,9 @@
 
 using namespace     std;
 
+const int OFF = 0;
+const int ON  = 1;
+
 Serial              serial(USBTX, USBRX);
 
 #if defined(TARGET_LPC1768)
@@ -64,6 +67,7 @@
 
 DigitalOut          sw(LED1);   // Change LED1 to a pin of your choice.
                                 // However, make sure that it does not collide with any of the SPI pins
+float               roomTemp = 21.8;    // A temperature sensor output
 
 const string        PASSWORD = "secret";    // change as you like
 const string        HTTP_OK = "HTTP/1.0 200 OK";
@@ -73,40 +77,39 @@
 string              httpHeader;     // HTTP header
 string              httpContent;    // HTTP content
 
-// analyse the url given
-// return values: -1 invalid password
-//                -2 no command given but password valid
-//                -3 just refresh page
-//                 0 switch off
-//                 1 switch on
-//
-//                The string passed to this function will look like this:
-//                GET /password HTTP/1.....
-//                GET /password/ HTTP/1.....
-//                GET /password/?sw=1 HTTP/1.....
-
-//                GET /password/?sw=0 HTTP/1.....
-int8_t analyseGetURL(string& str) {
-    if(str.substr(5, PASSWORD.size()) != PASSWORD)
+/**
+ * @brief   Analyses the received URL
+ * @note    The string passed to this function will look like this:
+ *          GET /password HTTP/1.....
+ *          GET /password/ HTTP/1.....
+ *          GET /password/?sw=1 HTTP/1.....
+ *          GET /password/?sw=0 HTTP/1.....
+ * @param   url URL string
+ * @retval -1 invalid password
+ *         -2 no command given but password valid
+ *         -3 just refresh page
+ *          0 switch off
+ *          1 switch on
+ */
+int8_t analyseURL(string& url) {
+    if(url.substr(5, PASSWORD.size()) != PASSWORD)
         return(-1);
 
     uint8_t pos = 5 + PASSWORD.size();
 
-    if(str.substr(pos, 1) == " ")
+    if(url.substr(pos, 1) == " ")
         return(-2);
 
-    if(str.substr(pos, 1) != "/")
+    if(url.substr(pos++, 1) != "/")
         return(-1);
 
-    pos++;
-
-    string  cmd(str.substr(pos, 5));
+    string  cmd(url.substr(pos, 5));
 
     if(cmd == "?sw=0")
-        return(0);
+        return(OFF);
 
     if(cmd == "?sw=1")
-        return(1);
+        return(ON);
 
     return(-3);
 }
@@ -134,21 +137,27 @@
  * @param
  * @retval
  */
-string& httpPage(uint8_t status) {
-    httpContent = "<h2>Web Switch</h2>\r\n";
+string& showWebPage(uint8_t status) {
+    char roomTempStr[5];
+
+    //roomTemp = ds1820.read();
+    sprintf(roomTempStr, "%3.1f", roomTemp);
 
-    if(status == 1) {
-        httpContent += "<pre>\r\n  <font color=#FF0000>ON</font>";
-        httpContent += " <a href=\"./?sw=0\">[switch off]</a>\r\n";
+    httpContent = "<h2><a href=\".\" title=\"Click to refresh the page\">Smart Home</a></h2>"; 
+    httpContent += "<pre>Temperature:\t" + string(roomTempStr) + "&deg;C\r\n</pre>";
+
+    if(status == ON) {
+        httpContent += "<pre>\r\nHeating:\t<font color=#FF0000>On </font>";
+        httpContent += " <a href=\"./?sw=0\"><button>Turn off</button></a>\r\n";
     }
     else {
-        httpContent += "<pre>\r\n  <font color=#00FF00>OFF</font>";
-        httpContent += " <a href=\"./?sw=1\">[switch on]</a>\r\n";
+        httpContent += "<pre>\r\nHeating:\t<font color=#999999>Off</font>";
+        httpContent += " <a href=\"./?sw=1\"><button>Turn on</button></a>\r\n";
     }
 
-    httpContent += "  <a href=\".\">[refresh status]</a>\r\n";
     httpContent += "</pre>\r\n";
     httpContent += "<hr>\r\n";
+    httpContent += "<pre>2017 ARMmbed</pre>";
     return httpContent;
 }
 
@@ -232,7 +241,6 @@
     while(serverIsListening) {
         if(server.accept(client) >= 0) {
             char    buf[1024] = { };
-            size_t  size = 0;
             
             serial.printf("Client connected!\n\rIP: %s\n\r", client.get_address());
             
@@ -246,8 +254,6 @@
                 break;
 
             default:
-                size = strlen(buf);
-
                 string  received((char*)buf);
 
                 if(received.substr(0, 3) != "GET") {
@@ -266,7 +272,7 @@
                     continue;
                 }
 
-                int cmd = analyseGetURL(received);
+                int cmd = analyseURL(received);
 
                 if(cmd == -2) {
 
@@ -285,16 +291,16 @@
                     continue;
                 }
 
-                if(cmd == 1) {
-                    sw = 1; // switch on
+                if(cmd == ON) {
+                    sw = ON;    // turn the switch on
                 }
 
-                if(cmd == 0) {
-                    sw = 0; // switch off
+                if(cmd == OFF) {
+                    sw = OFF;   // turn the switch off
                 }
 
                 httpHeader = HTTP_OK;
-                sendHTTP(client, httpHeader, httpPage(sw));
+                sendHTTP(client, httpHeader, showWebPage(sw));
             }
             closeClient();
         }