<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Paper Byte Logs</title>
    <subtitle>A personal blog by jomaway</subtitle>
    <link rel="self" type="application/atom+xml" href="https://paperbytelogs.de/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://paperbytelogs.de/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-12-11T00:00:00+00:00</updated>
    <id>https://paperbytelogs.de/atom.xml</id>
    <entry xml:lang="en">
        <title>Fix ESP32 firmware size in PlatformIO</title>
        <published>2025-12-11T00:00:00+00:00</published>
        <updated>2025-12-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paperbytelogs.de/notes/esp32-firmware-size/"/>
        <id>https://paperbytelogs.de/notes/esp32-firmware-size/</id>
        
        <content type="html" xml:base="https://paperbytelogs.de/notes/esp32-firmware-size/">&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Error&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;p&gt;Error: The program size (1564865 bytes) is greater than maximum allowed (1310720 bytes)&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
&lt;p&gt;Most ESP32 boards ship with a &lt;strong&gt;1.3 MB (1310720 bytes) application partition&lt;&#x2F;strong&gt;, unless a custom partition table is used. So if your firmware size is bigger than that, it won&#x27;t compile.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Change &lt;code&gt;platformio.ini&lt;&#x2F;code&gt; to use a partition layout with a 2 MB app slot.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;ini&quot; class=&quot;language-ini z-code&quot;&gt;&lt;code class=&quot;language-ini&quot; data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;board_build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;.&lt;&#x2F;span&gt;partitions &lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt; partitions&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;.&lt;&#x2F;span&gt;csv
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Create &lt;code&gt;partitions.csv&lt;&#x2F;code&gt; in your project root:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Option A - &quot;huge app&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv z-code&quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;SubType&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Offset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Size&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;    &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Flags
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;      &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x9000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;otadata&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0xe000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x2000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota_0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x10000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;2M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota_1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x210000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;2M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x410000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x3F0000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Option B - &quot;no OTA&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv z-code&quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;SubType&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Offset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Size&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Flags
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;      &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x9000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;phy_init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;phy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0xe000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x1000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;factory&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;factory&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x10000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x2F0000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x300000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x100000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See [[Understanding ESP32 partition tables]] for more information.&lt;&#x2F;p&gt;
&lt;p&gt;Or have a look at those &lt;a href=&quot;https:&#x2F;&#x2F;docs.espressif.com&#x2F;projects&#x2F;arduino-esp32&#x2F;en&#x2F;latest&#x2F;tutorials&#x2F;partition_table.html#examples&quot;&gt;examples&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Understanding ESP32 partition tables</title>
        <published>2025-12-11T00:00:00+00:00</published>
        <updated>2025-12-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paperbytelogs.de/posts/esp32-partition-table/"/>
        <id>https://paperbytelogs.de/posts/esp32-partition-table/</id>
        
        <content type="html" xml:base="https://paperbytelogs.de/posts/esp32-partition-table/">&lt;p&gt;I recently had the problem that my program size was greater than the default code partition.
To fix this we can change the partition table of the ESP32. For a quick fix see &lt;a href=&quot;&#x2F;notes&#x2F;esp32-firmware-size&#x2F;&quot;&gt;this note&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;esp32-partitions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-partitions&quot; aria-label=&quot;Anchor link for: esp32-partitions&quot;&gt;ESP32 partitions&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;The ESP32’s external flash (usually 4 MB, 8 MB, etc.) is divided into sections (&quot;partitions&quot;).
Each partition has a &lt;strong&gt;name&lt;&#x2F;strong&gt;, &lt;strong&gt;type&lt;&#x2F;strong&gt;, &lt;strong&gt;subtype&lt;&#x2F;strong&gt;, &lt;strong&gt;offset&lt;&#x2F;strong&gt;, and &lt;strong&gt;size&lt;&#x2F;strong&gt; — just like a hard drive.
Let&#x27;s have a quick look at an &lt;em&gt;example&lt;&#x2F;em&gt; of a &lt;code&gt;partitions.csv&lt;&#x2F;code&gt; file.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv z-code&quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;SubType&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Offset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Size&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Flags
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;      &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x9000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;otadata&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0xe000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x2000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota_0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x10000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;2M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota_1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x210000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;2M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x410000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x3F0000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But before we dive into the partition table we need to have a look at the bigger picture.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;esp32-flash-layout&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#esp32-flash-layout&quot; aria-label=&quot;Anchor link for: esp32-flash-layout&quot;&gt;ESP32 Flash Layout&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;ESP32 flash layout has &lt;strong&gt;mandatory system regions&lt;&#x2F;strong&gt; at fixed addresses, then a flexible area for your partition table and data.
Here you can see an &lt;strong&gt;overview&lt;&#x2F;strong&gt; of the layout.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Address&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x0000&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bootloader (fixed size, ~20-30 KB)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x8000&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Partition Table (default location, 4KB)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;0x9000&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;First data partition (NVS by default)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;0xXXXX&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Application firmware partitions&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;0xYYYY&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Filesystem partitions&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;So Bootloader and Partition Table use up the the first regions so the partition table starts at address &lt;code&gt;0x9000&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-partition-table-structure&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-partition-table-structure&quot; aria-label=&quot;Anchor link for: the-partition-table-structure&quot;&gt;The partition table structure&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;code&gt;partitions.csv&lt;&#x2F;code&gt; contains the following fields which represent the partition table.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Field&lt;&#x2F;th&gt;&lt;th&gt;Size&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Name&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;16 bytes&lt;&#x2F;td&gt;&lt;td&gt;Partition name (null-terminated string)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Type&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1 byte&lt;&#x2F;td&gt;&lt;td&gt;app=0x00, data=0x01&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Subtype&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1 byte&lt;&#x2F;td&gt;&lt;td&gt;e.g. OTA_0=0x10, NVS=0x02, SPIFFS=0x82&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Offset&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;4 bytes&lt;&#x2F;td&gt;&lt;td&gt;Flash address (must be aligned to 0x1000 pages)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Size&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;4 bytes&lt;&#x2F;td&gt;&lt;td&gt;Partition size&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Flags&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;4 bytes&lt;&#x2F;td&gt;&lt;td&gt;Rarely used&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;types-and-subtypes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#types-and-subtypes&quot; aria-label=&quot;Anchor link for: types-and-subtypes&quot;&gt;Types and Subtypes&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Only two major types exist:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Type&lt;&#x2F;th&gt;&lt;th&gt;Meaning&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;app&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Contains executable firmware&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;data&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Contains NVS, SPIFFS, keys, system data&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h4 id=&quot;app-subtypes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#app-subtypes&quot; aria-label=&quot;Anchor link for: app-subtypes&quot;&gt;App subtypes&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;For the &lt;code&gt;app&lt;&#x2F;code&gt; type, you can specify the following subtypes.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Subtype&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;factory&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Default firmware if no OTA used&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ota_0&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;OTA firmware slot 0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ota_1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;OTA firmware slot 1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ota_x&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Additional OTA slots (up to 15)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h4 id=&quot;data-subtypes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#data-subtypes&quot; aria-label=&quot;Anchor link for: data-subtypes&quot;&gt;Data Subtypes&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;For &lt;code&gt;data&lt;&#x2F;code&gt;, those subtypes are available&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Subtype&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nvs&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Key-value storage (Wi-Fi, preferences, calibration)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;otadata&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;OTA bootloader state (which slot is active)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;spiffs&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;SPIFFS filesystem&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fat&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;FAT filesystem&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nvs_keys&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Secure NVS encryption keys&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;phy&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Radio calibration&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;coredump&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Crash dump storage&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;efuse_em&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Emulated eFuse storage (rare)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Tip&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;p&gt;You should include at least &lt;code&gt;0x3000&lt;&#x2F;code&gt; bytes for the NVS partition.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
&lt;h2 id=&quot;alignment-rules&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#alignment-rules&quot; aria-label=&quot;Anchor link for: alignment-rules&quot;&gt;Alignment rules&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;ESP32 flash partitions must align to &lt;strong&gt;4 KB&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Note&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;p&gt;Partitions always start at addresses divisible by &lt;strong&gt;0x1000&lt;&#x2F;strong&gt; (4096 Bytes) &lt;br &#x2F;&gt;
Example: &lt;code&gt;0x9000&lt;&#x2F;code&gt;, &lt;code&gt;0x10000&lt;&#x2F;code&gt;, &lt;code&gt;0x210000&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
&lt;p&gt;So to get back to our example from the start we have:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv z-code&quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;SubType&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Offset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Size&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;Flags
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;      &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;nvs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x9000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;otadata&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0xe000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x2000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota_0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x10000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;2M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;     &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;ota_1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x210000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;2M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-advanced_csv&quot;&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;   &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;spiffs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x410000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;0x3F0000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-delimiter z-advanced_csv&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-advanced_csv&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-nonnumber z-advanced_csv&quot;&gt;&lt;span class=&quot;z-storage z-type z-advanced_csv&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;20 KiB&lt;&#x2F;code&gt; Byte sized NVS partition starting at the address &lt;code&gt;0x9000&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;A &lt;code&gt;8 KiB&lt;&#x2F;code&gt; Byte sized otadata partition starting at &lt;code&gt;0x9000&lt;&#x2F;code&gt; + &lt;code&gt;0x5000&lt;&#x2F;code&gt; = &lt;code&gt;0xe000&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Two &lt;code&gt;2 MB&lt;&#x2F;code&gt; Byte sized app partitions for our code.&lt;&#x2F;li&gt;
&lt;li&gt;A &lt;code&gt;4 MiB&lt;&#x2F;code&gt; Byte sized SPIFFS partition filling the rest of the available memory.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ressources&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ressources&quot; aria-label=&quot;Anchor link for: ressources&quot;&gt;Ressources&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.espressif.com&#x2F;projects&#x2F;esp-idf&#x2F;en&#x2F;stable&#x2F;esp32&#x2F;api-guides&#x2F;partition-tables.html&quot;&gt;Espressif Docs - Partition Tables&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.espressif.com&#x2F;projects&#x2F;arduino-esp32&#x2F;en&#x2F;latest&#x2F;tutorials&#x2F;partition_table.html&quot;&gt;Espressif Docs - Partition Tables (Arduino)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;medium.com&#x2F;the-esp-journal&#x2F;how-to-use-custom-partition-tables-on-esp32-69c0f3fa89c8&quot;&gt;Medium - How to use custom partition tables&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>ESP32: Why GPIO 34-39 need external pullups</title>
        <published>2025-06-01T00:00:00+00:00</published>
        <updated>2025-06-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paperbytelogs.de/notes/esp32-pullups/"/>
        <id>https://paperbytelogs.de/notes/esp32-pullups/</id>
        
        <content type="html" xml:base="https://paperbytelogs.de/notes/esp32-pullups/">&lt;p&gt;While working on a small example project with an ESP32, I encountered an issue with button detection on pin 34. Despite multiple attempts to troubleshoot, the button simply wouldn&#x27;t work as expected. Finally, I added an external pullup resistor—and voilà, it worked perfectly!&lt;&#x2F;p&gt;
&lt;p&gt;Curious about the cause, I did some research and discovered an important detail: only GPIOs that can function as both input and output support software-configurable pullups. GPIO pins 34 to 39, however, are input-only and therefore require external pullups for proper operation.&lt;&#x2F;p&gt;
&lt;p&gt;According to some Github issues, I&#x27;m not the first person this has happened to, so I’m leaving this note here as a reminder for future projects.&lt;&#x2F;p&gt;
&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Remember&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;p&gt;If you’re using GPIO 34-39, don’t forget to add external pullups!&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
&lt;p&gt;For more details, check out the &lt;a href=&quot;https:&#x2F;&#x2F;docs.espressif.com&#x2F;projects&#x2F;esp-idf&#x2F;en&#x2F;v5.0.1&#x2F;esp32&#x2F;api-reference&#x2F;peripherals&#x2F;gpio.html#_CPPv418gpio_set_pull_mode10gpio_num_t16gpio_pull_mode_t&quot;&gt;official ESP-IDF documentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Writing an E-Paper Display Driver </title>
        <published>2025-05-18T00:00:00+00:00</published>
        <updated>2025-05-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paperbytelogs.de/posts/epaper-display-driver/"/>
        <id>https://paperbytelogs.de/posts/epaper-display-driver/</id>
        
        <content type="html" xml:base="https://paperbytelogs.de/posts/epaper-display-driver/">&lt;h1 id=&quot;situation-and-goals&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#situation-and-goals&quot; aria-label=&quot;Anchor link for: situation-and-goals&quot;&gt;Situation and Goals&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;I ordered some epaper display modules from &lt;a href=&quot;https:&#x2F;&#x2F;www.waveshare.com&#x2F;4.2inch-e-Paper-Module-B.htm&quot;&gt;waveshare&lt;&#x2F;a&gt; to let my students tinker with them. It is a three color display with 4.2inch and is based on the &lt;a href=&quot;https:&#x2F;&#x2F;www.solomon-systech.com&#x2F;product&#x2F;ssd1683&#x2F;&quot;&gt;SSD1683&lt;&#x2F;a&gt; controller.&lt;&#x2F;p&gt;
&lt;p&gt;Waveshare provides some examples on their &lt;a href=&quot;https:&#x2F;&#x2F;www.waveshare.com&#x2F;wiki&#x2F;4.2inch_e-Paper_Module_(B)&quot;&gt;wiki&lt;&#x2F;a&gt; to get started, but I found the instructions a bit tricky to follow. Especially if you are still getting started with embedded programming. For my students, I wanted to provide a simple example with a library that they can easily include in a platformio project.&lt;&#x2F;p&gt;
&lt;p&gt;I also had a quick look at the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ZinggJM&#x2F;GxEPD2&quot;&gt;GxEPD2&lt;&#x2F;a&gt; library which seemed to be more what I was looking for. But for educational reasons and for the purpose of learning something myself, I decided to write my own driver library.&lt;&#x2F;p&gt;
&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Goal&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;ul&gt;
&lt;li&gt;Provide a simple library to use in a PlatformIO project.&lt;&#x2F;li&gt;
&lt;li&gt;Make the library compatible with an ESP32 and the Arduino Framework.&lt;&#x2F;li&gt;
&lt;li&gt;Keep the driver implementation as simple as possible.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
&lt;p&gt;We will be using C++ as the primary programming language for this project, leveraging its object-oriented features to create a modular and reusable library for the e-paper display.
While this guide aims to provide a starting point and easy to understand implementation, certain aspects have been intentionally simplified for clarity and ease of understanding.&lt;&#x2F;p&gt;
&lt;p&gt;So let&#x27;s get started.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-to-structure-the-code&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-structure-the-code&quot; aria-label=&quot;Anchor link for: how-to-structure-the-code&quot;&gt;How to structure the code?&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;To keep the design simple and modular, I decided to go with the following architecture:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;HAL: contains the microcontroller specific pin and spi initialization.&lt;&#x2F;li&gt;
&lt;li&gt;Driver: handles the display initialization and sending image data to the display.&lt;&#x2F;li&gt;
&lt;li&gt;Graphics: simple graphics functions to draw on a buffer.&lt;&#x2F;li&gt;
&lt;li&gt;User API: a wrapper to use the driver and graphics functions in a arduino typical way.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-hardware-abstraction-layer&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-hardware-abstraction-layer&quot; aria-label=&quot;Anchor link for: the-hardware-abstraction-layer&quot;&gt;The Hardware Abstraction Layer&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Before we can decide how our HAL should look like, we need to understand how the display will be connected to the microcontroller.
The display uses SPI to communicate with the microcontroller, but it also has some additional pins to control the display. The following table shows the pinout of the display:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pin Name&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;VCC&lt;&#x2F;td&gt;&lt;td&gt;Power supply (3.3V)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GND&lt;&#x2F;td&gt;&lt;td&gt;Ground&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DIN&lt;&#x2F;td&gt;&lt;td&gt;SPI Data In (MOSI)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CLK&lt;&#x2F;td&gt;&lt;td&gt;SPI Clock (SCK)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CS&lt;&#x2F;td&gt;&lt;td&gt;Chip Select (active low)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DC&lt;&#x2F;td&gt;&lt;td&gt;Data (high) &#x2F; Command (low)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RST&lt;&#x2F;td&gt;&lt;td&gt;Reset (active low)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BUSY&lt;&#x2F;td&gt;&lt;td&gt;Busy (active high)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Our HAL should handle everything which needs knowledge about the underlying hardware. This includes the SPI bus and some GPIO pins.
So we create an abstract interface that can be implemented for different microcontrollers.
The following code shows how the HAL interface looks like:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c++&quot;&gt;class&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-class z-c++&quot;&gt;EPD_HAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt; &lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;public&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-class z-c++&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;virtual&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c++&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;virtual&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;send_command&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c++&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;virtual&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;send_data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c++&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;virtual&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;wait_busy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c++&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;virtual&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;set_reset_pin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;bool&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;state&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c++&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Initialization:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Referring to the &lt;a href=&quot;https:&#x2F;&#x2F;files.waveshare.com&#x2F;wiki&#x2F;4.2inch%20e-Paper%20Module%20(B)&#x2F;4.2inch%20e-Paper%20(B)%20V2.pdf&quot;&gt;Datasheet&lt;&#x2F;a&gt; (Section 6.3) we need to set the following SPI settings.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Clock Speed: 20MHz&lt;&#x2F;li&gt;
&lt;li&gt;Send &lt;code&gt;MSBFIRST&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;SPI_MODE_0&lt;&#x2F;code&gt; (CPOL = 0 and CPHA = 0).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Data or Command:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The display can be operated with either 3-wire SPI or 4-wire SPI depending if the DC Pin is used or not. The module provides the option to change the setting by soldering a resistor on the backside. The 4-wire configuration is the default option, so we will use it.&lt;&#x2F;p&gt;
&lt;p&gt;This means:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;if the DC pin is &lt;code&gt;LOW&lt;&#x2F;code&gt; we send a command.&lt;&#x2F;li&gt;
&lt;li&gt;if the DC pin is &lt;code&gt;HIGH&lt;&#x2F;code&gt; we send some data.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The &lt;code&gt;send_command&lt;&#x2F;code&gt; and &lt;code&gt;send_data&lt;&#x2F;code&gt; methods just wrap this functionality by setting the DC Pin accordingly.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Reset:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;To awake the panel from deep sleep mode we need to use the hardware reset pin. In the Datasheet is states that it needs to be pulled &lt;code&gt;LOW&lt;&#x2F;code&gt; for 200μs and then back &lt;code&gt;HIGH&lt;&#x2F;code&gt; for another 200μs. This behavior can vary depending on the specific version of the display panel being used. To accommodate these differences and keep the implementation flexible, I decided to encapsulate the reset logic within the driver itself and just provide a &lt;code&gt;set_reset_pin&lt;&#x2F;code&gt; function in the HAL.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Wait Busy:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;busy&lt;&#x2F;code&gt; pin is used to signal that the panel is still processing and you should not send new commands or data to the display.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-driver&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-driver&quot; aria-label=&quot;Anchor link for: the-driver&quot;&gt;The Driver&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Ok now that we have our &lt;code&gt;EPD_HAL&lt;&#x2F;code&gt; as a foundation we can continue with the driver itself.&lt;&#x2F;p&gt;
&lt;p&gt;The Driver should handle all the initialization of the display and provide functions to show an image on the screen and set it back into sleep mode afterwards. For convenience we also want a method to clear the screen.&lt;&#x2F;p&gt;
&lt;p&gt;After some consideration this interface is what I came up with:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c++&quot;&gt;class&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-class z-c++&quot;&gt;EPD_Driver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt; &lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;protected&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-class z-c++&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        EPD_HAL&lt;span class=&quot;z-keyword z-operator z-c++&quot;&gt;*&lt;&#x2F;span&gt; hal&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Uses hardware abstraction layer
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint16_t&lt;&#x2F;span&gt; width &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;400&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Display width in pixels
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint16_t&lt;&#x2F;span&gt; height &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;300&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Display height in pixels
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;public&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-class z-c++&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-meta z-method z-constructor z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-constructor z-c++&quot;&gt;EPD_Driver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;EPD_HAL&lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;hal&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-constructor z-initializer-list z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-initializer-list z-c++&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-readwrite z-member z-c++&quot;&gt;hal&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;hal&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;reset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;clear&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;write_framebuffer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;bool&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;use_red_ram&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;display&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;bool&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;use_red_ram&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;initialization-and-sleep-mode&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#initialization-and-sleep-mode&quot; aria-label=&quot;Anchor link for: initialization-and-sleep-mode&quot;&gt;Initialization and sleep mode&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Let&#x27;s first look into the &lt;code&gt;init&lt;&#x2F;code&gt; process. The description in the datasheet and the provided examples diverged somewhat, but both give us a good starting point. Basically we need to do the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Do a hardware reset to awake the display from sleep mode.&lt;&#x2F;li&gt;
&lt;li&gt;Do a software reset to clear previous settings.&lt;&#x2F;li&gt;
&lt;li&gt;Send a bunch of commands to the display to config the options we want. These might change depending on your needs, but this should work as a minimal example.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;Set the panels border waveform.&lt;&#x2F;li&gt;
&lt;li&gt;Select temperature sensor.&lt;&#x2F;li&gt;
&lt;li&gt;Set the displays RAMs Data Entry Mode.&lt;&#x2F;li&gt;
&lt;li&gt;Specify initial window (full) and cursor for the RAM.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Wait until the display is ready.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;files.waveshare.com&#x2F;wiki&#x2F;4.2inch%20e-Paper%20Module%20(B)&#x2F;4.2inch%20e-Paper%20(B)%20V2.pdf&quot;&gt;Datasheet&lt;&#x2F;a&gt; (Chapter 7) provides a comprehensive table with all available commands and their options. I let a LLM generate a complete list of all commands from this table, which worked surprisingly well.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-keyword z-control z-c++&quot;&gt;namespace&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-namespace z-c++&quot;&gt;DisplayCmd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt; &lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; System Control
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-variadic z-c&quot;&gt;...&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;constexpr&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; DEEP_SLEEP_MODE   &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0x&lt;&#x2F;span&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Deep Sleep Mode Control
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;constexpr&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; DATA_ENTRY_MODE   &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0x&lt;&#x2F;span&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Data Entry Mode Setting
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;constexpr&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; SOFTWARE_RESET    &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0x&lt;&#x2F;span&gt;12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; SW RESET
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-variadic z-c&quot;&gt;...&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There you also can find the command for the sleep mode &lt;code&gt;0x10&lt;&#x2F;code&gt;. There is a Deep Sleep Mode 1 and 2. However, I could not find any difference between the two. So i went with Mode 2 as this was used in the example code provided by waveshare even if the datasheet suggest to use Mode 1.&lt;&#x2F;p&gt;
&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Deep sleep mode&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;p&gt;As you should not keep the display in a high voltage state for too long it is important to send it back to deep sleep mode after updating the screen.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
&lt;p&gt;We can use our HALs &lt;code&gt;send_&lt;&#x2F;code&gt; methods, to send a command and it&#x27;s options to the display.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-toc-list z-full-identifier z-c++&quot;&gt;EPD_Driver&lt;span class=&quot;z-punctuation z-accessor z-double-colon z-c++&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;send_command&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;DisplayCmd&lt;span class=&quot;z-punctuation z-accessor z-double-colon z-c++&quot;&gt;::&lt;&#x2F;span&gt;DEEP_SLEEP_MODE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;send_data&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0x&lt;&#x2F;span&gt;01&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Deep Sleep Mode 2
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;show-an-image&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#show-an-image&quot; aria-label=&quot;Anchor link for: show-an-image&quot;&gt;Show an Image&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;To show something on the epaper display we need to load the image data into the RAM of the epaper module and then tell it to update the screen. But as the display supports &lt;code&gt;RED&lt;&#x2F;code&gt;, &lt;code&gt;BLACK&lt;&#x2F;code&gt; and &lt;code&gt;WHITE&lt;&#x2F;code&gt; there are two memory locations. One for the &lt;code&gt;BLACK&lt;&#x2F;code&gt; and &lt;code&gt;WHITE&lt;&#x2F;code&gt; image and the other for the &lt;code&gt;RED&lt;&#x2F;code&gt; and &lt;code&gt;WHITE&lt;&#x2F;code&gt; image. Depending on your initial settings &lt;code&gt;WHITE&lt;&#x2F;code&gt; is representate by a &lt;code&gt;1&lt;&#x2F;code&gt; and the others are &lt;code&gt;0&lt;&#x2F;code&gt;. Each byte which we will send to the panel represents 8 pixels. You can find a visual representation on the &lt;a href=&quot;https:&#x2F;&#x2F;www.waveshare.com&#x2F;wiki&#x2F;4.2inch_e-Paper_Module_(B)_Manual#Overview&quot;&gt;waveshare wiki page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;With this knowledge we can implement the &lt;code&gt;write_framebuffer&lt;&#x2F;code&gt; and &lt;code&gt;update&lt;&#x2F;code&gt; method:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-toc-list z-full-identifier z-c++&quot;&gt;EPD_Driver&lt;span class=&quot;z-punctuation z-accessor z-double-colon z-c++&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;write_framebuffer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint8_t&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;bool&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;use_red_ram&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; select RAM
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;send_command&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;use_red_ram &lt;span class=&quot;z-keyword z-operator z-ternary z-c&quot;&gt;?&lt;&#x2F;span&gt; DisplayCmd&lt;span class=&quot;z-punctuation z-accessor z-double-colon z-c++&quot;&gt;::&lt;&#x2F;span&gt;WRITE_RAM_RED&lt;span class=&quot;z-keyword z-operator z-ternary z-c&quot;&gt;:&lt;&#x2F;span&gt; DisplayCmd&lt;span class=&quot;z-punctuation z-accessor z-double-colon z-c++&quot;&gt;::&lt;&#x2F;span&gt;WRITE_RAM_BW&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Send all pixels
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint32_t&lt;&#x2F;span&gt; w &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-c++&quot;&gt;this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-member z-c++&quot;&gt;width&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-c++&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint32_t&lt;&#x2F;span&gt; j &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; j &lt;span class=&quot;z-keyword z-operator z-comparison z-c&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-c++&quot;&gt;this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-member z-c++&quot;&gt;height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; j&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-c++&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-stdint z-c&quot;&gt;uint32_t&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-c&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; w&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; i&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;            hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;send_data&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;image&lt;span class=&quot;z-meta z-brackets z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-c++&quot;&gt;[&lt;&#x2F;span&gt;i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;+&lt;&#x2F;span&gt; j &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt; w&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-c++&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;        &lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Depending on the selected color we tell the display which memory location to choose and send the data.
As our display has a width of 400 pixel, which is a multiple of 8, we can savely just divide by 8 to calculate the bytes in one row.&lt;&#x2F;p&gt;
&lt;p&gt;To make the changes visible to the user we need to call the &lt;code&gt;update&lt;&#x2F;code&gt; function.
To update the display we need to send two command and wait until the display is ready.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-toc-list z-full-identifier z-c++&quot;&gt;EPD_Driver&lt;span class=&quot;z-punctuation z-accessor z-double-colon z-c++&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;send_command&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;DISP_UPDATE_CTRL_2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;send_data&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0x&lt;&#x2F;span&gt;F7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; EN ANALOG, LOAD TEMP, DISP MODE 1, DIS ANALOG, DIS OSC
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;send_command&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;MASTER_ACTIVATION&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    hal&lt;span class=&quot;z-punctuation z-accessor z-arrow z-c++&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;wait_busy&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The display supports also an option for fast updates. But we will not look into this today.&lt;&#x2F;p&gt;
&lt;p&gt;If we only use black and white images we could include the required commands in the &lt;code&gt;write_framebuffer&lt;&#x2F;code&gt; method.
But if we have an image with &lt;code&gt;RED&lt;&#x2F;code&gt; and &lt;code&gt;BLACK&lt;&#x2F;code&gt; we only want to update the screen after sending both images.
So we keep both functions seperated.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;display&lt;&#x2F;code&gt; method is basically just a wrapper around those two functions for the mentioned usecase.
Also &lt;code&gt;clear()&lt;&#x2F;code&gt; is the same as writing a complete white framebuffer.&lt;&#x2F;p&gt;
&lt;p&gt;We are now able to show an image on the screen by sending an array of bytes to the module. As the flash memory of the esp32 is big enough for storing the complete image data we don&#x27;t worry about partial updates for now.&lt;&#x2F;p&gt;
&lt;p&gt;We can use a service like &lt;a href=&quot;https:&#x2F;&#x2F;javl.github.io&#x2F;image2cpp&#x2F;&quot;&gt;image2cpp&lt;&#x2F;a&gt; to convert an existing image into an array of bytes. Make sure your image has the correct dimensions (400x300) before uploading it. Then we copy the resulting bytes into the source code.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;unsigned&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;char&lt;&#x2F;span&gt; TEST_IMAGE&lt;span class=&quot;z-meta z-brackets z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-c++&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-c++&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; PROGMEM &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-comment z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; 0X00,0X01,0X90,0X01,0X2C,0X01, &lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-numeric z-base z-c++&quot;&gt;0X&lt;&#x2F;span&gt;FF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-variadic z-c&quot;&gt;...&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For a quick demo we can test our newly written driver with the following program:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; includes and defines ...
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;auto&lt;&#x2F;span&gt; hal &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-c++&quot;&gt;EPD_HAL_ESP32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;EPD_CS_PIN&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; EPD_DC_PIN&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; EPD_RST_PIN&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; EPD_BUSY_PIN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;auto&lt;&#x2F;span&gt; epd &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-c++&quot;&gt;EPD_Driver&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;hal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-toc-list z-full-identifier z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;setup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    epd&lt;span class=&quot;z-punctuation z-accessor z-dot z-c++&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;init&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;  &lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Init the display
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    epd&lt;span class=&quot;z-punctuation z-accessor z-dot z-c++&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;clear&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    epd&lt;span class=&quot;z-punctuation z-accessor z-dot z-c++&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;display&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;TEST_IMAGE&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-c&quot;&gt;false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    epd&lt;span class=&quot;z-punctuation z-accessor z-dot z-c++&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-toc-list z-full-identifier z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;loop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This works as expected and we should see our image on the screen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-graphics-library&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-graphics-library&quot; aria-label=&quot;Anchor link for: the-graphics-library&quot;&gt;The Graphics Library&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We could call it a day and just always convert images and copy them into our program or write a simple server where to fetch new images from.
But sometimes it is useful to be able to create a new image programmatically.
This is where the graphics library comes in. Instead of writing our own graphics library from scratch we will use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;adafruit&#x2F;Adafruit-GFX-Library&quot;&gt;Adafruit_GFX&lt;&#x2F;a&gt; for this purpose.
This makes it fairly simple. We only need to subclass the &lt;code&gt;Adafruit_GFX&lt;&#x2F;code&gt; base class and implement the &lt;code&gt;drawPixel&lt;&#x2F;code&gt; method.&lt;&#x2F;p&gt;
&lt;p&gt;We could implement this in a way to draw directly to the epapers RAM. But this would need some more work on our &lt;code&gt;EPD_Driver&lt;&#x2F;code&gt; class to make it a smooth experience. To keep it simple i decided to go with a different approach.
In fact i decided to decouple it from the driver itself and only provide a &lt;code&gt;Canvas&lt;&#x2F;code&gt; class which is basically a framebuffer where you can draw on. After that you can send the imge to the display using the driver.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;auto&lt;&#x2F;span&gt; canvas &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-c++&quot;&gt;Canvas&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;400&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;300&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; draw on the canvas with all functions which are provided by Adafruit_GFX
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;auto&lt;&#x2F;span&gt; img &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; canvas&lt;span class=&quot;z-punctuation z-accessor z-dot z-c++&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;getImage&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;epd&lt;span class=&quot;z-punctuation z-accessor z-dot z-c++&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-variable z-function z-member z-c++&quot;&gt;display&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;img&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; BLACK_IMAGE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;the-user-api&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-user-api&quot; aria-label=&quot;Anchor link for: the-user-api&quot;&gt;The User API&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To simplify usage and make the library feel more like a typical Arduino library, I designed a streamlined Epaper class. It abstracts away lower-level tasks like creating the HAL and driver instances, as well as automatically handling actions like calling sleep after displaying an image. This allows users to get started quickly with minimal setup.&lt;&#x2F;p&gt;
&lt;p&gt;This is what is looks like:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; class=&quot;language-cpp z-code&quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c++&quot;&gt;typedef&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;enum&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    BLACK &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    RED &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c++&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-typedef z-c++&quot;&gt;Color_t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c++&quot;&gt;class&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-class z-c++&quot;&gt;EPaper&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt; &lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c++&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;private&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-class z-c++&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    EPD_HAL &lt;span class=&quot;z-keyword z-operator z-c++&quot;&gt;*&lt;&#x2F;span&gt;hal&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    EPD_Driver &lt;span class=&quot;z-keyword z-operator z-c++&quot;&gt;*&lt;&#x2F;span&gt;driver&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;public&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-class z-c++&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-meta z-method z-constructor z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-constructor z-c++&quot;&gt;EPaper&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;unsigned&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;cs_pin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;unsigned&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;dc_pin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;unsigned&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;reset_pin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;unsigned&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;busy_pin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;begin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;    &lt;span class=&quot;z-storage z-type z-c&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-c++&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c++&quot;&gt;showImage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c++&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-c++&quot;&gt;&lt;span class=&quot;z-meta z-group z-c++&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-c++&quot;&gt;const&lt;&#x2F;span&gt; byte &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c++&quot;&gt;,&lt;&#x2F;span&gt; Color_t &lt;span class=&quot;z-variable z-parameter z-c++&quot;&gt;color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c++&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c++&quot;&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-c++&quot;&gt;&lt;span class=&quot;z-meta z-block z-c++&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c++&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c++&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Before starting this little project i thought it would be much harder and more work to get some minimal example up and running.
But i made quick progress and the datasheet and the existing examples provided enough information to hack a first working solution together in a couple of hours.&lt;&#x2F;p&gt;
&lt;p&gt;As it is often not more productive to write something from scratch it is very educative. This is what i love and my main motivation. There are probably a lot of things which can be further improved, like partial and fast updates or using dma to transfer the framebuffer. But i think i managed to keep it as simple as possible for a minimal starting point and still be able to improve it later.&lt;&#x2F;p&gt;
&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Source code&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;p&gt;If you are interested you can find the full library &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jomaway&#x2F;rdf-epd-lib&quot;&gt;here&lt;&#x2F;a&gt;. &lt;em&gt;But as this project evolves over time it will contain other functions to support more complex workflows as well.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you have suggestions for improvements feel free to contribute.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hello 👋</title>
        <published>2025-04-01T00:00:00+00:00</published>
        <updated>2025-04-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paperbytelogs.de/posts/hey/"/>
        <id>https://paperbytelogs.de/posts/hey/</id>
        
        <content type="html" xml:base="https://paperbytelogs.de/posts/hey/">&lt;div class=&quot;note-container&quot;&gt;
    
            &lt;div class=&quot;note-header&quot;&gt;
                
                    &lt;div class=&quot;note-icon&quot;&gt;&lt;p&gt;Info&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
                
            &lt;&#x2F;div&gt;
            &lt;div class=&quot;note-content&quot;&gt;&lt;p&gt;I write this blog mainly for myself, but feel free to look around.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
        
    &lt;&#x2F;div&gt;
&lt;h1 id=&quot;intro&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#intro&quot; aria-label=&quot;Anchor link for: intro&quot;&gt;Intro&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Hello, I&#x27;m a teacher and I like to tinker with electronics and programming.
This blog is a collection of my projects, ideas, and experiments.
I hope you find something useful or interesting here.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s go ... and do something fun.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>PlatformIO</title>
        <published>2025-01-02T00:00:00+00:00</published>
        <updated>2025-01-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paperbytelogs.de/notes/platform-io/"/>
        <id>https://paperbytelogs.de/notes/platform-io/</id>
        
        <content type="html" xml:base="https://paperbytelogs.de/notes/platform-io/">&lt;p&gt;By default, PlatformIO creates new projects inside your Documents directory, which might not be ideal for everyone. If you prefer to keep your projects elsewhere, like me, you can easily change the default location in the PlatformIO terminal with the following command:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh z-code&quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;pio&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; settings set projects_dir  &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;Development&#x2F;platformIO&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Just replace &lt;code&gt;~&#x2F;Development&#x2F;platformIO&lt;&#x2F;code&gt; with your preferred folder.
This way, all new projects will be created in the directory you choose, keeping your workspace organized the way you like it.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
