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.

PololuLedStrip/PololuLedStrip.h

Committer:
sschocke
Date:
2015-01-08
Revision:
28:ba5c68a04f56
Parent:
8:f819de1946a7

File content as of revision 28:ba5c68a04f56:

#include "mbed.h"

#ifndef _POLOLU_LED_STRIP_H
#define _POLOLU_LED_STRIP_H

namespace Pololu
{
    #ifndef _POLOLU_RGB_COLOR
    #define _POLOLU_RGB_COLOR
    
    /** Represents an RGB color. */
    typedef struct rgb_color
    {
        uint8_t green;   /*!< A number between 0 and 255 that represents the brightness of the red component. */
        uint8_t red; /*!< A number between 0 and 255 that represents the brightness of the green component. */
        uint8_t blue;  /*!< A number between 0 and 255 that represents the brightness of the blue component. */
    } rgb_color;
    #endif
#if defined(STM32F10X_MD) || defined(STM32L152xE) || defined(STM32F030x8)
    extern "C" int led_strip_write_color(rgb_color *, volatile uint32_t * set, volatile uint32_t * clear, uint32_t mask);
#endif
#if defined(STM32F401xE) || defined(STM32F302x8)
    extern "C" int led_strip_write_color(rgb_color *, volatile uint16_t * set, volatile uint16_t * clear, uint32_t mask);
#endif

    /** This class lets you control the addressable RGB LED strips from Pololu</a>,
    or any other LED strip based on the TM1804 chip. */
    class PololuLedStrip
    {
        gpio_t gpio;
        
        public:
        
        /** This constructor lets you make an led strip object by specifying the pin name.
        There are no restrictions on what pin you can choose.
        
        Example:
        @code
PololuLedStrip ledStrip(p8);
        @endcode
        */
        PololuLedStrip(PinName pin);
        
        /** Writes the specified series of colors to the LED strip.
        @param colors should be a pointer to an array of rgb_color structs.
        @param count should be the number of colors to write.
        
        The first color in the array will be written to the LED closest to the data input connector.
        To update all the LEDs in the LED strip, count should be equal to or greater than the number of LEDs in the strip.
        If count is less than the number of LEDs in the strip, then some LEDs near the end of the strip will not be updated.
        
        The colors are sent in series and each color takes about 45 microseconds to send.
        This function disables interrupts temporarily while it is running.
        This function waits for over 10 us at the end before returning to allow the colors to take effect.
        */
        void write(rgb_color * colors, unsigned int count);
               
        /** This option defaults to <code>false</code>.
        Setting this to true changes the behavior of the write function, making it enable interrupts
        after each color is sent, about every 60 microseconds.
        This allows your program to respond to interrupts faster, but makes it possible for an interrupt
        that takes longer than 8 microseconds to screw up the transmission of colors to the LED strip.
        
        Example:
        @code
        PololuLedStrip::interruptFriendly = true;
        @endcode
        */
        static bool interruptFriendly;
        
        static void calculateDelays();
    };
}

using namespace Pololu;

#endif