moodlite - Coming soon

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Topics - CdRsKuLL

Pages: 1
moodlite Design / New moodlite Designs Release - Help required
« on: February 04, 2019, 10:22:05 AM »
Hey moodliter's,

I want to put together a new release of the designs and need your help :-)

Any modified files that you would like to become part of this package can you please post the STL / Step files if you have them below. It's designs that can be used by others really..

So, for example I know we have anew power module STL that allows you to use both types of NodeMCU's.. etc.

I think it's just a good way to keep all new files in one place for others to download.  A readme will be created with credits to designers too. :-)



moodlite Design / PRE-RELEASE - Square moodlite shape
« on: January 28, 2019, 09:48:34 AM »
So I've had this idea for a bit and after seeing a post by Furis I thought it's time to pull my finger out and get something done.

After a couple of hours I think we now have a square moodlite :-)

This will use the standard 4 LED's and uses the same principle as the three sided ones. Also, I've made it a similar size so you can mix and match :-)

I have not printed these out yet, that's why it's a pre-release version...  please let me know if you make one.



moodlite Chitchat / Shoutbox working?
« on: January 08, 2019, 10:54:24 PM »
Just wondering if the shoutbox / chat thing i working on the front page?


moodlite Chitchat / New Facebook group..
« on: January 07, 2019, 10:21:20 AM »
Moodlite now has a facebook group..

Please join and get involved :-)


moodlite Chitchat / moodlite release 2 ready for download
« on: January 03, 2019, 08:18:05 AM »

To download you must be a member and logged in...

Download at -;cat=1

I've updated the tile bottom design by reducing the internal pyramid height and also removed the need to loop back on yourself when wiring. This makes it easier and also reduces the print time.

Renders attached below



moodlite Design / Possibly new tile bottom - Shallow version
« on: January 01, 2019, 09:56:26 PM »
Spigot requested a shallow version which I've done. Looking at it I think it's a good idea. I'll print one out overnight and compare it to the current version. If it doesn't really make much difference then I will be swapping to this version going forward as it will save on print time / filament but it might also allow easier placement of a diffuser type material if needed..

Will update tomorrow

Off Topic Discussion / Enabled https...
« on: December 30, 2018, 10:26:15 PM »

I've enabled https on the website to make it more secure. Apologies if any downtime was caused.

On the odd chance you do find a problem, please let me know and I'll try and sort it out.

Many thanks,


moodlite Software / Moodlite source now on Github
« on: December 30, 2018, 09:05:43 PM »
Moodlite is now on Github :-). Many thanks to Spigot for setting this up. I've not a clue when it comes to Github but I know a lot of people have requested this so a big thank you for getting it up there.

Official releases will still be available from the download section here but all the development work will be carried out on GitHub, so please if you would like to get involved or just want to see what's being worked on then please give Spigot a shout and go and visit the link above.

Thanks again




Let's talk 3D printers... / Building a Prusa MK3 Clone...
« on: December 30, 2018, 12:13:57 PM »
So I thought I would have a go at building a Prusa mk3 clone.  You can now buy lots of parts from Ali-express and as I already have quite a few printer parts, why not give it a go. I'm lucky enough to own a Prusa mk3 and would love another...

At the moment I'm waiting on a frame and bed to arrive from China. Will post updates as the build progresses.

Spent so far..
Frame / Metal Bed / Rods 95
PSU 40
Magnetic bed 40
Spring Steel 20
LCD - Already had
Motors - Already had
Motherboard - 58
Total (so far) 253 


moodlite Design / Other shapes
« on: December 28, 2018, 11:19:45 AM »
Although I love the triangle shape I do intend doing a square as well to start with.. :-)

This will be contactable with the triangle but use 4 LED's rather than 3 per tile.  Just need to find the time..

Thought I would get the idea out there... let me know what you think.



moodlite Software / NodeMCU Software... Help required
« on: December 28, 2018, 10:52:06 AM »
So, I'm the first to admit that I'm not very good at software or coding... I'm more of a copy and paste coder, taking bits from things I've found and spend hours upon hours getting it to work :-)

The controller I decided on is the NodeMCU. This is because its cheap (4) and also includes wifi as well. You can program this through the Arduino IDE which is what I've been doing.  I've attached the code below but I would love to expand it so you can actually select colours etc..

Now the code on this controller tells the LED's what colour they need to be but also runs a webserver.  This enables any web browser from mobile / PC / tablet etc to go to it's IP address and change the current pattern.  At the moment (version v1.0) its very simple and just displays the following;

This allows you to select 8 different patterns and also alter the brightness and speed. Very simple, just a proof of concept really.

You can set it to have a static IP address which is handy if you want to link it to Google home etc via IFTTT :-)

So, if you can help lend a hand to improve this then please do..

Code: [Select]
// Downloaded from  - Open source
// Written by Steve Wagg aka CdRsKuLL
// Release v1.0 27th Dec 2018

// Load librarys
#include <FastLED.h>
#include <ESP8266WiFi.h>

// Replace with your network credentials
const char* ssid     = "NetworkName";
const char* password = "NetworkPassword";

// If you want to set a static IP, then uncommment the three below lines AND the line WiFi.config(ip, gateway, subnet); in the void setup() below. Otherwise it will be allocated one via your DCHP server
//IPAddress ip(192, 168, 1, 40); //set static ip
//IPAddress gateway(192, 168, 1, 1); //set getteway
//IPAddress subnet(255, 255, 255, 0);//set subnet

// Set the pin you are outputting on and the number of LEDs (5 tiles = 15 LEDs).
#define LED_PIN     6
#define NUM_LEDS    48

String header;
String pat = "1";
int brightpos1 = 0;
int brightpos2 = 0;
String brightString = String(5);
int speedpos1 = 0;
int speedpos2 = 0;
String speedString = String(5);
#define BRIGHTNESS  250
#define LED_TYPE    WS2812B
// Set web server port number to 80
WiFiServer server(80);
CRGBPalette16 currentPalette;
TBlendType    currentBlending;
extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;

void setup() {
  delay( 3000 ); // power-up safety delay
  Serial.print("Connecting to ");
  //WiFi.config(ip, gateway, subnet);  //uncomment if you want to use a static IP
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
  // Print local IP address and start web server
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");

  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;

void loop()
  WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c =;             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Connection: close");

            // reads the url for pattern change
            if (header.indexOf("GET /1/on") >= 0) {
              Serial.println("LED 1");
              pat = "1";
              currentPalette = RainbowColors_p; currentBlending = LINEARBLEND;
            } else if (header.indexOf("GET /2/on") >= 0) {
              Serial.println("LED 2");
              pat = "2";
              currentPalette = RainbowStripeColors_p;  currentBlending = NOBLEND;
            } else if (header.indexOf("GET /3/on") >= 0) {
              Serial.println("LED 3");
              pat = "3";;
              currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND;
            } else if (header.indexOf("GET /4/on") >= 0) {
              Serial.println("LED 4");
              pat = "4";
              SetupTotallyRandomPalette(); currentBlending = LINEARBLEND;
            } else if (header.indexOf("GET /5/on") >= 0) {
              Serial.println("LED 5");
              pat = "5";
              SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND;
            } else if (header.indexOf("GET /6/on") >= 0) {
              Serial.println("LED 6");
              pat = "6";
              currentPalette = currentPalette = CloudColors_p; currentBlending = LINEARBLEND;
            } else if (header.indexOf("GET /7/on") >= 0) {
              Serial.println("LED 7");
              pat = "7";
              currentPalette = currentPalette = PartyColors_p; currentBlending = LINEARBLEND;
            } else if (header.indexOf("GET /8/on") >= 0) {
              Serial.println("LED 8");
              pat = "8";
              currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND;

            if (header.indexOf("GET /?bvalue=") >= 0) {
              brightpos1 = header.indexOf('=');
              brightpos2 = header.indexOf('&');
              brightString = header.substring(brightpos1 + 1, brightpos2);
              FastLED.setBrightness( brightString.toInt() );

            if (header.indexOf("GET /?svalue=") >= 0) {
              speedpos1 = header.indexOf('=');
              speedpos2 = header.indexOf('&');
              speedString = header.substring(speedpos1 + 1, speedpos2); //this variable is updated at the end of the void sub

            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 25px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".textstyle { color: #FFFFFF;}");
            client.println(".slider { width: 300px; }</style></head>");
            client.println("<script src=\"\"></script>");

            // Web Page Heading
            client.println("<body style =\"background-color: #000000; color: #FFFFFF;\"><h1>moodlite</h1>");
            if (pat == "1") {
              client.println("<hr><p class=\"textstyle\">PATTERN 1<br><br>");
            if (pat == "2") {
              client.println("<hr><p class=\"textstyle\">PATTERN 2<br><br>");
            if (pat == "3") {
              client.println("<hr><p class=\"textstyle\">PATTERN 3<br><br>");
            if (pat == "4") {
              client.println("<hr><p class=\"textstyle\">PATTERN 4<br><br>");
            if (pat == "5") {
              client.println("<hr><p class=\"textstyle\">PATTERN 5<br><br>");
            if (pat == "6") {
              client.println("<hr><p class=\"textstyle\">PATTERN 6<br><br>");
            if (pat == "7") {
              client.println("<hr><p class=\"textstyle\">PATTERN 7<br><br>");
            if (pat == "8") {
              client.println("<hr><p class=\"textstyle\">PATTERN 8<br><br>");

            //Web Page buttons
            client.println("<a href=\"/1/on\"><button class=\"button\">P1</button></a>");
            client.println("<a href=\"/2/on\"><button class=\"button\">P2</button></a>");
            client.println("<a href=\"/3/on\"><button class=\"button\">P3</button></a>");
            client.println("<a href=\"/4/on\"><button class=\"button\">P4</button></a>");
            client.println("<a href=\"/5/on\"><button class=\"button\">P5</button></a>");
            client.println("<a href=\"/6/on\"><button class=\"button\">P6</button></a>");
            client.println("<a href=\"/7/on\"><button class=\"button\">P7</button></a>");
            client.println("<a href=\"/8/on\"><button class=\"button\">P8</button></a>");

            //Web page sliders
            client.println("</p><hr><p class=\"textstyle\">BRIGHTNESS</p>");
            client.println("<input type=\"range\" min=\"1\" max=\"255\" class=\"slider\" id=\"brightSlider\" onchange=\"bright(this.value)\" value=\"" + brightString + "\"/>");
            client.println("<script>var slider = document.getElementById(\"brightSlider\");");
            client.println("var brightP = document.getElementById(\"brightPos\"); brightP.innerHTML = slider.value;");
            client.println("slider.oninput = function() { slider.value = this.value; brightP.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function bright(pos) { ");
            client.println("$.get(\"/?bvalue=\" + pos + \"&\"); {Connection: close};}</script>");

            client.println("</p><p class=\"textstyle\">SPEED</p>");
            client.println("<input type=\"range\" min=\"1\" max=\"499\" class=\"slider\" id=\"speedSlider\" onchange=\"speed(this.value)\" value=\"" + speedString + "\"/>");
            client.println("<script>var slider = document.getElementById(\"speedSlider\");");
            client.println("var speedP = document.getElementById(\"speedPos\"); speedP.innerHTML = slider.value;");
            client.println("slider.oninput = function() { slider.value = this.value; speedP.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function speed(pos) { ");
            client.println("$.get(\"/?svalue=\" + pos + \"&\"); {Connection: close};}</script>");


            // The HTTP response ends with another blank line
            // Break out of the while loop
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
    // Clear the header variable
    header = "";
    // Close the connection
    Serial.println("Client disconnected.");

  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; /* motion speed */
  FillLEDsFromPaletteColors( startIndex);;
  FastLED.delay(1000 / speedString.toInt());

void FillLEDsFromPaletteColors( uint8_t colorIndex)
  uint8_t brightness = 255;

  for ( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
    colorIndex += 3;

void SetupTotallyRandomPalette()
  for ( int i = 0; i < 16; i++) {
    currentPalette[i] = CHSV( random8(), 255, random8());

// This function sets up a palette of black and white stripes,
// using code.  Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
  // 'black out' all 16 palette entries...
  fill_solid( currentPalette, 16, CRGB::Black);
  // and set every fourth one to white.
  currentPalette[0] = CRGB::White;
  currentPalette[4] = CRGB::White;
  currentPalette[8] = CRGB::White;
  currentPalette[12] = CRGB::White;


// This function sets up a palette of purple and green stripes.
void SetupPurpleAndGreenPalette()
  CRGB purple = CHSV( HUE_PURPLE, 255, 255);
  CRGB green  = CHSV( HUE_GREEN, 255, 255);
  CRGB black  = CRGB::Black;

  currentPalette = CRGBPalette16(
                     green,  green,  black,  black,
                     purple, purple, black,  black,
                     green,  green,  black,  black,
                     purple, purple, black,  black );

// This example shows how to set up a static color palette
// which is stored in PROGMEM (flash), which is almost always more
// plentiful than RAM.  A static PROGMEM palette like this
// takes up 64 bytes of flash.
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
  CRGB::Gray, // 'white' is too bright compared to red and blue



I'm currently playing with adding a mic to the power base, this will hopefully allow it to react to sound, so maybe beat to the music or something.. that's the idea anyway.   

Hoping others can lend a hand :-)



moodlite Chitchat / moodlite - Youtube
« on: December 28, 2018, 10:27:49 AM »
Just a quick demo of moodlite and the basic webapp

I will be working on expanding the functions soon :-)  I aim to enable sound activation.

more to come...


moonlite Builds / Build Diary - moodlite by CdRsKuLL
« on: December 27, 2018, 05:22:28 PM »
I thought an easy way would be to document the build of moodlite here. It should help people identify components and also the reasons why I picked them.

The design was done in Autodesk Inventor and I've included the IGES / STEP files within the download if you need them

I purchased all of my bits from Amazon UK or eBay,  my BOM consists of the following;

60 x LED - W2812B Type. I made sure these were the non-waterproof type as I didn't want them encased in silicon.  Cost 12
Amazon UK link -
Amazon USA link -

2 x NodeMCU PCB's. You only need one for the project, but at only 8ish I thought it was worth having a spare. There seem two types, one is bigger than the other one. Make sure you get the one with the square chip and not the rectangle one near the micro usb port. :-)
Amazon UK link -
Amazon USA link -

20 x 50cm Servo Extention leads. Now, you actually need more wire per tile but the 100cm ones were almost double the price. You should get about 15 tiles from about 20 of these.  I bought these off eBay. Only problem was they took ages to come.. like 5 days!! 
eBay link -
Amazon UK link -
Amazon USA link -  (2 packs required for about 15 tiles) You can prob get them cheaper off ebay, please look around.

I'm not sure how much filament I've used on this project, maybe a couple of rolls?  Anyway, the one I've used again was purchased from Amazon and was Ziro White PLA. I also used this to print the front diffusers. If you use this filament you will end up with the same translucent results I hope.  I've found it to be really good value filament, I have it in several colours, but only PLA, not tried other materials yet.
Amazon UK link -
Amazon USA link -

You will need something to power the tiles. I went for a 2A 5V cheap adapter. This powers both the NodeMCU and the LED's.  I purchased a 5.5/2.1mm one. I would recommend something like a 4A version which will be good for powering about 20 tiles.
Amazon UK link - (Higher spec 4A version)
Amazon USA link -  (Higher spec 4A version)

To go with the power supply I purchased some 5.5/2.1mm sockets. I've modelled the power module part on this so if you can get something similar it will save you a job. :-)
Amazon UK link -
Amazon USA link -

It's just a case of having to wait to print off all the tiles then. The base was taking just over 6:30 hrs and the top just over 2hrs.  I did a few designs but the one I've ended up with I'm quite pleased with.  It allows you to change the tile to a left or a right by swapping the wire underneath. They just slot into each other and you can mount T connectors between them or just screw them to the wall.  The front diffuser was originally designed to have a separate diffuser, but I then swapped over to a 3D printed solid one.  Both are included in the download so it's up to you which you use.

Below are a few build photos so you can see how the design evolved..

moodlite Chitchat / Moodlite - What's it all about?
« on: December 26, 2018, 09:54:59 AM »
So, after seeing the superb product 'Nanoleaf' but sadly couldn't afford the premium price I decided to set about to create my own, more economical version.  As it stands I can create about 20 tiles for around 45. This includes all the electronics, filament and LED's plus wires.. not bad at all :-)

The tiles should be printable on most of the current 3D printers ie. Ender 3 etc..  These can be controlled via a web browser or if you want to get techy.. something like Google Home :-)

More details to come, it's early days at the moment.  I'll be posting details on here first.



Pages: 1

SMF spam blocked by CleanTalk