Articles

Practical articles, tutorials, and deep dives on embedded systems development — covering Arduino, ESP32, Nordic SoCs, Zephyr RTOS, firmware updates, and real-world hardware projects.

What is TinyML and Why it Matters for Resource-Constrained Devices

TinyML is revolutionizing the way we think about artificial intelligence at the edge. Unlike traditional machine learning models that demand significant computational power, memory, and energy, TinyML focuses on running intelligent algorithms directly on resource-constrained devices—devices with less than 100 KB of RAM and power budgets under 50 mW. This breakthrough enables everyday gadgets like wearable health monitors, industrial sensors, and autonomous drones to make smart decisions locally, without relying on cloud connectivity. By bringing AI closer to the source of data, TinyML not only reduces latency and energy consumption but also enhances privacy and reliability, opening up a new frontier for real-time, on-device intelligence in the most constrained environments.

Read more 6 min read

Why OTA for ESP32 Is Still Too Hard — and What I'm Building to Fix It

Over-the-air (OTA) firmware updates are critical for modern embedded devices, but implementing a secure, automated OTA system on the ESP32 is still more complex than it should be. In this post, I break down the current state of OTA for ESP32, common pain points with existing solutions, and why I’m building an open-source, developer-friendly OTA update system with CI/CD support, firmware signing, and a lightweight OTA agent.

Read more 4 min read

Integrating Git into Your PlatformIO Workflow for Version Control

Version control is no longer just for large software teams—it's a vital tool for anyone building embedded projects with PlatformIO. In this guide, you'll learn how to integrate Git into your PlatformIO workflow to manage code changes, isolate new features, and track firmware releases with precision. From setting up a clean .gitignore to using branches effectively and tagging stable builds, this post walks you through a professional development process tailored for Arduino projects. Whether you're a solo tinkerer or preparing for collaboration, Git will help you write better code and recover faster when things go wrong.

Read more 8 min read

Creating and Managing Custom Board Definitions in PlatformIO

PlatformIO supports hundreds of official development boards out of the box, but what if you're working with a lesser-known Arduino clone or a custom-designed board? In this post, we’ll walk through how to create and manage custom board definitions in PlatformIO using VS Code. You’ll learn how to define board-specific settings like MCU type, upload speed, and memory layout so you can fully integrate unsupported boards into your PlatformIO workflow. Whether you’re building with a cheap ATmega328P-based board from AliExpress or your own PCB design, this guide will help you make it behave like a first-class citizen in PlatformIO.

Read more 6 min read

Organizing Multi-File Projects in PlatformIO: Best Practices for Scalability

As embedded projects grow beyond a few hundred lines of code, managing a single main.cpp file becomes a recipe for confusion and bugs. PlatformIO offers a powerful and flexible structure that supports professional development workflows—but only if used effectively. This article explores best practices for organizing multi-file PlatformIO projects, focusing on clean modular design, proper use of src/ and include/, header file management, and long-term scalability. Whether you're refactoring a messy prototype or starting a new embedded system from scratch, a well-organized project layout is key to building reliable, maintainable firmware.

Read more 8 min read

Mastering C++ for Embedded Systems with STM32: Sending Hello World over UART Using PlatformIO

This tutorial introduces modern C++ techniques in embedded development using an STM32 microcontroller and PlatformIO. You'll learn how to send Hello World over UART while applying essential C++ features such as classes, constructors, const, volatile, namespaces, and more. By encapsulating hardware access in a UART class, you'll build cleaner, safer, and more maintainable firmware — all without relying on dynamic memory allocation. Perfect for embedded developers looking to level up their C++ skills and structure their code more effectively.

Read more 8 min read

Refactoring Arduino Sketches into Clean C++ Projects with PlatformIO

Refactoring your Arduino `.ino` sketches into clean C++ modules makes your projects easier to maintain, scale, and reuse. In this guide, learn how to transform a single-file sketch into a structured PlatformIO project using .cpp and .h files, and discover how this modern workflow can make your code more robust and professional.

Read more 5 min read

Writing Testable Code and Running Tests Before Flashing with PlatformIO’s Built-In Framework

PlatformIO isn’t just about flashing firmware to your Arduino or ESP32 board—it’s also a complete development ecosystem that supports writing unit tests, running them locally, and keeping your embedded projects robust and maintainable. In this post, we’ll explore how to write testable code and run tests using PlatformIO’s built-in testing framework, all before the code ever reaches your hardware.

Read more 4 min read

Debugging Arduino Code with PlatformIO

Learn practical, real-world techniques for debugging your Arduino sketches using PlatformIO—whether you only have your board and a USB cable, or you decide to explore optional hardware debuggers. Discover why the Serial Monitor remains the most powerful tool, how to use LEDs and code structure to your advantage, and what changes when you step into the world of hardware debugging.

Read more 6 min read

Managing Arduino Libraries in PlatformIO

Adding Arduino libraries by copying ZIP files can quickly become messy and hard to maintain. PlatformIO makes this process simpler and more reliable with lib_deps: declare your libraries once in the platformio.ini file, and PlatformIO handles installation, updates, and versioning automatically. This post explains how to add libraries using the VS Code extension or manually, and includes an example of displaying text on an OLED screen using the Adafruit SSD1306 library — all without manual copying or hidden dependencies.

Read more 3 min read

PlatformIO Project Structure Explained for Arduino Users

Moving beyond Arduino’s single `.ino` sketch, PlatformIO introduces a structured project layout designed for scalability and professional development. This post explores what each folder means — from `src/` for your main source code, `lib/` for private libraries, and `include/` for shared headers, to the powerful `platformio.ini` configuration file. Learn how this structure helps organize larger projects, simplifies dependency management, and makes your builds reproducible — and see why many Arduino users find it worth the switch.

Read more 5 min read

Toggling LEDs with Buttons Using STM32 and C++

Learn how to build a classic embedded project — toggling an LED with a push button — while introducing key C++ concepts like classes, constructors, and encapsulation. This beginner-friendly guide uses STM32 HAL with PlatformIO and Visual Studio Code, showing how to organize low-level hardware control into clean, reusable C++ classes for better maintainability.

Read more 5 min read