Community project

RGB Button Color Controller

Raspberry Pi Pico
Photo of RGB Button Color Controller
Generated with AI

juliaccquintanilha

Published September 25, 2026

This project builds an interactive RGB LED controller powered by a Raspberry Pi Pico and a simple push button. Single clicks cycle through eight color modes (red, green, blue, yellow, cyan, magenta, white, and off), while double clicks jump to the next color. The LED is driven by three GPIO pins with current-limiting resistors, all powered by two AA batteries.

The guide includes a complete wiring diagram showing how to connect the common-cathode RGB LED, push button, and resistors to the Pico's GPIO pins, a full parts list with recommended component values, and the complete Arduino firmware with debouncing and click detection logic. Assembly takes just minutes—separate the components, solder the LED and resistors, connect the button, and power it up to start cycling through colors.

Wiring diagram

Wiring diagram for RGB Button Color Controller

Gather all the parts

QtyComponent
1

Rgb Led

LED RGB de 4 pinos, cátodo comum

Discrete four-pin common-cathode RGB LED with separate red, green, and blue anodes. Each colour channel needs its own current-limit resistor and can be PWM-dimmed from separate MCU GPIO pins.

1

Push Button

Botão tátil momentâneo

Momentary push button switch

1

Resistor

220 Ω, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

100 Ω, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

100 Ω, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Suporte para 2 pilhas AA (3 V)

2 × pilhas AA alcalinas, 3 V

Um suporte com duas pilhas AA que fornece cerca de 3 V para alimentar o Raspberry Pi Pico.

Assemble it in 4 steps

1. Separe as peças

Coloque na bancada o Raspberry Pi Pico, o LED RGB de quatro pinos com cátodo comum, o botão tátil, três resistores e o suporte com duas pilhas AA. Use um resistor de 220 Ω para a perna vermelha do LED e dois de 100 Ω para as pernas verde e azul.

  • No LED RGB de cátodo comum, a perna comum normalmente é a mais comprida. Confirme a identificação no folheto ou anúncio do seu LED antes de ligar a bateria.
  • Não use um LED RGB de ânodo comum neste circuito: ele funciona ao contrário e a identificação errada pode deixar as cores incorretas.

2. Monte o LED e os resistores

Ligue a perna comum (GND) do LED RGB a um pino GND do Pico (retorno). Ligue GP6 a uma ponta do resistor de 220 Ω e a outra ponta desse resistor à perna R do LED (cor vermelha). Ligue GP7 a uma ponta de um resistor de 100 Ω e a outra ponta à perna G (cor verde). Ligue GP8 a uma ponta do outro resistor de 100 Ω e a outra ponta à perna B (cor azul).

  • Cada cor precisa do seu próprio resistor; não una as três pernas coloridas antes dos resistores.
  • As letras R, G e B podem estar na embalagem; se não estiverem, consulte o diagrama específico do LED.
  • Não ligue nenhuma perna colorida do LED diretamente ao Pico — sem resistor a corrente pode danificar o LED ou o pino da placa.

3. Ligue o botão

Ligue uma perna do botão ao pino GP9 do Pico (sinal) e a perna do lado oposto ao GND do Pico (ground). Se o botão tiver quatro pernas, use duas pernas que não estejam do mesmo lado físico: as duas do mesmo lado já são conectadas internamente.

  • O programa mantém GP9 em nível alto sozinho; ao apertar, o botão o conecta ao GND.
  • Antes de energizar, confira que GP9 não está ligado ao positivo da bateria.
  • Usar duas pernas já unidas do mesmo lado do botão não registra o toque; atravesse o vão central do botão.

4. Ligue a alimentação de 3 V

Com as duas pilhas ainda fora do suporte, ligue o fio vermelho do suporte de duas pilhas AA ao pino VSYS do Pico (alimentação de 3 V) e o fio preto a qualquer pino GND (ground). Depois coloque as duas pilhas AA respeitando os sinais + e − do suporte.

  • O cabo USB pode ser usado para gravar o programa; retire as pilhas enquanto estiver com o USB conectado para evitar duas fontes ao mesmo tempo.
  • Não conecte o fio vermelho da bateria ao pino 3V3 do Pico: esse pino é uma saída regulada, e a ligação errada pode danificar a placa.

Review all connections

1. Connections between "battery_2aa_1" and "Raspberry Pi Pico"

Functionbattery_2aa_1Raspberry Pi Pico
powerPOSITIVEVIN
groundNEGATIVEGND

2. Connections between "rgb_led_1" and "Raspberry Pi Pico"

Functionrgb_led_1Raspberry Pi Pico
groundGNDGND

3. Connections between "resistor_red_1" and "Raspberry Pi Pico"

Functionresistor_red_1Raspberry Pi Pico
digitalP1GPIO 6
digitalP2 → Rgb Led REXT

4. Connections between "resistor_green_1" and "Raspberry Pi Pico"

Functionresistor_green_1Raspberry Pi Pico
digitalP1GPIO 7
digitalP2 → Rgb Led GEXT

5. Connections between "resistor_blue_1" and "Raspberry Pi Pico"

Functionresistor_blue_1Raspberry Pi Pico
digitalP1GPIO 8
digitalP2 → Rgb Led BEXT

6. Connections between "button_1" and "Raspberry Pi Pico"

Functionbutton_1Raspberry Pi Pico
groundGNDGND
digitalSIGNALGPIO 9

Deploy the firmware

#include <Arduino.h>
// Controle de LED RGB com clique simples e clique duplo.
// LED RGB de cátodo comum: nível alto acende cada cor.


// Hoisted type definitions
enum DisplayMode {
  MODE_OFF,
  MODE_RED,
  MODE_GREEN,
  MODE_BLUE,
  MODE_YELLOW,
  MODE_CYAN,
  MODE_MAGENTA,
  MODE_WHITE
};


// Forward declarations
void setLed(bool red, bool green, bool blue);
void showMode(DisplayMode mode);
void showNextColour();
void handleClick();

const uint8_t LED_RED_PIN = 6;
const uint8_t LED_GREEN_PIN = 7;
const uint8_t LED_BLUE_PIN = 8;
const uint8_t BUTTON_PIN = 9;

const unsigned long DEBOUNCE_MS = 35;
const unsigned long DOUBLE_CLICK_MS = 350;



DisplayMode currentMode = MODE_OFF;
bool lastRawButton = HIGH;
bool stableButton = HIGH;
unsigned long lastRawChangeMs = 0;
uint8_t pendingClicks = 0;
unsigned long firstClickMs = 0;

void setLed(bool red, bool green, bool blue) {
  digitalWrite(LED_RED_PIN, red ? HIGH : LOW);
  digitalWrite(LED_GREEN_PIN, green ? HIGH : LOW);
  digitalWrite(LED_BLUE_PIN, blue ? HIGH : LOW);
}

void showMode(DisplayMode mode) {
  currentMode = mode;
  switch (mode) {
    case MODE_RED:     setLed(true,  false, false); break;
    case MODE_GREEN:   setLed(false, true,  false); break;
    case MODE_BLUE:    setLed(false, false, true);  break;
    case MODE_YELLOW:  setLed(true,  true,  false); break;
    case MODE_CYAN:    setLed(false, true,  true);  break;
    case MODE_MAGENTA: setLed(true,  false, true);  break;
    case MODE_WHITE:   setLed(true,  true,  true);  break;
    case MODE_OFF:
    default:           setLed(false, false, false); break;
  }
}

void showNextColour() {
  switch (currentMode) {
    case MODE_OFF:     showMode(MODE_RED); break;
    case MODE_RED:     showMode(MODE_GREEN); break;
    case MODE_GREEN:   showMode(MODE_BLUE); break;
    case MODE_BLUE:    showMode(MODE_YELLOW); break;
    case MODE_YELLOW:  showMode(MODE_CYAN); break;
    case MODE_CYAN:    showMode(MODE_MAGENTA); break;
    case MODE_MAGENTA: showMode(MODE_WHITE); break;
    case MODE_WHITE:
    default:           showMode(MODE_RED); break;
  }
}

void handleClick() {
  pendingClicks++;
  if (pendingClicks == 1) {
    firstClickMs = millis();
  } else {
    // Dois toques: amarelo; se já estiver amarelo, apaga.
    pendingClicks = 0;
    if (currentMode == MODE_YELLOW) {
      showMode(MODE_OFF);
    } else {
      showMode(MODE_YELLOW);
    }
  }
}

void setup() {
  pinMode(LED_RED_PIN, OUTPUT);
  pinMode(LED_GREEN_PIN, OUTPUT);
  pinMode(LED_BLUE_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  showMode(MODE_OFF);
}

void loop() {
  const unsigned long now = millis();
  const bool rawButton = digitalRead(BUTTON_PIN);

  if (rawButton != lastRawButton) {
    lastRawButton = rawButton;
    lastRawChangeMs = now;
  }

  if ((now - lastRawChangeMs >= DEBOUNCE_MS) && rawButton != stableButton) {
    stableButton = rawButton;
    if (stableButton == LOW) {
      handleClick();
    }
  }

  if (pendingClicks == 1 && now - firstClickMs >= DOUBLE_CLICK_MS) {
    pendingClicks = 0;
    showNextColour();
  }
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik