Copy /*******************************************************************************
* Example 3: LED Widget Control
*
* Official Reference: https://docs.lvgl.io/9.2/widgets/led.html
* Slider Reference: https://docs.lvgl.io/9.2/widgets/slider.html
******************************************************************************/
/* Global variables for cross-callback access */
static lv_obj_t * led;
static lv_obj_t * brightness_label;
static lv_obj_t * slider_label;
/* ON button callback */
static void on_btn_cb(lv_event_t * e)
{
(void)e; /* Unused parameter */
lv_led_on(led);
lv_label_set_text(brightness_label, "Brightness: 255 (ON)");
}
/* OFF button callback */
static void off_btn_cb(lv_event_t * e)
{
(void)e;
lv_led_off(led);
lv_label_set_text(brightness_label, "Brightness: 0 (OFF)");
}
/* Slider callback */
static void slider_cb(lv_event_t * e)
{
lv_obj_t * slider = lv_event_get_target(e);
int32_t value = lv_slider_get_value(slider);
/* Update percentage label (0-255 -> 0-100%) */
int percent = (value * 100) / 255;
lv_label_set_text_fmt(slider_label, "%d%%", percent);
/* Update LED brightness */
lv_led_set_brightness(led, (uint8_t)value);
lv_label_set_text_fmt(brightness_label, "Brightness: %d", (int)value);
}
void week3_ex3_led_control(void)
{
/* Background */
lv_obj_set_style_bg_color(lv_screen_active(),
lv_color_hex(0x0f0f23),
LV_PART_MAIN);
/* Title */
lv_obj_t * title = lv_label_create(lv_screen_active());
lv_label_set_text(title, "Week 3 - Example 3: LED Widget");
lv_obj_set_style_text_color(title, lv_color_hex(0xFFFFFF), 0);
lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 20);
/* Create LED widget */
led = lv_led_create(lv_screen_active());
lv_obj_set_size(led, 80, 80);
lv_obj_align(led, LV_ALIGN_CENTER, 0, -70);
lv_led_set_color(led, lv_palette_main(LV_PALETTE_GREEN));
lv_led_set_brightness(led, 150);
/* Brightness label */
brightness_label = lv_label_create(lv_screen_active());
lv_label_set_text(brightness_label, "Brightness: 150");
lv_obj_set_style_text_color(brightness_label, lv_color_hex(0xFFFFFF), 0);
lv_obj_align(brightness_label, LV_ALIGN_CENTER, 0, 0);
/* ON Button */
lv_obj_t * btn_on = lv_button_create(lv_screen_active());
lv_obj_add_event_cb(btn_on, on_btn_cb, LV_EVENT_CLICKED, NULL);
lv_obj_align(btn_on, LV_ALIGN_CENTER, -60, 50);
lv_obj_set_style_bg_color(btn_on, lv_palette_main(LV_PALETTE_GREEN), 0);
lv_obj_set_style_pad_hor(btn_on, 30, 0);
lv_obj_set_style_pad_ver(btn_on, 15, 0);
lv_obj_t * label_on = lv_label_create(btn_on);
lv_label_set_text(label_on, "ON");
lv_obj_center(label_on);
/* OFF Button */
lv_obj_t * btn_off = lv_button_create(lv_screen_active());
lv_obj_add_event_cb(btn_off, off_btn_cb, LV_EVENT_CLICKED, NULL);
lv_obj_align(btn_off, LV_ALIGN_CENTER, 60, 50);
lv_obj_set_style_bg_color(btn_off, lv_palette_main(LV_PALETTE_RED), 0);
lv_obj_set_style_pad_hor(btn_off, 30, 0);
lv_obj_set_style_pad_ver(btn_off, 15, 0);
lv_obj_t * label_off = lv_label_create(btn_off);
lv_label_set_text(label_off, "OFF");
lv_obj_center(label_off);
/* Brightness Slider */
lv_obj_t * slider = lv_slider_create(lv_screen_active());
lv_obj_set_width(slider, 200);
lv_obj_align(slider, LV_ALIGN_CENTER, 0, 110);
lv_slider_set_range(slider, 0, 255);
lv_slider_set_value(slider, 150, LV_ANIM_OFF);
lv_obj_add_event_cb(slider, slider_cb, LV_EVENT_VALUE_CHANGED, NULL);
/* Slider percentage label */
slider_label = lv_label_create(lv_screen_active());
lv_label_set_text(slider_label, "59%"); /* 150/255 = 59% */
lv_obj_set_style_text_color(slider_label, lv_color_hex(0xFFFFFF), 0);
lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 5);
/* Description */
lv_obj_t * desc = lv_label_create(lv_screen_active());
lv_label_set_text(desc, "Learning: lv_led_create, lv_led_on/off, lv_led_set_brightness");
lv_obj_set_style_text_color(desc, lv_color_hex(0xAAAAAA), 0);
lv_obj_align(desc, LV_ALIGN_BOTTOM_MID, 0, -30);
}