I’ve had a Badger 2350 running as a departures board for the bus stop outside my flat for a few weeks now, and it’s turned out well enough to publish: tfl-bus-arrivals-badger2350. No API key needed — TfL’s unauthenticated limit is 50 req/min and this makes about 30 an hour.
Six arrival rows and a weather footer, refreshing every two minutes, deep-sleeping in between. It pauses updates overnight from 22:30 to 05:30 (configurable) and latches into a static low-battery screen at 3.45V rather than dying on stale data.
Rather than just outputting the bus arrival data, I have spent some effort neatening the display and usefulness of the thing overall: it degrades gracefully when the internet drops, and dies on a low battery warning (so you don’t run for the bus on a quick glance at stale data!). To conserve battery, overnight it only wakes once an hour for a clock and weather update (but you can add 30 minutes of live updates by pressing A). And most recently, some roadworks closed my bus stop, so now I have even added automatic failover to the neighbouring stop which also retitles the header. Anything stale gets labelled or dropped rather than shown as if it were live.
Under the hood it’s a plain wake → fetch → draw → sleep loop. Deep sleep is a full reset on this firmware, so every cached value has to be written to flash and rehydrated on the next wake, and that one constraint ended up shaping most of the design.
It’s pretty plug and play: you only really need to change your stop ID (and failover stop), and quiet hours if you’re a night owl. I get roughly one full week on battery, sometimes 10 days or so (the code evolved a few times before getting here). I plan to add a tube status/disruptions page within the same app in future, shown by pressing C or similar. Only button A is used at the moment.
This is my first project up on GitHub, so I’d really welcome any feedback and hope someone finds it useful!