Przekaźniki podepniemy do np. GPIO 18 i 19 i do roboty...
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "lvgl/lvgl.h"
- #include "lvgl_helpers.h"
- #include "driver/gpio.h"
- #define RELAY1_PIN GPIO_NUM_18
- #define RELAY2_PIN GPIO_NUM_19
- static void lv_tick_task(void *arg) {
- (void) arg;
- lv_tick_inc(portTICK_PERIOD_MS);
- }
- static void relay1_event_handler(lv_event_t *e) {
- lv_event_code_t code = lv_event_get_code(e);
- if (code == LV_EVENT_CLICKED) {
- static bool relay1_state = false;
- relay1_state = !relay1_state;
- gpio_set_level(RELAY1_PIN, relay1_state);
- }
- }
- static void relay2_event_handler(lv_event_t *e) {
- lv_event_code_t code = lv_event_get_code(e);
- if (code == LV_EVENT_CLICKED) {
- static bool relay2_state = false;
- relay2_state = !relay2_state;
- gpio_set_level(RELAY2_PIN, relay2_state);
- }
- }
- void app_main() {
- // Inicjalizacja LVGL
- lv_init();
- // Inicjalizacja sterownika ekranu i dotyku
- lvgl_driver_init();
- // Inicjalizacja bufora dla LVGL
- static lv_disp_draw_buf_t draw_buf;
- static lv_color_t buf1[DISP_BUF_SIZE];
- lv_disp_draw_buf_init(&draw_buf, buf1, NULL, DISP_BUF_SIZE);
- // Inicjalizacja wyświetlacza
- static lv_disp_drv_t disp_drv;
- lv_disp_drv_init(&disp_drv);
- disp_drv.draw_buf = &draw_buf;
- disp_drv.flush_cb = disp_driver_flush;
- disp_drv.hor_res = 320; // Dostępna rozdzielczość pozioma
- disp_drv.ver_res = 240; // Dostępna rozdzielczość pionowa
- lv_disp_drv_register(&disp_drv);
- // Inicjalizacja sterownika dotykowego
- static lv_indev_drv_t indev_drv;
- lv_indev_drv_init(&indev_drv);
- indev_drv.type = LV_INDEV_TYPE_POINTER;
- indev_drv.read_cb = touch_driver_read;
- lv_indev_drv_register(&indev_drv);
- // Inicjalizacja ticków dla LVGL
- const esp_timer_create_args_t periodic_timer_args = {
- .callback = &lv_tick_task,
- .name = "periodic_gui"
- };
- esp_timer_handle_t periodic_timer;
- esp_timer_create(&periodic_timer_args, &periodic_timer);
- esp_timer_start_periodic(periodic_timer, 1 * 1000U);
- // Konfiguracja pinów przekaźników
- gpio_config_t io_conf;
- io_conf.intr_type = GPIO_INTR_DISABLE;
- io_conf.mode = GPIO_MODE_OUTPUT;
- io_conf.pin_bit_mask = (1ULL << RELAY1_PIN) | (1ULL << RELAY2_PIN);
- io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
- io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
- gpio_config(&io_conf);
- // Utworzenie pierwszego przycisku
- lv_obj_t *btn1 = lv_btn_create(lv_scr_act());
- lv_obj_set_pos(btn1, 50, 50); // Pozycja przycisku na ekranie
- lv_obj_add_event_cb(btn1, relay1_event_handler, LV_EVENT_ALL, NULL);
- lv_obj_t *label1 = lv_label_create(btn1);
- lv_label_set_text(label1, "Relay 1");
- // Utworzenie drugiego przycisku
- lv_obj_t *btn2 = lv_btn_create(lv_scr_act());
- lv_obj_set_pos(btn2, 50, 150); // Pozycja przycisku na ekranie
- lv_obj_add_event_cb(btn2, relay2_event_handler, LV_EVENT_ALL, NULL);
- lv_obj_t *label2 = lv_label_create(btn2);
- lv_label_set_text(label2, "Relay 2");
- // Główna pętla
- while (1) {
- lv_task_handler();
- vTaskDelay(pdMS_TO_TICKS(10));
- }
- }