Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
0e11c3a
Merge pull request #30 from Pablo2048/feature/lvgl6.1
Pablo2048 Dec 27, 2019
ef1c05f
Add files via upload
HamidSaffari Apr 1, 2020
4620012
Create Readme.md
HamidSaffari Apr 1, 2020
2c7e062
Update Readme.md
HamidSaffari Apr 1, 2020
f5b4d9e
Update and rename ESP32_TFT_eSPI_Slider.ino to STM32_TFT_eSPI_Slider.ino
HamidSaffari Apr 1, 2020
f1f85e1
Update STM32_TFT_eSPI_Slider.ino
HamidSaffari Apr 1, 2020
7bf0782
Update Readme.md
HamidSaffari Apr 1, 2020
9609b79
Add files via upload
HamidSaffari Apr 1, 2020
95d691c
Update Readme.md
HamidSaffari Apr 1, 2020
ee401a9
Update STM32_TFT_eSPI_Slider.ino
HamidSaffari Apr 1, 2020
f1b5e33
Delete photo_2020-04-01_22-21-19.jpg
HamidSaffari Apr 1, 2020
c4a23c5
Add files via upload
HamidSaffari Apr 1, 2020
cf8cf99
Update Readme.md
HamidSaffari Apr 1, 2020
2e527c6
Update Readme.md
HamidSaffari Apr 1, 2020
fa13482
Merge pull request #38 from HamidSaffari/master
Pablo2048 Apr 2, 2020
79bb94b
Merge pull request #44 from Pablo2048/master
Pablo2048 May 24, 2020
85d6d22
Merge pull request #48 from Pablo2048/master
Pablo2048 Jun 8, 2020
8651c35
Merge pull request #49 from Pablo2048/master
Pablo2048 Jun 8, 2020
fce3212
e_SPI slider example updated
Stego72 Jun 10, 2020
fdcec3c
Merge pull request #51 from Stego72/master
Pablo2048 Jun 11, 2020
f8d9359
Removed Hardware-Timer interrupt LV-Tick because of using (millis()) …
HamidSaffari Jun 17, 2020
ef4f159
Update Readme.md
HamidSaffari Jun 17, 2020
d8d1fe0
Merge pull request #54 from HamidSaffari/patch-3
Pablo2048 Jun 18, 2020
8620db9
Merge pull request #53 from HamidSaffari/patch-2
Pablo2048 Jun 18, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 83 additions & 91 deletions examples/ESP32_TFT_eSPI_Slider/ESP32_TFT_eSPI_Slider.ino
Original file line number Diff line number Diff line change
@@ -1,91 +1,83 @@
#include <lvgl.h>
#include <Ticker.h>
#include <TFT_eSPI.h>

#define LVGL_TICK_PERIOD 60

Ticker tick; /* timer for interrupt handler */
TFT_eSPI tft = TFT_eSPI(); /* TFT instance */
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10];

lv_obj_t * slider_label;
int screenWidth = 480;
int screenHeight = 320;

#if USE_LV_LOG != 0
/* Serial debugging */
void my_print(lv_log_level_t level, const char * file, uint32_t line, const char * dsc)
{

Serial.printf("%s@%d->%s\r\n", file, line, dsc);
delay(100);
}
#endif

/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
uint16_t c;

tft.startWrite(); /* Start new TFT transaction */
tft.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1), (area->y2 - area->y1 + 1)); /* set the working window */
for (int y = area->y1; y <= area->y2; y++) {
for (int x = area->x1; x <= area->x2; x++) {
c = color_p->full;
tft.writeColor(c, 1);
color_p++;
}
}
tft.endWrite(); /* terminate TFT transaction */
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
}

bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
{
uint16_t touchX, touchY;

bool touched = tft.getTouch(&touchX, &touchY, 600);

if(!touched)
{
return false;
}

if(touchX>screenWidth || touchY > screenHeight)
{
Serial.println("Y or y outside of expected parameters..");
Serial.print("y:");
Serial.print(touchX);
Serial.print(" x:");
Serial.print(touchY);
}
else
{

data->state = touched ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;

/*Save the state and save the pressed coordinate*/
//if(data->state == LV_INDEV_STATE_PR) touchpad_get_xy(&last_x, &last_y);

/*Set the coordinates (if released use the last pressed coordinates)*/
data->point.x = touchX;
data->point.y = touchY;

Serial.print("Data x");
Serial.println(touchX);

Serial.print("Data y");
Serial.println(touchY);

}

return false; /*Return `false` because we are not buffering and no more data to read*/
}

/* Interrupt driven periodic handler */
static void lv_tick_handler(void)
{

lv_tick_inc(LVGL_TICK_PERIOD);
}
#include <lvgl.h>
#include <TFT_eSPI.h>

#define LVGL_TICK_PERIOD 60

//Ticker tick; /* timer for interrupt handler */
TFT_eSPI tft = TFT_eSPI(); /* TFT instance */
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10];

lv_obj_t * slider_label;
int screenWidth = 480;
int screenHeight = 320;

#if USE_LV_LOG != 0
/* Serial debugging */
void my_print(lv_log_level_t level, const char * file, uint32_t line, const char * dsc)
{

Serial.printf("%s@%d->%s\r\n", file, line, dsc);
delay(100);
}
#endif

/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
uint16_t c;

tft.startWrite(); /* Start new TFT transaction */
tft.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1), (area->y2 - area->y1 + 1)); /* set the working window */
for (int y = area->y1; y <= area->y2; y++) {
for (int x = area->x1; x <= area->x2; x++) {
c = color_p->full;
tft.writeColor(c, 1);
color_p++;
}
}
tft.endWrite(); /* terminate TFT transaction */
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
}

bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
{
uint16_t touchX, touchY;

bool touched = tft.getTouch(&touchX, &touchY, 600);

if(!touched)
{
return false;
}

if(touchX>screenWidth || touchY > screenHeight)
{
Serial.println("Y or y outside of expected parameters..");
Serial.print("y:");
Serial.print(touchX);
Serial.print(" x:");
Serial.print(touchY);
}
else
{

data->state = touched ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;

/*Save the state and save the pressed coordinate*/
//if(data->state == LV_INDEV_STATE_PR) touchpad_get_xy(&last_x, &last_y);

/*Set the coordinates (if released use the last pressed coordinates)*/
data->point.x = touchX;
data->point.y = touchY;

Serial.print("Data x");
Serial.println(touchX);

Serial.print("Data y");
Serial.println(touchY);

}

return false; /*Return `false` because we are not buffering and no more data to read*/
}
140 changes: 68 additions & 72 deletions examples/ESP32_TFT_eSPI_Slider/Setup.ino
Original file line number Diff line number Diff line change
@@ -1,72 +1,68 @@
void setup() {

ledcSetup(10, 5000/*freq*/, 10 /*resolution*/);
ledcAttachPin(32, 10);
analogReadResolution(10);
ledcWrite(10,768);

Serial.begin(115200); /* prepare for possible serial debug */

lv_init();

#if USE_LV_LOG != 0
lv_log_register_print_cb(my_print); /* register print function for debugging */
#endif

tft.begin(); /* TFT init */
tft.setRotation(3);

uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
tft.setTouch(calData);

lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);

/*Initialize the display*/
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = screenWidth;
disp_drv.ver_res = screenHeight;
disp_drv.flush_cb = my_disp_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);

/*Initialize the input device driver*/
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/
indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/
lv_indev_drv_register(&indev_drv); /*Finally register the driver*/

/*Initialize the graphics library's tick*/
tick.attach_ms(LVGL_TICK_PERIOD, lv_tick_handler);

//Set the theme..
lv_theme_t * th = lv_theme_night_init(210, NULL); //Set a HUE value and a Font for the Night Theme
lv_theme_set_current(th);

lv_obj_t * scr = lv_cont_create(NULL, NULL);
lv_disp_load_scr(scr);

//lv_obj_t * tv = lv_tabview_create(scr, NULL);
//lv_obj_set_size(tv, lv_disp_get_hor_res(NULL), lv_disp_get_ver_res(NULL));

/* Create simple label */
lv_obj_t *label = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(label, "Hello Arduino! (V6.1)");
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, -50);

/* Create a slider in the center of the display */
lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL);
lv_obj_set_width(slider, screenWidth-50); /*Set the width*/
lv_obj_set_height(slider, 50);
lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0); /*Align to the center of the parent (screen)*/
lv_obj_set_event_cb(slider, slider_event_cb); /*Assign an event function*/

/* Create a label below the slider */
slider_label = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(slider_label, "0");
lv_obj_set_auto_realign(slider, true);
lv_obj_align(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);

}

void setup() {

ledcSetup(10, 5000/*freq*/, 10 /*resolution*/);
ledcAttachPin(32, 10);
analogReadResolution(10);
ledcWrite(10,768);

Serial.begin(115200); /* prepare for possible serial debug */

lv_init();

#if USE_LV_LOG != 0
lv_log_register_print_cb(my_print); /* register print function for debugging */
#endif

tft.begin(); /* TFT init */
tft.setRotation(3);

uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
tft.setTouch(calData);

lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);

/*Initialize the display*/
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = screenWidth;
disp_drv.ver_res = screenHeight;
disp_drv.flush_cb = my_disp_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);

/*Initialize the input device driver*/
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/
indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/
lv_indev_drv_register(&indev_drv); /*Finally register the driver*/

//Set the theme..
lv_theme_t * th = lv_theme_material_init(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY, LV_THEME_DEFAULT_FLAG, LV_THEME_DEFAULT_FONT_SMALL , LV_THEME_DEFAULT_FONT_NORMAL, LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
lv_theme_set_act(th);

lv_obj_t * scr = lv_cont_create(NULL, NULL);
lv_disp_load_scr(scr);

//lv_obj_t * tv = lv_tabview_create(scr, NULL);
//lv_obj_set_size(tv, lv_disp_get_hor_res(NULL), lv_disp_get_ver_res(NULL));

/* Create simple label */
lv_obj_t *label = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(label, "Hello Arduino! (V7.0)");
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, -50);

/* Create a slider in the center of the display */
lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL);
lv_obj_set_width(slider, screenWidth-50); /*Set the width*/
lv_obj_set_height(slider, 50);
lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0); /*Align to the center of the parent (screen)*/
lv_obj_set_event_cb(slider, slider_event_cb); /*Assign an event function*/

/* Create a label below the slider */
slider_label = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(slider_label, "0");
lv_obj_set_auto_realign(slider, true);
lv_obj_align(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);

}
25 changes: 25 additions & 0 deletions examples/STM32_TFT_eSPI_Slider/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
Littlevgl on STM32F103C BluePill and ILI9341 in 8-Bit Parallel with XPT2046 Touch-pad on SPI2 port.
Which able to dim an LED attached to PB6 Pin (thru 100to330 ohm series resistor from GND) by adjusting the slider.
Library dependencies:
1. TFT_eSPI https://github.com/Bodmer/TFT_eSPI
and choosing the right setup inside User_Setup_Select.h and also set right pins on selected user file.
2. TFT_eTouch.h https://github.com/achillhasler/TFT_eTouch
and set the right pins inside TFT_eTouchUser.h and also run calibrate.ino to get the calibration value and store it inside
TFT_eTouchUser.h like ` #define TOUCH_DEFAULT_CALIBRATION { 294, 3913, 339, 3869, 2 }`
Note that TFT_eSPI touch include extension does nether support second SPI port nor touch in parallel mode.
3. Installing the last master Arduino_Core_STM32 on https://github.com/stm32duino/Arduino_Core_STM32
because the Hardwaretimer definitions changed a bit in 1.9.0 version which about to release.
4. lv_arduino https://github.com/littlevgl/lv_arduino
and config the lv_conf.h eg:
```C++
#define LV_HOR_RES_MAX (320)
#define LV_VER_RES_MAX (240)
#define LV_USE_THEME_NIGHT 1 /*Dark elegant theme*/
#define LV_MEM_CUSTOM 1 // otherwise occupied 32k buffer of RAM
```
![Example](https://github.com/HamidSaffari/lv_arduino/blob/master/examples/STM32_TFT_eSPI_Slider/photo_2020-04-02_01-55-36.jpg)

EDIT: Since lvgl updated to 7.0.1 the program no longer fits inside STM32F103CB so you have to go to larger like STM32F103RC.

Created by Hamid Saffari @ Apr 2020. https://github.com/HamidSaffari/
Released into the public domain.
Loading