Browse Source

đã cài được cảm ứng CST816D

thinhhv 1 year ago
parent
commit
636f7b7ea6

+ 3 - 1
.vscode/settings.json

@@ -2,6 +2,8 @@
     "files.associations": {
         "lvgl.h": "c",
         "esp_lcd_gc9a01.h": "c",
-        "ui.h": "c"
+        "ui.h": "c",
+        "cst816d.h": "c",
+        "esp_lcd_touch_stmpe610.h": "c"
     }
 }

+ 2 - 0
CMakeLists.txt

@@ -1,4 +1,6 @@
 cmake_minimum_required(VERSION 3.16)
 
 include($ENV{IDF_PATH}/tools/cmake/project.cmake)
+set(EXTRA_COMPONENT_DIRS main/component)
+
 project(spi_lcd_touch)

+ 3 - 0
main/component/CMakeLists.txt

@@ -0,0 +1,3 @@
+idf_component_register(SRCS "CST816D.c"
+                        REQUIRES driver
+                       INCLUDE_DIRS "." )

+ 85 - 0
main/component/CST816D.c

@@ -0,0 +1,85 @@
+#include "CST816D.h"
+#include "driver/i2c.h"
+#include "driver/gpio.h"
+#include "esp_log.h"
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+
+static const char *TAG = "CST816D";
+
+static void i2c_master_init(CST816D_t *dev) {
+    i2c_config_t conf = {
+        .mode = I2C_MODE_MASTER,
+        .sda_io_num = dev->sda_pin,
+        .scl_io_num = dev->scl_pin,
+        .sda_pullup_en = GPIO_PULLUP_ENABLE,
+        .scl_pullup_en = GPIO_PULLUP_ENABLE,
+        .master.clk_speed = 100000  // 100kHz
+    };
+    i2c_param_config(dev->i2c_port, &conf);
+    i2c_driver_install(dev->i2c_port, conf.mode, 0, 0, 0);
+}
+static esp_err_t mpu9250_register_read(uint8_t reg_addr, uint8_t *data, size_t len)
+{
+    return i2c_master_write_read_device(0, I2C_ADDR_CST816D , &reg_addr, 1, data, len, 1000 / portTICK_PERIOD_MS);
+}
+void CST816D_init(CST816D_t *dev) {
+    // Initialize I2C
+    i2c_master_init(dev);
+
+    // Configure reset pin
+    if (dev->rst_pin != -1) {
+        gpio_set_direction(dev->rst_pin, GPIO_MODE_OUTPUT);
+        gpio_set_level(dev->rst_pin, 0);
+        vTaskDelay(pdMS_TO_TICKS(10));
+        gpio_set_level(dev->rst_pin, 1);
+        vTaskDelay(pdMS_TO_TICKS(300));
+    }
+
+    // Configure interrupt pin
+    if (dev->int_pin != -1) {
+        gpio_set_direction(dev->int_pin, GPIO_MODE_OUTPUT);
+        gpio_set_level(dev->int_pin, 1);
+        vTaskDelay(pdMS_TO_TICKS(1));
+        gpio_set_level(dev->int_pin, 0);
+        vTaskDelay(pdMS_TO_TICKS(1));
+    }
+
+    // Initialize touch
+    uint8_t data = 0xFF;
+    i2c_master_write_to_device(dev->i2c_port, I2C_ADDR_CST816D, &data, 1, pdMS_TO_TICKS(1000));
+    printf("init touch\n");
+}
+
+bool CST816D_getTouch(CST816D_t *dev, uint16_t *x, uint16_t *y, uint8_t *gesture) {
+    uint8_t FingerIndex = 0;
+    uint8_t reg1=0x02;
+    mpu9250_register_read(0x02,&FingerIndex,1);
+    FingerIndex = (bool)FingerIndex;
+    // uint8_t *gesture = NULL;
+    mpu9250_register_read(0x01,gesture,1);
+    if (!(*gesture == SlideUp || *gesture == SlideDown))
+    {
+        *gesture = None;
+    }
+    uint8_t data[4];
+    mpu9250_register_read(0x03,data,4);
+    *x = ((data[0] & 0x0f) << 8) | data[1];
+    printf("x: %d\n",*x);
+    *y = ((data[2] & 0x0f) << 8) | data[3];
+    printf("y: %d\n",*y);
+    return FingerIndex;
+    // uint8_t data[4];
+    // uint8_t gesture_val = 0;
+    // // printf("get touch\n");
+    // // Read gesture
+    // i2c_master_read_from_device(dev->i2c_port, I2C_ADDR_CST816D, &gesture_val, 1, pdMS_TO_TICKS(1000));
+    // *gesture = gesture_val;
+
+    // // Read touch coordinates
+    // i2c_master_read_from_device(dev->i2c_port, I2C_ADDR_CST816D, data, 4, pdMS_TO_TICKS(1000));
+    // *x = ((data[0] & 0x0F) << 8) | data[1];
+    // *y = ((data[2] & 0x0F) << 8) | data[3];
+
+    // return (*gesture != None);
+}

+ 32 - 0
main/component/CST816D.h

@@ -0,0 +1,32 @@
+#ifndef _CST816D_H
+#define _CST816D_H
+
+#include "driver/i2c.h"
+#include "driver/gpio.h"
+
+#define I2C_ADDR_CST816D 0x15
+
+// Gestures
+typedef enum {
+    None = 0x00,       // No gesture
+    SlideDown = 0x01,  // Slide down
+    SlideUp = 0x02,    // Slide up
+    SlideLeft = 0x03,  // Slide left
+    SlideRight = 0x04, // Slide right
+    SingleTap = 0x05,  // Single tap
+    DoubleTap = 0x0B,  // Double tap
+    LongPress = 0x0C   // Long press
+} GESTURE_t;
+
+typedef struct {
+    int sda_pin;
+    int scl_pin;
+    int rst_pin;
+    int int_pin;
+    i2c_port_t i2c_port;
+} CST816D_t;
+
+void CST816D_init(CST816D_t *dev);
+bool CST816D_getTouch(CST816D_t *dev, uint16_t *x, uint16_t *y, uint8_t *gesture);
+
+#endif

+ 0 - 2
main/lvgl_demo_ui.c

@@ -100,8 +100,6 @@ void example_lvgl_demo_ui(lv_disp_t *disp)
 //     lv_obj_set_y(ui_Spinner1, 0);
 //     lv_obj_set_align(ui_Spinner1, LV_ALIGN_CENTER);
 //     lv_obj_clear_flag(ui_Spinner1, LV_OBJ_FLAG_CLICKABLE);      /// Flags
-
-
 // }
 void lv_example_1(void)
 {

+ 58 - 5
main/spi_lcd_touch_example_main.c

@@ -17,6 +17,8 @@
 #include "esp_log.h"
 #include "lvgl.h"
 #include "ui.h"
+#include "component/CST816D.h"
+
 #if CONFIG_EXAMPLE_LCD_CONTROLLER_ILI9341
 #include "esp_lcd_ili9341.h"
 #elif CONFIG_EXAMPLE_LCD_CONTROLLER_GC9A01
@@ -47,6 +49,17 @@ static const char *TAG = "example";
 #define EXAMPLE_PIN_NUM_BK_LIGHT       3
 #define EXAMPLE_PIN_NUM_TOUCH_CS       1
 
+#define I2C_SDA 4
+#define I2C_SCL 5
+#define TP_INT 0
+#define TP_RST -1
+CST816D_t CST816D = {
+        .int_pin = TP_INT,
+        .rst_pin= TP_RST,
+        .scl_pin = I2C_SCL,
+        .sda_pin = I2C_SDA,
+        .i2c_port = I2C_NUM_0
+    };
 // The pixel number in horizontal and vertical
 #if CONFIG_EXAMPLE_LCD_CONTROLLER_ILI9341
 #define EXAMPLE_LCD_H_RES              240
@@ -90,6 +103,7 @@ static void example_lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_
 /* Rotate display and touch, when rotated screen in LVGL. Called when driver parameters are updated. */
 static void example_lvgl_port_update_callback(lv_disp_drv_t *drv)
 {
+    printf("vao\n");
     esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data;
 
     switch (drv->rotated) {
@@ -164,9 +178,32 @@ static void example_increase_lvgl_tick(void *arg)
     /* Tell LVGL how many milliseconds has elapsed */
     lv_tick_inc(EXAMPLE_LVGL_TICK_PERIOD_MS);
 }
+void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
+{
+    uint16_t touchX = 0, touchY = 0;
+    uint8_t gesture;
+
+    bool touched = CST816D_getTouch( &CST816D,&touchX, &touchY, &gesture );
+    printf("my touch read\n");
+    if( !touched )
+    {
+        data->state = LV_INDEV_STATE_REL;
+    }
+    else
+    {
+        data->state = LV_INDEV_STATE_PR;
 
+        /*Set the coordinates*/
+        data->point.x = touchX;
+        data->point.y = touchY;
+
+        printf( "Data x : %d\n", touchX );
+        printf( "Data y : %d\n", touchY );
+    }
+}
 void app_main(void)
 {
+   
     static lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s)
     static lv_disp_drv_t disp_drv;      // contains callback functions
 
@@ -248,10 +285,10 @@ void app_main(void)
 
 #if CONFIG_EXAMPLE_LCD_TOUCH_CONTROLLER_STMPE610
     ESP_LOGI(TAG, "Initialize touch controller STMPE610");
-    ESP_ERROR_CHECK(esp_lcd_touch_new_spi_stmpe610(tp_io_handle, &tp_cfg, &tp));
+    // ESP_ERROR_CHECK(esp_lcd_touch_new_spi_stmpe610(tp_io_handle, &tp_cfg, &tp));
 #endif // CONFIG_EXAMPLE_LCD_TOUCH_CONTROLLER_STMPE610
 #endif // CONFIG_EXAMPLE_LCD_TOUCH_ENABLED
-
+    
     ESP_LOGI(TAG, "Turn on LCD backlight");
     gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL);
 
@@ -287,21 +324,37 @@ void app_main(void)
     ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, EXAMPLE_LVGL_TICK_PERIOD_MS * 1000));
 
 #if CONFIG_EXAMPLE_LCD_TOUCH_ENABLED
+    CST816D_init(&CST816D);
     static lv_indev_drv_t indev_drv;    // Input device driver (Touch)
     lv_indev_drv_init(&indev_drv);
     indev_drv.type = LV_INDEV_TYPE_POINTER;
     indev_drv.disp = disp;
-    indev_drv.read_cb = example_lvgl_touch_cb;
+    indev_drv.read_cb = my_touchpad_read;
     indev_drv.user_data = tp;
 
     lv_indev_drv_register(&indev_drv);
 #endif
+    CST816D_init(&CST816D);
+    static lv_indev_drv_t indev_drv;    // Input device driver (Touch)
+    lv_indev_drv_init(&indev_drv);
+    indev_drv.type = LV_INDEV_TYPE_POINTER;
+    indev_drv.disp = disp;
+    indev_drv.read_cb = my_touchpad_read;
+    indev_drv.user_data =NULL;
 
+    lv_indev_drv_register(&indev_drv);
+    // static lv_indev_drv_t indev_drv;
+    // lv_indev_drv_init( &indev_drv );
+    // indev_drv.type = LV_INDEV_TYPE_POINTER;
+    // indev_drv.disp = disp;
+    // indev_drv.read_cb = my_touchpad_read;
+    // indev_drv.user_data = NULL;
+    // lv_indev_drv_register( &indev_drv );
     ESP_LOGI(TAG, "Display LVGL Meter Widget");
-    // example_lvgl_demo_ui(disp);
+    example_lvgl_demo_ui(disp);
     // ui_Screen1_screen_init();
     // lv_example_1();
-    ui_init();
+    // ui_init();
     while (1) {
         // raise the task priority of LVGL and/or reduce the handler period can improve the performance
         vTaskDelay(pdMS_TO_TICKS(10));

+ 4 - 3
sdkconfig.old

@@ -390,9 +390,10 @@ CONFIG_PARTITION_TABLE_MD5=y
 #
 # Example Configuration
 #
-CONFIG_EXAMPLE_LCD_CONTROLLER_ILI9341=y
-# CONFIG_EXAMPLE_LCD_CONTROLLER_GC9A01 is not set
-# CONFIG_EXAMPLE_LCD_TOUCH_ENABLED is not set
+# CONFIG_EXAMPLE_LCD_CONTROLLER_ILI9341 is not set
+CONFIG_EXAMPLE_LCD_CONTROLLER_GC9A01=y
+CONFIG_EXAMPLE_LCD_TOUCH_ENABLED=y
+CONFIG_EXAMPLE_LCD_TOUCH_CONTROLLER_STMPE610=y
 # end of Example Configuration
 
 #