Sleeping Face
Closed eyes, drooping eyebrows, a small quiet mouth, and three Z characters drifting up and away.
This lab is where the round screen stops being a constraint you work around and starts making
design decisions for you.
Time for a nap
A sleeping robot is one of the friendliest things a machine can be. It says "I'm fine, I'm just resting" — which is exactly what you want a robot to say when it has nothing to do.
The Zzz Had Nowhere to Go
On the OLED, the Zzz sat in the top-right corner. This screen has no corners.
The obvious replacement — up beside the right eye, where the OLED put them — is already occupied.
On a 240×240 circle the eyebrow reaches out to x=192 at that height, and the first Z lands right
on top of it. There is no free corner to retreat to.
So the Zs drift up and to the right from beside the mouth, rising into the empty quarter
below the right eye. That is not a stylistic preference; it is the only clear space left.
| Screen shape | Where the Zzz can live |
|---|---|
| 128 × 64 rectangle | The top-right corner, away from everything |
| 240 × 240 circle | Beside the mouth, rising into the gap under the right eye |
Sample Program Code
Only the Zs move, so only the Z box is erased between frames. Everything else is drawn once.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | |
Here's one frame of the animation:

Three Signals Saying the Same Thing
Sleep is one of the few expressions where redundancy is the point. Each of these on its own is ambiguous; together there is no mistaking it:
| Feature | On its own it could mean | Together they mean |
|---|---|---|
| Closed eyes (arcs) | Blinking, winking, laughing | |
| Drooping outer brows | Sad, tired, relaxed | Asleep |
| Small round mouth | Surprised, whistling, neutral | |
Drifting Zzz |
Only one thing |
That is a design lesson worth keeping: when an expression has to survive being glanced at, give the viewer more than one clue.
Comment Out the Erase and Watch It Smear
Take the fill_rect() out of draw_zzz() and the Z's pile into a solid white block within seconds. There is no frame buffer here — the glass keeps whatever you last sent it, forever, until you paint over it. That is the bug you will meet most often on this display.
Things to Try
- Break the erase, as in the warning above, and watch how fast it happens. Then put it back and appreciate how much work one rectangle is doing.
- Use
config.BIG_FONTfor the Z's and adjust the box. Bigger Z's read better from a distance but need more room inside the circle than you expect. - Slow the bob down from 0.15 to 0.4 seconds. Breathing rate is a personality trait — a fast bob reads as restless, a slow one as deeply asleep.
- Add a fourth
Zfurther up and to the right. Check that it is still inside the circle withconfig.inside_circle()before you run it.
References
- Blinking — where the closed-eye arc was introduced
- Screen Coordinates — why there is no corner to put the Zzz in
- A Face With a Memory — where falling asleep becomes something the robot decides on its own