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:
Mon Dec 29 21:00:26 2014 +0000
Revision:
19:7fdccfd5b50b
Parent:
13:1e8f27da036a
Parent:
16:f2f2da9ef9ab
Child:
20:f5a6527bfda6
Merge leet's front page changes into new firmware branch

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 7:f15c81074400 21 void rxint(void) {
sschocke 7:f15c81074400 22 server.rxint();
sschocke 0:d21e3e1c0a4b 23 }
sschocke 0:d21e3e1c0a4b 24
tomvdb 4:4a502f72cbe3 25 void setColor( uint8_t r, uint8_t g, uint8_t b )
tomvdb 4:4a502f72cbe3 26 {
tomvdb 4:4a502f72cbe3 27 for ( int c = 0; c < LED_COUNT; c++ )
tomvdb 4:4a502f72cbe3 28 {
tomvdb 4:4a502f72cbe3 29 colors[c].red = r;
tomvdb 4:4a502f72cbe3 30 colors[c].green = g;
tomvdb 4:4a502f72cbe3 31 colors[c].blue = b;
tomvdb 4:4a502f72cbe3 32 }
tomvdb 4:4a502f72cbe3 33
tomvdb 4:4a502f72cbe3 34 ledStrip.write(colors, LED_COUNT);
tomvdb 4:4a502f72cbe3 35 }
tomvdb 4:4a502f72cbe3 36
sschocke 0:d21e3e1c0a4b 37 int main() {
sschocke 13:1e8f27da036a 38 pc.baud(115200);
leet 10:f48a9f923271 39
leet 16:f2f2da9ef9ab 40 pc.printf("WiFi Lamp - v0.02 ...\r\n");
leet 10:f48a9f923271 41
sschocke 13:1e8f27da036a 42 setColor( 25, 0, 0);
tomvdb 4:4a502f72cbe3 43
sschocke 0:d21e3e1c0a4b 44 wifiCHPD = 0;
sschocke 0:d21e3e1c0a4b 45 wifiReset = 0;
sschocke 13:1e8f27da036a 46 wifiSerial.baud(115200);
sschocke 0:d21e3e1c0a4b 47 wifiSerial.attach(&rxint);
sschocke 7:f15c81074400 48 #ifdef DEBUG_WIFI
sschocke 7:f15c81074400 49 server.debugSerial = &pc;
sschocke 7:f15c81074400 50 #endif
sschocke 0:d21e3e1c0a4b 51 wait_ms(1000);
sschocke 0:d21e3e1c0a4b 52
sschocke 0:d21e3e1c0a4b 53 pc.printf("Powering WiFi...\r\n");
sschocke 0:d21e3e1c0a4b 54 wifiCHPD = 1;
sschocke 13:1e8f27da036a 55 wifiReset = 1;
sschocke 0:d21e3e1c0a4b 56 wait_ms(250);
sschocke 0:d21e3e1c0a4b 57 pc.printf("Hardware Reset WiFi...\r\n");
sschocke 0:d21e3e1c0a4b 58 wifiOn = 1;
sschocke 0:d21e3e1c0a4b 59
sschocke 7:f15c81074400 60 pc.printf("Starting Web Server...\r\n");
sschocke 7:f15c81074400 61 server.Initialize();
sschocke 0:d21e3e1c0a4b 62 pc.printf("Done\r\n");
sschocke 0:d21e3e1c0a4b 63
sschocke 13:1e8f27da036a 64 setColor( 0, 25, 0);
tomvdb 4:4a502f72cbe3 65 wait_ms(500);
tomvdb 4:4a502f72cbe3 66 setColor( 0, 0, 0);
tomvdb 4:4a502f72cbe3 67
sschocke 0:d21e3e1c0a4b 68 while(true) {
sschocke 9:319aeb6e0123 69 ESP8266_WebRequest* request = server.GetRequest();
sschocke 9:319aeb6e0123 70 if( request != NULL ) {
sschocke 9:319aeb6e0123 71 pc.printf("HTTP %s %s\r\n", request->Method.c_str(), request->URI.c_str());
sschocke 9:319aeb6e0123 72 for( std::map<std::string,std::string>::iterator it = request->Parameters.begin(); it!=request->Parameters.end(); ++it ) {
sschocke 9:319aeb6e0123 73 pc.printf("HTTP Parameter %s = %s\r\n", it->first.c_str(), it->second.c_str());
sschocke 9:319aeb6e0123 74 }
sschocke 7:f15c81074400 75 std::string httpReply;
sschocke 9:319aeb6e0123 76 if( request->URI == "/" ) {
leet 16:f2f2da9ef9ab 77 httpReply = "<html><title>WiFi Lamp</title> \
leet 16:f2f2da9ef9ab 78 <body><h1>The WiFi Lamp v0.02 is alive ...</h1>Quick colour links:<br> \
leet 16:f2f2da9ef9ab 79 <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 80 <form id='setcolour' action='setcolour' > \
leet 16:f2f2da9ef9ab 81 <p> \
leet 16:f2f2da9ef9ab 82 Red: <input type='text' name='r' value='0' /> \
leet 16:f2f2da9ef9ab 83 </p> \
leet 16:f2f2da9ef9ab 84 <p> \
leet 16:f2f2da9ef9ab 85 Green: <input type='text' name='g' value='0' /> \
leet 16:f2f2da9ef9ab 86 </p> \
leet 16:f2f2da9ef9ab 87 <p> \
leet 16:f2f2da9ef9ab 88 Blue: <input type='text' name='b' value='0' /> \
leet 16:f2f2da9ef9ab 89 </p> \
leet 16:f2f2da9ef9ab 90 <p> \
leet 16:f2f2da9ef9ab 91 <input type='submit' /> \
leet 16:f2f2da9ef9ab 92 </p> \
leet 16:f2f2da9ef9ab 93 </form> \
leet 16:f2f2da9ef9ab 94 </body></html>";
sschocke 7:f15c81074400 95 setColor(0,0,0);
sschocke 12:fbf950985e1c 96 server.SendReply(request->LinkID, httpReply, mimeHTML);
sschocke 9:319aeb6e0123 97 } else if( request->URI == "/red" ) {
leet 10:f48a9f923271 98 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 99 setColor(100, 0, 0);
sschocke 11:3ab606a42227 100 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 101 } else if( request->URI == "/green" ) {
leet 10:f48a9f923271 102 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 103 setColor(0, 100, 0);
sschocke 12:fbf950985e1c 104 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 105 } else if( request->URI == "/blue" ) {
leet 10:f48a9f923271 106 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 107 setColor(0, 0, 100);
sschocke 12:fbf950985e1c 108 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 10:f48a9f923271 109 } else if( request->URI == "/white" ) {
leet 10:f48a9f923271 110 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 111 setColor(100, 100, 100);
sschocke 12:fbf950985e1c 112 server.SendReply(request->LinkID, httpReply, mimeHTML);
leet 16:f2f2da9ef9ab 113 } else if( request->URI == "/setcolour" || request->URI == "/setcolor" ) {
sschocke 7:f15c81074400 114 int r=0, g=0, b=0;
sschocke 9:319aeb6e0123 115
sschocke 9:319aeb6e0123 116 if(request->Parameters.count("r") > 0) r=atoi(request->Parameters["r"].c_str());
sschocke 9:319aeb6e0123 117 if(request->Parameters.count("g") > 0) g=atoi(request->Parameters["g"].c_str());
sschocke 9:319aeb6e0123 118 if(request->Parameters.count("b") > 0) b=atoi(request->Parameters["b"].c_str());
sschocke 7:f15c81074400 119
leet 16:f2f2da9ef9ab 120 pc.printf( "Set colour to (%i, %i, %i)\r\n", r,g,b);
sschocke 0:d21e3e1c0a4b 121
sschocke 7:f15c81074400 122 setColor( r,g,b );
sschocke 7:f15c81074400 123
sschocke 7:f15c81074400 124 httpReply = "<html><head><title>WiFi Lamp</title></head><body>ok</body></html>";
sschocke 11:3ab606a42227 125 server.SendReply(request->LinkID, httpReply, mimeHTML);
sschocke 7:f15c81074400 126 } else {
sschocke 11:3ab606a42227 127 server.Send404Error(request->LinkID);
sschocke 0:d21e3e1c0a4b 128 }
sschocke 7:f15c81074400 129 pc.printf("\r\nHTTP Reply Sent\r\n");
sschocke 9:319aeb6e0123 130 delete request;
sschocke 0:d21e3e1c0a4b 131 }
sschocke 1:f07afcffeb5a 132
sschocke 0:d21e3e1c0a4b 133 wait_ms(10);
sschocke 0:d21e3e1c0a4b 134 }
sschocke 0:d21e3e1c0a4b 135 }