Shallow Thoughts : : Apr

Akkana's Musings on Open Source Computing and Technology, Science, and Nature.

Thu, 30 Apr 2026

How to Re-initialize a Stuck ESP32 (in CircuitPython)

I designed my particulate air quality sensor project around Adafruit's PyPortal. It uses a ESP32 coprocessor for networking.

Unfortunately, the ESP32 is a little flaky. It tends to lose track of the network after an hour or so:

ESP32 not responding
Traceback (most recent call last):
  File "code.py", line 182, in 
  File "adafruit_requests.py", line 725, in post
  File "adafruit_requests.py", line 649, in request
  File "adafruit_connection_manager.py", line 331, in get_socket
  File "adafruit_connection_manager.py", line 248, in _get_connected_socket
  File "adafruit_connection_manager.py", line 61, in connect
  File "adafruit_esp32spi/adafruit_esp32spi_socketpool.py", line 114, in connect
  File "adafruit_esp32spi/adafruit_esp32spi.py", line 899, in socket_connect
  File "adafruit_esp32spi/adafruit_esp32spi.py", line 801, in socket_open
  File "adafruit_esp32spi/adafruit_esp32spi.py", line 422, in _send_command_get_response
  File "adafruit_esp32spi/adafruit_esp32spi.py", line 378, in _wait_response_cmd
  File "adafruit_esp32spi/adafruit_esp32spi.py", line 292, in _wait_for_ready
TimeoutError: ESP32 not responding

I tried re-initializing the network, but it didn't help: re-initializing always died with Timed out waiting for SPI char and SCK in use.

There are lots of people asking about this on the net, but I couldn't find a discussion that actually had a solution for how to re-initialize a stuck ESP32. So I asked Claude. I know, AI, eww ... but Claude seems to have access to CircuitPython code and discussions that Google doesn't index, so sometimes it's the best way to find out how to solve CircuitPython problems. It took a couple of iterations (each requiring a few hours of testing, since it typically takes an hour or so before the network stops working), but we got there. Here's what seems to work for me.

Read more ...

Tags: ,
[ 10:10 Apr 30, 2026    More hardware | permalink to this entry | ]

Fri, 17 Apr 2026

Particular: A Particulate Air Quality Sensor

We're thinking about replacing our ancient fireplace with a modern wood stove. There are lots of reasons, but one is that the house smells smoky when we use the fireplace (which is pretty much every night in winter), and I can't help wondering what all that smoke is doing to my lungs.

Dave insists that the smoke all gets sucked up the chimney and I shouldn't worry about it. I tried to look it up, but it seems like there's hardly any published research on that (or maybe I was just choosing the wrong search terms).

[a boxy blue air quality sensor in a crate made out of popsicle sticks, with a microcontroller with screen on top] But why not actually measure it? I've occasionally wanted a particulate matter sensor anyway; we get a lot of wildfire smoke here in New Mexico most summers (sometimes from local fires, sometimes from as far away as California or Canada) and sometimes the air quality can get pretty bad.

Of course you can buy ready-to-go air quality sensors. But what's the fun in that, when you can make your own for about half the price? (If you don't count the value of your time, that is.)

Read more ...

Tags: , ,
[ 15:09 Apr 17, 2026    More hardware | permalink to this entry | ]

Mon, 06 Apr 2026

Blacklisting a Module in the Linux Kernel (in 2026)

As part of a quest to disable the HDMI audio devices that Linux's audio system pipewire is so fond of (about which, more in a separate article), I got the bright idea of blacklisting the snd_hda_codec_hdmi kernel module. (Don't do that; it isn't a good solution because it breaks other things.)

But at least along the way I learned how to blacklist kernel modules, which isn't as simple as the net might make you think.

Read more ...

Tags: ,
[ 11:40 Apr 06, 2026    More linux/kernel | permalink to this entry | ]