WiFi RGB Lamp Web Server

Dependencies:   mbed ESP8266_WebServer

RGB WiFi Lamp

Firmware

This is the official firmware repository for the BinarySpace RGB WiFi Lamp project. This firmware is still in alpha stage, and subject to change.

Planned changes include:

  • Configure the WiFi Lamp to connect onto your SSID
  • Variety of operating modes like
    • Fixed colour operation
    • Rainbow gradient
    • Time-based colour changing
    • API-based colour changing

Connecting to the WiFi lamp

To connect to the WiFi lamp web server, scan for an open WiFi network using your cellphone, tablet or laptop that begins with the letters ESP_xxxxxx. This is the automatically created SSID of the ESP8266 WiFi module used in the lamp. Your WiFi client needs to be configured to use DHCP.

Once connected, simply point your browser at http://192.168.4.1 and you should see the rudementary web interface allowing you to switch the WiFi lamp on in the red colour or off.

A second option is to enter the following URL
http://192.168.4.1/setcolor?r=x&g=x&b=x
where x is a number between 0 and 255 for the intensity of (r)ed, (g)reen and (b)lue respectively. Any of the r,g,b parts not specified will automatically default to 0

Supported Platforms

  • ST Nucleo F103RB
  • ST Nucleo F302R8
  • ST Nucleo L152RE
  • ST Nucleo F401RE

Unsupported Platforms

  • ST Nucleo F030R8 (unsupported due to insufficient registers for PololuLed library)

How to update your firmware

One of the best things about the ST Nucleo series is that they enumerate as a USB Mass Storage device when plugged in. Updating the firmware is as simple as compiling it using mbed compiler(free registration required to use) for your selected platform, plugging in your Nucleo and copying the .bin file created by the compiler to the USB drive enumerated by the Nucleo. That's it!

Code is fully Open Source

Please feel free to fork this repository and to submit pull requests if you make any cool additions/changes.

If you are developing changes to the firmware and monitoring via serial console for debugging purposes, note than you can simply comment out the #define DEBUG_WIFI line at the top of the main.cpp file to make the output much less verbose. This effectively disables debugging of the WebServer library code and echoing of communications between the Nucleo and the ESP. It also makes the web server noticeably faster, as it doesn't have to output a lot of serial data before handling requests.

LED Strip colour inconsistency

If you are experiencing problems with the LED's not all changing colour, or perhaps flickering or incorrect colour, there could be 2 potential problems we have identified.

  • Power Supply problems - If the power supply is not providing enough power, or not clean enough power, you may experience flickering or random colour changes. Ensure that your power supply can provide enough power (1A @ 5V recommended). If this does not solve your problem, soldering a capacitor over the power supply lines(5V, GND) may help to clean out any noise from the power supply. (100uF minimum)
  • Depending on cable lengths and connectors, noise on the data line may also be a problem. Try soldering a 100Ω - 500Ω resistor in line on the Din pin of the LED strip

Firmware update for the ESP8266 Module

We suggest you upgrade the firmware on the ESP8266 module to the latest official AT firmware from Espressif. Click Here for a detailed upgrade quide.

Committer:
sschocke
Date:
Wed Dec 31 15:15:50 2014 +0000
Revision:
20:f5a6527bfda6
Parent:
19:7fdccfd5b50b
Child:
22:6d7a72fab8ff
Rework of Web Server to handle multiple simultaneous requests

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sschocke 0:d21e3e1c0a4b 1 #include "mbed.h"
sschocke 1:f07afcffeb5a 2 #include "PololuLedStrip.h"
sschocke 7:f15c81074400 3 #include "ESP8266_WebServer.h"
sschocke 0:d21e3e1c0a4b 4 #include <string>
sschocke 13:1e8f27da036a 5 //#define DEBUG_WIFI
sschocke 0:d21e3e1c0a4b 6
sschocke 8:f819de1946a7 7 PololuLedStrip ledStrip(D11);
sschocke 1:f07afcffeb5a 8
sschocke 8:f819de1946a7 9 #define LED_COUNT 8
sschocke 1:f07afcffeb5a 10 rgb_color colors[LED_COUNT];
sschocke 1:f07afcffeb5a 11
sschocke 0:d21e3e1c0a4b 12 DigitalOut wifiCHPD(D4);
sschocke 0:d21e3e1c0a4b 13 DigitalOut wifiReset(D9);
sschocke 0:d21e3e1c0a4b 14
sschocke 0:d21e3e1c0a4b 15 int wifiOn = 0;
sschocke 0:d21e3e1c0a4b 16
sschocke 0:d21e3e1c0a4b 17 Serial wifiSerial(D8,D2);
sschocke 0:d21e3e1c0a4b 18 Serial pc(USBTX,USBRX);
sschocke 7:f15c81074400 19 ESP8266_WebServer server(&wifiSerial);
sschocke 0:d21e3e1c0a4b 20
sschocke 20:f5a6527bfda6 21 const char javascript[] = "function hello() { alert('Hello World'); }";
sschocke 20:f5a6527bfda6 22 const char css[] = "body { background-color:#DDDDDD; font-size:14px; }";
sschocke 20:f5a6527bfda6 23
sschocke 20:f5a6527bfda6 24 #ifdef DEBUG_WIFI
sschocke 20:f5a6527bfda6 25 void pcrxint(void) {
sschocke 20:f5a6527bfda6 26 server.debugBuffers(&pc);
sschocke 20:f5a6527bfda6 27 server.echoMode = true;
sschocke 20:f5a6527bfda6 28 }
sschocke 20:f5a6527bfda6 29 #endif
sschocke 20:f5a6527bfda6 30
sschocke 7:f15c81074400 31 void rxint(void) {
sschocke 7:f15c81074400 32 server.rxint();
sschocke 0:d21e3e1c0a4b 33 }
sschocke 0:d21e3e1c0a4b 34
tomvdb 4:4a502f72cbe3 35 void setColor( uint8_t r, uint8_t g, uint8_t b )
tomvdb 4:4a502f72cbe3 36 {
tomvdb 4:4a502f72cbe3 37 for ( int c = 0; c < LED_COUNT; c++ )
tomvdb 4:4a502f72cbe3 38 {
tomvdb 4:4a502f72cbe3 39 colors[c].red = r;
tomvdb 4:4a502f72cbe3 40 colors[c].green = g;
tomvdb 4:4a502f72cbe3 41 colors[c].blue = b;
tomvdb 4:4a502f72cbe3 42 }
tomvdb 4:4a502f72cbe3 43
tomvdb 4:4a502f72cbe3 44 ledStrip.write(colors, LED_COUNT);
tomvdb 4:4a502f72cbe3 45 }
tomvdb 4:4a502f72cbe3 46
sschocke 0:d21e3e1c0a4b 47 int main() {
sschocke 13:1e8f27da036a 48 pc.baud(115200);
sschocke 20:f5a6527bfda6 49 #ifdef DEBUG_WIFI
sschocke 20:f5a6527bfda6 50 pc.attach(&pcrxint);
sschocke 20:f5a6527bfda6 51 #endif
leet 10:f48a9f923271 52
leet 16:f2f2da9ef9ab 53 pc.printf("WiFi Lamp - v0.02 ...\r\n");
leet 10:f48a9f923271 54
sschocke 13:1e8f27da036a 55 setColor( 25, 0, 0);
tomvdb 4:4a502f72cbe3 56
sschocke 0:d21e3e1c0a4b 57 wifiCHPD = 0;
sschocke 0:d21e3e1c0a4b 58 wifiReset = 0;
sschocke 13:1e8f27da036a 59 wifiSerial.baud(115200);
sschocke 0:d21e3e1c0a4b 60 wifiSerial.attach(&rxint);
sschocke 7:f15c81074400 61 #ifdef DEBUG_WIFI
sschocke 7:f15c81074400 62 server.debugSerial = &pc;
sschocke 7:f15c81074400 63 #endif
sschocke 0:d21e3e1c0a4b 64 wait_ms(1000);
sschocke 0:d21e3e1c0a4b 65
sschocke 0:d21e3e1c0a4b 66 pc.printf("Powering WiFi...\r\n");
sschocke 0:d21e3e1c0a4b 67 wifiCHPD = 1;
sschocke 13:1e8f27da036a 68 wifiReset = 1;
sschocke 0:d21e3e1c0a4b 69 wait_ms(250);
sschocke 0:d21e3e1c0a4b 70 pc.printf("Hardware Reset WiFi...\r\n");
sschocke 0:d21e3e1c0a4b 71 wifiOn = 1;
sschocke 0:d21e3e1c0a4b 72
sschocke 7:f15c81074400 73 pc.printf("Starting Web Server...\r\n");
sschocke 7:f15c81074400 74 server.Initialize();
sschocke 0:d21e3e1c0a4b 75 pc.printf("Done\r\n");
sschocke 0:d21e3e1c0a4b 76
sschocke 13:1e8f27da036a 77 setColor( 0, 25, 0);
tomvdb 4:4a502f72cbe3 78 wait_ms(500);
tomvdb 4:4a502f72cbe3 79 setColor( 0, 0, 0);
tomvdb 4:4a502f72cbe3 80
sschocke 0:d21e3e1c0a4b 81 while(true) {
sschocke 9:319aeb6e0123 82 ESP8266_WebRequest* request = server.GetRequest();
sschocke 9:319aeb6e0123 83 if( request != NULL ) {
sschocke 9:319aeb6e0123 84 pc.printf("HTTP %s %s\r\n", request->Method.c_str(), request->URI.c_str());
sschocke 9:319aeb6e0123 85 for( std::map<std::string,std::string>::iterator it = request->Parameters.begin(); it!=request->Parameters.end(); ++it ) {
sschocke 9:319aeb6e0123 86 pc.printf("HTTP Parameter %s = %s\r\n", it->first.c_str(), it->second.c_str());
sschocke 9:319aeb6e0123 87 }
sschocke 7:f15c81074400 88 std::string httpReply;
sschocke 9:319aeb6e0123 89 if( request->URI == "/" ) {
sschocke 20:f5a6527bfda6 90 httpReply = "<html><head><title>WiFi Lamp</title> \
sschocke 20:f5a6527bfda6 91 <link rel='stylesheet' href='wifilamp.css'> \
sschocke 20:f5a6527bfda6 92 <script src='wifilamp.js'></script></head> \
leet 16:f2f2da9ef9ab 93 <body><h1>The WiFi Lamp v0.02 is alive ...</h1>Quick colour links:<br> \
leet 16:f2f2da9ef9ab 94 <a href='/red'>Red</a><br><a href='/green'>Green</a><br><a href='/blue'>Blue</a><br><a href='/white'>White</a><br> \
leet 16:f2f2da9ef9ab 95 <form id='setcolour' action='setcolour' > \
leet 16:f2f2da9ef9ab 96 <p> \
leet 16:f2f2da9ef9ab 97 Red: <input type='text' name='r' value='0' /> \
leet 16:f2f2da9ef9ab 98 </p> \
leet 16:f2f2da9ef9ab 99 <p> \
leet 16:f2f2da9ef9ab 100 Green: <input type='text' name='g' value='0' /> \
leet 16:f2f2da9ef9ab 101 </p> \
leet 16:f2f2da9ef9ab 102 <p> \
leet 16:f2f2da9ef9ab 103 Blue: <input type='text' name='b' value='0' /> \
leet 16:f2f2da9ef9ab 104 </p> \
leet 16:f2f2da9ef9ab 105 <p> \
leet 16:f2f2da9ef9ab 106 <input type='submit' /> \
leet 16:f2f2da9ef9ab 107 </p> \
leet 16:f2f2da9ef9ab 108 </form> \
leet 16:f2f2da9ef9ab 109 </body></html>";
sschocke 7:f15c81074400 110 setColor(0,0,0);
sschocke 12:fbf950985e1c 111 server.SendReply(request->LinkID, httpReply, mimeHTML);
sschocke 20:f5a6527bfda6 112 } else if( request->URI == "/wifilamp.js" ) {
sschocke 20:f5a6527bfda6 113 server.SendReply(request->LinkID, javascript, strlen(javascript), mimeJavaScript);
sschocke 20:f5a6527bfda6 114 } else if( request->URI == "/wifilamp.css" ) {
sschocke 20:f5a6527bfda6 115 server.SendReply(request->LinkID, css, strlen(css), mimeCSS);
sschocke 9:319aeb6e0123 116 } else if( request->URI == "/red" ) {
leet 10:f48a9f923271 117 httpReply = "<html><head><title>WiFi Lamp</title></head><body><h1>The WiFi Lamp is now Red - To Turn <a href='/'>Off</a></h1></body></html>";
sschocke 7:f15c81074400 118 setColor(100, 0, 0);
sschocke 11:3ab606a42227 119 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 120 } else if( request->URI == "/green" ) {
leet 10:f48a9f923271 121 httpReply = "<html><head><title>WiFi Lamp</title></head><body><h1>The WiFi Lamp is now Green - To Turn <a href='/'>Off</a></h1></body></html>";
leet 10:f48a9f923271 122 setColor(0, 100, 0);
sschocke 12:fbf950985e1c 123 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 124 } else if( request->URI == "/blue" ) {
leet 10:f48a9f923271 125 httpReply = "<html><head><title>WiFi Lamp</title></head><body><h1>The WiFi Lamp is now Blue - To Turn <a href='/'>Off</a></h1></body></html>";
leet 10:f48a9f923271 126 setColor(0, 0, 100);
sschocke 12:fbf950985e1c 127 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 128 } else if( request->URI == "/white" ) {
leet 10:f48a9f923271 129 httpReply = "<html><head><title>WiFi Lamp</title></head><body><h1>The WiFi Lamp is now White - To Turn <a href='/'>Off</a></h1></body></html>";
leet 10:f48a9f923271 130 setColor(100, 100, 100);
sschocke 12:fbf950985e1c 131 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 16:f2f2da9ef9ab 132 } else if( request->URI == "/setcolour" || request->URI == "/setcolor" ) {
sschocke 7:f15c81074400 133 int r=0, g=0, b=0;
sschocke 9:319aeb6e0123 134
sschocke 9:319aeb6e0123 135 if(request->Parameters.count("r") > 0) r=atoi(request->Parameters["r"].c_str());
sschocke 9:319aeb6e0123 136 if(request->Parameters.count("g") > 0) g=atoi(request->Parameters["g"].c_str());
sschocke 9:319aeb6e0123 137 if(request->Parameters.count("b") > 0) b=atoi(request->Parameters["b"].c_str());
sschocke 7:f15c81074400 138
leet 16:f2f2da9ef9ab 139 pc.printf( "Set colour to (%i, %i, %i)\r\n", r,g,b);
sschocke 0:d21e3e1c0a4b 140
sschocke 7:f15c81074400 141 setColor( r,g,b );
sschocke 7:f15c81074400 142
sschocke 7:f15c81074400 143 httpReply = "<html><head><title>WiFi Lamp</title></head><body>ok</body></html>";
sschocke 11:3ab606a42227 144 server.SendReply(request->LinkID, httpReply, mimeHTML);
sschocke 7:f15c81074400 145 } else {
sschocke 11:3ab606a42227 146 server.Send404Error(request->LinkID);
sschocke 0:d21e3e1c0a4b 147 }
sschocke 7:f15c81074400 148 pc.printf("\r\nHTTP Reply Sent\r\n");
sschocke 9:319aeb6e0123 149 delete request;
sschocke 0:d21e3e1c0a4b 150 }
sschocke 0:d21e3e1c0a4b 151 }
sschocke 0:d21e3e1c0a4b 152 }