Un : utilisation environnementale
- Carte de développement Nodemcu-esp32s
- Écran d'affichage 128*160 tft
- Logiciel de développement d'interface graphique
- environnement de développement de framework platformio + arduino
Cette greffe nécessite de configurer l'environnement LVGL à l'avance. Si vous ne savez pas comment le configurer, vous pouvez lire mon article précédent Configuration LVGL
GUI gui génère du code de portage
- J'ai simplement généré un fichier de projet GUI gui
- Le personnalisé et généré dans le dossier de code généré sont ce dont nous avons besoin.
Placez ces deux dossiers sous notre dossier de projet platformio et cette étape est terminée.
Modification de fichier pertinente
- Changez tout dans ces deux dossiers
#include "lvgl/lvgl.h"
pour
#include "lvgl.h"
Remplacez #include "lv_font.h" dans les fichiers .c de ces deux dossiers
par "lvgl.h"
3. À ce stade, compilez et exécutez, une erreur peut être signalée et le fichier d'en-tête est introuvable. temps, nous devons utiliser C++ Ajouter le chemin correspondant au fichier json de la configuration de l'environnement.
Cliquez sur C/C++ Compiler les paramètres de configuration
pour effectuer des opérations similaires et ajoutez le dossier du fichier d'en-tête introuvable.
modification du fichier principal
Eh bien, après la configuration ci-dessus, nous y avons ajouté le contenu requis, mais comment l'appeler, nous le modifions dans le fichier principal d'un lvgl déjà configuré.
- ajouter un fichier d'en-tête
#include<gui_guider.h>
#include<custom.h>
#include<events_init.h>
- Ajouter la configuration d'initialisation de la page
ps : doit être après l'initialisation de l'écran lvgl et tft
setup_ui(&guider_ui);
events_init(&guider_ui);
custom_init(&guider_ui);
Notez que nous devons déclarer les éléments guider_ui devant, sinon une erreur sera signalée.
Ensuite, vous avez terminé, regardez les résultats.
L'ensemble du code est le suivant
#include<Arduino.h>
#include <lvgl.h>
#include <TFT_eSPI.h>
#include<gui_guider.h>
#include<custom.h>
#include<events_init.h>
/*If you want to use the LVGL examples,
make sure to install the lv_examples Arduino library
and uncomment the following line.
#include <lv_examples.h>
*/
lv_ui guider_ui;
/*Change to your screen resolution*/
static const uint16_t screenWidth = 128;
static const uint16_t screenHeight = 160;
static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[ screenWidth * 10 ];
TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */
#if LV_USE_LOG != 0
/* Serial debugging */
void my_print(const char * buf)
{
Serial.printf(buf);
Serial.flush();
}
#endif
/* Display flushing */
void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
{
uint32_t w = ( area->x2 - area->x1 + 1 );
uint32_t h = ( area->y2 - area->y1 + 1 );
tft.startWrite();
tft.setAddrWindow( area->x1, area->y1, w, h );
tft.pushColors( ( uint16_t * )&color_p->full, w * h, true );
tft.endWrite();
lv_disp_flush_ready( disp );
}
/*
void 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 )
{
data->state = LV_INDEV_STATE_REL;
}
else
{
data->state = LV_INDEV_STATE_PR;
data->point.x = touchX;
data->point.y = touchY;
Serial.print( "Data x " );
Serial.println( touchX );
Serial.print( "Data y " );
Serial.println( touchY );
}
}
*/
void setup()
{
Serial.begin( 115200 ); /* prepare for possible serial debug */
String LVGL_Arduino = "Hello LVGL! ";
//LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
Serial.println( LVGL_Arduino );
Serial.println( "I am LVGL_Arduino" );
lv_init();
#if LV_USE_LOG != 0
lv_log_register_print_cb( my_print ); /* register print function for debugging */
#endif
tft.begin(); /* TFT init */
tft.setRotation( 0 ); /* Landscape orientation, flipped */
/*Set the touchscreen calibration data,
the actual data for your display can be acquired using
the Generic -> Touch_calibrate example from the TFT_eSPI library*/
// uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
// tft.setTouch( calData );
lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 );
/*Initialize the display*/
static lv_disp_drv_t disp_drv;
lv_disp_drv_init( &disp_drv );
/*Change the following line to your display resolution*/
disp_drv.hor_res = screenWidth;
disp_drv.ver_res = screenHeight;
disp_drv.flush_cb = my_disp_flush;
disp_drv.draw_buf = &draw_buf;
lv_disp_drv_register( &disp_drv );
/*Initialize the (dummy) input device driver*/
//static lv_indev_drv_t indev_drv;
//lv_indev_drv_init( &indev_drv );
//indev_drv.type = LV_INDEV_TYPE_POINTER;
//indev_drv.read_cb = my_touchpad_read;
//lv_indev_drv_register( &indev_drv );
#if 1
setup_ui(&guider_ui);
events_init(&guider_ui);
custom_init(&guider_ui);
/* Create simple label */
/* lv_obj_t *label = lv_label_create( lv_scr_act() );
lv_label_set_text( label, LVGL_Arduino.c_str() );
lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 );*/
#else
/* Try an example from the lv_examples Arduino library
make sure to include it as written above.
lv_example_btn_1();
*/
// uncomment one of these demos
lv_demo_widgets(); // OK
// lv_demo_benchmark(); // OK
// lv_demo_keypad_encoder(); // works, but I haven't an encoder
// lv_demo_music(); // NOK
// lv_demo_printer();
// lv_demo_stress(); // seems to be OK
#endif
Serial.println( "Setup done" );
}
void loop()
{
lv_timer_handler(); /* let the GUI do its work */
delay( 5 );
}