LVGL - Sterowanie przekaźnikami z GUI

Tu wszystko o LVGL
ODPOWIEDZ
Awatar użytkownika
SunRiver
Użytkownik
Posty: 1513
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Festung Oppeln
Kontakt:

LVGL - Sterowanie przekaźnikami z GUI

Post autor: SunRiver »

Tak więc teraz możemy sobie zrobić dwuprzyciskowe gui i sterować nimi przekaźniki.
Przekaźniki podepniemy do np. GPIO 18 i 19 i do roboty...
  1.  
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #include "lvgl/lvgl.h"
  5. #include "lvgl_helpers.h"
  6. #include "driver/gpio.h"
  7.  
  8. #define RELAY1_PIN GPIO_NUM_18
  9. #define RELAY2_PIN GPIO_NUM_19
  10.  
  11. static void lv_tick_task(void *arg) {
  12.     (void) arg;
  13.     lv_tick_inc(portTICK_PERIOD_MS);
  14. }
  15.  
  16. static void relay1_event_handler(lv_event_t *e) {
  17.     lv_event_code_t code = lv_event_get_code(e);
  18.     if (code == LV_EVENT_CLICKED) {
  19.         static bool relay1_state = false;
  20.         relay1_state = !relay1_state;
  21.         gpio_set_level(RELAY1_PIN, relay1_state);
  22.     }
  23. }
  24.  
  25. static void relay2_event_handler(lv_event_t *e) {
  26.     lv_event_code_t code = lv_event_get_code(e);
  27.     if (code == LV_EVENT_CLICKED) {
  28.         static bool relay2_state = false;
  29.         relay2_state = !relay2_state;
  30.         gpio_set_level(RELAY2_PIN, relay2_state);
  31.     }
  32. }
  33.  
  34. void app_main() {
  35.     // Inicjalizacja LVGL
  36.     lv_init();
  37.  
  38.     // Inicjalizacja sterownika ekranu i dotyku
  39.     lvgl_driver_init();
  40.  
  41.     // Inicjalizacja bufora dla LVGL
  42.     static lv_disp_draw_buf_t draw_buf;
  43.     static lv_color_t buf1[DISP_BUF_SIZE];
  44.     lv_disp_draw_buf_init(&draw_buf, buf1, NULL, DISP_BUF_SIZE);
  45.  
  46.     // Inicjalizacja wyświetlacza
  47.     static lv_disp_drv_t disp_drv;
  48.     lv_disp_drv_init(&disp_drv);
  49.     disp_drv.draw_buf = &draw_buf;
  50.     disp_drv.flush_cb = disp_driver_flush;
  51.     disp_drv.hor_res = 320; // Dostępna rozdzielczość pozioma
  52.     disp_drv.ver_res = 240; // Dostępna rozdzielczość pionowa
  53.     lv_disp_drv_register(&disp_drv);
  54.  
  55.     // Inicjalizacja sterownika dotykowego
  56.     static lv_indev_drv_t indev_drv;
  57.     lv_indev_drv_init(&indev_drv);
  58.     indev_drv.type = LV_INDEV_TYPE_POINTER;
  59.     indev_drv.read_cb = touch_driver_read;
  60.     lv_indev_drv_register(&indev_drv);
  61.  
  62.     // Inicjalizacja ticków dla LVGL
  63.     const esp_timer_create_args_t periodic_timer_args = {
  64.         .callback = &lv_tick_task,
  65.         .name = "periodic_gui"
  66.     };
  67.     esp_timer_handle_t periodic_timer;
  68.     esp_timer_create(&periodic_timer_args, &periodic_timer);
  69.     esp_timer_start_periodic(periodic_timer, 1 * 1000U);
  70.  
  71.     // Konfiguracja pinów przekaźników
  72.     gpio_config_t io_conf;
  73.     io_conf.intr_type = GPIO_INTR_DISABLE;
  74.     io_conf.mode = GPIO_MODE_OUTPUT;
  75.     io_conf.pin_bit_mask = (1ULL << RELAY1_PIN) | (1ULL << RELAY2_PIN);
  76.     io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  77.     io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
  78.     gpio_config(&io_conf);
  79.  
  80.     // Utworzenie pierwszego przycisku
  81.     lv_obj_t *btn1 = lv_btn_create(lv_scr_act());
  82.     lv_obj_set_pos(btn1, 50, 50); // Pozycja przycisku na ekranie
  83.     lv_obj_add_event_cb(btn1, relay1_event_handler, LV_EVENT_ALL, NULL);
  84.     lv_obj_t *label1 = lv_label_create(btn1);
  85.     lv_label_set_text(label1, "Relay 1");
  86.  
  87.     // Utworzenie drugiego przycisku
  88.     lv_obj_t *btn2 = lv_btn_create(lv_scr_act());
  89.     lv_obj_set_pos(btn2, 50, 150); // Pozycja przycisku na ekranie
  90.     lv_obj_add_event_cb(btn2, relay2_event_handler, LV_EVENT_ALL, NULL);
  91.     lv_obj_t *label2 = lv_label_create(btn2);
  92.     lv_label_set_text(label2, "Relay 2");
  93.  
  94.     // Główna pętla
  95.     while (1) {
  96.         lv_task_handler();
  97.         vTaskDelay(pdMS_TO_TICKS(10));
  98.     }
  99. }
  100.  
Teraz możemy przy pomocy dotykowego LCD i tego prostego GUI sterować przekaźnikami.
ODPOWIEDZ

Wróć do „LVGL - dla ESP32”