John Romkey
S06:E50

John Romkey

Episode description

John Romkey joins the show and shares his CircuitPython tool, circremote, what it does, how it works, how he used Cursor and Claude to help write it, and more.

Follow the show on Mastodon or Bluesky.

Show Notes

00:00 Intro

00:56 John’s start with computers and electronics

6:25 circremote

9:21 circremote clean and emacs support

12:22 circremote’s sensor support and AI

14:23 Cursor with VS Code and Claude

19:27 Sensor and device support in circremote

21:32 Community sensor work

26:16 Which board?

Download transcript (.srt)
0:01

Welcome to the CircuitPython Show. I'm your host, Paul Cutler. This episode I welcome

0:06

John Romkey. John is a computer scientist, software architect, and long-time internet

0:11

engineer who's been building and breaking networks since the early days of TCP/IP. John

0:16

demonstrated one of the earliest Internet of Things devices, the Internet Toaster, controlled

0:21

via SNMP in 1993 along with Simon Hackett. John currently works with microcontrollers,

0:26

sensors, home automation, and full stack systems,

0:29

with occasional detours into PCB design and development.

0:32

John currently works with microcontrollers, sensors,

0:35

home automation, and full stack systems,

0:37

with occasional detours into PCB design and development.

0:41

He enjoys programming in CircuitPython, Python, Ruby, C,

0:44

and C++, and working with Docker

0:47

and similar technologies for backend work.

0:50

John, welcome to the show.

0:52

- Hi, thank you very much.

0:54

I'm very happy to be here.

0:55

Thanks for inviting me.

0:56

- How did you first get started

0:58

with computers and electronics?

1:00

- When I was a teenager, I got bitten by a radioactive chip.

1:05

No, I was a really bored teenager in rural Maine

1:08

in the late '70s, and the kind of thing

1:12

that you would do at that point,

1:14

some of us, the nerds, would hang out at Radio Shack.

1:17

And Radio Shack in those days, when it existed,

1:21

that was like the golden age of Radio Shack.

1:23

And there was like, it was like electronics.

1:26

It was almost like you walked into a 70s version

1:30

of Adafruit in a store in a mall.

1:33

I had a lot of exposure to electronics there

1:36

and components and early personal computers.

1:41

We were not a well-off family,

1:43

but somehow my father managed to afford a TRS-80 for me.

1:47

And that pretty much changed my life.

1:50

And so between that and the access to electronics

1:55

at Radio Shack, that kinda got me into that.

1:59

At the time, we didn't have,

2:02

if you wanted to program, write programs on a TRS-80,

2:04

you wrote programs in Assembler,

2:07

which was, or BASIC, I'm sorry, BASIC,

2:10

which was not a lot better than Assembler, really.

2:13

And it was very, very low resource machine.

2:16

Like your baseline TRS-80 would have 4K

2:20

memory. So, you know, going from there to like decades later and writing software for

2:27

Arduinos and ESP 32s, it really takes me back there. Although we have such better tools

2:35

for working in software these days, you know, and CircuitPython is a great example of that.

2:41

CircuitPython, you couldn't even have imagined something like CircuitPython back then. But

2:50

hung out at Radio Shack.

2:53

- How did you discover CircuitPython?

2:56

- I mean, through Adafruit.

2:59

I got involved in doing work with ESP32s,

3:03

or the ESP8266 at first,

3:05

and looking for resources and looking for more hardware

3:10

to work with, Adafruit was right there.

3:13

And Adafruit does such an amazing job

3:15

at fostering community,

3:17

and also doing open-source hardware and software,

3:20

which is very important to me.

3:22

I was very drawn to Adafruit.

3:25

Anyway, if you spend any time poking around Adafruit

3:28

and looking at what Adafruit offers,

3:30

Adafruit's put so much resources into CircuitPython.

3:34

And I've done a lot of work writing C software.

3:38

And I love C.

3:40

C is better than programming in Assembler,

3:43

but it's like right next to it, really.

3:46

And it's so easy to shoot yourself in the foot in C.

3:51

You just like misjudge the length of your array

3:55

and suddenly you've written over your stack

3:58

and what happens when you return, who knows?

4:02

And your program just explodes in new and exciting ways,

4:05

which are really difficult to debug

4:07

'cause you're not on a full-fledged computer,

4:10

you're on some tiny microcontroller.

4:12

And CircuitPython just protects you from all of that.

4:16

and lets you write code in a civilized way.

4:20

For all the power that C gives you,

4:23

when you start just manipulating strings,

4:25

you're in a world of hurt,

4:26

and especially on these kinds of microcontrollers.

4:30

And if you're doing anything,

4:32

like say you're doing a web server,

4:34

which you can totally do in C, in Arduino,

4:38

on an ESP32, or anyway, if you're doing that,

4:43

you're doing a lot of string manipulation,

4:45

And this is just not something that C is very inviting to

4:50

or supportive of.

4:51

C++, better.

4:53

But CircuitPython's just got your back.

4:56

CircuitPython just makes it really easy,

4:59

especially since CircuitPython started supporting

5:01

f-strings in Python,

5:03

where you can just interpolate values in it.

5:06

It's just, it's so much more relaxing to program

5:10

in CircuitPython than it is in C.

5:13

I know that some people get uptight

5:16

about the overhead of CircuitPython.

5:18

You know, CircuitPython has less memory available.

5:21

CircuitPython is interpreted,

5:23

it's much slower doing some operations than C is.

5:27

It's actually shockingly fast for some things.

5:29

But I think they lose track of the fact

5:31

that your average program just doesn't need

5:34

that level of performance.

5:36

Yeah, if you're writing something on an ESP32,

5:39

I keep coming back to that

5:40

because that's the chip that I use the most.

5:43

But if you're writing something on an ESP32

5:45

that's very graphics intensive,

5:47

like maybe you're writing some game or something

5:50

that really pushes what you can do on an ESP32,

5:54

then sure, you're probably not gonna write that

5:56

in CircuitPython.

5:57

But most people just write code that's like a simple loop

6:01

and it's just reading some sensors

6:03

or controlling some servos or something like that,

6:07

or serving a webpage,

6:10

and it's actually not even touching,

6:13

getting close to the limits of the ESP32.

6:16

And CircuitPython is great for that.

6:19

There's plenty of capacity, plenty of resources.

6:22

And anyway, it's a great tool for a lot of applications.

6:25

- Speaking of tools, you've written a tool

6:27

for CircuitPython called circremote.

6:30

Tell me more about it and how it works.

6:33

- circremote basically will send a chunk of code

6:36

to CircuitPython, either over a serial port over USB,

6:41

or if you have a device, which I believe only ESP32s

6:46

do this currently, a device that supports the web workflow

6:50

so that you could connect to it over Wi-Fi or Ethernet.

6:55

If you have that kind of device,

6:57

then it can do it over the network.

6:59

So it doesn't have to be directly connected

7:01

to your computer.

7:02

So I do a lot of work with sensors

7:05

and I've been building some of my own PCBs with sensors.

7:10

Adafruits are fine,

7:11

but sometimes I just want something a little different.

7:14

Also, it's fun, honestly.

7:16

It's just fun, and it's a nice stretch.

7:19

There's a lot of stuff that I end up running frequently,

7:23

like an IDC scanner,

7:26

because most of the sensors that I connect are over IDC.

7:30

I'm using STEM-QT for the hardware connection,

7:34

which is awesome.

7:35

It makes prototyping so quick and easy.

7:39

But I am so tired of finding the IDC scanner code

7:43

for CircuitPython and copying and pasting it in.

7:46

And so I figured I'll write a utility

7:48

that will just keep track of this for me

7:51

and then send it to the device,

7:54

whether it's over Wi-Fi or whether it's over USB.

7:58

And once I started doing that,

8:00

having drivers for the different kinds of chips that I use

8:04

was the next step to do.

8:06

And so I decided to, of course,

8:09

make it way more complicated

8:11

and add way more functionality to it,

8:13

and just came up with this general concept of a command,

8:17

which is the code that you send over

8:19

and let it organize the commands and keep track of them,

8:23

added the ability to have multiple paths

8:27

to search for the commands.

8:28

So it comes with,

8:30

I think there's over a hundred things built in currently,

8:33

And they're not all things for sensors.

8:37

There are a lot of sensors it supports,

8:38

like temperature sensors, light sensors, things like that.

8:42

But also there are some utilities,

8:45

like list the files that are on the flash drive.

8:48

One of the utilities that I added enables web workflow.

8:51

And so it takes the credentials for your Wi-Fi

8:55

and the other information that you need

8:56

to set up web workflow,

8:58

and then just creates the settings.toml file on the device.

9:03

Another one just resets it.

9:04

You know, I got tired of typing import microcontroller,

9:07

microcontroller reset.

9:09

Another one puts it in UF2 bootloader mode.

9:12

Another one can just display the contents of an arbitrary file on it.

9:16

Oh, this is one, this is one that I really enjoyed and it's a little OCD.

9:21

Like I use a Mac and I love, I love Apple mostly until they release major

9:26

operating system updates and break everything.

9:29

But one of the things they do when a Mac is writing to a flash drive

9:34

with a DOS file system on it, like CircuitPython very reasonably uses,

9:39

it's the right choice.

9:41

One of the things they do is they just put all this trash on the drive,

9:45

all these random little files,

9:47

and these are keeping track of Mac-specific metadata

9:51

or indexing for Spotlight, which is the Mac's search system.

9:55

And it turns out Apple's not the only one.

9:57

Windows does something similar.

9:59

I use an editor that I would never recommend

10:02

that anybody use called Emacs, which is ancient.

10:05

I've used it for decades.

10:07

It's basically built into my fingers at this point.

10:10

And it's very hard for me to switch to a different editor.

10:13

Emacs leaves trash all over the place.

10:15

It leaves copies of files and checkpoints

10:18

of files and things.

10:19

And so this doesn't really take up all that much space

10:23

because most of these files are tiny.

10:25

But there's just all this crap on your drive,

10:28

on your CircuitPython drive.

10:30

There's a utility to remove the crap, it decraps it.

10:34

I think it's actually called clean, not decrap,

10:37

although that might've been a better choice for the name.

10:40

So anyway, the point is there's a bunch of utilities there too

10:43

and at this point I'm using it on an almost daily basis.

10:48

There's stuff that I'm doing all the time.

10:50

I've actually have, in my office,

10:53

I have a LED matrix sign that I've built using

10:58

Adafruit's matrix portal S3.

11:01

That's another project that someday I'll try to get

11:04

to a point where it's actually really releasable

11:07

so that other people could use it.

11:08

But one of the things with it is it's quite bright

11:12

and at night I would like to turn it off

11:14

and I haven't actually added an off function to it yet.

11:18

So what I do right now is I have a thing that runs

11:21

every night on my Mac, which just uses Cirq Remote

11:25

in an automated way to poke the sign

11:28

and just, I added a stop command.

11:30

And all that does is it's just a loop

11:32

that's like while true, pass.

11:36

And then in the morning, I have another one

11:38

that does a reset to it.

11:40

And so the sign goes off at night

11:43

and it comes back on in the morning and I'm happy

11:45

and I didn't actually have to fix the code

11:48

and the sign to do the right thing.

11:50

So it's been really helpful to me

11:53

and I hope it's something that may be helpful

11:55

to other folks too.

11:56

- You'll be happy to know that you're not

11:57

the only Emacs user.

11:58

todbot is a big Emacs user as well.

12:01

- Yes, I'm not the final Emacs user in the world.

12:07

Sometimes people ask me like, "What editor do you use?

12:10

"I wanna use the editor you use."

12:11

And I'm like, "No, no, you do not wanna use

12:14

"the editor that I use.

12:15

"You should use something modern.

12:16

"You should probably use VS Code or something like that.

12:20

Don't do that to yourself.

12:22

Cirq Remote supports dozens of sensors.

12:24

I plugged in a DPS 310 barometric and temperature sensor, ran Cirq Remote /dev/ttty/dps310

12:34

and it installed the dependencies.

12:36

And then I ran it again, and it spit out the temperature, pressure and altitude settings without me having to write any code.

12:42

How are you able to support so many sensors in Cirq Remote?

12:46

I cheated.

12:48

So it's not really a cheat, but some people think it is.

12:52

I actually had an AI write most of Cirq Remote and I have no illusions about this.

12:59

I've been writing software since the late seventies.

13:03

I've been pretty dubious about LLMs writing code.

13:07

They've come a long way since just, you know, a year ago, even six months ago.

13:12

I have to say that the rate of improvement and progress in LLMs is just stunning compared

13:22

to other things that I've seen over the course of my life.

13:26

So I could write most of Cirq Remote myself.

13:30

I kind of didn't feel like it, and I was curious to do an experiment.

13:34

The one part that I would have had some trouble with would have been the web workflow.

13:38

to the device over serial over USB, not a big deal. The web workflow uses web sockets and I

13:46

know how web sockets work and I've worked with them a bunch, but I've never programmed them in

13:51

Python. And so just to be clear for folks, Cirq Remote itself is a CPython program. It's a Python

13:59

program that runs on a Mac, on Linux, on Windows. Cirq Remote itself doesn't run on the device and

14:06

isn't CircuitPython. What it does, though, is have a library of commands written in CircuitPython,

14:13

which it then sends to the device. So we've kind of got these two dialects of Python going on there,

14:19

but Cirq Remote doesn't execute the CircuitPython itself. So I decided, why not take a shot at this?

14:28

Let's see what happens if I try to have an LLM write this for me. And at that time, I have a

14:34

a good friend, Elena Hardy, who has been doing a lot of work

14:38

using Cursor.

14:40

And Cursor is a front end that works with VS Code.

14:45

And it turns out there's a GC-EMACS compatibility

14:48

mode for VS Code.

14:49

And it actually is really good.

14:51

And so that worked really nicely for me.

14:54

Thank you, whoever wrote that.

14:55

I am so grateful to you, or your AI,

14:58

or whatever wrote that for you.

15:01

And so Cursor can work with a variety of backend LLMs, and I've been having it use Claude.

15:08

I think it was on Claude SONNET 4 when I did this.

15:15

And you'll get different results depending on which LLM, which model, language model

15:19

you're using.

15:20

So I basically gave it a set of instructions, and I tried to be really clear, and I tried

15:26

to not give it too much up front.

15:31

And I don't think this counts as vibe coding.

15:33

Cause I wasn't really just like throwing stuff at it and like, Hey, how about if

15:37

we do this, how about if we do that?

15:39

It was more like, I want this, I want this, I want this file location.

15:43

I want it organized like this.

15:45

It was a spec that I gave it and it worked.

15:50

It was shockingly good.

15:53

It wrote the code to send the code to it.

15:57

One of the things that makes this work

16:00

is CircuitPython supports this thing called raw REPL mode.

16:04

And so this is something where it

16:06

does no interpretation of what you're sending it

16:08

as you send it.

16:10

And then you send a terminator.

16:11

And that's when it goes and it actually processes the code.

16:15

And this makes it so much easier to automate sending code

16:19

to it to execute.

16:20

And Cirq Remote is not the only program that does this.

16:23

There are other programs that use it this way as well.

16:26

I think Fani does and probably Moo and a few other things.

16:31

So that was great.

16:32

So then I tossed in having it work with the web workflow

16:37

and I had to intervene in a couple of places there.

16:40

It didn't get the correct URL for the device.

16:43

I had to look that up and I couldn't get it to work though.

16:46

And it was having a bunch of issues with it

16:49

and I got frustrated.

16:50

And so I have done WebSocket programming in Ruby.

16:54

And so I basically just went and said,

16:58

okay, just rewrite it in Ruby for me.

17:00

And it rewrote it in Ruby in one shot.

17:02

It just, it did it.

17:04

And the WebSocket code in Ruby worked.

17:08

And so that was amazing.

17:09

And so I lived with that for a few days.

17:11

And then I thought,

17:12

how much is the CircuitPython community gonna love me

17:16

if I give them a utility that's written in Ruby?

17:20

And I figured not at all.

17:22

And so then I decided, let's just take another leap

17:27

and have it translate this Ruby program

17:30

that now works back to Python.

17:33

And it did it in one shot

17:35

and it worked the first time I tried it,

17:38

which just blew me away.

17:40

That was really, really wild.

17:43

So that's been really positive.

17:46

The negative to it has been that when things go wrong,

17:52

they can go really wrong.

17:54

And because I didn't write the code,

17:57

I'm not familiar with it in the way that I would be.

18:01

And it can be really tough to debug.

18:03

And when the LLM, the LLM is more than happy

18:07

to go deep, deep down a rabbit hole

18:09

trying to debug something.

18:11

But it's not very good at declaring defeat

18:15

and realizing that you need to back up

18:18

and take a new approach.

18:20

I have to do that.

18:21

And so one of the things I learned really quickly

18:25

was not only did I have to recognize

18:28

when we were totally going in the wrong direction,

18:30

which is fine, but also it can be tough

18:34

to unravel what it's done in going in that direction.

18:39

So I just get, you know, like 99% of the rest of the world.

18:43

And you definitely need to have really good

18:46

hygiene with this.

18:48

It's easier to just throw away the work

18:51

that's been being done and go back to where you started

18:55

when you started to debug this,

18:57

than it is to get the LLM to reliably

19:01

go back to a checkpoint.

19:02

Now, it's quite possible that Cursor's pretty good at this

19:05

and it's not something I know how to do in it.

19:08

Cursor's got a ton of stuff that it does

19:10

that I'm not an expert cursor user by any means.

19:14

So there may be expert cursor users,

19:17

like my friend Elena, who will listen to this

19:19

and roll her eyes and be like,

19:20

"I told you how to do this," and she probably did.

19:24

That's some experience with that.

19:26

So I also, you know, I wanted to support

19:29

lots and lots of sensors and other devices,

19:32

so I told Cursor to look at Adafruit's store

19:37

and see what Adafruit sells and write commands for those.

19:42

And that was partly really successful.

19:45

It was great at scanning what Adafruit had available

19:48

and it was great at organizing that.

19:52

And the thing with Python versus CircuitPython

19:55

is there's a lot of Python code on the internet

19:59

and there's a lot less CircuitPython code.

20:01

And they look really similar

20:03

because they are really similar.

20:05

And so the training, the base of code in CircuitPython

20:09

for the language models to be trained on is much smaller.

20:14

And so it doesn't do as good of a job

20:17

with generating CircuitPython code.

20:19

And sometimes it gets confused.

20:22

And especially things for accessing the file system

20:26

is different in CircuitPython versus Python,

20:28

which is totally reasonable, not a complaint at all.

20:31

It's actually just totally impressive

20:34

everything that CircuitPython does.

20:36

But so I found that the LLM would frequently

20:39

get confused about that.

20:40

And it would still hallucinate things that are not there.

20:44

Mostly it did a really good job at figuring out

20:47

the Adafruit libraries to use for the devices.

20:51

Occasionally, I think once or twice,

20:53

it hallucinated a library name that didn't exist.

20:56

But mostly it did a good job with that.

20:59

I had to manually intervene and fix things much more often

21:03

with the CircuitPython code than with the Python code.

21:08

I also, at one point, it had a sort of systematic error

21:12

that it had done across most of the commands.

21:16

And so I actually was able to tell it how to fix that

21:20

and then have it apply that to all the commands,

21:22

which was a huge time saver.

21:24

I figured out the fix, it did the work.

21:26

And that was pretty good, I liked that.

21:30

Yeah.

21:30

- That's pretty neat.

21:32

- You do a lot of work with sensors,

21:34

both for yourself and for your community.

21:37

How are you using sensors in your community?

21:39

- I am trying to do some projects to do sort of,

21:45

I guess one word for it, one phrase for it

21:47

is citizen science, so that people can have sensor networks,

21:53

or communities can have sensor networks in them

21:56

to track things like air quality, or noise pollution,

22:00

or light pollution or things like that.

22:03

Air quality is such a big, difficult question

22:07

because we tend to focus on one or two things

22:10

for air quality.

22:11

We have the AQI calculation,

22:13

which is really a synthetic number.

22:16

And it tends to focus on particulate pollution,

22:20

which is a big deal.

22:22

But also there's a ton of other things,

22:25

like respiratory irritants, gases like formaldehyde.

22:29

I live in Portland, in North Portland,

22:31

and there was an incident with a factory

22:34

on the sort of not real residential part of North Portland,

22:38

but which has been fined multiple times

22:41

for releasing formaldehyde.

22:43

And so I'd love for folks who are interested in doing this

22:47

to be able to have cheap devices

22:50

that they can put on a public sensor network

22:53

that could monitor for stuff like this.

22:56

And so that's kind of a passion of mine.

22:59

I work with a local hacker space, PDX hacker space,

23:02

and folks there help with this.

23:05

And some of us are working on projects like that.

23:08

Also like CO2 monitoring, CO2 monitoring.

23:11

Like CO2 can build up in a closed environment,

23:14

like an office space or home,

23:16

but also it got used as a proxy for airflow

23:19

during the pandemic.

23:20

A lot of people were getting CO2 monitors

23:22

with the idea that if CO2 levels went up,

23:25

then the possibility of COVID,

23:28

the virus in the air went up as well,

23:30

because that's a sign that air exchange isn't happening.

23:34

And so they were less concerned about the CO2

23:37

than they were just about fresh air, which is fair.

23:40

And so a bunch of folks at the hackerspace

23:42

were very interested in that.

23:44

One friend, Darcy Neal, is building personal CO2 monitors.

23:48

And so we've collaborated on some hardware there.

23:53

There's a commercial device called Purple Air,

23:56

which does something similar.

23:57

It's an air quality monitoring device,

24:00

very focused on particulate matter,

24:02

and they have air quality maps

24:04

that they generate from their data.

24:06

I'd like to generalize that.

24:08

I'm fine with commercial products.

24:10

You know, there's a lot to be said for just buying it,

24:12

having it be supported, that's great.

24:15

But I also like lower cost things available to hobbyists

24:18

or DIY people, maker spaces, things like that.

24:22

And so the hardware that I've been designing

24:24

and the software that I've built is all open source.

24:28

I got kind of waylaid by the tariff situation.

24:32

There's a board that I was doing a lot of work on

24:35

and got a final iteration of it in last spring

24:38

before the tariffs hit,

24:40

but they really jacked up the cost on doing everything.

24:43

And I'm happy to, I'd love to build things in the US,

24:47

but there's no options to do that.

24:50

the businesses just simply don't exist at this time.

24:54

There's a really great place in China called JLCPCB,

24:59

and a lot of folks use them.

25:01

And they have, it's just like it's so easy to work with them.

25:04

You upload your designs through their web interface,

25:07

you walk through it, and you get the order set right there.

25:09

It takes minutes.

25:11

And there's just nothing comparable to that in the US.

25:15

And also what I found trying to price things,

25:17

it's the factories in the US that do circuit board assembly,

25:22

they wanna do hundreds of thousands of boards,

25:25

which is fair, I don't begrudge them that,

25:27

I don't blame them, I would much prefer to deal

25:29

with large commercial orders

25:30

than individual hobbyists as well.

25:34

But it's just like, they don't wanna talk to you

25:37

if you wanna do 10 boards, and that's fine,

25:39

that's totally fair.

25:40

So there's simply no alternative available at this time.

25:45

And I know a lot of hobbyists and makers

25:48

got really, had a really hard time with this.

25:52

So I'm getting, you know, now that things have stabilized

25:55

even though it costs a lot more,

25:56

it's still orders of magnitude cheaper

25:59

to do it through China.

26:01

And so I'm trying to get back to that now

26:03

and just, you know, hopefully don't get hit

26:06

with a thousand dollar tariff or broker fee

26:09

or something like that for $100 worth of PCBs,

26:13

but we'll see how it goes.

26:15

- That's pretty neat.

26:16

Last question I ask each guest,

26:18

you're going to start a new project or prototype,

26:20

which board do you reach for?

26:23

- That's a great question.

26:24

And it would really depend a lot on the project.

26:28

So like I have these LED matrix signs

26:31

that are using Adafruit's matrix portal S3.

26:35

And if I were doing an LED matrix,

26:37

that is absolutely the board I would go for.

26:38

That's just really well thought out, well designed,

26:42

and actually impressively cheap for what it does board.

26:46

If I were going for just a more general purpose,

26:50

so almost everything I do is ESP32 based

26:54

because I always want connectivity.

26:56

But if I were going for just a more general purpose

26:59

board with connectivity,

27:01

Adafruit's feathers are great.

27:03

The board that I'm designing, it's just called sensor,

27:06

which is, you know, but it's got connectors on it

27:10

to hook up some more specific things like a particle sensor,

27:14

which needs a weird little ribbon cable connector.

27:19

Adafruit sells a version of that,

27:21

but I like having it directly on the board

27:23

because almost all the instances of this

27:25

that I'm going to put together are gonna need that.

27:28

So, you know, it's not very satisfying,

27:30

but I might go for my own board.

27:32

But Adafruit in general, like the feather boards are great.

27:35

For just general purpose boards,

27:37

unexpected maker, makes some really, really nice hardware.

27:41

A lot of emphasis on low power,

27:44

low overhead in the power

27:45

if you want to use a battery with it.

27:48

So I often look at his boards too.

27:50

So those are both really great choices, yeah.

27:53

- Yeah, those are great choices.

27:54

John, thanks so much for coming on the show.

27:56

- Thanks very much for having me.

27:58

This was a lot of fun.

28:00

- Thank you for listening to the CircuitPython Show.

28:02

For show notes and transcripts,

28:04

visit www.circuitpythonshow.com.

28:07

And if you're enjoying the show,

28:08

do me a favor and share a review

28:10

on your favorite podcast app.

28:11

It really helps.

28:13

Until next time, stay positive.