Nowadays, LED is a huge decoration factor in our daily life. It has not only made our life decorative but also reduced our electricity consumption. By keeping this factor in mind, here we are going to use a WS2812B RGB Addressable LED strip for our project Ambient Light for TV. RGB LED is a multifunctional light that can be used for various electronics projects, photography, filmmaking, gaming decoration, music VU meter and much more.
For this project, we are going to use the WS2812B RGB LED strip and an Arduino Nano to program and run the LED strip as the user’s choice. Here we use the Ambient Light Application to control the WS2812B LED strip for android TV.
Must Read DIY Ambient Light For Computer
Project
Circuit Diagram
Components Required
- Arduino Nano
- WS2812B Addressable LED Strip
- 5V/3A Decent Power Supply
About Parts for Ambient Light
Arduino
For the compact build, I choose Arduino Nano despite Arduino UNO. Arduino Nano is a small, flexible microcontroller board using an Atmega328p chip. It can also use as a substitute for UNO. All the functions are the same in these two boards. The size of its PCB is 18×45 mm. The clock speed is 16Mhz. Its input voltage is 5-12V. There are 30 pins including power pins, data pins, analog pins, and serial pins on this board.
WS2812B Addressable LED Strip
The WS2812B Addressable LED is a very cool LED light that contains a WS2812B LED controller IC and a 5050 RGB LED. The below image shows the WS2812B Addressable LED inner connection. It has four terminals inside the LED package i.e VDD, VSS, DIN and DOUT. VSS is used to power up the LED and VDD is connected to the ground. DIN control the inputted data signal as well as DOUT through the received data to the next WS2812B controller chip respectively.
Calculation of Current Required for Drive The LED Strip
To proceed with constructing the LED first, we need to know the voltage requirement of the single 5050 RGB LEDs. Each WS2812B LED pixel has three types of LEDs i.e Red (20 mA), Green (20 mA) and Blue (20 mA). So the total current requirement is 60mA. And if we individually take 50 LEDs then the current is 3A. This is more than an Arduino can supply.
So the best way to power up the whole system is an external 5V/3A pure DC power supply that can provide enough current.
Process of Setting Up Ambient Light On The TV
Now come to the LED strip part. There you need to attach the LED strip from the left-bottom side to the left-top side, then the right-top side to the right-bottom side. We do this pattern because in the application this is the default pattern. But you can change it as your wish. Just need to define the pattern in the application that’s it.
After that connect the data pin of the LED strip with the digital pin (D4) of the Arduino and as well as VCC And ground respectively.
Ambient Light Application Setup for TV
First, we need to download and install the “Ambient Light Application for Android” from the playstore. It costs around rupees 240 or 3 dollars. After installation, open the application on the TV and go to settings.
- There you need to define the total number of horizontal LEDs (choose any one part i.e., top or bottom). Similarly, specify the total number of vertical LEDs.
- Keep the bottom gap value to zero.
- Set LED strip direction to CW (Clock Wise)
- Define the first LED offset to (-) of the total number of vertical LEDs.
And leave the rest of the settings as it is. For my purpose, this is the setting.
Lastly back to the homescreen and select “Screen Capturing Mode” out of three modes.
Arduino Code
To compile this code you need to install this library first “FastLED.h“.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | #include "FastLED.h" #define INITIAL_LED_TEST_ENABLED true #define INITIAL_LED_TEST_BRIGHTNESS 16 // Change the brightness between 0 to 255 #define INITIAL_LED_TEST_TIME_MS 250 // We will use a maximum of 300 leds #define MAX_LEDS 141 // Number of leds in your strip // type of your led controller #define LED_TYPE WS2812B // DATA_PIN #define LED_PINS 6 // 3 wire leds #define COLOR_ORDER GRB // colororder of the stripe, set RGB in hyperion #define OFF_TIMEOUT 6000 // ms to switch off after no data was received, set 0 to deactivate #define BRIGHTNESS 255 // max brightness 0 to 255 #define DITHER_MODE BINARY_DITHER // BINARY_DITHER or DISABLE_DITHER #define COLOR_TEMPERATURE CRGB(255,255,255) // RGB value describing the color temperature #define COLOR_CORRECTION TypicalLEDStrip // predefined fastled color correction #define BAUD_RATE 115200 // use 115200 baudrate for ftdi based boards // Adalight sends a "Magic Word" before sending the pixel data uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i; unsigned long endTime; // Define the array of leds CRGB leds[MAX_LEDS]; // set color to all leds void showColor(const CRGB& led) { #if MAX_LEDS > 1 LEDS.showColor(led); #endif } // switch of leds void switchOff() { #if MAX_LEDS > 1 memset(leds, 0, MAX_LEDS * sizeof(struct CRGB)); FastLED.show(); #endif } // function to check if serial data is available bool checkIncommingData() { boolean dataAvailable = true; while (!Serial.available()) { if ( OFF_TIMEOUT > 0 && endTime < millis()) { switchOff(); dataAvailable = false; endTime = millis() + OFF_TIMEOUT; } } return dataAvailable; } // main function that setups and runs the code void setup() { Serial.begin(BAUD_RATE); Serial.print("Ada\n"); // Send "Magic Word" string to host int ledCount = MAX_LEDS; #if MAX_LEDS > 1 FastLED.addLeds<LED_TYPE, LED_PINS, COLOR_ORDER>(leds, ledCount); #endif // color adjustments FastLED.setBrightness ( BRIGHTNESS ); FastLED.setTemperature( COLOR_TEMPERATURE ); FastLED.setCorrection ( COLOR_CORRECTION ); FastLED.setDither ( DITHER_MODE ); // initial RGB flash #if INITIAL_LED_TEST_ENABLED == true for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++) { showColor(CRGB(255,0,0)); delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS); } for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++) { showColor(CRGB(0,255,0)); delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS); } for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++) { showColor(CRGB(0,0,255)); delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS); } #endif showColor(CRGB(0, 0, 0)); boolean transmissionSuccess; unsigned long sum_r, sum_g, sum_b; // loop() is avoided as even that small bit of function overhead for(;;) { // wait for first byte of Magic Word for (i = 0; i < sizeof prefix; ++i) { // If next byte is not in Magic Word, the start over if (!checkIncommingData() || prefix[i] != Serial.read()) { i = 0; } } if (!checkIncommingData()) continue; hi = Serial.read(); if (!checkIncommingData()) continue; lo = Serial.read(); if (!checkIncommingData()) continue; chk = Serial.read(); // if checksum does not match go back to wait if (chk != (hi ^ lo ^ 0x55)) continue; int num_leds = min ( MAX_LEDS, (hi<<8) + lo + 1 ); memset(leds, 0, num_leds * sizeof(struct CRGB)); transmissionSuccess = true; sum_r = 0; sum_g = 0; sum_b = 0; // read the transmission data and set LED values for (int idx = 0; idx < num_leds; idx++) { byte r, g, b; if (!checkIncommingData()) { transmissionSuccess = false; break; } r = Serial.read(); if (!checkIncommingData()) { transmissionSuccess = false; break; } g = Serial.read(); if (!checkIncommingData()) { transmissionSuccess = false; break; } b = Serial.read(); leds[idx].r = r; leds[idx].g = g; leds[idx].b = b; } // shows new values if (transmissionSuccess) { endTime = millis() + OFF_TIMEOUT; #if MAX_LEDS > 1 FastLED.show(); #endif } } } // end of setup void loop() { } |
USB
How the tv connect with arduino?? Via usb or via network?