Community project
RGB Button Color Controller
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

Gather all the parts
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"
2. Connections between "rgb_led_1" and "Raspberry Pi Pico"
3. Connections between "resistor_red_1" and "Raspberry Pi Pico"
4. Connections between "resistor_green_1" and "Raspberry Pi Pico"
5. Connections between "resistor_blue_1" and "Raspberry Pi Pico"
6. Connections between "button_1" and "Raspberry Pi Pico"
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.




