KY-009 RGB Full Color LED SMD Module
The KY-009 is an RGB LED module that allows for the creation of various colors by adjusting the brightness of its red, green, and blue LEDs using PWM signals. It is suitable for projects requiring colorful visual displays.

On this page
KY-009 pinout
The KY-009 is a 4-pin RGB LED module with 5050 SMD LED (common cathode):
| Pin | Type | Description | Notes |
|---|---|---|---|
| Pin (-) | Power | Common cathode (ground) | Shared ground for all LEDs |
| Pin (R) | Communication | Red LED anode | 1.8V forward voltage, 180Ω resistor |
| Pin (G) | Communication | Green LED anode | 2.8V forward voltage, 100Ω resistor |
| Pin (B) | Communication | Blue LED anode | 2.8V forward voltage, 100Ω resistor |
Interface: PWM control for each color channel
Colors: 16.7 million colors via RGB mixing
LED Type: 5050 SMD (surface mount device)
Power: 5V operation, common cathode configuration
Resistors: R=180Ω (1.8V), G=100Ω (2.8V), B=100Ω (2.8V)
Applications: Status indicators, mood lighting, color displays, decorative effects
Wiring the KY-009 to ESP32
To interface the KY-009 with an ESP32 for RGB color control:
| KY-009 pin | ESP32 pin | Purpose |
|---|---|---|
| Pin (-) | GND | Common ground |
| Pin (R) | GPIO18 | Red channel (via 180Ω resistor) |
| Pin (G) | GPIO19 | Green channel (via 100Ω resistor) |
| Pin (B) | GPIO21 | Blue channel (via 100Ω resistor) |
Current-Limiting Resistors Required: Red=180Ω, Green/Blue=100Ω for LED protection
PWM Control: Use PWM on all three GPIO pins for smooth color transitions
GPIO Selection: Use any PWM-capable GPIOs, shown pins are examples
Brightness: Adjust PWM duty cycle for brightness control
KY-009 code examples
KY-009 Arduino example
Copyint redPin = 18; // GPIO18, matches the wiring above
int greenPin = 19; // GPIO19
int bluePin = 21; // GPIO21
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
setColor(255, 0, 0); // Red
delay(1000);
setColor(0, 255, 0); // Green
delay(1000);
setColor(0, 0, 255); // Blue
delay(1000);
setColor(255, 255, 0); // Yellow
delay(1000);
setColor(0, 255, 255); // Cyan
delay(1000);
setColor(255, 0, 255); // Magenta
delay(1000);
setColor(255, 255, 255); // White
delay(1000);
}
void setColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}This Arduino code defines pins 9, 10, and 11 for controlling the red, green, and blue channels of the KY-009 module, respectively. The setColor() function sets the brightness of each color using PWM, allowing the LED to display various colors. The loop() function cycles through several colors with a one-second delay between each.
KY-009 ESP-IDF example
Copy#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#define RED_PIN GPIO_NUM_18
#define GREEN_PIN GPIO_NUM_19
#define BLUE_PIN GPIO_NUM_21
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_MODE LEDC_HIGH_SPEED_MODE
#define LEDC_CHANNEL_R LEDC_CHANNEL_0
#define LEDC_CHANNEL_G LEDC_CHANNEL_1
#define LEDC_CHANNEL_B LEDC_CHANNEL_2
void configure_led_pwm(gpio_num_t pin, ledc_channel_t channel) {
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_MODE,
.timer_num = LEDC_TIMER,
.duty_resolution = LEDC_TIMER_10_BIT,
.freq_hz = 1000
};
ledc_timer_config(&ledc_timer);
ledc_channel_config_t ledc_channel = {
.gpio_num = pin,
.speed_mode = LEDC_MODE,
.channel = channel,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LEDC_TIMER,
.duty = 0,
.hpoint = 0
};
ledc_channel_config(&ledc_channel);
}
void set_color(uint32_t red, uint32_t green, uint32_t blue) {
ledc_set_duty(LEDC_MODE, LEDC_CHANNEL_R, red);
ledc_update_duty(LEDC_MODE, LEDC_CHANNEL_R);
ledc_set_duty(LEDC_MODE, LEDC_CHANNEL_G, green);
ledc_update_duty(LEDC_MODE, LEDC_CHANNEL_G);
ledc_set_duty(LEDC_MODE, LEDC_CHANNEL_B, blue);
ledc_update_duty(LEDC_MODE, LEDC_CHANNEL_B);
}
void app_main(void) {
configure_led_pwm(RED_PIN, LEDC_CHANNEL_R);
configure_led_pwm(GREEN_PIN, LEDC_CHANNEL_G);
configure_led_pwm(BLUE_PIN, LEDC_CHANNEL_B);
while (1) {
set_color(1023, 0, 0); // Red
vTaskDelay(pdMS_TO_TICKS(1000));
set_color(0, 1023, 0); // Green
vTaskDelay(pdMS_TO_TICKS(1000));
set_color(0, 0, 1023); // Blue
vTaskDelay(pdMS_TO_TICKS(1000));
}
}This ESP-IDF code configures the KY-009 RGB LED module using PWM on GPIO18 (red), GPIO19 (green), and GPIO21 (blue). The configure_led_pwm() function sets up PWM for each LED channel, and set_color() controls the brightness levels. The main loop cycles through red, green, and blue colors with one-second intervals.
KY-009 ESPHome example
Copyoutput:
- platform: ledc
pin: GPIO18
id: red_led
- platform: ledc
pin: GPIO19
id: green_led
- platform: ledc
pin: GPIO21
id: blue_led
light:
- platform: rgb
name: "KY-009 RGB LED"
red: red_led
green: green_led
blue: blue_ledThe three LED legs sit on ledc PWM outputs (GPIO18/19/21 per the wiring above), combined by the rgb light platform into a single color-capable light entity in Home Assistant. Note the KY-009 has no current-limiting resistors on board - add them in line with each color pin.
KY-009 PlatformIO example
Copy[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino#include <Arduino.h>
#define RED_PIN 18
#define GREEN_PIN 19
#define BLUE_PIN 21
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop() {
analogWrite(RED_PIN, 255);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
delay(1000);
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 255);
analogWrite(BLUE_PIN, 0);
delay(1000);
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 255);
delay(1000);
}This PlatformIO code configures the KY-009 RGB LED module with PWM signals on GPIO18, GPIO19, and GPIO21. It cycles through red, green, and blue colors with one-second intervals.
KY-009 MicroPython example
Copyimport machine
import time
RED_PIN = machine.PWM(machine.Pin(18), freq=1000)
GREEN_PIN = machine.PWM(machine.Pin(19), freq=1000)
BLUE_PIN = machine.PWM(machine.Pin(21), freq=1000)
def set_color(r, g, b):
RED_PIN.duty(r)
GREEN_PIN.duty(g)
BLUE_PIN.duty(b)
while True:
set_color(1023, 0, 0) # Red
time.sleep(1)
set_color(0, 1023, 0) # Green
time.sleep(1)
set_color(0, 0, 1023) # Blue
time.sleep(1)This MicroPython script configures GPIO18, GPIO19, and GPIO21 as PWM outputs to control the KY-009 RGB LED module. The set_color() function sets the brightness of each LED channel, cycling through red, green, and blue colors.
KY-009 specifications
About the KY-009
The KY-009 is a 5050 SMD RGB LED - a wide-angle, surface-mount package rather than the domed 5mm LED on the through-hole KY-016 - broken out to a 4-pin common-cathode header. Functionally the two modules are identical: the same per-channel PWM control, the same forward voltages (1.8V for red, 2.8V for green and blue), and but one practical difference: the KY-016 carries onboard current-limiting resistors while the KY-009 does not, so budget three external resistors (roughly 100-220 ohm) for this board. Beyond that, picking between the two comes down to the light pattern - diffuse and wide from the SMD package, more directional from the leaded dome.
Skipping the resistors and driving the LED straight from a GPIO risks exceeding its rated forward current and shortening its life. Values around 180 ohm for red and 100 ohm for green/blue at 5V, per the module’s own documentation, are the safe starting point. All three channels need PWM-capable GPIOs to mix colors smoothly - the ESP32’s ledc peripheral has plenty of channels to spare for that.
KY-009 troubleshooting
LED Not Lighting Up
›
Issue: The LED does not emit light when expected.
Solutions:
- Ensure all connections are secure and correctly wired.
- Verify that the appropriate current-limiting resistors are used to prevent LED damage.
- Check that the microcontroller's GPIO pins are configured as outputs and are providing the correct PWM signals.
Incorrect Color Output
›
Issue: The LED displays unexpected colors or does not mix colors correctly.
Solutions:
- Confirm that the PWM signals are correctly set for each color channel.
- Ensure that the resistors used for each LED are of appropriate values to balance brightness.
- Check for any software errors in the code controlling the PWM outputs.
Where to buy the KY-009

Resources
Similar sensors





