Mission
Build this
Build a visible entrance display and labelled semaphore for the lifetime count, recent activity, or a defensible activity class.
Borrowed parts are labelled below and have a fallback. The registered device ID is fixed; sensing and behaviour decisions remain yours.
Bill of materials
Parts
| Source | Part | Fallback |
|---|---|---|
| ● kit | Four-digit TM1637 display | — |
| ● kit | Optional 74HC595, LEDs and 220 Ω resistors | — |
| ● kit | SG90 servo | — |
Disconnect USB before rewiring. Motors, the relay, and the servo need appropriate power and a shared ground. Never drive an actuator from the ESP32 3V3 pin.
Your invitation
Choose one fact important enough to become architecture
A tower cannot explain everything the garden knows. It stands at the entrance and makes one shared quantity visible quickly, from farther away than a visitor would read a screen.
Your first design decision is therefore not colour or servo angle. It is editorial: should the tower show the lifetime entrance count, recent passage activity, or a small labelled state derived from that activity? Choose one claim and make the distance test match it.
One glance, one meaning, and a clear answer when the source has gone stale.
The central idea
A total and a rate tell different public stories
A count of 1842 does not mean 1842 people are present. If the semaphore expresses busyness, calculate recent change over time and say exactly which interval the labels describe.
Design for a glance
Redundancy makes distance more forgiving
Preserve the exact count or recent change for a closer viewer.
Use a few large, labelled positions visible from farther away.
An optional second cue may confirm the state, but must not carry the meaning alone.
The cues should agree. A high arm cannot mean “busy” while the digits still show a previous quiet interval. Update the stored interpretation once, then let every output read that same state.
Wiring
Prove the display before raising the semaphore
The reference route uses the four-pin TM1637 display. If your kit instead supplies a bare seven-segment display or 74HC595, follow its verified example and include one current-limiting resistor per lit LED segment.
The power rule: The TM1637 logic uses 3V3. The servo uses a separate 5 V supply. Join all grounds.
Bench referenceOpen the exact wiring map
| ESP32 pin | Part | Part marking | Carries |
|---|---|---|---|
3V3 | TM1637 display | VCC | 3V3 power — verify module markings |
GND | TM1637 display | GND | Ground |
GPIO 18 | TM1637 display | CLK | Digital in/out |
GPIO 19 | TM1637 display | DIO | Digital in/out |
GPIO 26 | SG90 servo | signal (orange) | PWM to actuator — semaphore position |
external 5 V | SG90 servo | power (red) | 5V power — separate supply |
GND | SG90 servo | ground (brown) | Ground — join servo and ESP32 grounds |
Never power the servo from ESP32 3V3. Confirm the display module pin order before power; bare LED segments require current-limiting resistors.
- 3V3 power
- Ground
- Digital in/out
- PWM to actuator
- 5V power
This map is for a TM1637 four-pin module. A 74HC595 or bare display is a valid alternate route, not a pin-compatible replacement.
Write the signal legend
A semaphore position needs a printed meaning
___ to ___ new passages per ___ minutes
___ to ___ new passages per ___ minutes
More than ___ new passages per ___ minutes
No trusted update for longer than ___ minutes
Your team decides:
- Which one public quantity deserves the tower?
- What viewing distance is the actual design target?
- How often may the arm move without becoming distracting?
- How does the unknown pose remain distinct from every real state?
Your distance trial
Measure recognition before the viewer reaches the label
- Prepare a fixed sequence of states.
Include every arm position, several digit values, and the unknown condition in a random order.
- Mark at least three viewing distances.
Measure them rather than calling them near, medium, and far. Include the intended real-world distance.
- Test at least five first-time viewers.
Ask what the signal means and time the answer. Record wrong answers separately from “cannot tell.”
- Revise one ambiguous cue.
Change angle, label, size, contrast, or encoding, then repeat the hardest distance with fresh trials.
| Distance | Shown state | Answer | Correct? | Reading time | Display or arm? |
|---|---|---|---|---|---|
| ___ m | quiet | ___ | yes / no | ___ s | ___ |
| ___ m | busy | ___ | yes / no | ___ s | ___ |
| ___ m | unknown | ___ | yes / no | ___ s | ___ |
When the signal lies from a distance
Legibility failures have different causes
People see the arm but reverse its meaning
The position is visible but the legend is not intuitive. Test clearer labels or a physical shape that suggests the intended ordering.
The digits are readable indoors but vanish outside
Contrast and ambient light changed. Add a hood, change orientation, or make the semaphore carry the far-distance meaning.
The tower says busy forever
You may be using the cumulative total rather than a recent difference, or your activity window never expires old events.
The arm moves after every count
The physical state has too many changes. Let digits show exact updates while the semaphore changes only when a labelled band changes.
A disconnected Gate Keeper still looks normal
Store the last arrival time and move to the unknown pose after the documented freshness limit.
Choose your public signal problem
What kind of tower team will you become?
The public editors
Make the argument for which one garden quantity deserves distance, and remove every cue that dilutes it.
The legibility engineers
Make distance, angle, light, contrast, and reading time the experiment across a carefully measured route.
The redundant coders
Compare digits, arm, and an optional shift-register pattern to learn which combinations prevent confusion without adding noise.
A calm way through the build
Collect four small wins
st-01says hello.Join the garden with an unknown status.
- The display shows the live Gate Keeper total.
Handle reset and stale data before interpreting it.
- A time window produces one labelled activity state.
Write the legend and test replay values.
- The arm agrees with the display.
Power it separately, print the legend, and mark the viewing distances.
The garden handshake
Share what you found
These names are the rigid part of the project. They let another team find your work without knowing what you called the variables in your code.
Tower operating state
garden/entrance/tower/st-01/statusUnit: enum
Listen beyond your own device.
garden/entrance/counter/gk-01/countThe Gate Keeper supplies a cumulative accepted-passage count. Display it directly or derive recent activity from count differences over a documented window; never label it current occupancy.
Finish line
Ready to introduce to the garden
st-01 stays online and publishes a registered status such as ok, warning, or error.
The reject feed stays clear after the final code starts.
The tower reads Gate Keeper count, handles resets and stale data, and never describes the total as occupancy.
Digits and semaphore share one stored interpretation and update without blocking garden messages.
The build log contains the editorial choice, printed legend, fixed state sequence, three measured distances, five viewers, accuracy, reading time, confusion, and one revision.
The display is electrically appropriate, any bare LEDs are current-limited, the servo is safely powered, and the device label can be scanned.
A good Signal Tower does less than a dashboard and does it better: one defensible garden story, readable before the viewer has reached the door.