# Arduino (/integration/frameworks/arduino)



The [LVGL library](https://github.com/lvgl/lvgl) is directly available as Arduino libraries.

Note that you need to choose a board powerful enough to run LVGL and
your GUI. See the [requirements of LVGL](/introduction/requirements).

For example ESP32 is a good candidate to create UI's with LVGL.

If you are using the Arduino GIGA Display Shield (docs [here](https://docs.arduino.cc/hardware/giga-display-shield)), use the [Arduino\_H7\_Video](https://github.com/arduino/ArduinoCore-mbed/tree/main/libraries/Arduino_H7_Video) library, included in the Arduino Mbed OS board package ([here](https://github.com/arduino/ArduinoCore-mbed)), which provides built-in LVGL compatibility.

Get the LVGL Arduino library [#get-the-lvgl-arduino-library]

LVGL can be installed via the Arduino IDE Library Manager or as a .ZIP library.

You can [Download](https://github.com/lvgl/lvgl/archive/refs/heads/master.zip)
the latest version of LVGL from GitHub and simply copy it to Arduino's
library folder.

Set up drivers [#set-up-drivers]

To get started, the recommended option is to use the LovyanGFX
library as the TFT driver, since it makes testing much easier.
You’ll need to create a display configuration file, such as [my\_display.hpp`similar to the example in`LovyanGFX user\_setting.ino](https://github.com/lovyan03/LovyanGFX/blob/master/examples/HowToUse/2_user_setting/2_user_setting.ino)
In the Arduino IDE, you can create a new tab and name it [my\_display.hpp`and paste the content of your configuration file there.
If you prefer not to use LovyanGFX, you can integrate other graphics libraries as well by implementing a wrapper class in the same way LovyanGFX is handled; `lv\_lgfx\_user.hpp](https://github.com/lvgl/lvgl/blob/master/src/drivers/display/lovyan_gfx/lv_lgfx_user.hpp)
provides a good example of this. Once your configuration file
is ready, update `lv_conf.h` to include it, for example:

```c title=" " lineNumbers=1
/* Interface for Lovyan_GFX */
#define LV_USE_LOVYAN_GFX         1

#if LV_USE_LOVYAN_GFX
    #define LV_LGFX_USER_INCLUDE "my_display.hpp"
#endif /*LV_USE_LOVYAN_GFX*/
```

Alternatively, you can use [TFT\_eSPI](https://github.com/Bodmer/TFT_eSPI) library.
To make it work, set up `TFT_eSPI` according to your
TFT display type via editing either:

* `User_Setup.h`
* or by selecting a configuration in the `User_Setup_Select.h`

Both files are located in `TFT_eSPI` library's folder.

Configure LVGL [#configure-lvgl]

LVGL has its own configuration file called `lv_conf.h`. When LVGL is
installed, follow these configuration steps:

1. Go to the directory of the installed Arduino libraries
2. Go to `lvgl` and copy `lv_conf_template.h` as `lv_conf.h` into the Arduino Libraries directory next to the `lvgl` library folder.
3. Open `lv_conf.h` and change the first `#if 0` to `#if 1` to enable the content of the file
4. Set the color depth of you display in <ApiLink name="LV_COLOR_DEPTH" />

Finally the layout with `lv_conf.h` should look like this:

```c title=" " lineNumbers=1
arduino
 |-libraries
   |-lvgl
   |-other_lib_1
   |-other_lib_2
   |-lv_conf.h
```

***

Take a look at [LVGL\_Arduino.ino](https://github.com/lvgl/lvgl/blob/master/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino)
to see how to initialize LVGL. `TFT_eSPI` is used as the display driver.

In the INO file you can see how to register a display and a touchpad for
LVGL and call an example.

Use the examples and demos [#use-the-examples-and-demos]

Note that, there is no dedicated INO file for every example. Instead,
you can load an example by calling an `lv_example_...` function. For
example <ApiLink name="lv_example_btn_1" />.

| Field       | Description                                                                                                                                                              |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `important` | Due to some the limitations of Arduino's build system you need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`. |

Debugging and logging [#debugging-and-logging]

LVGL can display debug information in case of trouble. In the
`LVGL_Arduino.ino` example there is a `my_print` method, which sends
this debug information to the serial interface. To enable this feature
you have to edit the `lv_conf.h` file and enable logging in the
section `log settings`:

```c title=" " lineNumbers=1
/* Log settings */
#define USE_LV_LOG      1   /* Enable/disable the log module */
#if LV_USE_LOG
/* How important log should be added:
 * LV_LOG_LEVEL_TRACE       A lot of logs to give detailed information
 * LV_LOG_LEVEL_INFO        Log important events
 * LV_LOG_LEVEL_WARN        Log if something unwanted happened but didn't cause a problem
 * LV_LOG_LEVEL_ERROR       Only critical issue, when the system may fail
 * LV_LOG_LEVEL_NONE        Do not log anything
 */
#  define LV_LOG_LEVEL    LV_LOG_LEVEL_WARN
```

After enabling the log module and setting <ApiLink name="LV_LOG_LEVEL" /> accordingly, the
output log is sent to the `Serial` port @ 115200 bps.
