Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. My Project
  3. Fire pit RGB striplight controller

Fire pit RGB striplight controller

Scheduled Pinned Locked Moved My Project
12 Posts 7 Posters 6.2k Views 13 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • hekH Online
    hekH Online
    hek
    Admin
    wrote on last edited by
    #2

    Beautiful!

    1 Reply Last reply
    0
    • CrankyCoderC Offline
      CrankyCoderC Offline
      CrankyCoder
      wrote on last edited by
      #3

      wow. that looks great!!

      Home Automation Tinkerer
      www.CrankyCoder.net

      Controller: HomeAssistant in Kubernetes
      Gateway: MQTTClientGateway
      MySensors: 2.3

      1 Reply Last reply
      0
      • R Offline
        R Offline
        r-nox
        wrote on last edited by
        #4

        Nice work, looks fantastic!

        1 Reply Last reply
        0
        • Boots33B Offline
          Boots33B Offline
          Boots33
          Hero Member
          wrote on last edited by
          #5

          Found a nice routine for the colour cycling, it gives a very smooth fade between colours.

          Sketch below

          /*
          RGB LED Node for 12v common anode rgb strip,
          Also has a standard on/off switch to control an extra set of garden lights 
          and a standard on/off switch to select colour cycling
          PWM pins (3, 5, 6, 9, 10, or 11).
          colour cycling routine from https://gist.github.com/jamesotron/766994
          
          */
          
          // Enable debug prints to serial monitor
          #define MY_DEBUG 
          #define MY_NODE_ID 200  // I use 200 for my test nodes I will remove this line when it is installed
          // Enable and select radio type attached
          #define MY_RADIO_NRF24
           
          #include <SPI.h>
          #include <MySensors.h>
          #define RGB_CHILD_ID 1  // the rbg device includes a dimmer and on/off switch as well
          #define CHILD_ID_LIGHT_B 2
          #define CYCLE_SWITCH_ID 3
          
           const int controlPinA = 7;  //used to turn on/off rgb Power pin
           const int controlPinB = 8;  //used to switch on/off other garden lights
           const int redPin = 3;     //pin used to switch the red mosfet
           const int greenPin = 5;  //pin used to switch the green mosfet
           const int bluePin = 6;  //pin used to switch the blue mosfet
           long RGB_values[3] = {0,0,0};  //array used to hold the three rgb colours
           int dimSet = 0;                 // holder for the current dimmer setting
           int cycleSpeed = 20;    // this sets the speed of the colour cycling 
           bool cycleState = 0;    // used to check if colour cycling is turned on
          
          // int dimHolder = 0;             
          MyMessage msg(CYCLE_SWITCH_ID, V_STATUS);    
           
          void setup()
          {
            pinMode(controlPinA, OUTPUT);    //|
            pinMode(controlPinB, OUTPUT);    //|
            pinMode(redPin, OUTPUT);         //| setup pins as outputs
            pinMode(greenPin, OUTPUT);       //| 
            pinMode(bluePin, OUTPUT);        //|
            setColor(0,0,0);                 // make sure lights are off when first booted
          }
          
          void presentation()  {
            // Present sketch (name, version)
            sendSketchInfo("RGB Node", "1.0");        
                 
            // Register sensors (id, type, description, ack back) 
             present(RGB_CHILD_ID, S_RGB_LIGHT,"Firepit RGB Control");
             present(CHILD_ID_LIGHT_B, S_LIGHT,"Firepit Garden Lights");
             present(CYCLE_SWITCH_ID, S_LIGHT,"Cycle Switch");
          }
           
          void loop()
          {
            
          if (cycleState == 1){  // check to see is colour cycling is turned on
            cyclecolor();
          }
          }
          
          /*-----------------Start of functions---------------------*/
          
          
          /*----------- function to display LED colour as well as set brightness------------*/
          void setColor(int red, int green, int blue){  
          if (dimSet != 0){
           analogWrite(redPin, round(red*dimSet/100));          //|
           analogWrite(greenPin, round(green*dimSet/100));      //| change the three rgb colours and adjust brightness
           analogWrite(bluePin, round(blue*dimSet/100));        //|
          }
          else{                                                // if dimmer setting is 0 then set all colours to 0
            analogWrite(redPin, dimSet);
            analogWrite(greenPin, dimSet);
            analogWrite(bluePin, dimSet);
          }  
          #ifdef MY_DEBUG            //Print debug info if enabled
            Serial.print("RED = ");
            Serial.println(red);
            Serial.print("BLUE = ");
            Serial.println(blue);
            Serial.print("GREEN = ");
            Serial.println(green);
           #endif
          }
          
          
          /*------------------process incoming messages--------------------*/
          void receive(const MyMessage &message) {
            
           if (message.type==V_RGB) {             //check for RGB message type
                /*   process the RGB hex code    */
              String rgbHexString = message.getString();                      //Load the hex color code into a string
              long number = (long) strtol( &rgbHexString[0], NULL, 16);
              RGB_values[0] = number >> 16;
              RGB_values[1] = number >> 8 & 0xFF;
              RGB_values[2] = number & 0xFF;
              setColor(RGB_values[0],RGB_values[1],RGB_values[2]);            // call the setColor function to update the LED's
            #ifdef MY_DEBUG                                                   //Print debug info if enabled
               Serial.print("HEX RGB " );
               Serial.println(rgbHexString);
               Serial.print("long number " );
               Serial.println(number);
            #endif
           }
               
           if (message.type==V_DIMMER) {                                   //check for dimmer message type
               if(cycleState == 1){                                     // new incoming colour change, turn off cycling if it is on
               send(msg.set(false));
               cycleState = 0;
               }
              dimSet = message.getInt();                                        // Load the dimmer setting into dimSet
              setColor(RGB_values[0],RGB_values[1],RGB_values[2]);              // call the setColor function to update the LED's. new dimmer setting
              #ifdef MY_DEBUG                                                   //Print debug info if enabled
               Serial.print("dimmer setting " );
               Serial.println(dimSet);
              #endif
           }
                
           if (message.type==V_LIGHT) {                                     //check for incoming  light switch message type
              switch (message.sensor) {
                case 1:                                                     //message is for sensor 1 (RGB switch)
                  digitalWrite(controlPinA, message.getBool() ? 1 : 0);
                  break;
                case 2:                                                     //message is for sensor 2 (garden lights)
                  digitalWrite(controlPinB, message.getBool() ? 1 : 0);
                  break;
                case 3:                                                     // message is for sensor 3 (colour cycle switch)
                  cycleState = message.getBool() ? 1: 0;
                  break;
                  
               }
              #ifdef MY_DEBUG                                            //print some degug info if enabled
                Serial.print("Incoming change for sensor:");
                Serial.println(message.sensor);
                Serial.print("Light switch setting " );
                Serial.println(message.getBool());
              #endif
              }
           }
           
          /*---------------function to cycle colours-----------------------*/
          void cyclecolor(){
          
          /*Start off with red*/
            RGB_values[0] = 255;
            RGB_values[1] = 0;
            RGB_values[2] = 0; 
            /* Choose the colours to increment and decrement.*/
            for (int decColour = 0; decColour < 3; decColour += 1) {
              int incColour = decColour == 2 ? 0 : decColour + 1;
          
            /* cross-fade the two colours*/
            for(int i = 0; i < 255; i += 1) {
             RGB_values[decColour] -= 1;
             RGB_values[incColour] += 1;
             analogWrite(redPin, RGB_values[0]);
             analogWrite(greenPin, RGB_values[1]);
             analogWrite(bluePin, RGB_values[2]);
             if (cycleState == 0){                 // If colour cycling is turned off break out to main loop
               break;
             }
             wait(cycleSpeed);   // this controls the speed of the colour cycling
            }
           }
          }
          
          
          1 Reply Last reply
          0
          • TigroenotT Offline
            TigroenotT Offline
            Tigroenot
            wrote on last edited by Tigroenot
            #6

            @Boots33
            Looks awesome!
            I have a question. I took your sketch and it works great, but is it possible not to use the separate V_LIGHT to turn it on/off? What I mean is that I don't want to put a rele or a MOSFET to control the RGB power but to start/stop dimming by using just one RGB icon in domoticz. And turn it off by either setting dimmer value to 0 or pressing the off button in domoticz RGB switch. Is it possible?

            Boots33B 1 Reply Last reply
            0
            • TigroenotT Tigroenot

              @Boots33
              Looks awesome!
              I have a question. I took your sketch and it works great, but is it possible not to use the separate V_LIGHT to turn it on/off? What I mean is that I don't want to put a rele or a MOSFET to control the RGB power but to start/stop dimming by using just one RGB icon in domoticz. And turn it off by either setting dimmer value to 0 or pressing the off button in domoticz RGB switch. Is it possible?

              Boots33B Offline
              Boots33B Offline
              Boots33
              Hero Member
              wrote on last edited by Boots33
              #7

              Hi @Tigroenot The reason i used the xtra mosfet was mainly so the leds would just resume with whatever they were previously set to when the rgb switch was turned back on and also as this node is powered all the time wanted to make sure it turned off completely. I can see no reason why you could not do away with the IRF4905 and just set the three channels to 0.
              You would need to save the current state to the arduino eeprom if you wanted to have it resume with the same colour etc when the switch is turned back on.

              In fact part of the code does set all the channels to 0 already if the dim level is set to 0.

              You can see below that if dimSet = 0 then the else statement is executed , setting all the channels to 0

              void setColor(int red, int green, int blue){  
              if (dimSet != 0){
               analogWrite(redPin, round(red*dimSet/100));          //|
               analogWrite(greenPin, round(green*dimSet/100));      //| change the three rgb colours and adjust brightness
               analogWrite(bluePin, round(blue*dimSet/100));        //|
              }
              else{                                                // if dimmer setting is 0 then set all colours to 0
                analogWrite(redPin, dimSet);
                analogWrite(greenPin, dimSet);
                analogWrite(bluePin, dimSet);
              }  
              

              You would also need to change the code where it reacts to the incoming message from the RGB switch.

              Instead of

              case 1:                                                     //message is for sensor 1 (RGB switch)
                      digitalWrite(controlPinA, message.getBool() ? 1 : 0);     // change state of RGB power switch
                      break;
              
              

              you would need to try something like the code below. It is untested so you may need to tweak it a bit.

              case 1:                                                     //message is for sensor 1 (RGB switch)
                     // digitalWrite(controlPinA, message.getBool() ? 1 : 0);     // change state of RGB power switch
                      if (message.getBool()== 0){
                       setColor(0,0,0);                 // turn lights off
                       cycleState = 0;                  // turn off colour cycling
                      }
                      else{
                        setColor(200,0,0);     // turn lights red when first turned on
                      }
              
                      break;
              1 Reply Last reply
              0
              • Boots33B Offline
                Boots33B Offline
                Boots33
                Hero Member
                wrote on last edited by
                #8

                I have been distracted from this project with other things but intend to finish it off soon. I am posting the current wiring diagram which I have tested with a 5m RGB strip. I can confirm the mosfets do not heat up at all, even without heatsinks so all looks good.

                I am thinking of changing the clear garden lights from a mosfet to a relay as they are powered by 12AC so will need to rectify that or switch the AC with a relay. still a work in progress

                The circuit

                0_1480590413384_firepit controller.jpg

                1 Reply Last reply
                1
                • Boots33B Offline
                  Boots33B Offline
                  Boots33
                  Hero Member
                  wrote on last edited by
                  #9

                  So I decided to leave the garden lights running on 12v AC as this may offer less voltage drop and wire corrosion than if I were to switch to DC.

                  I had a double relay module on hand so have added an extra switch to the sketch. this node now controls the RGB Strip as well as the two relays. The relay modules need to be switched high to turn off so I have also modified the sketch to suit.

                  I think the sketch and diagram below will be the ones I use.

                  /*
                  RGB LED Node for 12v common anode rgb strip,
                  Also has two standard on/off switches to control  extra  garden lights 
                  and a standard on/off switch to select colour cycling
                  PWM pins (3, 5, 6, 9, 10, or 11).
                  colour cycling routine from https://gist.github.com/jamesotron/766994
                  
                  */
                  
                  // Enable debug prints to serial monitor
                  #define MY_DEBUG 
                  #define MY_NODE_ID 200  // I use 200 for my test nodes I will remove this line when it is installed
                  // Enable and select radio type attached
                  #define MY_RADIO_NRF24
                  
                  #include <SPI.h>
                  #include <MySensors.h>
                  #define RGB_CHILD_ID 1                // the rbg device includes a dimmer and on/off switch as well
                  #define CHILD_ID_LIGHT_1 2            //garden lights 1
                  #define CYCLE_SWITCH_ID 3             // colour cycle switch
                  #define CHILD_ID_LIGHT_2 4            // garden lights 2
                  
                  const int controlPinA = 7;                          //pin used to turn on/off rgb Power 
                  const int controlPin1 = 8;                          //pin used to switch on/off  garden lights 1
                  const int controlPin2 = 4;                          //pin used to switch on/off garden lights 2
                  const int redPin = 3;                               //pin used to switch the red mosfet
                  const int greenPin = 5;                             //pin used to switch the green mosfet
                  const int bluePin = 6;                              //pin used to switch the blue mosfet
                  long RGB_values[3] = {0,0,0};                       //array used to hold the three rgb colours
                  int dimSet = 0;                                     // holder for the current dimmer setting
                  int cycleSpeed = 20;                                // this sets the speed of the colour cycling 
                  bool cycleState = 0;                                // used to check if colour cycling is turned on. 0 means it will be off when node starts up
                  bool onceOnly = 0;                                  //used to excecute some code once at startup
                             
                  MyMessage msg(CYCLE_SWITCH_ID, V_STATUS);    
                  MyMessage rgbmsgA(RGB_CHILD_ID, V_PERCENTAGE);
                  MyMessage gardenlightmsg1(CHILD_ID_LIGHT_1, V_STATUS); 
                  MyMessage gardenlightmsg2(CHILD_ID_LIGHT_2, V_STATUS);
                  
                  void setup()
                  {
                  pinMode(controlPinA, OUTPUT);    //|
                  pinMode(controlPin1, OUTPUT);    //|
                  pinMode(controlPin2, OUTPUT);    //|
                  pinMode(redPin, OUTPUT);         //| setup pins as outputs
                  pinMode(greenPin, OUTPUT);       //| 
                  pinMode(bluePin, OUTPUT);        //|
                  setColor(0,0,0);                 // make sure RGB lights are off at startup
                  digitalWrite(controlPin1,HIGH);   // make sure garden lights are off at startup. relay module swithces High to turn off
                  digitalWrite(controlPin2,HIGH);   // make sure garden lights are off at startup. relay module swithces High to turn off
                  }
                  
                  void presentation()  {
                  // Present sketch (name, version)
                  sendSketchInfo("RGB Node", "0.1");        
                       
                  // Register sensors (id, type, description, ack back) 
                   present(RGB_CHILD_ID, S_RGB_LIGHT,"Firepit RGB Control");
                   present(CHILD_ID_LIGHT_1, S_LIGHT," Garden Lights 1");
                   present(CYCLE_SWITCH_ID, S_LIGHT,"RGB Cycle Switch");
                   present(CHILD_ID_LIGHT_2, S_LIGHT," Garden Lights 2");
                  }
                  
                  void loop()
                  {
                  if (onceOnly == 0){                     // this code only exectutes once at startup to make sure controller knows switch settings are off
                   send(msg.set(false));                // send message to switch off colour cycling
                   send(rgbmsgA.set(0));                // send message to switch off RGB lights
                   send(gardenlightmsg1.set(false));    // send message to switch off garden lights relay 1
                   send(gardenlightmsg2.set(false));    // send message to switch off garden lights relay 2
                   onceOnly = 1; 
                  }
                  if (cycleState == 1){  // check to see is colour cycling is turned on
                  cyclecolor();
                  }
                  }
                  
                  /*-----------------Start of functions---------------------*/
                  
                  
                  /*----------- function to display LED colour as well as set brightness------------*/
                  void setColor(int red, int green, int blue){  
                  if (dimSet != 0){
                  analogWrite(redPin, round(red*dimSet/100));          //|
                  analogWrite(greenPin, round(green*dimSet/100));      //| change the three rgb colours and adjust brightness
                  analogWrite(bluePin, round(blue*dimSet/100));        //|
                  }
                  else{                                                // if dimmer setting is 0 then set all colours to 0
                  analogWrite(redPin, dimSet);
                  analogWrite(greenPin, dimSet);
                  analogWrite(bluePin, dimSet);
                  }  
                  #ifdef MY_DEBUG            //Print debug info if enabled
                  Serial.print("RED = ");
                  Serial.println(red);
                  Serial.print("BLUE = ");
                  Serial.println(blue);
                  Serial.print("GREEN = ");
                  Serial.println(green);
                  #endif
                  }
                  
                  
                  /*------------------process incoming messages--------------------*/
                  void receive(const MyMessage &message) {
                  switch (message.type) {
                  case V_LIGHT:                                                //message is for a light switch (2)
                    #ifdef MY_DEBUG                                            //print some degug info if enabled
                      Serial.print("Incoming change for sensor:");
                      Serial.println(message.sensor);
                      Serial.print("Light switch setting " );
                      Serial.println(message.getBool());
                    #endif
                     switch (message.sensor) {
                      case 1:                                                     //message is for sensor 1 (RGB switch)
                        digitalWrite(controlPinA, message.getBool() ? 1 : 0);     // change state of RGB power switch
                        break;
                      case 2:                                                     //message is for sensor 2 (garden lights switch 1)
                        digitalWrite(controlPin1, message.getBool() ? 0 : 1);     //change state of garden light switch 
                        break;
                      case 3:                                                     // message is for sensor 3 (colour cycle switch)
                        cycleState = message.getBool() ? 1: 0;                    // change state of colour cycle 
                        break;
                      case 4:                                                     //message is for sensor 4 (garden lights switch 2)
                        digitalWrite(controlPin2, message.getBool() ? 0 : 1);     //change state of garden light switch 
                        break;
                     }
                     break;
                  case V_PERCENTAGE:                                                  //check for dimmer message type (3)
                     if(cycleState == 1){                                         // new incoming colour change, turn off cycling if it is on
                     send(msg.set(false));
                     cycleState = 0;
                     }
                    dimSet = message.getInt();                                        // Load the dimmer setting into dimSet
                    setColor(RGB_values[0],RGB_values[1],RGB_values[2]);              // call the setColor function to update the LED's. new dimmer setting
                    #ifdef MY_DEBUG                                                   //Print debug info if enabled
                     Serial.print("dimmer setting " );
                     Serial.println(dimSet);
                    #endif
                    break;
                  case V_RGB:                                                       //check for RGB message type (40)
                      /*   process the RGB hex code    */
                    String rgbHexString = message.getString();                      //Load the hex color code into a string
                    long number = (long) strtol( &rgbHexString[0], NULL, 16);
                    RGB_values[0] = number >> 16;
                    RGB_values[1] = number >> 8 & 0xFF;
                    RGB_values[2] = number & 0xFF;
                    setColor(RGB_values[0],RGB_values[1],RGB_values[2]);            // call the setColor function to update the LED's
                  #ifdef MY_DEBUG                                                   //Print debug info if enabled
                     Serial.print("HEX RGB " );
                     Serial.println(rgbHexString);
                     Serial.print("long number " );
                     Serial.println(number);
                  #endif
                  }
                  }
                  
                  /*---------------function to cycle colours-----------------------*/
                  void cyclecolor(){
                  
                  /*Start off with red*/
                  RGB_values[0] = 255;
                  RGB_values[1] = 0;
                  RGB_values[2] = 0; 
                  /* Choose the colours to increment and decrement.*/
                  for (int decColour = 0; decColour < 3; decColour += 1) {
                    int incColour = decColour == 2 ? 0 : decColour + 1;
                  
                  /* cross-fade the two colours*/
                  for(int i = 0; i < 255; i += 1) {
                   RGB_values[decColour] -= 1;
                   RGB_values[incColour] += 1;
                   analogWrite(redPin, RGB_values[0]);
                   analogWrite(greenPin, RGB_values[1]);
                   analogWrite(bluePin, RGB_values[2]);
                   if (cycleState == 0){                 // If colour cycling is turned off break out to main loop
                     break;
                   }
                   wait(cycleSpeed);   // this controls the speed of the colour cycling
                  }
                  }
                  }
                  
                  
                  
                  

                  0_1480641324831_firepit controller with relays.jpg

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    MikeF
                    wrote on last edited by
                    #10

                    Be careful powering the Nano from 12V - there are reports elsewhere on this forum of some versions getting fried at this voltage!

                    Boots33B 1 Reply Last reply
                    0
                    • M MikeF

                      Be careful powering the Nano from 12V - there are reports elsewhere on this forum of some versions getting fried at this voltage!

                      Boots33B Offline
                      Boots33B Offline
                      Boots33
                      Hero Member
                      wrote on last edited by
                      #11

                      Thanks @MikeF as you say they can get quite hot when run at the higher end of their voltage tolerance. .
                      I have never had a nano fail on me at 12v though and as this is an outside node located where it can do no harm if it fails I am happy to avoid the extra voltage regulator.

                      If it was a node to be situated inside the house then I always try and keep to 9v or less just to make sure it all runs cool.

                      micahM 1 Reply Last reply
                      0
                      • Boots33B Boots33

                        Thanks @MikeF as you say they can get quite hot when run at the higher end of their voltage tolerance. .
                        I have never had a nano fail on me at 12v though and as this is an outside node located where it can do no harm if it fails I am happy to avoid the extra voltage regulator.

                        If it was a node to be situated inside the house then I always try and keep to 9v or less just to make sure it all runs cool.

                        micahM Offline
                        micahM Offline
                        micah
                        wrote on last edited by
                        #12

                        @Boots33

                        I've fried a couple pro mini's and a nano running 12v to the vin/raw... actually in one case it might have been up to 15v .... oops.

                        But I've since learned my lesson.... I now use a Linear Voltage Regulator between the source and the arduino for all my builds that have a higher voltage power source (i.e.: builds that run lights). Typically a L7805CV or L7809CV or L7810CV (or other) depending on the voltage of my source and what I want to send to the arduino.

                        Here is an example L7809CV from AliExpress

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        19

                        Online

                        11.7k

                        Users

                        11.2k

                        Topics

                        113.1k

                        Posts


                        Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • MySensors
                        • OpenHardware.io
                        • Categories
                        • Recent
                        • Tags
                        • Popular