How do I use an arduino as an LED controller?

-1

I'm a total C++ newbie, but I recently got an arduino and I'm doing my first project with it. I may be jumping into the deep end here, but I've got some experience with electronics already. I also have some experience with python.

I want to make a fancy interior lighting setup using two of these led strips and this arduino starter kit.

I need to make a whole bunch of presets that can be quickly activated using the IR remote included with the kit.

I need to be able to split the strips into individual zones , which I can use to easily set the presets. Maybe I want preset1 to be the ceiling lights a dark blue at 50% brightness and the window lights an orange at 25% brightness.

I know that to achieve this I want every button on the remote to call a different function. I've written some Psuedocode and I'd like some advice on the best way to learn how to implement this on an arduino.

I really need help with the software side of this project, the hardware side is all good.

disclaimer: I haven't touched coding since high school, so my psuedocode is probably trash. I just hope it's vaguely understandable

//Psuedocode attempt to make an LED thingy


// Importing needed libraries
Import fastled
Import IRremote

define num_led 300
define data_pin 5

// defining various zones. Zone 1 = Under cabinet, Zone 2 = Around window etc.
Global zone1 = num_led [0:24]
Global zone2 = num_led [24:172]
Global zone3 = num_led [173:277]
Global zone4 = num_led [278:299]

Def preset1()
    for led in zone1:
        ledRGB = (160, 0, 210)
    for led in zone2:
        ledRGB = (120, 0, 24)
    for led in zone3:
        ledRGB = (0, 0, 0)
    for led in zone4:
        ledRGB = (100,100,100)
// Make a whole bunch more of these normal presets

Def preset6()
    for led in zone1:
        do cool fastled animation
    for led in zone2:
        do different fastled animation
    for led in zone3:
        ledRGB = (0, 0, 0)
    for led in zone4:
        ledRGB = (0, 0, 0)

// Make a whole bunch more of these fancy presets

Def BrightnessUp()
    i = 0
    for num_led in zone1 and zone2 and zone3 and zone4:
        if i in ledRGB > 0: //This is to minimise colour shift. Any RGB channel set at 0 won’t increase.
            i = i+10
        else:
            return

// Similar for brightness down
        


void setup() { 
    
    FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
{



//The following is mostly copy pasted C++ code with modifications 
//It works to understand the IR remote inputs and call functions based on input

const int RECV_PIN = 7;

IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;

void setup(){
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  if (irrecv.decode(&results)){
 
        if (results.value == 0XFFFFFFFF)
          results.value = key_value;

        switch(results.value)
          case 0xFF30CF:
          Serial.println("1");
     Call preset1()
          break ;
          case 0xFF18E7:
          Serial.println("2");
     Call preset2()
          break ;
          case 0xFF7A85:
          Serial.println("3");
     Call preset3()
          break ;
         //ETC for every number on remote
      case 0xFFE01F:
          Serial.println("-");
     Call BrigtnessDown()
          break ;  
          case 0xFFA857:
          Serial.println("+");
     Call BrightnessUp()
          break ;  
     
        }
        key_value = results.value;
        irrecv.resume(); 
  }
}
c++
arduino
arduino-ide
asked on Stack Overflow Aug 9, 2020 by LED_Project69

1 Answer

0

Steps to be followed are

  1. Install the FastLED Library from GitHub: FastLED Lib
  2. Install the IRremote Library from GitHub: IRremote Lib
  3. Import it to your Arduino library folder via Arduino IDE: Importing a .zip Library

Here is a basic structure of the program which we will require.

#include "FastLED.h"
#include "IRremote.h"
#define DATA_PIN 5   // digital pin of your arduino
#define NUM_LEDS 300

CRGB leds[NUM_LEDS];

//Zones array
int zone1[2] = {0, 24};    //For zone1: Start,End
int zone2[2] = {25, 172};  //For zone2: Start,End
int zone3[2] = {173, 277}; //For zone3: Start,End
int zone4[2] = {278, 299}; //For zone4: Start,End

// For IR receiver
const int RECV_PIN = 3; // Hardware specs allows 3 or 9 pin to be used for ATmega328p
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  //Setup for FastLED
  FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);

  //Setup for IRremote
  pinMode(LED_BUILTIN, OUTPUT); //LED_BUILTIN is the inbuild led on Arduino UNO at Pin13
  irrecv.enableIRIn(); // Start the receiver
  irrecv.blink13(true); // Enable blinking the LED when during reception
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value) {
      case 0xFF30CF:
        Serial.println("1");
        preset1();
        break;
      case 0xFF18E7:
        Serial.println("2");
        //preset2();  //TODO: Complete this preset2
        break;
      case 0xFF7A85:
        Serial.println("3");
        //preset3(); //TODO: Complete this preset3
        break;
      //ETC for every number on remote
      case 0xFFE01F:
        Serial.println("-");
        brightnessDown();
        break;
      case 0xFFA857:
        Serial.println("+");
        brightnessUp();
        break;
      default:
        Serial.println("Not Understood.");
        break;
    }
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

void preset1()
{
  //Zone 1
  for (int i = zone1[0]; i <= zone1[1]; i++) {
    leds[i] = CRGB(160, 0, 210);
  }

  //Zone 2
  for (int i = zone2[0]; i <= zone2[1]; i++) {
    leds[i] = CRGB(120, 0, 24);
  }

  //Zone 3
  for (int i = zone3[0]; i <= zone3[1]; i++) {
    leds[i] = CRGB(0, 0, 0);
  }

  //Zone 4
  for (int i = zone4[0]; i <= zone4[1]; i++) {
    leds[i] = CRGB(100, 100, 100);
  }

  //To set the LEDs
  FastLED.show();
}

void brightnessUp()
{
  for (int i = 0; i < NUM_LEDS; i++) {
    if (leds[i].r > 0)
      leds[i].r = leds[i].r + 10;
    if (leds[i].g > 0)
      leds[i].g = leds[i].g + 10;
    if (leds[i].b > 0)
      leds[i].b = leds[i].b + 10;
  }
  //To set the LEDs
  FastLED.show();
}

void brightnessDown()
{
  for (int i = 0; i < NUM_LEDS; i++) {
    if (leds[i].r > 10)
      leds[i].r = leds[i].r - 10;
    if (leds[i].g > 10)
      leds[i].g = leds[i].g - 10;
    if (leds[i].b > 10)
      leds[i].b = leds[i].b - 10;
  }
  //To set the LEDs
  FastLED.show();
}
    

Note: This code this created with the help of Pseudo-code provided and the logic implemented in it, you may have to change certain things in order for it to produce best results.

answered on Stack Overflow Aug 10, 2020 by Sourabh Choure • edited Aug 10, 2020 by Sourabh Choure

User contributions licensed under CC BY-SA 3.0