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 08 18:25:16 2015 +0000
Revision:
28:ba5c68a04f56
Parent:
1:f07afcffeb5a
Disco Mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sschocke 1:f07afcffeb5a 1 #include "PololuLedStrip.h"
sschocke 1:f07afcffeb5a 2
sschocke 1:f07afcffeb5a 3 bool PololuLedStrip::interruptFriendly = false;
sschocke 1:f07afcffeb5a 4
sschocke 1:f07afcffeb5a 5 // The two timed delays, in units of half-cycles.
sschocke 1:f07afcffeb5a 6 uint8_t led_strip_write_delays[2];
sschocke 1:f07afcffeb5a 7
sschocke 1:f07afcffeb5a 8 void PololuLedStrip::calculateDelays()
sschocke 1:f07afcffeb5a 9 {
sschocke 1:f07afcffeb5a 10 int f_mhz = SystemCoreClock / 1000000; // Clock frequency in MHz.
sschocke 1:f07afcffeb5a 11
sschocke 1:f07afcffeb5a 12 if (f_mhz <= 48)
sschocke 1:f07afcffeb5a 13 {
sschocke 1:f07afcffeb5a 14 // The delays below result in 360/1120 ns pulses and a 1880 ns period on the mbed NXP LPC11U24.
sschocke 1:f07afcffeb5a 15 led_strip_write_delays[0] = 0;
sschocke 1:f07afcffeb5a 16 led_strip_write_delays[1] = 0;
sschocke 1:f07afcffeb5a 17 }
sschocke 1:f07afcffeb5a 18 else
sschocke 1:f07afcffeb5a 19 {
sschocke 1:f07afcffeb5a 20 // Try to generally compute what the delays should be for a ide range of clock frequencies.
sschocke 1:f07afcffeb5a 21
sschocke 1:f07afcffeb5a 22 // The fudge factors below were experimentally chosen so that we would have
sschocke 1:f07afcffeb5a 23 // ~100/840 ns pulses and a ~1430 ns period on the mbed NXP LPC1768 (96 MHz Cortex-M3).
sschocke 1:f07afcffeb5a 24 // There seem to be some ~100 ns inconsistencies in the timing depending on which example program is
sschocke 1:f07afcffeb5a 25 // running; the most likely explanation is some kind of flash caching that affects the timing.
sschocke 1:f07afcffeb5a 26 // If you ever change these numbers, it is important to check the the subtractions below
sschocke 1:f07afcffeb5a 27 // will not overflow in the worst case (smallest possible f_mhz).
sschocke 1:f07afcffeb5a 28 led_strip_write_delays[0] = 750*f_mhz/1000 - 33;
sschocke 1:f07afcffeb5a 29 led_strip_write_delays[1] = 550*f_mhz/1000 - 20;
sschocke 1:f07afcffeb5a 30 }
sschocke 1:f07afcffeb5a 31
sschocke 1:f07afcffeb5a 32 // Convert from units of cycles to units of half-cycles; it makes the assembly faster.
sschocke 1:f07afcffeb5a 33 for(int i = 0; i < 2; i++)
sschocke 1:f07afcffeb5a 34 {
sschocke 1:f07afcffeb5a 35 led_strip_write_delays[i] <<= 1;
sschocke 1:f07afcffeb5a 36 }
sschocke 1:f07afcffeb5a 37 }
sschocke 1:f07afcffeb5a 38
sschocke 1:f07afcffeb5a 39 PololuLedStrip::PololuLedStrip(PinName pinName)
sschocke 1:f07afcffeb5a 40 {
sschocke 1:f07afcffeb5a 41 gpio_init_out(&gpio, pinName);
sschocke 1:f07afcffeb5a 42 }
sschocke 1:f07afcffeb5a 43
sschocke 1:f07afcffeb5a 44 void PololuLedStrip::write(rgb_color * colors, unsigned int count)
sschocke 1:f07afcffeb5a 45 {
sschocke 1:f07afcffeb5a 46 calculateDelays();
sschocke 1:f07afcffeb5a 47
sschocke 1:f07afcffeb5a 48 __disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
sschocke 1:f07afcffeb5a 49
sschocke 1:f07afcffeb5a 50 while(count--)
sschocke 1:f07afcffeb5a 51 {
sschocke 1:f07afcffeb5a 52 led_strip_write_color(colors, gpio.reg_set, gpio.reg_clr, gpio.mask);
sschocke 1:f07afcffeb5a 53 colors++;
sschocke 1:f07afcffeb5a 54
sschocke 1:f07afcffeb5a 55 if (interruptFriendly)
sschocke 1:f07afcffeb5a 56 {
sschocke 1:f07afcffeb5a 57 __enable_irq();
sschocke 1:f07afcffeb5a 58 __nop();
sschocke 1:f07afcffeb5a 59 __nop();
sschocke 1:f07afcffeb5a 60 __nop();
sschocke 1:f07afcffeb5a 61 __disable_irq();
sschocke 1:f07afcffeb5a 62 }
sschocke 1:f07afcffeb5a 63 }
sschocke 1:f07afcffeb5a 64
sschocke 1:f07afcffeb5a 65 __enable_irq(); // Re-enable interrupts now that we are done.
sschocke 1:f07afcffeb5a 66 wait_us(24); // Hold the line low for 24 microseconds to send the reset signal.
sschocke 1:f07afcffeb5a 67
sschocke 1:f07afcffeb5a 68 //*(gpio.reg_set) = gpio.mask;
sschocke 1:f07afcffeb5a 69 //*(gpio.reg_clr) = gpio.mask;
sschocke 1:f07afcffeb5a 70
sschocke 1:f07afcffeb5a 71 }