{"id":4673,"date":"2026-08-15T08:10:28","date_gmt":"2026-08-15T08:10:28","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=4673"},"modified":"2026-08-15T08:30:07","modified_gmt":"2026-08-15T08:30:07","slug":"monochrome-magic-crafting-professional-embedded-dashboards-with-u8g2","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=4673","title":{"rendered":"Monochrome Magic: Crafting Professional Embedded Dashboards with U8g2"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-1024x585.jpg\" alt=\"\" class=\"wp-image-4674\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-1024x585.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-300x171.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-768x439.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-1150x657.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-750x429.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-400x229.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status-250x143.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/08\/glcd_temp_status.jpg 1344w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Building a professional embedded user interface doesn&#8217;t require an expensive color TFT. In this guide, you will learn how to use the U8g2 graphics library to craft a sleek, responsive dashboard with dynamic data and progress bars on a classic 128&#215;64 monochrome display.<\/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>Introduction.<\/li>\n\n\n\n<li>Building the UI.<\/li>\n\n\n\n<li>Results.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction:<\/h2>\n\n\n\n<p>In the modern era of embedded systems, it is easy to assume that every project requires a vibrant, full-color TFT touchscreen to look professional. We are surrounded by smartphones, tablets, and sleek consumer electronics that set a high bar for visual fidelity, and that expectation often bleeds into our microcontroller projects. However, reaching for a color display the moment you need to display a few metrics often leads to unnecessary complications: inflated Bill of Materials (BOM) costs, complex SPI or parallel drivers, higher power consumption, and sometimes sluggish refresh rates that ruin the user experience.<\/p>\n\n\n\n<p>The truth is, you rarely need 65,000 colors to display temperature, CPU load, or system status. A classic, $3 monochrome 128&#215;64 graphical LCD (GLCD) or OLED screen is more than capable of delivering a sleek, high-tech user interface\u2014provided you pair it with the right software tools and a bit of design discipline. Monochrome displays offer incredible contrast, excellent sunlight readability, and rock-solid reliability, making them a staple in industrial equipment, benchtop tools, and compact IoT devices. The secret to making them look modern isn&#8217;t adding color; it&#8217;s adding structure, typography, and dynamic elements.<\/p>\n\n\n\n<p>This is where <strong>U8g2<\/strong> comes in. As the premier monochrome graphics library for embedded C and C++, U8g2 takes the pain out of driving raw pixels. It handles the complex timing and initialization of hundreds of different displays and provides a powerful graphics engine that supports lines, boxes, circles, and most importantly, an absolutely massive library of scalable, professional fonts. With U8g2, the limitations of 1-bit graphics disappear, replaced by the ability to draw inverse text, sleek data layouts, and custom widgets.<\/p>\n\n\n\n<p>In this guide, we are going to prove that constraints breed creativity. We will walk step-by-step through building a live &#8220;System Status&#8221; dashboard from scratch using an STM32 and a standard 128&#215;64 display. Moving past the basic &#8220;Hello World&#8221; text, we will construct a UI that features a bold header, mixed typography for visual hierarchy, live string formatting, and a dynamic progress bar that smoothly sweeps across the screen using simulated sensor data.<\/p>\n\n\n\n<p>Whether you are building a custom mechanical keyboard, a 3D printer controller, or a compact sensor node, the principles in this guide will change the way you approach monochrome UI design. Let&#8217;s dive in and build something that looks so good, no one will believe it\u2019s running on a 1-bit display.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. UI Development:<\/h2>\n\n\n\n<p>We shall continue from this guide <a href=\"https:\/\/blog.embeddedexpert.io\/?p=3761\" data-type=\"link\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=3761\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<p>In main.c, in user code begin PV, declare the following simulated variable of the UI:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">\/\/ --- UI and Simulation Variables ---\nstatic float sim_temp = 25.0f;\nstatic float sim_cpu = 50.0f;\nstatic uint8_t sim_load = 50;\nstatic uint32_t start_tick = 0;<\/pre><\/div>\n\n\n\n<p>Next, in user code begin 0, declare a function that will draw the horizontal progress bar as follows:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">\/\/ Helper function to draw a horizontal progress bar\nvoid draw_progress_bar(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t percentage) {\n    \/\/ 1. Draw the outer border\n    u8g2_DrawFrame(&amp;myDisplay, x, y, w, h);\n\n    \/\/ 2. Calculate fill width based on percentage\n    uint8_t fill_w = (uint8_t)((w - 2) * percentage \/ 100.0f);\n\n    \/\/ 3. Draw the solid fill inside the border\n    if (fill_w &gt; 0) {\n        u8g2_DrawBox(&amp;myDisplay, x + 1, y + 1, fill_w, h - 2);\n    }\n}<\/pre><\/div>\n\n\n\n<p>We start by drawing the frame, which is the box of the progress bar.<\/p>\n\n\n\n<p>Next, determine how much to fill the progress bar from the percentage value. <\/p>\n\n\n\n<p>Finally, fill the progress bar with box value.<\/p>\n\n\n\n<p>Next, a function to render the UI:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">\/\/ The main UI rendering function\nvoid render_ui(void) {\n    \/\/ 1. Gather data\n    uint32_t uptime = (HAL_GetTick() - start_tick) \/ 1000; \/\/ Seconds since boot\n\n    \/\/ 2. Format data into strings\n    char temp_str[20];\n    char cpu_str[20];\n    char time_str[20];\n    char load_str[20];\n\n    \/\/ Convert seconds to HH:MM:SS\n    uint32_t h = uptime \/ 3600;\n    uint32_t m = (uptime % 3600) \/ 60;\n    uint32_t s = uptime % 60;\n\n    snprintf(temp_str, sizeof(temp_str), &quot;Core:  %.1f C&quot;, sim_temp);\n    snprintf(cpu_str, sizeof(cpu_str), &quot;CPU:   %.1f %%&quot;, sim_cpu);\n    snprintf(time_str, sizeof(time_str), &quot;Time:  %02d:%02d:%02d&quot;, h, m, s);\n    snprintf(load_str, sizeof(load_str), &quot;%d%%&quot;, sim_load);\n\n    \/\/ 3. Clear the internal buffer\n    u8g2_ClearBuffer(&amp;myDisplay);\n\n    \/\/ 4. Draw the Header (Using a bold font)\n    u8g2_SetFont(&amp;myDisplay, u8g2_font_6x13B_tr);\n    u8g2_DrawStr(&amp;myDisplay, 0, 10, &quot;TEMP STATUS&quot;);\n    u8g2_DrawHLine(&amp;myDisplay, 0, 13, 128); \/\/ Underline the header\n\n    \/\/ 5. Draw the Text Data (Using a standard font)\n    u8g2_SetFont(&amp;myDisplay, u8g2_font_6x10_tr);\n    u8g2_DrawStr(&amp;myDisplay, 0, 28, temp_str);\n    u8g2_DrawStr(&amp;myDisplay, 0, 42, cpu_str);\n    u8g2_DrawStr(&amp;myDisplay, 0, 54, time_str);\n\n    \/\/ 6. Draw the Progress Bar\n    u8g2_SetFont(&amp;myDisplay, u8g2_font_5x7_tr);\n    u8g2_DrawStr(&amp;myDisplay, 0, 63, &quot;LOAD&quot;);\n    draw_progress_bar(25, 56, 85, 7, sim_load);\n\n    \/\/ Draw percentage text at the end of the bar\n    u8g2_DrawStr(&amp;myDisplay, 112, 63, load_str);\n\n    \/\/ 7. Send the buffer to the screen\n    u8g2_SendBuffer(&amp;myDisplay);\n}<\/pre><\/div>\n\n\n\n<p>We start by calculating the time since the MCU booted in seconds and convert it into time in hours, minutes and seconds.<\/p>\n\n\n\n<p>fill the buffer for the time, temperature, load and CPU.<\/p>\n\n\n\n<p>Clear the buffer and start filling it with the required data and send it to the display.<\/p>\n\n\n\n<p>In use code begin 2 in main 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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">u8g2_InitDisplay(&amp;myDisplay);\nu8g2_SetPowerSave(&amp;myDisplay, 0);\nu8g2_ClearBuffer(&amp;myDisplay);\n\n\/\/ Record start time\nstart_tick = HAL_GetTick();\n\nuint32_t last_update = 0;\nfloat time_counter = 0.0f; \/\/ Used for sine wave simulation<\/pre><\/div>\n\n\n\n<p>Initialize the display, wake it up and clear the buffer.<\/p>\n\n\n\n<p>Get the current ticks which is in ms.<\/p>\n\n\n\n<p>Declare some local variables to update the UI.<\/p>\n\n\n\n<p>In user code begin 3 in while 1 loop:<\/p>\n\n\n\n<p>Get the current ticks:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">uint32_t now = HAL_GetTick();<\/pre><\/div>\n\n\n\n<p>If the difference is more than 50 ms:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">if (now - last_update &gt; 50) {<\/pre><\/div>\n\n\n\n<p>Store the now value into last_update as follows:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\"> last_update = now;<\/pre><\/div>\n\n\n\n<p>Increment the timer counter by 0.05, which is equivalent to 50mS.<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">\/\/ Increment time counter (0.05f matches the 50ms interval)\ntime_counter += 0.05f;<\/pre><\/div>\n\n\n\n<p>Next, simulate the changes:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\"> \/\/ --- Simulate Data Changing ---\n\n\/\/ Temperature oscillates smoothly between 20.0 and 45.0 C\n\/\/ sin(x) returns -1 to 1. We scale it to 0 to 1, then multiply by 25, and add 20.\nsim_temp = 20.0f + ((sinf(time_counter * 0.5f) + 1.0f) \/ 2.0f) * 25.0f;\n\n\/\/ CPU oscillates smoothly between 10% and 90%\nsim_cpu = 10.0f + ((sinf(time_counter * 0.8f + 1.0f) + 1.0f) \/ 2.0f) * 80.0f;\n\n\/\/ Load increments and decrements based on CPU\n\/\/ Use a sine wave for smooth 0-100% sweeping\nsim_load = (uint8_t)(((sinf(time_counter * 0.4f) + 1.0f) \/ 2.0f) * 100.0f);<\/pre><\/div>\n\n\n\n<p>Finally, render the UI:<\/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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">\/\/ --- Render the UI ---\nrender_ui();<\/pre><\/div>\n\n\n\n<p>Thats all for the guide.<\/p>\n\n\n\n<p>Save, build the project and run it as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"34\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1024x34.png\" alt=\"\" class=\"wp-image-4349\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1024x34.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-300x10.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-768x26.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1536x51.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1150x38.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-750x25.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-400x13.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-250x8.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1.png 1986w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>You may download the source code from&nbsp;<a href=\"https:\/\/github.com\/hussamaldean\/Embedded-Expert-Post-Projects\/tree\/main\/Projects\/U8G2_UI\" data-type=\"link\" data-id=\"https:\/\/github.com\/hussamaldean\/Embedded-Expert-Post-Projects\/tree\/main\/Projects\/U8G2_UI\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Results:<\/h2>\n\n\n\n<p>You should get the following on your GLCD12864:<\/p>\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=\"Custom UI using U8G2 on GLCD12864\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/EwehRkwe0tc?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>Stay tuned.<\/p>\n\n\n\n<p>Happy coding \ud83d\ude09<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Building a professional embedded user interface doesn&#8217;t require an expensive color TFT. In this guide, you will learn how to use the U8g2 graphics library to craft a sleek, responsive dashboard with dynamic data and progress bars on a classic 128&#215;64 monochrome display. In this guide, we shall cover the following: 1. Introduction: In the [&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-4673","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\/4673"}],"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=4673"}],"version-history":[{"count":3,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4673\/revisions"}],"predecessor-version":[{"id":4678,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4673\/revisions\/4678"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}