Video
# Lab: DJ Controller
## **Objective**
Create an interactive LED controller where the TK04 button generates random colors for all 5 LEDs of the TK33 WS2812 LED strip, and the TK07 potentiometer adjusts the brightness from 0% to 100%. This lab demonstrates digital input, analog input, and advanced LED control.
## **Required Components**

1. **Lonely Binary UNO R3** - Main Arduino board
2. **TinkerBlock UNO R3 Shield** - Expansion shield that plugs onto the UNO R3
3. **TinkerBlock TK33** - WS2812 LED Strip Module (5 LEDs)
4. **TinkerBlock TK07** - Potentiometer Module
5. **TinkerBlock TK04** - Button Module
## **Theory**
### **Color and Brightness Control**
- **Random Color Generation**: Generate random RGB values for visual variety
- **Brightness Control**: Use potentiometer to control overall LED brightness
- **Button Debouncing**: Prevent multiple triggers from single button press
- **Analog Mapping**: Convert potentiometer reading to brightness percentage
### **WS2812 LED Control**
- **Individual LED Control**: Set each LED to the same color
- **Brightness Scaling**: Apply brightness percentage to all LEDs
- **Color Consistency**: Maintain color while adjusting brightness
- **Real-time Updates**: Update display immediately on input changes
### **Input Processing**
- **Digital Input**: Button state detection with debouncing
- **Analog Input**: Potentiometer reading for brightness control
- **Input Mapping**: Convert analog values to useful ranges
- **State Management**: Track button and potentiometer states
## **Wiring Instructions**
### **TK33 WS2812 LED Strip Pinout**
- **GND** → Arduino GND
- **VCC** → Arduino 5V
- **NC** → No Connection
- **Signal** → Arduino Digital Pin D5
### **TK07 Potentiometer Pinout**
- **GND** → Arduino GND
- **VCC** → Arduino 5V
- **NC** → No Connection
- **Signal** → Arduino Analog Pin A3
### **TK04 Button Pinout**
- **GND** → Arduino GND
- **VCC** → Arduino 5V
- **NC** → No Connection
- **Signal** → Arduino Digital Pin D3
### **Connection Diagram**

```
UNO R3 + Shield
├── Digital Pin D5 ──→ TK33 Signal (WS2812 Data)
├── Analog Pin A3 ───→ TK07 Signal (Potentiometer)
└── Digital Pin D3 ──→ TK04 Signal (Button)
```
## **Basic Color and Brightness Controller**
```cpp
// Basic Color and Brightness Controller
// TK04 button generates random colors, TK07 potentiometer controls brightness
#include <FastLED.h>
// Pin definitions
#define LED_PIN 5 // TK33 WS2812 LED Strip on D5
#define POT_PIN A3 // TK07 Potentiometer on A3
#define BUTTON_PIN 3 // TK04 Button on D3
#define NUM_LEDS 5 // TK33 has 5 WS2812 LEDs
// LED array
CRGB leds[NUM_LEDS];
// Button debouncing variables
#define DEBOUNCE_DELAY 50 // Debounce time in milliseconds
unsigned long lastButtonPress = 0;
bool lastButtonState = HIGH;
bool buttonPressed = false;
// Color and brightness variables
CRGB currentColor = CRGB::Red;
int currentBrightness = 100; // 0-255
int brightnessPercentage = 100; // 0-100
void setup() {
// Initialize serial communication
Serial.begin(9600);
Serial.println("Color and Brightness Controller");
Serial.println("===============================");
// Initialize WS2812 LED strip
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(currentBrightness);
// Initialize input pins
pinMode(POT_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Internal pull-up resistor
// Clear all LEDs
FastLED.clear();
FastLED.show();
delay(1000);
Serial.println("Controller initialized!");
Serial.println("TK33 WS2812 LED Strip: D5");
Serial.println("TK07 Potentiometer: A3");
Serial.println("TK04 Button: D3");
Serial.println();
Serial.println("Press button to change color");
Serial.println("Turn potentiometer to adjust brightness");
Serial.println();
// Set initial color
setAllLEDs(currentColor);
FastLED.show();
}
void loop() {
// Read potentiometer for brightness control
readPotentiometer();
// Read button for color change
readButton();
// Update display
updateDisplay();
// Display status
displayStatus();
delay(100);
}
void readPotentiometer() {
// Read potentiometer value (0-1023)
int potValue = analogRead(POT_PIN);
// Map to brightness percentage (0-100)
int newBrightnessPercentage = map(potValue, 0, 1023, 0, 100);
// Map percentage to LED brightness (0-255)
int newBrightness = map(newBrightnessPercentage, 0, 100, 0, 255);
// Update if changed
if (newBrightnessPercentage != brightnessPercentage) {
brightnessPercentage = newBrightnessPercentage;
currentBrightness = newBrightness;
Serial.print("Brightness: ");
Serial.print(brightnessPercentage);
Serial.println("%");
}
}
void readButton() {
// Read button state (LOW when pressed due to pull-up)
bool buttonState = digitalRead(BUTTON_PIN);
// Check for button press with debouncing
if (buttonState == LOW && lastButtonState == HIGH) {
if (millis() - lastButtonPress > DEBOUNCE_DELAY) {
buttonPressed = true;
lastButtonPress = millis();
// Generate random color
generateRandomColor();
Serial.print("New color: R=");
Serial.print(currentColor.r);
Serial.print(" G=");
Serial.print(currentColor.g);
Serial.print(" B=");
Serial.println(currentColor.b);
}
}
lastButtonState = buttonState;
}
void generateRandomColor() {
// Generate random RGB values
currentColor.r = random(256);
currentColor.g = random(256);
currentColor.b = random(256);
// Ensure minimum brightness for visibility
if (currentColor.r == 0 && currentColor.g == 0 && currentColor.b == 0) {
currentColor.r = random(50, 256);
}
}
void setAllLEDs(CRGB color) {
// Set all LEDs to the same color
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
}
void updateDisplay() {
// Set all LEDs to current color
setAllLEDs(currentColor);
// Apply brightness
FastLED.setBrightness(currentBrightness);
// Update display
FastLED.show();
}
void displayStatus() {
static unsigned long lastDisplay = 0;
if (millis() - lastDisplay > 2000) {
Serial.println("=== STATUS ===");
Serial.print("Color: R=");
Serial.print(currentColor.r);
Serial.print(" G=");
Serial.print(currentColor.g);
Serial.print(" B=");
Serial.println(currentColor.b);
Serial.print("Brightness: ");
Serial.print(brightnessPercentage);
Serial.println("%");
Serial.print("Potentiometer: ");
Serial.println(analogRead(POT_PIN));
Serial.println();
lastDisplay = millis();
}
}
```
## **Advanced Color and Brightness Controller**
```cpp
// Advanced Color and Brightness Controller
// Enhanced features with color presets and smooth transitions
#include <FastLED.h>
// Pin definitions
#define LED_PIN 5 // TK33 WS2812 LED Strip on D5
#define POT_PIN A3 // TK07 Potentiometer on A3
#define BUTTON_PIN 3 // TK04 Button on D3
#define NUM_LEDS 5 // TK33 has 5 WS2812 LEDs
// LED array
CRGB leds[NUM_LEDS];
// Button variables
#define DEBOUNCE_DELAY 50
#define LONG_PRESS_TIME 1000
unsigned long lastButtonPress = 0;
unsigned long buttonPressStart = 0;
bool lastButtonState = HIGH;
bool buttonPressed = false;
bool longPressDetected = false;
// Color and brightness variables
CRGB currentColor = CRGB::Red;
CRGB targetColor = CRGB::Red;
int currentBrightness = 100;
int targetBrightness = 100;
int brightnessPercentage = 100;
// Color presets
CRGB colorPresets[] = {
CRGB::Red,
CRGB::Green,
CRGB::Blue,
CRGB::Yellow,
CRGB::Purple,
CRGB::Cyan,
CRGB::Orange,
CRGB::Pink,
CRGB::White,
CRGB::WarmWhite
};
int numPresets = sizeof(colorPresets) / sizeof(colorPresets[0]);
int currentPreset = 0;
// Transition variables
bool transitioning = false;
unsigned long transitionStart = 0;
#define TRANSITION_DURATION 500 // milliseconds
void setup() {
Serial.begin(9600);
Serial.println("Advanced Color and Brightness Controller");
Serial.println("=======================================");
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(currentBrightness);
pinMode(POT_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
FastLED.clear();
FastLED.show();
delay(1000);
Serial.println("Advanced controller initialized!");
Serial.println("Short press: Random color");
Serial.println("Long press: Cycle through presets");
Serial.println("Potentiometer: Adjust brightness");
Serial.println();
// Set initial color
setAllLEDs(currentColor);
FastLED.show();
}
void loop() {
// Read inputs
readPotentiometer();
readAdvancedButton();
// Handle transitions
handleTransitions();
// Update display
updateAdvancedDisplay();
// Display status
displayAdvancedStatus();
delay(20); // Faster updates for smooth transitions
}
void readPotentiometer() {
int potValue = analogRead(POT_PIN);
int newBrightnessPercentage = map(potValue, 0, 1023, 0, 100);
int newBrightness = map(newBrightnessPercentage, 0, 100, 0, 255);
if (newBrightnessPercentage != brightnessPercentage) {
brightnessPercentage = newBrightnessPercentage;
targetBrightness = newBrightness;
if (!transitioning) {
currentBrightness = targetBrightness;
}
Serial.print("Brightness: ");
Serial.print(brightnessPercentage);
Serial.println("%");
}
}
void readAdvancedButton() {
bool buttonState = digitalRead(BUTTON_PIN);
// Button press detection
if (buttonState == LOW && lastButtonState == HIGH) {
buttonPressStart = millis();
lastButtonPress = millis();
}
// Button release detection
if (buttonState == HIGH && lastButtonState == LOW) {
unsigned long pressDuration = millis() - buttonPressStart;
if (pressDuration > DEBOUNCE_DELAY && pressDuration < LONG_PRESS_TIME) {
// Short press - random color
generateRandomColor();
Serial.println("Short press: Random color generated");
} else if (pressDuration >= LONG_PRESS_TIME) {
// Long press - cycle preset
cycleColorPreset();
Serial.println("Long press: Color preset cycled");
}
}
lastButtonState = buttonState;
}
void generateRandomColor() {
targetColor.r = random(256);
targetColor.g = random(256);
targetColor.b = random(256);
// Ensure minimum brightness
if (targetColor.r == 0 && targetColor.g == 0 && targetColor.b == 0) {
targetColor.r = random(50, 256);
}
startTransition();
}
void cycleColorPreset() {
currentPreset = (currentPreset + 1) % numPresets;
targetColor = colorPresets[currentPreset];
Serial.print("Preset ");
Serial.print(currentPreset);
Serial.print(": ");
printColorName(targetColor);
Serial.println();
startTransition();
}
void startTransition() {
transitioning = true;
transitionStart = millis();
}
void handleTransitions() {
if (transitioning) {
unsigned long elapsed = millis() - transitionStart;
float progress = (float)elapsed / TRANSITION_DURATION;
if (progress >= 1.0) {
// Transition complete
currentColor = targetColor;
currentBrightness = targetBrightness;
transitioning = false;
} else {
// Smooth transition
currentColor.r = lerp8(currentColor.r, targetColor.r, progress * 255);
currentColor.g = lerp8(currentColor.g, targetColor.g, progress * 255);
currentColor.b = lerp8(currentColor.b, targetColor.b, progress * 255);
currentBrightness = lerp8(currentBrightness, targetBrightness, progress * 255);
}
}
}
void setAllLEDs(CRGB color) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
}
void updateAdvancedDisplay() {
setAllLEDs(currentColor);
FastLED.setBrightness(currentBrightness);
FastLED.show();
}
void displayAdvancedStatus() {
static unsigned long lastDisplay = 0;
if (millis() - lastDisplay > 3000) {
Serial.println("=== ADVANCED STATUS ===");
Serial.print("Color: R=");
Serial.print(currentColor.r);
Serial.print(" G=");
Serial.print(currentColor.g);
Serial.print(" B=");
Serial.println(currentColor.b);
Serial.print("Brightness: ");
Serial.print(brightnessPercentage);
Serial.println("%");
Serial.print("Preset: ");
Serial.print(currentPreset);
Serial.print("/");
Serial.println(numPresets - 1);
Serial.print("Transitioning: ");
Serial.println(transitioning ? "Yes" : "No");
Serial.println();
lastDisplay = millis();
}
}
void printColorName(CRGB color) {
if (color == CRGB::Red) Serial.print("Red");
else if (color == CRGB::Green) Serial.print("Green");
else if (color == CRGB::Blue) Serial.print("Blue");
else if (color == CRGB::Yellow) Serial.print("Yellow");
else if (color == CRGB::Purple) Serial.print("Purple");
else if (color == CRGB::Cyan) Serial.print("Cyan");
else if (color == CRGB::Orange) Serial.print("Orange");
else if (color == CRGB::Pink) Serial.print("Pink");
else if (color == CRGB::White) Serial.print("White");
else if (color == CRGB::WarmWhite) Serial.print("Warm White");
else Serial.print("Custom");
}
```
## **Interactive Color and Brightness Controller**
```cpp
// Interactive Color and Brightness Controller
// Serial commands and advanced features
#include <FastLED.h>
// Pin definitions
#define LED_PIN 5 // TK33 WS2812 LED Strip on D5
#define POT_PIN A3 // TK07 Potentiometer on A3
#define BUTTON_PIN 3 // TK04 Button on D3
#define NUM_LEDS 5 // TK33 has 5 WS2812 LEDs
// LED array
CRGB leds[NUM_LEDS];
// Button variables
#define DEBOUNCE_DELAY 50
unsigned long lastButtonPress = 0;
bool lastButtonState = HIGH;
// Color and brightness variables
CRGB currentColor = CRGB::Red;
int currentBrightness = 100;
int brightnessPercentage = 100;
bool autoMode = true;
// Color modes
enum ColorMode {
MODE_RANDOM,
MODE_RAINBOW,
MODE_WARM_COLORS,
MODE_COOL_COLORS,
MODE_PRESET
};
ColorMode currentMode = MODE_RANDOM;
// Rainbow variables
uint8_t rainbowHue = 0;
void setup() {
Serial.begin(9600);
Serial.println("Interactive Color and Brightness Controller");
Serial.println("===========================================");
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(currentBrightness);
pinMode(POT_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
FastLED.clear();
FastLED.show();
delay(1000);
Serial.println("Interactive controller ready!");
Serial.println("Commands: random, rainbow, warm, cool, preset, auto, manual, status, help");
Serial.println();
setAllLEDs(currentColor);
FastLED.show();
}
void loop() {
// Handle serial commands
handleSerialCommands();
// Read inputs
readPotentiometer();
readButton();
// Update display based on mode
updateInteractiveDisplay();
delay(50);
}
void handleSerialCommands() {
if (Serial.available()) {
String command = Serial.readStringUntil('\n');
command.trim();
command.toLowerCase();
if (command == "random") {
currentMode = MODE_RANDOM;
generateRandomColor();
Serial.println("Mode: Random colors");
} else if (command == "rainbow") {
currentMode = MODE_RAINBOW;
Serial.println("Mode: Rainbow cycle");
} else if (command == "warm") {
currentMode = MODE_WARM_COLORS;
generateWarmColor();
Serial.println("Mode: Warm colors");
} else if (command == "cool") {
currentMode = MODE_COOL_COLORS;
generateCoolColor();
Serial.println("Mode: Cool colors");
} else if (command == "preset") {
currentMode = MODE_PRESET;
cyclePreset();
Serial.println("Mode: Color presets");
} else if (command == "auto") {
autoMode = true;
Serial.println("Auto mode enabled");
} else if (command == "manual") {
autoMode = false;
Serial.println("Manual mode enabled");
} else if (command == "status") {
displayInteractiveStatus();
} else if (command == "help") {
displayHelp();
} else {
Serial.println("Unknown command. Type 'help' for available commands.");
}
}
}
void readPotentiometer() {
int potValue = analogRead(POT_PIN);
int newBrightnessPercentage = map(potValue, 0, 1023, 0, 100);
int newBrightness = map(newBrightnessPercentage, 0, 100, 0, 255);
if (newBrightnessPercentage != brightnessPercentage) {
brightnessPercentage = newBrightnessPercentage;
currentBrightness = newBrightness;
if (!autoMode) {
Serial.print("Brightness: ");
Serial.print(brightnessPercentage);
Serial.println("%");
}
}
}
void readButton() {
bool buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW && lastButtonState == HIGH) {
if (millis() - lastButtonPress > DEBOUNCE_DELAY) {
lastButtonPress = millis();
if (autoMode) {
// Auto mode - change color based on current mode
switch (currentMode) {
case MODE_RANDOM:
generateRandomColor();
break;
case MODE_RAINBOW:
// Rainbow mode doesn't change on button press
break;
case MODE_WARM_COLORS:
generateWarmColor();
break;
case MODE_COOL_COLORS:
generateCoolColor();
break;
case MODE_PRESET:
cyclePreset();
break;
}
} else {
// Manual mode - always random
generateRandomColor();
}
}
}
lastButtonState = buttonState;
}
void generateRandomColor() {
currentColor.r = random(256);
currentColor.g = random(256);
currentColor.b = random(256);
if (currentColor.r == 0 && currentColor.g == 0 && currentColor.b == 0) {
currentColor.r = random(50, 256);
}
if (!autoMode) {
Serial.print("Random color: R=");
Serial.print(currentColor.r);
Serial.print(" G=");
Serial.print(currentColor.g);
Serial.print(" B=");
Serial.println(currentColor.b);
}
}
void generateWarmColor() {
// Warm colors: red, orange, yellow, warm white
int colorType = random(4);
switch (colorType) {
case 0:
currentColor = CRGB::Red;
break;
case 1:
currentColor = CRGB::Orange;
break;
case 2:
currentColor = CRGB::Yellow;
break;
case 3:
currentColor = CRGB::WarmWhite;
break;
}
}
void generateCoolColor() {
// Cool colors: blue, green, cyan, purple
int colorType = random(4);
switch (colorType) {
case 0:
currentColor = CRGB::Blue;
break;
case 1:
currentColor = CRGB::Green;
break;
case 2:
currentColor = CRGB::Cyan;
break;
case 3:
currentColor = CRGB::Purple;
break;
}
}
void cyclePreset() {
static int presetIndex = 0;
CRGB presets[] = {CRGB::Red, CRGB::Green, CRGB::Blue, CRGB::Yellow, CRGB::Purple, CRGB::Cyan, CRGB::Orange, CRGB::Pink, CRGB::White, CRGB::WarmWhite};
int numPresets = sizeof(presets) / sizeof(presets[0]);
presetIndex = (presetIndex + 1) % numPresets;
currentColor = presets[presetIndex];
if (!autoMode) {
Serial.print("Preset ");
Serial.print(presetIndex);
Serial.println(" selected");
}
}
void setAllLEDs(CRGB color) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
}
void updateInteractiveDisplay() {
if (currentMode == MODE_RAINBOW) {
// Rainbow cycle effect
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(rainbowHue + i * 32, 255, 255);
}
rainbowHue += 2;
} else {
// Solid color mode
setAllLEDs(currentColor);
}
FastLED.setBrightness(currentBrightness);
FastLED.show();
}
void displayInteractiveStatus() {
Serial.println("=== INTERACTIVE STATUS ===");
Serial.print("Mode: ");
switch (currentMode) {
case MODE_RANDOM: Serial.println("Random"); break;
case MODE_RAINBOW: Serial.println("Rainbow"); break;
case MODE_WARM_COLORS: Serial.println("Warm Colors"); break;
case MODE_COOL_COLORS: Serial.println("Cool Colors"); break;
case MODE_PRESET: Serial.println("Preset"); break;
}
Serial.print("Auto Mode: ");
Serial.println(autoMode ? "Yes" : "No");
Serial.print("Color: R=");
Serial.print(currentColor.r);
Serial.print(" G=");
Serial.print(currentColor.g);
Serial.print(" B=");
Serial.println(currentColor.b);
Serial.print("Brightness: ");
Serial.print(brightnessPercentage);
Serial.println("%");
Serial.println();
}
void displayHelp() {
Serial.println("=== AVAILABLE COMMANDS ===");
Serial.println("random - Random color mode");
Serial.println("rainbow - Rainbow cycle mode");
Serial.println("warm - Warm colors mode");
Serial.println("cool - Cool colors mode");
Serial.println("preset - Color preset mode");
Serial.println("auto - Enable auto mode");
Serial.println("manual - Enable manual mode");
Serial.println("status - Display current status");
Serial.println("help - Show this help");
Serial.println();
}
```
## **Code Explanation**
### **Basic Version Features**
- **Button Control**: Press TK04 to generate random colors
- **Potentiometer Control**: Turn TK07 to adjust brightness (0-100%)
- **Debouncing**: Prevents multiple triggers from single button press
- **Real-time Updates**: Immediate response to input changes
### **Advanced Version Features**
- **Smooth Transitions**: Gradual color and brightness changes
- **Color Presets**: Predefined color options
- **Long Press Detection**: Different actions for short/long button press
- **Enhanced Feedback**: Detailed serial output
### **Interactive Version Features**
- **Serial Commands**: Remote control via serial interface
- **Multiple Modes**: Random, rainbow, warm, cool, preset modes
- **Auto/Manual Mode**: Automatic or manual color changes
- **Advanced Color Generation**: Themed color palettes
### **Key Functions**
#### **Button Handling:**
- **Debouncing**: Prevents false triggers
- **Press Detection**: Short and long press recognition
- **State Management**: Tracks button state changes
#### **Potentiometer Processing:**
- **Analog Reading**: Reads 0-1023 range
- **Mapping**: Converts to 0-100% brightness
- **Real-time Control**: Immediate brightness adjustment
#### **Color Generation:**
- **Random Colors**: Full RGB spectrum
- **Preset Colors**: Predefined color options
- **Themed Colors**: Warm and cool color palettes
#### **LED Control:**
- **Individual Control**: Set each LED independently
- **Brightness Scaling**: Apply brightness to all LEDs
- **Color Consistency**: Maintain color while adjusting brightness
## **Expected Output**
### **Basic Version:**
```
Color and Brightness Controller
===============================
Controller initialized!
TK33 WS2812 LED Strip: D5
TK07 Potentiometer: A3
TK04 Button: D3
Press button to change color
Turn potentiometer to adjust brightness
New color: R=255 G=128 B=64
Brightness: 75%
=== STATUS ===
Color: R=255 G=128 B=64
Brightness: 75%
Potentiometer: 768
```
### **Advanced Version:**
```
Advanced Color and Brightness Controller
=======================================
Advanced controller initialized!
Short press: Random color
Long press: Cycle through presets
Potentiometer: Adjust brightness
Short press: Random color generated
Brightness: 60%
Long press: Color preset cycled
Preset 1: Green
=== ADVANCED STATUS ===
Color: R=0 G=255 B=0
Brightness: 60%
Preset: 1/9
Transitioning: No
```
### **Interactive Version:**
```
Interactive Color and Brightness Controller
===========================================
Interactive controller ready!
Commands: random, rainbow, warm, cool, preset, auto, manual, status, help
random
Mode: Random colors
Random color: R=128 G=255 B=64
rainbow
Mode: Rainbow cycle
status
=== INTERACTIVE STATUS ===
Mode: Rainbow
Auto Mode: Yes
Color: R=255 G=0 B=255
Brightness: 80%
```
## **Troubleshooting**
### **Button Issues:**
- Check TK04 wiring (D3 pin)
- Verify internal pull-up resistor
- Test button state with Serial output
- Check for loose connections
### **Potentiometer Issues:**
- Check TK07 wiring (A3 pin)
- Verify voltage supply (5V)
- Test analog reading range
- Check for noise in readings
### **LED Strip Issues:**
- Check TK33 wiring (D5 pin)
- Verify power supply (5V, sufficient current)
- Test with simple color setting
- Check FastLED library installation
### **Color Issues:**
- Verify random number generation
- Check color mapping functions
- Test individual RGB components
- Verify brightness scaling
## **Applications**
### **Home Automation**
- **Mood Lighting**: Create different atmospheres
- **Smart Home**: Integrate with home automation systems
- **Ambient Lighting**: Background lighting control
- **Party Lighting**: Dynamic event lighting
### **Educational**
- **Color Theory**: Learn RGB color mixing
- **Analog Input**: Practice potentiometer control
- **Digital Input**: Learn button interfacing
- **Real-time Systems**: Practice responsive programming
### **Commercial**
- **Display Lighting**: Product showcase lighting
- **Retail Ambiance**: Store atmosphere control
- **Event Lighting**: Dynamic venue lighting
- **Signage**: Interactive advertising displays
### **Art & Design**
- **Color Testing**: Test color combinations
- **Lighting Design**: Prototype lighting effects
- **Interactive Art**: User-controlled installations
- **Color Palettes**: Develop color schemes
## **Next Steps**
- Add wireless control capabilities
- Implement color temperature control
- Create scheduling features
- Add music-reactive modes
## **Resources**
- **FastLED Library**: https://github.com/FastLED/FastLED
- **Color Theory**: RGB color space and mixing
- **Analog Input**: Potentiometer interfacing
- **Digital Input**: Button debouncing techniques