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:
Thu Jan 01 15:00:33 2015 +0000
Revision:
22:6d7a72fab8ff
Parent:
20:f5a6527bfda6
Child:
23:3563e1699fb9
Added Color Picker function to home screen

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 22:6d7a72fab8ff 4 #include "resource.h"
sschocke 0:d21e3e1c0a4b 5 #include <string>
sschocke 13:1e8f27da036a 6 //#define DEBUG_WIFI
sschocke 0:d21e3e1c0a4b 7
sschocke 8:f819de1946a7 8 PololuLedStrip ledStrip(D11);
sschocke 1:f07afcffeb5a 9
sschocke 8:f819de1946a7 10 #define LED_COUNT 8
sschocke 1:f07afcffeb5a 11 rgb_color colors[LED_COUNT];
sschocke 1:f07afcffeb5a 12
sschocke 0:d21e3e1c0a4b 13 DigitalOut wifiCHPD(D4);
sschocke 0:d21e3e1c0a4b 14 DigitalOut wifiReset(D9);
sschocke 0:d21e3e1c0a4b 15
sschocke 0:d21e3e1c0a4b 16 int wifiOn = 0;
sschocke 0:d21e3e1c0a4b 17
sschocke 0:d21e3e1c0a4b 18 Serial wifiSerial(D8,D2);
sschocke 0:d21e3e1c0a4b 19 Serial pc(USBTX,USBRX);
sschocke 7:f15c81074400 20 ESP8266_WebServer server(&wifiSerial);
sschocke 0:d21e3e1c0a4b 21
sschocke 22:6d7a72fab8ff 22 char temp[200];
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 22:6d7a72fab8ff 90 httpReply = "<html><head><title>RGB WiFi Lamp</title>\
sschocke 22:6d7a72fab8ff 91 <link rel='stylesheet' href='wifilamp.css' />\
sschocke 22:6d7a72fab8ff 92 <script src='wifilamp.js'></script>\
sschocke 22:6d7a72fab8ff 93 </head>\
sschocke 22:6d7a72fab8ff 94 <body onLoad='onLoad()'>\
sschocke 22:6d7a72fab8ff 95 <table>\
sschocke 22:6d7a72fab8ff 96 <tr>\
sschocke 22:6d7a72fab8ff 97 <td style='width:250px' valign='top'>\
sschocke 22:6d7a72fab8ff 98 <img style='margin-right:2px' src='colormap.gif' usemap='#colormap' />\
sschocke 22:6d7a72fab8ff 99 <map id='colormap' name='colormap'>";
sschocke 22:6d7a72fab8ff 100 int startx = 63;
sschocke 22:6d7a72fab8ff 101 int countx = 7;
sschocke 22:6d7a72fab8ff 102 for( int y=0; y<=180; y+=15) {
sschocke 22:6d7a72fab8ff 103 int endx = startx + (countx*18);
sschocke 22:6d7a72fab8ff 104 for( int x=startx; x<endx; x+= 18) {
sschocke 22:6d7a72fab8ff 105 sprintf(temp, areaHTML, x,y, x+9,y+4, x+9,y+15, x,y+19, x-9,y+15, x-9,y+4);
sschocke 22:6d7a72fab8ff 106 httpReply += temp;
sschocke 22:6d7a72fab8ff 107 }
sschocke 22:6d7a72fab8ff 108 if( y < 90 ) {
sschocke 22:6d7a72fab8ff 109 startx -= 9;
sschocke 22:6d7a72fab8ff 110 countx++;
sschocke 22:6d7a72fab8ff 111 } else {
sschocke 22:6d7a72fab8ff 112 startx += 9;
sschocke 22:6d7a72fab8ff 113 countx--;
sschocke 22:6d7a72fab8ff 114 }
sschocke 22:6d7a72fab8ff 115 }
sschocke 22:6d7a72fab8ff 116 httpReply += "</map><br/><span onClick=\"changeColor('#000000')\">Turn Off</span></td><td align='right'></td></tr></table></body>";
sschocke 12:fbf950985e1c 117 server.SendReply(request->LinkID, httpReply, mimeHTML);
sschocke 20:f5a6527bfda6 118 } else if( request->URI == "/wifilamp.js" ) {
sschocke 20:f5a6527bfda6 119 server.SendReply(request->LinkID, javascript, strlen(javascript), mimeJavaScript);
sschocke 20:f5a6527bfda6 120 } else if( request->URI == "/wifilamp.css" ) {
sschocke 20:f5a6527bfda6 121 server.SendReply(request->LinkID, css, strlen(css), mimeCSS);
sschocke 22:6d7a72fab8ff 122 } else if( request->URI == "/colormap.gif" ) {
sschocke 22:6d7a72fab8ff 123 server.SendReply(request->LinkID, (char*)colormap, sizeof(colormap), "image/gif");
sschocke 9:319aeb6e0123 124 } else if( request->URI == "/red" ) {
leet 10:f48a9f923271 125 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 126 setColor(100, 0, 0);
sschocke 11:3ab606a42227 127 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 128 } else if( request->URI == "/green" ) {
leet 10:f48a9f923271 129 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 130 setColor(0, 100, 0);
sschocke 12:fbf950985e1c 131 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 132 } else if( request->URI == "/blue" ) {
leet 10:f48a9f923271 133 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 134 setColor(0, 0, 100);
sschocke 12:fbf950985e1c 135 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 136 } else if( request->URI == "/white" ) {
leet 10:f48a9f923271 137 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 138 setColor(100, 100, 100);
sschocke 12:fbf950985e1c 139 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 16:f2f2da9ef9ab 140 } else if( request->URI == "/setcolour" || request->URI == "/setcolor" ) {
sschocke 7:f15c81074400 141 int r=0, g=0, b=0;
sschocke 9:319aeb6e0123 142
sschocke 9:319aeb6e0123 143 if(request->Parameters.count("r") > 0) r=atoi(request->Parameters["r"].c_str());
sschocke 9:319aeb6e0123 144 if(request->Parameters.count("g") > 0) g=atoi(request->Parameters["g"].c_str());
sschocke 9:319aeb6e0123 145 if(request->Parameters.count("b") > 0) b=atoi(request->Parameters["b"].c_str());
sschocke 7:f15c81074400 146
leet 16:f2f2da9ef9ab 147 pc.printf( "Set colour to (%i, %i, %i)\r\n", r,g,b);
sschocke 0:d21e3e1c0a4b 148
sschocke 7:f15c81074400 149 setColor( r,g,b );
sschocke 7:f15c81074400 150
sschocke 7:f15c81074400 151 httpReply = "<html><head><title>WiFi Lamp</title></head><body>ok</body></html>";
sschocke 11:3ab606a42227 152 server.SendReply(request->LinkID, httpReply, mimeHTML);
sschocke 7:f15c81074400 153 } else {
sschocke 11:3ab606a42227 154 server.Send404Error(request->LinkID);
sschocke 0:d21e3e1c0a4b 155 }
sschocke 7:f15c81074400 156 pc.printf("\r\nHTTP Reply Sent\r\n");
sschocke 9:319aeb6e0123 157 delete request;
sschocke 0:d21e3e1c0a4b 158 }
sschocke 0:d21e3e1c0a4b 159 }
sschocke 0:d21e3e1c0a4b 160 }