# 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]

LVGL needs a display driver that knows how to send rendered pixels to your
hardware. On Arduino projects, common choices are:

* the built-in [LovyanGFX driver](/integration/external_display_controllers/lovyan)
* the [TFT\_eSPI](https://github.com/Bodmer/TFT_eSPI) library
* a custom display driver registered with LVGL's display API
* another Arduino graphics library wrapped by your application

When using the LovyanGFX driver, install the LovyanGFX library and create a
configuration header that defines your `LGFX` class. In the Arduino IDE, this can
be another sketch tab, for example `my_display.hpp`. Enable the driver from
`lv_conf.h` and point `LV_LGFX_USER_INCLUDE` at that header. The detailed
LovyanGFX setup and initialization flow is documented on the
[LovyanGFX driver page](/integration/external_display_controllers/lovyan).

When using TFT\_eSPI, configure the TFT\_eSPI library for your display by editing
`User_Setup.h` or selecting a setup from `User_Setup_Select.h` in the TFT\_eSPI
library 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 your display's color format in <ApiLink name="LV_COLOR_FORMAT_DEFAULT" />

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](/main-modules/display) and a
[touchpad](/main-modules/indev) 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 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 LV_USE_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.
