Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Neopixel Color Picker
- // 11/2/2025
- // Turn pot to change color or brightness
- // Press button to toggle between color and brightness
- // Read HSV or RGB value in Serial Monitor
- #include <FastLED.h>
- #define LED_PIN 2
- #define NUM_LEDS 1
- #define BUTTON_PIN 4
- #define POT_PIN A0
- CRGB leds[NUM_LEDS];
- bool modeColor = true; // true = color mode, false = brightness mode
- int buttonState; // current stable state
- int lastButtonState = HIGH;
- unsigned long lastDebounceTime = 0;
- const unsigned long debounceDelay = 50;
- uint8_t hue = 0;
- float brightness = 0.5;
- // For change detection (reduce serial spam)
- static uint8_t lastHue = 255;
- static float lastBrightness = -1.0;
- // Smooth potentiometer reading
- int readPotSmooth() {
- int sum = 0;
- for (int i = 0; i < 5; i++) {
- sum += analogRead(POT_PIN);
- delay(2);
- }
- return sum / 5;
- }
- void setup() {
- Serial.begin(9600);
- FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
- pinMode(BUTTON_PIN, INPUT_PULLUP);
- analogReference(DEFAULT);
- FastLED.setBrightness(brightness * 255);
- leds[0] = CHSV(hue, 255, 255);
- FastLED.show();
- Serial.println(F("Arduino Color Picker Example"));
- Serial.println(F("Press button to toggle between color and brightness control"));
- }
- void loop() {
- int reading = digitalRead(BUTTON_PIN);
- // --- Debounce the button ---
- if (reading != lastButtonState) {
- lastDebounceTime = millis();
- }
- if ((millis() - lastDebounceTime) > debounceDelay) {
- if (reading != buttonState) {
- buttonState = reading;
- // Toggle on press (HIGH → LOW)
- if (buttonState == LOW) {
- modeColor = !modeColor;
- Serial.println();
- Serial.println(F("--------------------------"));
- Serial.print(F("Mode changed to: "));
- Serial.println(modeColor ? F("COLOR") : F("BRIGHTNESS"));
- Serial.println(F("--------------------------"));
- // --- Visual indicator flash ---
- if (modeColor) {
- // Flash current hue at *full* brightness for visibility
- FastLED.setBrightness(255);
- leds[0] = CHSV(hue, 255, 255);
- } else {
- // Flash white at current brightness
- FastLED.setBrightness(brightness * 255);
- leds[0] = CRGB::White;
- }
- FastLED.show();
- delay(500); // flash duration
- // Restore last display
- FastLED.setBrightness(brightness * 255);
- leds[0] = CHSV(hue, 255, 255);
- FastLED.show();
- delay(500); // pause so user can notice the change
- }
- }
- }
- lastButtonState = reading;
- // --- Potentiometer reading (smoothed) ---
- int potValue = readPotSmooth();
- if (modeColor) {
- // Map pot to hue range 0–230 (avoid red wraparound)
- hue = map(potValue, 0, 1023, 0, 230);
- } else {
- // Adjust brightness (8%–100% to keep LED visible)
- brightness = map(potValue, 0, 1023, 20, 255) / 255.0;
- }
- FastLED.setBrightness(brightness * 255);
- leds[0] = CHSV(hue, 255, 255);
- FastLED.show();
- // --- Serial output (only when values change) ---
- bool changed = false;
- if (modeColor && hue != lastHue) {
- lastHue = hue;
- changed = true;
- } else if (!modeColor && abs(brightness - lastBrightness) > 0.01) {
- lastBrightness = brightness;
- changed = true;
- }
- if (changed) {
- // Convert HSV to RGB for display
- CRGB rgbColor = CHSV(hue, 255, 255);
- Serial.print(F("HSV: ("));
- Serial.print(hue);
- Serial.print(F(", 255, "));
- Serial.print((uint8_t)(brightness * 255));
- Serial.print(F(") | RGB: ("));
- Serial.print(rgbColor.r);
- Serial.print(F(", "));
- Serial.print(rgbColor.g);
- Serial.print(F(", "));
- Serial.print(rgbColor.b);
- Serial.print(F(") | Brightness: "));
- Serial.print((int)(brightness * 100));
- Serial.println(F("%"));
- }
- delay(20);
- }
Advertisement
Add Comment
Please, Sign In to add comment