Deploying upstream@2ad59ba9611579270590e67d5c659bf0e5aaab90: Deploying upstream@dfe7f679cad4a407c297c22c662bb525125c88a1: Deploying upstream@81b0a55daf214b6417165f48a0b73fe350ca861c: Deploying upstream@8fe5f7130f34686dff5b9a15d7226e65cb39de8c: Publish devlog for 8 June 2026

This commit is contained in:
2026-06-08 12:36:43 -04:00
parent fc5c467a43
commit dd3aad498f
79 changed files with 6412 additions and 2155 deletions

View File

@@ -0,0 +1,826 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<meta
http-equiv="X-UA-Compatible"
content="ie=edge">
<meta
name="theme-color"
content="#fff"
id="theme-color">
<meta
name="description"
content="AKLabs">
<link
rel="icon"
href="/">
<title>Devlog Entry - 8 June 2026</title>
<meta
property="og:title"
content="Devlog Entry - 8 June 2026">
<meta
property="og:url"
content="https://aklabs.net/2026/06/08/Devlog-20260608/index.html">
<meta
property="og:img"
content="/images/akesterson.webp">
<meta
property="og:type"
content="article">
<meta
property="og:article:published_time"
content="2026-06-08">
<meta
property="og:article:modified_time"
content="2026-06-08">
<meta
property="og:article:author"
content="Andrew Kesterson">
<link rel="preload" href="//at.alicdn.com/t/font_1946621_i1kgafibvw.css" as="style" >
<link rel="preload" href="//at.alicdn.com/t/font_1952792_89b4ac4k4up.css" as="style" >
<link rel="preload" href="/css/main.css" as="style" >
<link rel="modulepreload" href="//instant.page/5.1.0">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="//at.alicdn.com/t/font_1946621_i1kgafibvw.css">
<link rel="stylesheet" href="//at.alicdn.com/t/font_1952792_89b4ac4k4up.css">
<link rel="stylesheet" href="/js/lib/lightbox/baguetteBox.min.css">
<script>
function loadScript(url, cb) {
var script = document.createElement('script');
script.src = url;
if (cb) script.onload = cb;
script.async = true;
document.body.appendChild(script);
}
function loadCSS(href, data, attr) {
var sheet = document.createElement('link');
sheet.ref = 'stylesheet';
sheet.href = href;
sheet.dataset[data] = attr;
document.head.appendChild(sheet);
}
function changeCSS(cssFile, data, attr) {
var oldlink = document.querySelector(data);
var newlink = document.createElement("link");
newlink.setAttribute("rel", "stylesheet");
newlink.setAttribute("href", cssFile);
newlink.dataset.prism = attr;
document.head.replaceChild(newlink, oldlink);
}
</script>
<script>
function prismThemeChange() {
if(document.getElementById('theme-color').dataset.mode === 'dark') {
if(document.querySelector('[data-prism]')) {
changeCSS('/js/lib/prism/prism-tomorrow.min.css', '[data-prism]', 'prism-tomorrow');
} else {
loadCSS('/js/lib/prism/prism-tomorrow.min.css', 'prism', 'prism-tomorrow');
}
} else {
if(document.querySelector('[data-prism]')) {
changeCSS('/js/lib/prism/prism-defauult.min.css', '[data-prism]', 'prism-defauult');
} else {
loadCSS('/js/lib/prism/prism-defauult.min.css', 'prism', 'prism-defauult');
}
}
}
prismThemeChange()
</script>
<link rel="stylesheet" href="/js/lib/prism/prism-line-numbers.min.css">
<script>
// control reverse button
var reverseDarkList = {
dark: 'light',
light: 'dark'
};
var themeColor = {
dark: '#1c1c1e',
light: '#fff'
}
// get the data of css prefers-color-scheme
var getCssMediaQuery = function() {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
};
// reverse current darkmode setting function
var reverseDarkModeSetting = function() {
var setting = localStorage.getItem('user-color-scheme');
if(reverseDarkList[setting]) {
setting = reverseDarkList[setting];
} else if(setting === null) {
setting = reverseDarkList[getCssMediaQuery()];
} else {
return;
}
localStorage.setItem('user-color-scheme', setting);
return setting;
};
// apply current darkmode setting
</script>
<script>
var setDarkmode = function(mode) {
var setting = mode || localStorage.getItem('user-color-scheme');
if(setting === getCssMediaQuery()) {
document.documentElement.removeAttribute('data-user-color-scheme');
localStorage.removeItem('user-color-scheme');
document.getElementById('theme-color').content = themeColor[setting];
document.getElementById('theme-color').dataset.mode = setting;
prismThemeChange();
} else if(reverseDarkList[setting]) {
document.documentElement.setAttribute('data-user-color-scheme', setting);
document.getElementById('theme-color').content = themeColor[setting];
document.getElementById('theme-color').dataset.mode = setting;
prismThemeChange();
} else {
document.documentElement.removeAttribute('data-user-color-scheme');
localStorage.removeItem('user-color-scheme');
document.getElementById('theme-color').content = themeColor[getCssMediaQuery()];
document.getElementById('theme-color').dataset.mode = getCssMediaQuery();
prismThemeChange();
}
};
setDarkmode();
</script>
<link rel="preload" href="/js/lib/lightbox/baguetteBox.min.js" as="script">
<link rel="preload" href="/js/lib/lightbox/baguetteBox.min.css" as="style" >
<link rel="preload" href="/js/lib/lozad.min.js" as="script">
<meta name="generator" content="Hexo 6.0.0"><link rel="alternate" href="/atom.xml" title="AKLabs" type="application/atom+xml">
</head>
<body>
<div class="wrapper">
<nav class="navbar">
<div class="navbar-logo">
<a class="navbar-logo-main" href="/">
<span class="navbar-logo-dsc">AKLabs</span>
</a>
</div>
<div class="navbar-menu">
<a
href="/now"
class="navbar-menu-item">
~/.plan
</a>
<a
href="/archives"
class="navbar-menu-item">
Archive
</a>
<a
href="/categories"
class="navbar-menu-item">
Categories
</a>
<a
href="/about"
class="navbar-menu-item">
About
</a>
<a
href="/contact"
class="navbar-menu-item">
Contact
</a>
<button
class="navbar-menu-item darknavbar navbar-menu-btn"
aria-label="Toggle dark mode"
id="dark">
<i class="iconfont icon-weather"></i>
</button>
<button
class="navbar-menu-item searchnavbar navbar-menu-btn"
aria-label="Toggle search"
id="search">
<!-- <i
class="iconfont icon-search"
style="font-size: 1.2rem; font-weight: 400;">
</i> -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img"
class="iconify iconify--ion" width="28" height="28" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512">
<path fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="28"
d="M256 80a176 176 0 1 0 176 176A176 176 0 0 0 256 80Z"></path>
<path fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="28"
d="M232 160a72 72 0 1 0 72 72a72 72 0 0 0-72-72Z"></path>
<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="28"
d="M283.64 283.64L336 336"></path>
</svg>
</button>
</div>
</nav>
<div
id="local-search"
style="display: none">
<input
class="navbar-menu-item"
id="search-input"
placeholder="请输入搜索内容..." />
<div id="search-content"></div>
</div>
<div class="section-wrap">
<div class="container">
<div class="columns">
<aside class="left-column">
<div class="card card-author">
<img
src="/images/akesterson.webp"
class="author-img"
width="88"
height="88"
alt="author avatar">
<p class="author-name">Andrew Kesterson</p>
<p class="author-description"><center><i>"Love God. Live Righteously. Die Well."</i> <br/> <br/> <a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew">Source Code</a> || <a target="_blank" rel="noopener" href="https://www.linkedin.com/in/andrewkesterson/">LinkedIn</a> <br/> </center></p>
<div class="author-message">
<a
class="author-posts-count"
href="/archives">
<span>31</span>
<span>Posts</span>
</a>
<a
class="author-categories-count"
href="/categories">
<span>9</span>
<span>Categories</span>
</a>
<a
class="author-tags-count"
href="/tags">
<span>0</span>
<span>Tags</span>
</a>
</div>
</div>
<div class="sticky-tablet">
<article class="display-when-two-columns spacer">
<div class="card card-content toc-card">
<div class="toc-header">
<i
class="iconfont icon-menu"
style="padding-right: 2px;">
</i>TOC
</div>
<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#libakgl-updates"><span class="toc-text">libakgl updates</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#libakerror-new-error-type"><span class="toc-text">libakerror new error type</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#ESP32-Projects"><span class="toc-text">ESP32 Projects</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Using-Analog-to-Digital-Converters-Potentiometers-and-Capacitive-Touch-Sensors"><span class="toc-text">Using Analog to Digital Converters, Potentiometers and Capacitive Touch Sensors</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Photoresistors-and-Voltage-Dividers"><span class="toc-text">Photoresistors and Voltage Dividers</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Joystick-and-WS2812-LED-demo"><span class="toc-text">Joystick and WS2812 LED demo</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Closing-Thoughts"><span class="toc-text">Closing Thoughts</span></a></li></ol>
</div>
</article>
<article class="card card-content categories-widget">
<div class="categories-card">
<div class="categories-header">
<i
class="iconfont icon-fenlei"
style="padding-right: 2px;">
</i>Categories
</div>
<div class="categories-list">
<a href="/categories/Books/">
<div class="categories-list-item">
Books
<span class="categories-list-item-badge">14</span>
</div>
</a>
<a href="/categories/Faith/">
<div class="categories-list-item">
Faith
<span class="categories-list-item-badge">6</span>
</div>
</a>
<a href="/categories/Outdoors/">
<div class="categories-list-item">
Outdoors
<span class="categories-list-item-badge">1</span>
</div>
</a>
<a href="/categories/Philosophy/">
<div class="categories-list-item">
Philosophy
<span class="categories-list-item-badge">5</span>
</div>
</a>
<a href="/categories/Leadership/">
<div class="categories-list-item">
Leadership
<span class="categories-list-item-badge">8</span>
</div>
</a>
<a href="/categories/History/">
<div class="categories-list-item">
History
<span class="categories-list-item-badge">1</span>
</div>
</a>
<a href="/categories/Liberal-Education/">
<div class="categories-list-item">
Liberal-Education
<span class="categories-list-item-badge">1</span>
</div>
</a>
<a href="/categories/Technology/">
<div class="categories-list-item">
Technology
<span class="categories-list-item-badge">13</span>
</div>
</a>
<a href="/categories/Current-Events/">
<div class="categories-list-item">
Current-Events
<span class="categories-list-item-badge">5</span>
</div>
</a>
</div>
</div>
</article>
<article class="card card-content tags-widget">
<div class="tags-card">
<div class="tags-header">
<i
class="iconfont icon-biaoqian"
style="padding-right: 2px;">
</i>hot tags
</div>
<div class="tags-list">
</div>
</div>
</article>
</div>
</aside>
<main class="main-column">
<article class="card card-content">
<header>
<h1 class="post-title">
Devlog Entry - 8 June 2026
</h1>
</header>
<div class="post-meta post-show-meta">
<time datetime="2026-06-08T13:27:12.000Z">
<i
class="iconfont icon-calendar"
style="margin-right: 2px;">
</i>
<span>2026-06-08</span>
</time>
<span class="dot"></span>
<a
href="/categories/Technology/"
class="post-meta-link">
Technology
</a>
<span class="dot"></span>
<span>802 words</span>
</div>
</header>
<div
id="section"
class="post-content">
<h2 id="libakgl-updates"><a href="#libakgl-updates" class="headerlink" title="libakgl updates"></a>libakgl updates</h2><ul>
<li><a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/libakgl/commit/652ee4cdf3a636c749db0a06ea30e7422840f9de">Tilemaps can now contain their own physics properties</a>. This allows you to specify different gravity, drag, and even entirely different physics simulators in the map properties. Something about reading the physics simulation values from the map rather than the overall game properties makes the gravity behave differently, so the values need to be tweaked a little bit, but it still works fine.</li>
</ul>
<p><img src="/images/posts/devlog-20260608/mapphysicsproperties.png" alt="example map properties" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20300%20300'%3E%3C/svg%3E" data-src="/images/posts/devlog-20260608/mapphysicsproperties.png" class="lozad post-image"><br><br/></p>
<pre class="line-numbers language-json" data-language="json"><code class="language-json"><span class="token property">"properties"</span><span class="token operator">:</span><span class="token punctuation">[</span>
<span class="token punctuation">&#123;</span>
<span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"physics.drag.y"</span><span class="token punctuation">,</span>
<span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"float"</span><span class="token punctuation">,</span>
<span class="token property">"value"</span><span class="token operator">:</span><span class="token number">0</span>
<span class="token punctuation">&#125;</span><span class="token punctuation">,</span>
<span class="token punctuation">&#123;</span>
<span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"physics.gravity.y"</span><span class="token punctuation">,</span>
<span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"float"</span><span class="token punctuation">,</span>
<span class="token property">"value"</span><span class="token operator">:</span><span class="token number">0</span>
<span class="token punctuation">&#125;</span><span class="token punctuation">,</span>
<span class="token punctuation">&#123;</span>
<span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"physics.model"</span><span class="token punctuation">,</span>
<span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"string"</span><span class="token punctuation">,</span>
<span class="token property">"value"</span><span class="token operator">:</span><span class="token string">"arcade"</span>
<span class="token punctuation">&#125;</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
</td>
<h2 id="libakerror-new-error-type"><a href="#libakerror-new-error-type" class="headerlink" title="libakerror new error type"></a>libakerror new error type</h2><p>libakerror now includes a new error type, <a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/libakerror/commit/93f5e934804d1b62d5c4751562056d8185c7c707"><code>AKERR_CIRCULAR_REFERENCE</code></a> for things like linked lists or trees that are self-referential.</p>
<hr/>
<h2 id="ESP32-Projects"><a href="#ESP32-Projects" class="headerlink" title="ESP32 Projects"></a>ESP32 Projects</h2><p>This week was basically one long episode of “Wait I thought I knew how that worked … Oh I didnt understand … but now I do!”. Overall it was a good week.</p>
<h3 id="Using-Analog-to-Digital-Converters-Potentiometers-and-Capacitive-Touch-Sensors"><a href="#Using-Analog-to-Digital-Converters-Potentiometers-and-Capacitive-Touch-Sensors" class="headerlink" title="Using Analog to Digital Converters, Potentiometers and Capacitive Touch Sensors"></a>Using Analog to Digital Converters, Potentiometers and Capacitive Touch Sensors</h3><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Fun with potentiometers and the esp32 analog to digital converter. It was fluttering around at zero until the camera came on <a target="_blank" rel="noopener" href="https://t.co/U6Xi5qF4Pz">pic.twitter.com/U6Xi5qF4Pz</a></p>&mdash; Andrew Kesterson (@AKLabsDotNet) <a target="_blank" rel="noopener" href="https://x.com/AKLabsDotNet/status/2061259063120261133?ref_src=twsrc%5Etfw">June 1, 2026</a></blockquote> <script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>
<p><a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/esp32-learning/src/branch/main/04-adc">This project</a> lets you control a couple of LEDs with a potentiometer and a capacitive touch sensor, using the potentiometer through the analog to digital converter as a dimmer for the green LED vi PWM, and using the capacitive touch sensor as an on&#x2F;off switch for the red LED.</p>
<p>Lessons learned from this project:</p>
<ul>
<li>How potentiometers actually work (surprise: its more complicated than I thought, as usual)</li>
<li>How an ADC works</li>
<li>How the ESP32-S3 ADC in particular works</li>
<li>How to build a Flash ADC on a breadboard (<em>note: I didnt get around to actually BUILDING the flash ADC I mention in the article. I need to go back and do that.</em>)</li>
<li>How integrated circuits measure capacitance</li>
</ul>
<p>There is a more detailed writeup about this project <a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/esp32-learning/src/branch/main/04-adc">in my source repository</a></p>
<hr/>
<h3 id="Photoresistors-and-Voltage-Dividers"><a href="#Photoresistors-and-Voltage-Dividers" class="headerlink" title="Photoresistors and Voltage Dividers"></a>Photoresistors and Voltage Dividers</h3><p><a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/esp32-learning/src/branch/main/05-photoresistors/README.md">This project</a> uses a photoresistor feeding into the ADC and an LED fed with PWM to create a nightlight that gets brighter as the ambient light gets darker.</p>
<p>The code in this lesson is unremarkable; the lessons here were primarily in correcting some fundamental misunderstandings in my basic electronics knowledge.</p>
<ul>
<li>Resistors in a circuit dont work the way I thought they did</li>
<li>How a voltage divider actually works and why we might use one</li>
<li>How a photoresistor actually works under the hood</li>
</ul>
<p>There is a LOT tied up in what I learned about voltage dividers and photoresistors. I had some pretty fundamental misunderstandings about how circuits worked, and if you went through the same kinds of tutorials I did, you may too. There is a more detailed writeup about this project <a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/esp32-learning/src/branch/main/05-photoresistors/README.md">in my source repository</a></p>
<hr/>
<h3 id="Joystick-and-WS2812-LED-demo"><a href="#Joystick-and-WS2812-LED-demo" class="headerlink" title="Joystick and WS2812 LED demo"></a>Joystick and WS2812 LED demo</h3><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Putting together almost everything Ive learned about arduino and esp32 over the past few weeks to make a joystick blinks lights demo with calibration. Challenging but very fun. <a target="_blank" rel="noopener" href="https://t.co/7blqqQOlYg">pic.twitter.com/7blqqQOlYg</a></p>&mdash; Andrew Kesterson (@AKLabsDotNet) <a target="_blank" rel="noopener" href="https://x.com/AKLabsDotNet/status/2063056777768239514?ref_src=twsrc%5Etfw">June 6, 2026</a></blockquote> <script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>
<p><a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/esp32-learning/src/branch/main/06-joystick/README.md">This demo project</a> shows using a joystick peripheral to control the position of an LED light on a WS2812 light strip, as well as how to calibrate a joystick, while using PWM driven LEDs to show the relative position of a joystick on its axis and the status of the momentary joystick pushbutton. The breadboard picture above shows a WS2812 horizontal strip, but thats not what I used; mine was a circular LED arrangement, I just couldnt find the right part in Fritzing.</p>
<p>Lessons learned from this project:</p>
<ul>
<li><a target="_blank" rel="noopener" href="https://fritzing.org/">Fritzing</a> is time consuming but neat</li>
<li>I still dont trust C++</li>
<li>How the RMT peripheral on the ESP32-S3 works and why it is involved when driving WS2812 LED strips</li>
<li>How to select pin assignments on the ESP32 without relying on the tutorial</li>
<li>How to calibrate joysticks</li>
</ul>
<p>Theres quite a bit of info packed in to the writeup on this one - at least I feel like there is. Theres some discussion of the code too so that may make it look bigger than it actually is. The writeup on the WS2812 protocol, in all its beautiful wierdness, may be enough to justify the read. There is a more detailed writeup about this project <a target="_blank" rel="noopener" href="https://source.starfort.tech/andrew/esp32-learning/src/branch/main/06-joystick/README.md">in my source repository</a>.</p>
<h2 id="Closing-Thoughts"><a href="#Closing-Thoughts" class="headerlink" title="Closing Thoughts"></a>Closing Thoughts</h2><p>I am very very ready to leave Arduino behind and move on to the projects in <a target="_blank" rel="noopener" href="https://www.amazon.com/Bare-Metal-Embedded-Programming-high-performance-microcontrollers/dp/183546081X">Bare-Metal Embedded C Programming</a> on STM32, but I think I should do some more projects with Arduino first. Every time I do, I find some new electronics fundamental I didnt understand as well as I thought, or find some habit that will probably bite me when I get into the really low level stuff. So I think we have to stay with Arduino for a while longer.</p>
<!--
-- tags
INFO Validating config
INFO Start processing
Name Posts Path
No tags.
---------------
-- categories
INFO Validating config
INFO Start processing
Name Posts
Books 14
Current Events 5
Current Events 0
Faith 6
History 1
Leadership 8
Liberal Education 1
Outdoors 1
Philosophy 5
Philosophy 0
Technology 12
technology 0
--!>
</div>
<div>
</div>
</article>
<div class="nav">
<div class="nav-item-next">
<a
href="/2026/05/30/Devlog-20260530/"
class="nav-link">
<div>
<div class="nav-label">Next</div>
<div class="nav-title">Devlog Entry - 30 May 2026 </div>
</div>
<i class="iconfont icon-right nav-next-icon"></i>
</a>
</div>
</div>
<div
class="card card-content toc-card"
id="mobiletoc">
<div class="toc-header">
<i
class="iconfont icon-menu"
style="padding-right: 2px;">
</i>TOC
</div>
<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#libakgl-updates"><span class="toc-text">libakgl updates</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#libakerror-new-error-type"><span class="toc-text">libakerror new error type</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#ESP32-Projects"><span class="toc-text">ESP32 Projects</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Using-Analog-to-Digital-Converters-Potentiometers-and-Capacitive-Touch-Sensors"><span class="toc-text">Using Analog to Digital Converters, Potentiometers and Capacitive Touch Sensors</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Photoresistors-and-Voltage-Dividers"><span class="toc-text">Photoresistors and Voltage Dividers</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Joystick-and-WS2812-LED-demo"><span class="toc-text">Joystick and WS2812 LED demo</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Closing-Thoughts"><span class="toc-text">Closing Thoughts</span></a></li></ol>
</div>
</main>
<aside class="right-column">
<div class="sticky-widescreen">
<article class="card card-content toc-card">
<div class="toc-header">
<i
class="iconfont icon-menu"
style="padding-right: 2px;">
</i>TOC
</div>
<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#libakgl-updates"><span class="toc-text">libakgl updates</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#libakerror-new-error-type"><span class="toc-text">libakerror new error type</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#ESP32-Projects"><span class="toc-text">ESP32 Projects</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Using-Analog-to-Digital-Converters-Potentiometers-and-Capacitive-Touch-Sensors"><span class="toc-text">Using Analog to Digital Converters, Potentiometers and Capacitive Touch Sensors</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Photoresistors-and-Voltage-Dividers"><span class="toc-text">Photoresistors and Voltage Dividers</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Joystick-and-WS2812-LED-demo"><span class="toc-text">Joystick and WS2812 LED demo</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Closing-Thoughts"><span class="toc-text">Closing Thoughts</span></a></li></ol>
</article>
<article class="card card-content">
<div class="recent-posts-card">
<div class="recent-posts-header">
<i
class="iconfont icon-wenzhang_huaban"
style="padding-right: 2px;">
</i>Recent Posts
</div>
<div class="recent-posts-list">
<div class="recent-posts-item">
<div class="recent-posts-item-title">2026-06-08</div>
<a href="/2026/06/08/Devlog-20260608/"><div class="recent-posts-item-content">Devlog Entry - 8 June 2026</div></a>
</div>
<div class="recent-posts-item">
<div class="recent-posts-item-title">2026-05-30</div>
<a href="/2026/05/30/Devlog-20260530/"><div class="recent-posts-item-content">Devlog Entry - 30 May 2026</div></a>
</div>
<div class="recent-posts-item">
<div class="recent-posts-item-title">2026-05-15</div>
<a href="/2026/05/15/Devlog-20260518/"><div class="recent-posts-item-content">Devlog Entry - 18 May 2026</div></a>
</div>
<div class="recent-posts-item">
<div class="recent-posts-item-title">2026-02-23</div>
<a href="/2026/02/23/Why-Firefighting/"><div class="recent-posts-item-content">Why Firefighting</div></a>
</div>
</div>
</div>
</article>
</div>
</aside>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="footer-container">
<div>
<div class="footer-dsc">
<span>
Copyright ©
-
2026
</span>
&nbsp;
<a
href="mailto:andrew@aklabs.net"
class="footer-link">
Andrew Kesterson
</a>
<br/>
</div>
</div>
<div class="footer-dsc">
Powered by
<a
href="https://hexo.io/"
class="footer-link"
target="_blank"
rel="nofollow noopener noreferrer">
&nbsp;Hexo
</a>
<span>&nbsp;|&nbsp;</span>
Theme -
<a
href="https://github.com/theme-kaze"
class="footer-link"
target="_blank"
rel="nofollow noopener noreferrer">
&nbsp;Kaze
</a>
</div>
</footer>
<a
role="button"
id="scrollbutton"
class="basebutton"
aria-label="回到顶部">
<i class="iconfont icon-arrowleft button-icon"></i>
</a>
<a
role="button"
id="menubutton"
aria-label="menu button"
class="basebutton">
<i class="iconfont icon-menu button-icon"></i>
</a>
<a
role="button"
id="popbutton"
class="basebutton"
aria-label="控制中心">
<i class="iconfont icon-expand button-icon"></i>
</a>
<a
role="button"
id="darkbutton"
class="basebutton darkwidget"
aria-label="夜色模式">
<i class="iconfont icon-weather button-icon"></i>
</a>
<a
role="button"
id="searchbutton"
class="basebutton searchwidget"
aria-label="搜索">
<i class="iconfont icon-search button-icon"></i>
</a>
<script>
var addImgLayout = function () {
var img = document.querySelectorAll('.post-content img')
var i
for (i = 0; i < img.length; i++) {
var wrapper = document.createElement('a')
wrapper.setAttribute('href', img[i].getAttribute('data-src'))
wrapper.setAttribute('aria-label', 'illustration')
wrapper.style.cssText =
'width: 100%; display: flex; justify-content: center;'
if (img[i].alt) wrapper.dataset.caption = img[i].alt
wrapper.dataset.nolink = true
img[i].before(wrapper)
wrapper.append(img[i])
var divWrap = document.createElement('div')
divWrap.classList.add('gallery')
wrapper.before(divWrap)
divWrap.append(wrapper)
}
baguetteBox.run('.gallery')
}
</script>
<script>
loadScript(
"/js/lib/lightbox/baguetteBox.min.js",
addImgLayout
)
</script>
<script src="/js/main.js"></script>
<script>
var addLazyload = function () {
var observer = lozad('.lozad', {
load: function (el) {
el.srcset = el.getAttribute('data-src')
},
loaded: function (el) {
el.classList.add('loaded')
},
})
observer.observe()
}
</script>
<script>
loadScript('/js/lib/lozad.min.js', addLazyload)
</script>
<script src="//instant.page/5.1.0" type="module"
integrity="sha384-by67kQnR+pyfy8yWP4kPO12fHKRLHZPfEsiSXR8u2IKcTdxD805MGUXBzVPnkLHw"></script>
<script>
var googleAnalytics = function () {
window.dataLayer = window.dataLayer || []
function gtag() {
dataLayer.push(arguments)
}
gtag('js', new Date())
gtag('config', 'G-S3YLF516N6')
}
</script>
<script>
loadScript(
'https://www.googletagmanager.com/gtag/js?id=' +
'G-S3YLF516N6',
googleAnalytics
)
</script>
</body>
</html>