{"id":2784,"date":"2024-08-31T16:59:01","date_gmt":"2024-08-31T16:59:01","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=2784"},"modified":"2024-08-31T16:59:03","modified_gmt":"2024-08-31T16:59:03","slug":"create-custom-ui-with-lvgl-and-eez-studio-part-2-ui-communication","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=2784","title":{"rendered":"Create Custom UI with LvGL and EEZ Studio Part 2: UI communication"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"319\" height=\"92\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/EEZ-web-logo-new-1.png\" alt=\"\" class=\"wp-image-2785\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/EEZ-web-logo-new-1.png 319w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/EEZ-web-logo-new-1-300x87.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/EEZ-web-logo-new-1-250x72.png 250w\" sizes=\"(max-width: 319px) 100vw, 319px\" \/><\/figure><\/div>\n\n\n<p>In this second part of creating UI using LvGL and EEZ Studio, we shall see how to communicate between the UI and the MCU by controlling the LED using the switch and update the bar.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>In this guide, we shall cover the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configure the UI.<\/li>\n\n\n\n<li>Configure the LED.<\/li>\n\n\n\n<li>Update bar and LED control<\/li>\n\n\n\n<li>Results.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Configure the UI:<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>We start off by opening screens.c source from the ui folder as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"567\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-1024x567.jpg\" alt=\"\" class=\"wp-image-2786\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-1024x567.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-300x166.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-768x425.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-1536x851.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-2048x1134.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-1150x637.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-750x415.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-400x221.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-23-32-250x138.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Next declare the following variable as global:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">lv_obj_t *obj_bar;<\/pre><\/div>\n\n\n\n<p>In the section where the bar is created by the EEZ Studio, we need to modify it as following:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">        \tobj_bar = lv_bar_create(parent_obj);\n            lv_obj_set_pos(obj_bar, 45, 183);\n            lv_obj_set_size(obj_bar, 150, 10);\n            lv_bar_set_value(obj_bar, 25, LV_ANIM_OFF);<\/pre><\/div>\n\n\n\n<p>This way, the bar object is available globally and can be accessed any time.<\/p>\n\n\n\n<p>At the end of the screens.c declare the following function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void update_bar (uint8_t value)\n{\n\tlv_bar_set_value(obj_bar,value,LV_ANIM_OFF);\n}<\/pre><\/div>\n\n\n\n<p>The function shall update the bar value.<\/p>\n\n\n\n<p>It takes value as argument.<\/p>\n\n\n\n<p>The lv_bar_set_value takes the following arguments:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Bar object which obj_bar in this case.<\/li>\n\n\n\n<li>Value to be updated.<\/li>\n\n\n\n<li>Animation on or off.<\/li>\n<\/ul>\n\n\n\n<p>Next, open screens.h as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"567\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-1024x567.jpg\" alt=\"\" class=\"wp-image-2787\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-1024x567.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-300x166.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-768x425.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-1536x851.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-2048x1134.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-1150x637.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-750x415.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-400x221.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/08\/2024-08-31_19-24-29-250x138.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>At the end before #ifend __cplusplus, add the following function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void update_bar (uint8_t value);<\/pre><\/div>\n\n\n\n<p>Now, we have access to the update function.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. LED Configuration:<\/h2>\n\n\n\n<p>Since STM32F429-disco features two leds connected to PG13 and PG14. We shall use PG13 as our LED to be controlled.<\/p>\n\n\n\n<p>Create new source and header file with name of led.c and led.h.<\/p>\n\n\n\n<p>The header file content:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#ifndef LED_H_\n#define LED_H_\n#include &quot;stdint.h&quot;\n\nvoid led_init(void);\nvoid write_led(uint8_t state);\n\n\n#endif \/* LED_H_ *\/<\/pre><\/div>\n\n\n\n<p>For led source file:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;stm32f4xx.h&quot;\n\n#include &quot;led.h&quot;\n\nvoid led_init(void)\n{\n\tRCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIOGEN;\n\n\tGPIOG-&gt;MODER|=GPIO_MODER_MODE13_0;\n\n\tGPIOG-&gt;MODER&amp;=~GPIO_MODER_MODE13_1;\n\n}\n\nvoid write_led(uint8_t state)\n{\n\tif(state==1)\n\t{\n\t\tGPIOG-&gt;BSRR=GPIO_BSRR_BS13;\n\t}\n\telse\n\t{\n\t\tGPIOG-&gt;BSRR=GPIO_BSRR_BR13;\n\t}\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Update Bar and LED Control:<\/h2>\n\n\n\n<p>In main.c file, first include the led header file as following:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;led.h&quot;<\/pre><\/div>\n\n\n\n<p>Declare the following three variables as following:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">uint8_t value;\nuint8_t dir=0;\nuint32_t previous;<\/pre><\/div>\n\n\n\n<p>First variable is the value to be passed to update the bar.<\/p>\n\n\n\n<p>Dir which is the direction either the value increment or decrement.<\/p>\n\n\n\n<p>Previous which is used to store the previous time in milliseconds.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>before he initialization of the UI, initialize the led as following:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">led_init();<\/pre><\/div>\n\n\n\n<p>Store the current run time in the previous variable:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">previous=millis();<\/pre><\/div>\n\n\n\n<p>In the while 1 loop after the ui_tick():<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">if(millis()-previous&gt;10)\n\t\t{\n\t\t\tif(dir==0)\n\t\t\t{\n\t\t\t\tvalue++;\n\t\t\t\tif(value==100)\n\t\t\t\t{\n\t\t\t\t\tdir=1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(dir==1)\n\t\t\t{\n\t\t\t\tvalue--;\n\t\t\t\tif(value==0)\n\t\t\t\t{\n\t\t\t\t\tdir=0;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tupdate_bar(value);\n\t\t\tprevious=millis();\n\t\t}<\/pre><\/div>\n\n\n\n<p>This will update the value each 10 milliseconds in none blocking mode.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Finally the previous declared led toggle function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void action_toggle_led(lv_event_t * e)\n{\n\tlv_event_code_t code = lv_event_get_code(e);\n\tlv_obj_t * obj = lv_event_get_target(e);\n\tuint8_t state=lv_obj_has_state(obj,LV_STATE_CHECKED);\n\twrite_led(state);\n\n}<\/pre><\/div>\n\n\n\n<p>Get the code of the even.<\/p>\n\n\n\n<p>Get the object which trigger the even.<\/p>\n\n\n\n<p>Get the of the object which is in this case is switch.<\/p>\n\n\n\n<p>Pass the state to the write_led to turn on\/off according to switch state.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Save the project, build it and run it on your STM32F429-Disco.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/07\/2024-07-12_15-03-3.jpg\" alt=\"\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Results:<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Control GUI element with LvGL and STM32F429-disco\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/PQqVpvRJCU4?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Notice that the bar is being updated and when the switch is clicked, the LED state changes as we intended.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Happy coding \ud83d\ude09<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this second part of creating UI using LvGL and EEZ Studio, we shall see how to communicate between the UI and the MCU by controlling the LED using the switch and update the bar. In this guide, we shall cover the following: 6. Configure the UI: We start off by opening screens.c source from [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,19,11,12],"tags":[],"class_list":["post-2784","post","type-post","status-publish","format-standard","hentry","category-embedded-systems","category-lcd","category-peripheral-drivers","category-stm32"],"_links":{"self":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/2784"}],"collection":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2784"}],"version-history":[{"count":1,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/2784\/revisions"}],"predecessor-version":[{"id":2788,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/2784\/revisions\/2788"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}