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.

KY-009 RGB Full Color LED SMD Module image
KY-009 · PWM
PWM
Interface
4pins
Connections
5V
Supply
20mA
Power
$1
Typical price
On this page

KY-009 pinout

4 pins · PWM

The KY-009 is a 4-pin RGB LED module with 5050 SMD LED (common cathode):

View:
KY-009 RGB Full Color LED SMD Module pinout
PinTypeDescriptionNotes
Pin (-)PowerCommon cathode (ground)Shared ground for all LEDs
Pin (R)CommunicationRed LED anode1.8V forward voltage, 180Ω resistor
Pin (G)CommunicationGreen LED anode2.8V forward voltage, 100Ω resistor
Pin (B)CommunicationBlue LED anode2.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

4 connections · all required

To interface the KY-009 with an ESP32 for RGB color control:

KY-009 RGB Full Color LED SMD Module wiring with ESP32
KY-009 pinESP32 pinPurpose
Pin (-)GNDCommon ground
Pin (R)GPIO18Red channel (via 180Ω resistor)
Pin (G)GPIO19Green channel (via 100Ω resistor)
Pin (B)GPIO21Blue 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

5 platforms
Platform:

KY-009 Arduino example

Copy
int 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

Copy
output:
  - 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_led

The 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
src/main.cppCopy
#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

Copy
import 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

From the datasheet
Operating Voltage
5V
Forward Voltage (Red)
1.8V
Forward Voltage (Green/Blue)
2.8V
Forward Current
20mA
LED Type
5050 SMD
Dimensions
18.5 mm x 15 mm

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

2 common issues

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

KY-009 RGB Full Color LED SMD Module
KY-009 RGB Full Color LED SMD Module
$1per unit, typical
Amazon and AliExpress links are affiliate links - buying through them supports the site at no extra cost to you.

Resources