Skip to content
Fugleramme
The parts

How they fit together

The outdoor unit sends audio, the server does the work, and the frame draws what it gets. Below is each part with what it does, why it is the way it is, and where the code is.

Outdoor unit
XIAO ESP32-S3 · INMP441 · solar panel
Home server
Python · BirdNET · systemd · cron
Indoor unit
ESP32-S3 · e-paper 1200×1600
Camera
Android · Kotlin · CameraX
POST /upload60 s WAV + health JSON
GET /configthe listening plan back
POST /display960,000 bytes
POST /bildeJPEG + metadata
weather
birds and images
The frame never fetches anything itself.Without power it shows what it last got.
api.met.no
Gemini

The parts

firmware/outdoor_sensor/
What

Records one minute straight into PSRAM with the radio off, connects, syncs the clock, uploads and sleeps. Deep sleep is 14 µA.

Why

The first version on a Raspberry Pi drew 450 mA idle and died on solar power. We needed a board that can sleep between sessions.

Where in the code
firmware/README.md
tools/
What

Receives audio and images, runs BirdNET, calculates the listening plan, composes the page, dithers and pushes. The web pages are pure standard library.

Why

Everything heavy happens where power is cheap and the logs are easy to read. The outdoor unit does not have to keep the radio on while the analysis runs.

Where in the code
tools/README.md
firmware/indoor_frame/
What

An HTTP server that receives 960,000 bytes and pushes them to the panel. Watchdog and WiFi recovery, nothing else.

Why

The frame should not need a clock, a plan or the internet. It shows what it last got, even without power.

Where in the code
firmware/README.md
kamera-app/
What

Watches the garden at 1x, takes a telephoto picture at the feeder when something moves, crops it and sends it. The server asks the model what is there.

Why

The microphone does not hear everything. Two thrushes on the lawn were never heard, and that was the start of the camera.

Where in the code
kamera-app/README.md

A day on the server

00030609121518212407:07 page drawn09:37 again16:00 the day so far22:00 statistics Listening every 10 min in the fine window Every 20 min until 21:00 The watch every quarter hour, all day

The listening plan

Calculated by the same code that runs the outdoor unit
040608101214 JanFebMarAprMayJunJulAugSepOctNovDec Today Sunrise 03:52 09:19 Fine window: 1 h before to 4 h after, one session every 10 minutes Summer timeSummer time
Steps down with the battery
above 3.80 V10 min20 min
above 3.65 V15 min30 min
below30 min60 min
In the fine window, and the rest of the day. The outdoor unit has to survive November.

The colours of the panel

The panel has six colours. Everything on the wall is drawn in them.
Black
White
Red
Yellow
Blue
Green

A colour that is not in the palette has to be made with dithering, and dithered text is hard to read. So text, lines and pads are pure palette colours. Only the plates are dithered.