Split-flap departure slab

A tiny airport departures board for your desk. Print three parts, drop in an ESP32-C6 screen, and watch flights click in letter by letter. No Wi-Fi needed, and along the way you learn how a table of data, one button and a few words run the whole show.

DifficultyBeginner
Build time45 min
Est. cost$20
Parts4
Files8
Steps15

Things you'll need

QtyPartType
1
Waveshare ESP32-C6-LCD-1.47 board
Waveshare ESP32-C6-LCD-1.47 board The brain, the screen and one tiny colour light, all on one board. 1.47-inch LCD, USB-C, and a BOOT button that is your only control.
electronics
3
Printed parts
Printed parts Frame, stand and foot. All three are in the 3MF below. The photos show them in plain white PLA.
printed
1
USB-C data cable Powers the board and loads the program. It must be a data cable, not a charge-only one.
electronics
25 g
PLA filament One colour is plenty. Any PLA works; the stand is the only chunky part.
consumable

Tools & software

1
Chrome or Edge browser Loads the program onto the board straight from this page. Nothing to install.
1
Arduino IDE (optional) Only needed if you want to change the code later. See 'Level up' at the end.

Files & downloads

Download all

Flash writes a precompiled image over USB-C in Chrome or Edge. The .ino below is the source — you do not need Arduino IDE unless you want to change the sketch.

What you're building

A tiny airport departures board for your desk. Each row clicks over letter by letter, like the flip boards in a real terminal, until it spells a flight: LAX 08:15 ONTIME.

No soldering. No wires. You print three parts, drop in one board, plug in one cable, and click one button on this page to load the program. It works with no Wi-Fi at all.

Note

No Wi-Fi needed. The program on this page has its Wi-Fi name left empty on purpose. The board shows a built-in Chicago (ORD) schedule, so it works the second you plug it in. Real live flights are an optional Level-up at the end.

What you'll learn

  • How a screen can be just a table of rows
  • How one button gets two meanings: tap and hold
  • How a word like DELAY can pick a colour
  • How a split-flap letter flips one card at a time
  • What JSON is, and why it looks like a packing list

Meet the parts

Three white printed parts (frame, foot and stand) and the bare ESP32-C6 board on a cutting mat
Everything you need: three printed parts and one board.
  1. Frame: the ring with a window. The board drops in from the back; the big opening on one end is for the USB-C plug and the buttons.
  2. Foot: the flat bar with a tab. It plugs into the back of the stand and leans the screen back.
  3. Stand: the block. The frame sits on its front; the block is the body under the screen.
  4. The board: a Waveshare ESP32-C6 with a 1.47-inch screen. Brain, screen and light in one.
Tip

Pick your own colours. The photos show all three parts in plain white. Any PLA works. Try a dark frame with a bright stand, or match your desk.

Note

Before you start. The printer does about 1.5 hours of work on its own. You do about 5 minutes of pushing parts together and 2 minutes of loading the program. No tools, no glue, no screws. You will need a computer with Chrome or Edge for the loading part.


Part 1: Print

Three small parts, one plate. Start the printer, then come back for Part 2 while it works.

1

Download the 3MF

Grab All parts (3MF) from Files & downloads above and open it in Bambu Studio, OrcaSlicer or PrusaSlicer. The parts open stacked the way they fit together; press A (Arrange) to spread them out on the plate.

Download the 3MF
2

Pick a colour and print

One colour or three, your choice. Normal PLA settings are fine: 0.2 mm layers, 2 walls, 15% infill. The whole plate uses about 25 g of filament.

3

Check the parts

Look through the frame: the window and the end opening should be free of strings. Try the foot's tab in the slot on the back of the stand. Snug is good. Too tight? A little sandpaper (ask an adult).


Part 2: Put it together

No glue, no screws. Three pushes and you're done. If a part feels tight, wiggle it; never force it.

1

Drop the board into the frame

Lower the board in from the back: screen toward the window, USB-C port into the big opening on the end. The two tiny buttons (BOOT and RESET) sit beside the port in that opening. Press gently until it lies flat.

Drop the board into the frame
2

Push the frame onto the stand

The stand has a raised lip on its front. Press the back of the frame over it; the lip traps the board so it can't fall out. Keep the USB-C opening on the right as you face the screen, so words read right way up.

Push the frame onto the stand
3

Plug in the foot

Turn it round. Push the foot's tab into the slot on the back of the stand. Turn it back: the screen now leans back a little, like a real departures board, and the foot stops it tipping over.

Plug in the foot
4

Plug in the cable

USB-C into the port on the right. Any USB power works later (a phone charger is fine), but for the next part plug it into a computer.

Plug in the cable
Tip

Which tiny button is BOOT? The board has BOOT and RST printed next to them on the back, so look before you close it up. Forgot? Tap one. If the page flips, that's BOOT. If the board restarts, that was RESET.


Part 3: Load the program

The board arrives empty. You are going to copy the departures-board program onto it from this web page. That takes about a minute.

Note

Word to know: flash. Flashing means copying a program onto a chip. The chip keeps it even when unplugged, like saving a game.

1

Plug in

Connect the USB-C cable from the board to a computer (Windows, Mac, Chromebook or Linux). Remember: a data cable, not a charge-only one.

2

Click Flash to board

Scroll up to Files & downloads and click Flash to board. Use Chrome or Edge. Pick the port that appears, click Install, and wait for the green tick.

3

Watch it wake up

A gold DEPARTURES header appears with a clock under it, then rows of blank flaps click in from the top-left. The light glows amber while they move. Words sideways? Hold BOOT for a second to rotate; the board remembers.

Tip

No port in the list? Hold BOOT, tap RESET, let go of BOOT, then click Flash again. On a Mac the port is usually called usbmodem. Phones and Safari can't flash; use a computer.


Play it

Five things to try, in order.

1

Watch the flaps

Every letter starts blank and clicks through the alphabet until it lands on the right one. The top-left flap starts first and the wave spreads down and right. The whole board settles in about two seconds.

Watch the flaps
2

Tap BOOT = Departures or Calendar

A quick tap blanks the board and flips in the other page. CALENDAR shows a made-up day: standup, design, lunch. Tap again to get the flights back.

3

Hold BOOT = rotate

Hold for about a second. The board turns: 3 big rows become 5 small rows (sideways in this stand, which is half the fun). Hold again to turn back. It remembers your choice even after you unplug it.

4

Watch the light

A tiny colour light glows at the edge of the screen. Amber while flaps move. Settled: red if any flight says DELAY, green if none do. The built-in schedule always has a delay, so tap to Calendar to see green.

5

Wait 28 seconds

On Departures, a new wave of flights flips in every 28 seconds: times shift, a DELAY clears, a GATE call appears. Two schedules take turns, so watch what changes.

Wait 28 seconds
Note

About that clock. With no Wi-Fi the board has no idea what time it is, so it pretends: the clock starts at 08:14 every time you plug it in and ticks forward from there. Give it real Wi-Fi (Level up) and it fetches the real time.


How it works: five tiny lessons

You don't need to read the whole program (it's in Files & downloads if you're curious). Each lesson below shows the one small piece of code that does the job, and gives you something to try.

Lesson 1: A screen is just a table

Each flight is one row with three things: where, when, and how it's going. The program keeps a list of rows and draws one line per row. Change the list and the board changes. That's how scoreboards, spreadsheets and apps all work: data first, drawing second.

split-flap-board.ino
struct RowSpec { const char *left; const char *when; const char *stat; };

static const RowSpec kFlightsA[] = {
    {"LAX", "08:15", "ONTIME"}, {"JFK", "09:40", "DELAY"},
    {"SFO", "10:05", "ONTIME"}, {"MIA", "11:20", "ONTIME"},
};

From the top of split-flap-board.ino. The real list has 7 rows; the screen shows the first 3 or 5.

Tip

Try it: find the first row on your board in the code above. LAX is Los Angeles. Can you work out where JFK, SFO and MIA are?

Lesson 2: One button, two meanings

The slab has no touch screen. BOOT is the only button. So how does one button do two jobs? A stopwatch. When BOOT goes down, the program writes down the time. Still down 700 milliseconds later? That's a hold: rotate. Let go sooner? That's a tap: next page.

split-flap-board.ino
#define BOOT_LONG_MS 700   // 0.7 seconds

if (down && !g_bootDown) g_bootDownAt = now;            // button just went down

if (down && (now - g_bootDownAt) >= BOOT_LONG_MS)       // still down after 0.7 s?
  toggleOrient();                                        //   that's a hold: rotate

if (!down && g_bootDown && !g_bootLong) cyclePage();    // let go early? that's a tap

Simplified from pollBoot(). millis() is the stopwatch: milliseconds since the board turned on.

Tip

Try it: tap, then hold, then try a medium press. Can you find the exact edge where a tap turns into a hold? Game controllers do this all the time: tap to jump, hold to charge.

Lesson 3: A word picks a colour

The status is just a word: ONTIME, DELAY or GATE. The program looks the word up and hands back a colour. That's a lookup. The same word drives the little light: red if any row says DELAY, green if none do. Airports do this on purpose. You can read a colour from across the hall.

split-flap-board.ino
static uint16_t statusColor(const char *st) {
  if (strstr(st, "DELAY"))  return COL_DELAY;    // red
  if (strstr(st, "ONTIME")) return COL_ONTIME;   // green
  if (strstr(st, "GATE"))   return COL_GOLD;     // gold
  return COL_CREAM;                              // anything else: plain
}

Simplified from statusColor(). strstr asks: is this word somewhere inside that text?

Tip

Try it on paper: a row says GATE. Which colour? What if it says CANCELLED, a word the program has never seen? (Gold. Then cream, the plain colour, because nothing matched.)

Lesson 4: How a flap flips

A real split-flap has a wheel of cards. Ours has a string: a space, A to Z, 0 to 9, then : - and /. That's 40 cards. Every 32 milliseconds each cell steps to the next card until it matches its target. A is one click from blank. Z is 26. That's why some letters land before others.

split-flap-board.ino
static const char FLAP[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:-/";
static const uint32_t FLAP_MS = 32;   // one click every 32 ms

static char nextFlap(char ch) {
  const int n = sizeof(FLAP) - 1;            // 40 cards on the wheel
  return FLAP[(flapIndex(ch) + 1) % n];      // the next card, wrapping round
}

if (shown[r][c] != target[r][c]) shown[r][c] = nextFlap(shown[r][c]);

From nextFlap() and tickFlaps(). The % means 'wrap back to the start of the wheel'.

Tip

Try it: watch one row flip in from blank. Which character lands last? Hint: numbers come after Z on the wheel, and the colon is card 37, so the : in the time is nearly always the last to stop.

Lesson 5: JSON is a packing list

Want real flights? The board can fetch a file from the internet. The file has to use the same three labels as the table: dest, time, status. That format is called JSON. Think of it as a packing list: the internet sends the list, the program unpacks it, and the flaps do the rest.

flights.json
{
  "airport": "ORD",
  "flights": [
    {"dest": "LAX", "time": "08:15", "status": "ONTIME"},
    {"dest": "JFK", "time": "09:40", "status": "DELAY"}
  ]
}

A file the board understands. Same three things per row as the table in Lesson 1.

Tip

Try it: write your own flights.json on paper for a trip you'd love to take. Three flights, three statuses. Which colour would each row be?


Secret commands

Your computer can chat with the board through the same USB-C cable. That chat is called serial. Open the Serial Monitor in Arduino IDE (or any serial app) at 115200, type a word, press Enter.

Type this What happens
help lists every command
status page, Wi-Fi, light colour and what every row says
page taps BOOT for you: Departures or Calendar
flip blanks the board and flips it all in again
rotate holds BOOT for you: 5 rows or 3 rows

Level up: change the code

Ready to make it yours? Download split-flap-board.ino and c6_slab_pins.h, put them in a folder called split-flap-board, and open the .ino in Arduino IDE. Change the include line near the top to #include "c6_slab_pins.h". Board: ESP32C6 Dev Module, USB CDC On Boot: Enabled. Libraries: GFX Library for Arduino and Adafruit NeoPixel.

Ideas, easiest first:

  • Change one destination in kFlightsA to your nearest airport.
  • Rewrite kCalendar so it's your day: school, lunch, practice, dinner.
  • Change FLAP_MS from 32 to 80 for lazy flaps, or 10 for a blur.
  • Turn every DELAY in kFlightsA and kFlightsB into ONTIME. Now the light goes green on Departures too.
  • Add your Wi-Fi (2.4 GHz only) and a SCHEDULE_URL to a flights.json. Never paste a real password into a copy you share.
split-flap-board.ino
#define WIFI_SSID     ""   // your 2.4 GHz network name goes here
#define WIFI_PASSWORD ""   // and its password (never share this copy!)
#define SCHEDULE_URL  ""   // https://example.com/flights.json

{"DEN", "15:45", "GATE"},   // one canned row: change DEN to your airport

Simplified from the top of split-flap-board.ino, plus one row from kFlightsA.


If something goes wrong

  • Screen stays black after flashing. Press RESET once. Still black? Try another USB-C cable; many are charge-only.
  • No port shows up. Hold BOOT, tap RESET, release BOOT, click Flash again.
  • Words are sideways. Hold BOOT for about a second. It rotates and remembers.
  • Tapping does nothing. Quick (under 0.7 s) but a real press, not a flick. If the board restarted, that was RESET.
  • The clock is wrong. No Wi-Fi means pretend time, starting at 08:14 each power-up. Real time needs Wi-Fi (Level up).
  • Light never goes green on Departures. On purpose: the built-in schedule always has a DELAY. Tap to Calendar, or fix it in Level up.
  • Board won't drop into the frame. The USB-C port must face the big end opening. It only fits one way.
  • Screen looks a bit dim. On purpose. 50% brightness keeps the panel from a hot spot.

Build photos

Licensed under CC BY-SA 4.0. Check with the author before commercial use.