<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Qihao Makes</title><link>https://qihao.dev/en/</link><description>Qihao&apos;s maker journal about learning 3D printing, electronics, and product building from scratch.</description><language>en</language><atom:link href="https://qihao.dev/en/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Mon, 14 Sep 2026 00:00:00 GMT</lastBuildDate><item><title>Why the Same Text Shouldn&apos;t Generate Another MP3: Separating Audio Assets from Playback Jobs</title><link>https://qihao.dev/en/blog/tts-audio-assets-playback-jobs-cache/</link><guid isPermaLink="true">https://qihao.dev/en/blog/tts-audio-assets-playback-jobs-cache/</guid><description>The local voice platform originally called TTS again whenever the same text was sent, creating a duplicate MP3. Starting with that real duplicate-file problem, this article explains why audio assets and playback jobs should be separate, and how cache keys, history playback, resending, and legacy database migration fit together.</description><dc:creator>Qihao</dc:creator><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate><category>Concept primer</category><category>TTS</category><category>Audio caching</category><category>Data modeling</category><category>ESP32</category><category>Voice platform</category><category>SHA-256</category></item><item><title>ESP32-S3 AI Voice Conversation Prototype</title><link>https://qihao.dev/en/works/001-esp32-s3-ai-voice-conversation-prototype/</link><guid isPermaLink="true">https://qihao.dev/en/works/001-esp32-s3-ai-voice-conversation-prototype/</guid><description>Building a button-triggered AI voice conversation prototype that records the user&apos;s voice, sends it to a server for language-model processing, and plays the spoken response through the device&apos;s speaker.</description><dc:creator>Qihao</dc:creator><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><category>AI Hardware</category><category>ESP32-S3</category><category>AI Voice Conversation</category><category>Voice Interaction</category><category>Hardware Prototype</category></item><item><title>Type Text in a Browser, Hear It from an ESP32 Speaker: Testing a Local TTS Playback Pipeline</title><link>https://qihao.dev/en/blog/esp32-web-text-to-speech-local-voice-platform/</link><guid isPermaLink="true">https://qihao.dev/en/blog/esp32-web-text-to-speech-local-voice-platform/</guid><description>I moved the ESP32-S3 from playing audio embedded in firmware to speaking text entered dynamically in a browser. This article documents the working path from the web UI through local TTS and a task queue to the ESP32, MAX98357A, and speaker—and clearly marks the voice-input work that remains.</description><dc:creator>Qihao</dc:creator><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate><category>Project progress</category><category>ESP32-S3</category><category>MAX98357A</category><category>Text-to-speech</category><category>FastAPI</category><category>I²S</category><category>Voice bot</category></item><item><title>ESP32-S3 + MAX98357A Wiring: Play Voice Through a 4Ω/3W Speaker</title><link>https://qihao.dev/en/blog/esp32-s3-max98357a-speaker-wiring-voice-playback/</link><guid isPermaLink="true">https://qihao.dev/en/blog/esp32-s3-max98357a-speaker-wiring-voice-playback/</guid><description>A hands-on ESP32-S3 voice playback build: adapt a two-pin speaker connector to the MAX98357A screw terminal, complete the five-wire I²S connection, and verify the audio output with three test tones and five web-generated voice clips.</description><dc:creator>Qihao</dc:creator><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><category>Problem solved</category><category>ESP32-S3</category><category>MAX98357A</category><category>I²S</category><category>Speaker</category><category>Audio playback</category></item><item><title>From a bag of components to first light: soldering my first complete circuit board</title><link>https://qihao.dev/en/blog/first-complete-circuit-board-electronic-dice/</link><guid isPermaLink="true">https://qihao.dev/en/blog/first-complete-circuit-board-electronic-dice/</guid><description>To practice soldering while ending up with something usable, I chose a YCA2109 electronic dice practice board. This article records how I started with a bare board and a bag of components, spent about five or six hours assembling, soldering, and troubleshooting it, and finally got the LEDs to light briefly.</description><dc:creator>Qihao</dc:creator><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><category>Growth Story</category><category>Soldering Basics</category><category>Electronic Dice</category><category>Circuit Board</category><category>Hardware Practice</category><category>Beginner</category></item><item><title>YCA2109 Electronic Dice Not Lighting Up and Chip Heating When Powered: Troubleshooting Process After Two DIP Chips Were Installed in Reverse</title><link>https://qihao.dev/en/blog/yca2109-electronic-dice-no-light-hot-ic-reversed/</link><guid isPermaLink="true">https://qihao.dev/en/blog/yca2109-electronic-dice-no-light-hot-ic-reversed/</guid><description>A freshly soldered YCA2109 electronic dice had all LEDs unlit when powered; the voltage after connecting the battery holder to the circuit board was only about 2.2V, and the two chips became noticeably hot after about 10 minutes. This article documents how I worked through the power supply, button, multimeter range, and input diode step by step, eventually finding that the two DIP chips were in the wrong orientation; after flipping them, the electronic dice resumed operation and could randomly stop on different numbers.</description><dc:creator>Qihao</dc:creator><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><category>Problem solved</category><category>YCA2109</category><category>Electronic dice</category><category>DIP chip</category><category>Hardware troubleshooting</category><category>Multimeter</category></item><item><title>ESP32 with an ST7789 screen: what do the 7 wires each do?</title><link>https://qihao.dev/en/blog/esp32-st7789-seven-wire-pin-functions/</link><guid isPermaLink="true">https://qihao.dev/en/blog/esp32-st7789-seven-wire-pin-functions/</guid><description>When I first connected the GMT130-V1.0, I could only follow the wiring table. This article groups VCC, GND, BLK, RES, SCK, SDA, and DC into four categories, and walks along the complete display chain to explain how they turn ESP32 code into a visible image, and how to safely re-plan the wiring once you understand it.</description><dc:creator>Qihao</dc:creator><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><category>Concept primer</category><category>ESP32-S3</category><category>ST7789</category><category>GMT130-V1.0</category><category>SPI</category><category>Hardware basics</category></item><item><title>ST7789 Backlight but No Image: GMT130-V1.0 Works After Switching from SPI_MODE0 to MODE3</title><link>https://qihao.dev/en/blog/st7789-gmt130-spi-mode3-black-screen-fix/</link><guid isPermaLink="true">https://qihao.dev/en/blog/st7789-gmt130-spi-mode3-black-screen-fix/</guid><description>A GMT130-V1.0 had a working backlight but never displayed a single pixel, even though the driver chip and resolution were correct. This article retraces how I moved from a black screen on software SPI Mode 0 to hardware SPI that actually applies SPI_MODE3, then verified the fix with a five-color loop and a power-cycle test.</description><dc:creator>Qihao</dc:creator><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><category>Problem solved</category><category>ESP32-S3</category><category>ST7789</category><category>GMT130-V1.0</category><category>SPI</category><category>Hardware Debugging</category></item><item><title>Colored artifact lines at the edge of an ST7735 screen: How to choose between INITR_BLACKTAB and GREENTAB</title><link>https://qihao.dev/en/blog/st7735-colored-edge-lines-blacktab-greentab/</link><guid isPermaLink="true">https://qihao.dev/en/blog/st7735-colored-edge-lines-blacktab-greentab/</guid><description>A 1.8-inch 128×160 ST7735 can already display the main content, but fixed colored lines remain on the right and bottom. This article uses a single-variable hands-on test to show how to identify initialization parameter mismatch from image offset, and verifies whether INITR_GREENTAB fits the current panel.</description><dc:creator>Qihao</dc:creator><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><category>Problem solved</category><category>ESP32-S3</category><category>ST7735</category><category>Arduino</category><category>TFT display</category><category>Hardware troubleshooting</category></item><item><title>AI gave me a shopping list, but I spent a day buying parts.</title><link>https://qihao.dev/en/blog/ai-shopping-list-hardware-parts/</link><guid isPermaLink="true">https://qihao.dev/en/blog/ai-shopping-list-hardware-parts/</guid><description>I thought that once I bought all the components for the ESP32-S3, I could just wire them up and debug; it was only when the microphone lacked soldered pins and the speaker terminal couldn&apos;t match that I understood AI can speed up problem-solving but cannot replace the foundation and judgment formed through practice.</description><dc:creator>Qihao</dc:creator><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate><category>Growth Story</category><category>AI Learning</category><category>ESP32-S3</category><category>Hardware Basics</category><category>Practice Notes</category></item><item><title>The tutorial made sense, but my first solder joint still ended up as a blob.</title><link>https://qihao.dev/en/blog/first-soldering-inmp441-failure/</link><guid isPermaLink="true">https://qihao.dev/en/blog/first-soldering-inmp441-failure/</guid><description>For my first time soldering pins onto an INMP441, I skipped the practice board and went straight to the real thing. Twenty minutes later, I had six oddly shaped solder joints. This failure taught me: tutorials and AI can teach knowledge, but hands-on skill only grows from practice.</description><dc:creator>Qihao</dc:creator><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><category>Growth Story</category><category>ESP32-S3</category><category>INMP441</category><category>First Soldering</category><category>Hardware Learning</category><category>AI-Assisted Learning</category></item></channel></rss>