Introduction: ESP8266 Led Strip MQTT Control Lights WS2812
I always wanted under bed led lights so that I can control the mood or even on the family room underneath the tv to get very subtle lighting. I could write rules in OpenHAB and it takes care of the rest. This is a rather simple setup to get everything accomplished over MQTT thanks to the power of Homie Framework with only a few lines of code.
Things to consider before getting started. Depending on the size of your LED Strip of WS2812s, you will need to adjust.
Each LED light consumes about 60 mA, so if you are powering 60, the minimum Amperage would be as follows. As you add more lights, the power requirements also increase.
60 LEDs × 60 mA ÷ 1,000 = 3.6 Amps minimum
Parts List:
Step 1: Wiring
The wiring schematic is fairly simple.
Note: Please make sure you have the polarity right on the power supply or you can damage the LEDs and/or ESP8266.
From Power Supply
- VCC Line to Wemos D1 5V Pin and to Positive/Red Wire on LED Strip
- GND Line to Wemos D1 GND Pin and to Ground/White Wire on LED Strip
- Add 1000uf Capacitor on Ground/5V line close to LED Strip
From Wemos D1
- Connect D1 Pin to Data/Green Wire on LED Strip.
Thats it. :)
Step 2: Programming
Dependencies for Arduino are Homie 2.0 which you can get from their Github and the Adafruit Neopixel Library
- Homie 2.0 Framework / Readme* Please note, Homie has other dependencies which is covered on their Readme
- Adafruit Neopixel Library
Sketch for Arduino
#include <Homie.h>
#include <Adafruit_NeoPixel.h>#define FW_NAME "led-control" #define FW_VERSION "1.0.0"
#define PIN D1 #define LED_COUNT 60
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800); int delayval = 500; int showType = 0; int SoffitR; int SoffitG; int SoffitB; int numPixels = LED_COUNT;
HomieNode ledNode("led", "led");
bool lightOnHandler(HomieRange range, String value) { if (value == "off") { colorWipe(strip.Color(0, 0, 0), 50); // Black/off Homie.setNodeProperty(ledNode, "color").send("0,0,0,0"); } else if (value == "red") { colorWipe(strip.Color(255, 0, 0), 50); // Red Homie.setNodeProperty(ledNode, "color").send("0,255,0,0"); } else if (value == "green") { colorWipe(strip.Color(0, 255, 0), 50); // Green Homie.setNodeProperty(ledNode, "color").send("0,0,255,0"); } else if (value == "blue") { colorWipe(strip.Color(0, 0, 255), 50); // Blue Homie.setNodeProperty(ledNode, "color").send("0,0,255,0"); } else { //value.trim(); Serial.print (value); //Serial.flush(); // split string at every "," and store in proper variable // convert final result to integer SoffitR = value.substring(0,value.indexOf(',')).toInt(); SoffitG = value.substring(value.indexOf(',')+1,value.lastIndexOf(',')).toInt(); SoffitB = value.substring(value.lastIndexOf(',')+1).toInt(); colorWipe(strip.Color(SoffitR, SoffitG, SoffitB), 50); Homie.setNodeProperty(ledNode, "color").send(value); } return true; } int i;
void colorWipe(uint32_t c, uint8_t wait) { for (uint16_t i=0; i
void setup() { Serial.begin(115200); Serial.println(FW_NAME FW_VERSION); strip.begin();
Homie_setFirmware(FW_NAME, FW_VERSION); ledNode.advertise("color").settable(lightOnHandler);
Homie.setup();
}
void loop() { Homie.loop(); }
JSON Config File
{
"name": "LED for TV Stand", "device_id": "family-room-tv-led", "wifi": { "ssid": "MYSSDID", "password": "MYWIFIPASSWORD" }, "mqtt": { "host": "MY MQTT SERVER", "port": 1883, "base_topic": "devices/", "auth": true, "username": "sensor", "password": "sensor1" }, "ota": { "enabled": true } }
OpenHAB
Items
Color TVLedLight "Bed Color" <colorlight> (All)
String TVLedLightColor (All) {mqtt=">[OpenHab:devices/family-room-tv-led/led/color/set:command:*:default]"}
Sitemap
Text label="Family Room" icon="sofa" {
Frame label="Switches"Switch item=wifiplug_living_room
Colorpicker item=TVLedLight
}
}
Rules
import org.openhab.core.library.types.*
rule "Set RGB value TVLedLight"
whenItem TVLedLight changed
then
val hsbValue = TVLedLight.state as HSBType
val brightness = hsbValue.brightness.intValue
val redValue = ((((hsbValue.red.intValue * 255) / 100) * brightness) / 100).toString
val greenValue = ((((hsbValue.green.intValue * 255) / 100) * brightness) / 100).toString
val blueValue = ((((hsbValue.blue.intValue *255) / 100) * brightness) / 100).toString
val color = redValue + "," + greenValue + "," + blueValue
sendCommand( TVLedLightColor, color )
end
Give it a test run.
Thanks for reading.
* I maybe compensated for some links.