Embedded systems and hardware engineer building the tools that sit between the shack and the sky.
| DAY | NIGHT | |
|---|---|---|
| 80m-40m | -- | -- |
| 30m-20m | -- | -- |
| 17m-15m | -- | -- |
| 12m-10m | -- | -- |
| 14.100 | -- | -- |
| 18.110 | -- | -- |
| 21.150 | -- | -- |
| 24.930 | -- | -- |
| 28.200 | -- | -- |
The beacon panel is a browser-only addition, computed straight from the public NCDXF schedule (18 beacons × 5 bands) — not yet ported to the physical clock's display.
Builds that connect firmware, RF, and the operating desk.
A Geochron-inspired world clock for a 1024×600 RGB panel (Waveshare ESP32-S3-Touch-LCD-7B): a live day/night terminator over a real map asset, an HF/VHF band-conditions panel pulled hourly from hamqsl.com, and a five-city clock bar with sunrise/sunset. Chased a persistent display-sync glitch back to the RGB panel's pixel clock, not application code — settled at 20MHz after several higher-clock compromises each reintroduced it.
A remote operating console for a FlexRadio FLEX-3000 alongside PowerSDR. The FLEX-3000 needs a real, physically-attached FireWire bus, so PowerSDR itself can't run remotely — but the operating position can: instead of streaming PowerSDR's window as video (laggy, breaks audio drivers), this streams the underlying FFT bins, meter readings, CAT state, and audio, then renders a native UI on a lightweight client anywhere on the network.
A three-node antenna rotator controller: two ESP32-C5 sensor nodes (one compass-only, one compass+tilt for azimuth/elevation) report orientation over ESP-NOW to an ESP32-S3-Touch-LCD-5 hub, which drives the rotor relays over RS485/Modbus and runs the on-screen control UI. Structurally complete but not yet compiled or run on real hardware — bench-testing each node comes before wiring in any motors.
An interactive HF propagation visualizer: rays leave the antenna, hit a virtual-height ionosphere layer, and bend back to Earth only if the operating frequency is below that layer's MUF at the ray's takeoff angle (secant law). Models D/E/F1/F2 plus patchy, time-flickering Sporadic-E openings, night-mode layer behavior, multi-hop chains, and a curved-Earth globe view alongside a to-scale flat view.
More builds and activity logged on qrz.com/db/YT3CT.
A DIY Geochron-style world clock for the Waveshare ESP32-S3-Touch-LCD-7B (1024×600 RGB panel): a live day/night shadow drawn over a real coastline map, in the spirit of the mechanical Geochron's scrolling lamp-lit drum — but equirectangular instead of Mercator, since Mercator distorts badly near the poles and only works on the real device because its map is on a moving drum, not a fixed rectangle.
A full-screen map with the terminator recomputed once a minute (soft twilight blend, not a hard edge), an amber subsolar-point marker, an HF/VHF band-conditions panel parsed from hamqsl.com's feed once an hour, and a five-city clock bar with live local time and that city's own sunrise/sunset. The terminator and every sunrise/sunset time run on the same NOAA simplified solar-position algorithm — declination plus the equation of time — computed from the current UTC date/time, no ephemeris data needed.
The hardest part wasn't the astronomy, it was a persistent glitch: the panel would visibly slip a few rows out of sync with the framebuffer and stay shifted. Two tuning changes were tried and reverted (full-refresh mode instead of direct-mode, a larger RGB bounce buffer) before the real culprit turned up — the RGB pixel clock. Waveshare's own default is 30MHz; 20MHz fixed the glitch outright but was uncomfortably flickery, so 25MHz and then 28MHz were each tried as a less-flickery compromise. An exhaustive elimination pass — disabling every periodic task one at a time, including a run where the map task did nothing at all — ruled out application-level scheduling as the cause. Back to 20MHz, which is what's actually flashed.
Two separate bugs turned out to share the same root cause: a blocking operation running on the same core as LVGL's render task and the RGB panel's vsync interrupt. The DHT11 temperature sensor's read routine disables interrupts for ~5ms to bit-bang its single-wire protocol; the hamqsl.com fetch needs a multi-second TLS handshake. Both were moved into their own dedicated FreeRTOS tasks pinned to core 0, leaving core 1 free for rendering. A separate slow memory leak — repeated timezone-switching calls leaking a few bytes each, adding up to a reboot after 15–25 minutes of uptime — got fixed by caching each city's UTC offset once a minute instead of re-deriving it every second.
Hardware bring-up — I2C bus, IO-expander, RGB panel init, SD card, and the LVGL v8 display port for this exact panel — is Waveshare's own example code for this board, reused as-is so the tricky, easy-to-get-wrong parts are the same code Waveshare ships and tests. Everything else (the terminator math, the map renderer, band-conditions parsing, the city-clock panel) is original.
A remote operating console for a FlexRadio FLEX-3000, built as a companion to PowerSDR. FireWire and PowerSDR stay on the radio PC; a lightweight client anywhere on the network gets a live waterfall/spectrum, VFO/mode/filter controls, audio, and PTT — without full screen/remote-desktop sharing.
The FLEX-3000 requires a real, physically-attached IEEE-1394 FireWire bus, so PowerSDR itself can never run "remotely." What can be remote is the operating position: instead of streaming PowerSDR's whole window as video (RDP/VNC — laggy, breaks audio drivers), this project streams the underlying data — FFT bins, meter readings, CAT state, audio — and renders a native UI on the client. Data frames are kilobytes; video frames are megabytes.
A server on the radio PC taps the FFT/meter data, captures RX/TX audio, and relays CAT commands and PTT. A client on the operator PC renders the waterfall from that FFT stream, exposes VFO/mode/filter controls, and handles audio in/out and PTT. Two links, split by need: TCP carries control/CAT (needs to be reliable), UDP carries the FFT stream and audio (needs to be low-latency).
The protocol comes first (everything else depends on it being stable), then the server's FFT source — the one piece that needs real PowerSDR source to finish, though it can be built and tested against an included simulated FFT source until then. The client can be built and tested entirely against that same simulated server, no radio required.
A three-node antenna rotator controller: two ESP32-C5 sensor nodes read orientation and report it over ESP-NOW to an ESP32-S3-Touch-LCD-5 hub, which drives the rotor via relays and runs the on-screen control UI. One node reports azimuth only (GY-271 compass); the other reports azimuth and elevation (GY-271 plus an MPU6050 for tilt). A first working build with solid structure and logic throughout — not yet compiled or run on real hardware.
Same approach as GeochronClock: the hub's display bring-up (RGB LCD timing, the CH422G IO-expander, GT911 touch, backlight) is fiddly board-specific init code that's easy to get subtly wrong from a written description, so it starts from Waveshare's own ESP-IDF demo for this exact panel, confirmed working unmodified, before this project's files are merged into it.
The hub flashes first and prints its MAC address over serial; that address gets copied into both sensor nodes so they know where to send ESP-NOW telemetry. All three devices share one hardcoded WiFi channel for ESP-NOW, which has to match across all of them if it's ever changed.
Compass hard/soft-iron calibration isn't implemented yet; axis mapping on both the compass heading formula and the tilt-compensation formula depends on physical mounting and will likely need sign flips once real readings are visible; Modbus address/baud and relay-channel assignment need verifying against the actual relay board; and the deadband on the bang-bang control loop needs tuning once real overshoot/hunting behavior is visible. Testing runs bottom-up: each node alone, then the hub with sensors only, then the jog buttons/encoders, and only then the relay board and motors — with an Emergency Stop check before anything else gets trusted.
Activity logged over 30+ years on QRZ.com — pulled straight from the public profile.
Notes on how signals actually get from this station to the next continent — the working knowledge behind the projects above.