SchoolAir · physical air-quality indicator
Two halves. The vase is a plain cover over the mechanism, and the mechanism stands on the dock's lid. A small stepper motor hangs under the lid and turns a lead screw. A carriage rides up and down the screw between two grooved posts and lifts a rod inside the flower's hollow stem. Two micro-switches on a bracket behind the posts tell the controller when the carriage reaches the bottom or the top. The dock holds every electrical part: Raspberry Pi, air sensor, stepper driver and status LED. The lid clicks into the base with no screws. The vase drops into the ring on the lid and locks with a 30° twist. A terracotta rim band drops over the top of the vase and carries SCHOOLAIR.ORG and the NFC tag; it turns, so the lettering can face the room. The same dock sits on a shelf or slides down onto two wall screws. The balloon numbers match the parts table and the build order.
| № | Part | What it does | Source |
|---|---|---|---|
| 1 | Dock base | Rounded square 120 × 120 × 33.5, flat back with two keyholes. Ledge and four barbs for the lid, keyed corner post, pry notch. Sealed sensor pocket on the right, grilles on front, left and right, cable holes 14 × 8 on both sides, smart-LED holder behind the front grille. Screw posts with pilot holes for the Pi, the driver board and the sensor's power adapter. Stick-on rubber feet. | print · dock_base.stl |
| 2 | Raspberry Pi Zero WH | Along the sensor pocket wall on four M2.5 standoffs, header on the pocket side. Reads the sensor over I2C and drives the motor and the LED. | buy |
| 3 | Air sensor, SEN63C or SEN65 | SEN63C indoors (it has CO₂), SEN65 outdoors. On edge in the right-side pocket, openings against the right wall on a foam gasket, foam block behind. Sealed from the rest of the dock, so the Pi's warm air stays out. Its lead runs to the Adafruit SEN6x STEMMA QT power adapter, screwed to four posts at the front-right; one Qwiic cable goes from the adapter to the Pi, and the adapter's second Qwiic port is left free for add-ons, so no hub is needed. | buy |
| 4 | ULN2003 driver board | On four posts at the front-left, in front of the motor, with four M3 × 6 self-tapping screws. Four signal wires and power from the Pi header; the motor plugs into its socket. The 1000 µF capacitor goes across its 5 V input. | buy · with the motor |
| 5 | Stepper motor 28BYJ-48, 5 V | Face against the lid's underside, body inside the dock, shaft up through the lid. Two M3 × 6 self-tapping screws from below through its ears into the lid. Lead toward the back. | buy |
| 6 | Dock lid | The vase floor. Bayonet ring with three lugs, two guide posts 20 × 5 × 108 either side of the screw, each with a 7 × 2.5 groove on its inner face, and the home stop post ⌀9 × 32.5 under the rod. Gussets at the post roots (8 outside, 3.5 inside, 14 tall; since 2026-10-06, after a post snapped), pilots in the post ends for the switch bracket, a 5 mm hole for the switch leads. Clipped corner so it drops into the base one way only. Print with 4 walls. | print · dock_lid.stl |
| 7 | Limit-switch bracket and two switches | Two SS-5 lever micro-switches on a printed bracket screwed to the back ends of the posts. Slotted holes give ±2 mm to set each trigger point: the bottom switch clicks 0.5 mm before the stop, the top one at erect. A U channel down the left rail carries the leads to the lid hole. | print · ls_bracket.stl · buy switches |
| 8 | Coupler | ⌀14 × 16.5. D-shaped pocket presses onto the motor shaft from below; ⌀8 pocket above takes the screw, held by two M3 grub screws. | print · coupler.stl |
| 9 | Lead screw Tr8×8 | 8 mm trapezoidal, four starts, 8 mm per turn, 100 long. The motor turns it; it never moves up or down itself. | buy · Tr8×8 |
| 10 | Carriage | Sleeve with the Tr8×8 nut printed in, a tab each side running in the post grooves, and a bar to the rod boss on the pot axis. The boss hangs 12 below the sleeve, clamps the rod with an M3 set screw, and lands on the stop post at the bottom. | print · carriage.stl |
| 11 | Switch flag | Screws under the carriage tabs with two M2 × 8; its arm presses the bottom switch at home and the top switch at erect. | print · ls_flag.stl |
| 12 | Drive rod | M3 threaded rod, 146 long, bottom flush with the boss. Slides up inside the stem. Round its top tip. | buy · M3 rod |
| 13 | Pot shell | The visible vase. Throat on top, an 8.2 bore in the roof for the stem gland, three bayonet L-slots in the base wall, hidden inside the ring. Nothing inside it moves against it. | print · shell.stl |
| 14 | Stem gland | Its foot is glued into the roof bore with a drop of CA; a split M9 × 1 collet stands up through the dish. PETG, printed the right way up. | print · stem_gland.stl |
| 15 | Planter dish | Shallow tray on the flat roof, not glued; its centre hole clears the gland nut. Fill with moss or gravel so the stem looks planted. | print · dish.stl |
| 16 | Gland nut | Its cone squeezes the collet onto the stem tube. Loosen to slide the stem up or down, tighten by hand to lock. PETG. | print · stem_gland_nut.stl |
| 17 | Rim band | The terracotta rim. "SCHOOLAIR.ORG" raised on the front, NFC tag pocket behind it inside. Drops on from above with a straight bore and rests on the dish bead, so it turns to face the room. Stands about 3 mm off the pot at its bottom edge. | print · rim_band.stl |
| 18 | Stem and flower | The flowers' own hollow stem, ⌀6 / 4 × 150, held by the gland. No glue on the tube. Head weighted to 12 g for the wilt. | buy |
Everything not printed, grouped by where it goes. Quantities are per unit; most items come in packs.
| Qty | Item | Where it goes |
|---|---|---|
| 1 | 28BYJ-48 stepper, 5 V, with ULN2003 driver board | Motor under the lid, board on its posts at the front-left. Buy them as a pair; the 12 V version will not run from the Pi's 5 V. |
| 1 | Tr8×8 lead screw, 100 mm | In the coupler. Screw only; the nut is printed into the carriage. |
| 2 | M3 × 6 self-tapping | Motor ears into the lid, from below. |
| 2 | M3 × 4 grub screws | Lead screw in the coupler. |
| 1 | M3 × 6 self-tapping | Rod set screw in the carriage boss. |
| 1 + 1 | Stem gland and nut (printed, PETG) | Adjustable clamp in the vase roof; the stem tube passes through and the nut locks it at any height. A drop of CA on the foot, none on the tube. |
| 1 | M3 threaded rod, 146 mm | Drive rod, in the carriage boss. Round the top tip. |
| 6 | Jumper wires, female–female, 10–20 cm, 2.54 mm DuPont | Driver board to the Pi header. The shorter the better: long wires fill the dock. |
| 1 | Jumper link, 2.54 mm | Flower strap: Pi pin 37 (GPIO26) to pin 39 (ground). Tells the firmware a flower is fitted; left off on the box model. |
| 1 | 1000 µF 10 V electrolytic capacitor | Across 5 V and ground at the driver board. |
| 1 | Flower with its 150 mm hollow stem, washers to 12 g | Stem through the gland in the roof; washers on the head's stub. |
| 4 | Rubber feet, stick-on, 3 mm high | Under the dock's corners. |
| 8 | M2.5 × 6 self-tapping | Pi Zero to its standoffs, and the sensor's power adapter to its posts. |
| 4 | M3 × 6 self-tapping | Driver board to its posts. |
| 2 | Lever micro-switches, SS-5 size (20 × 9.7 × 6.5, hinge lever) | Limit switches, top and bottom, on the bracket. Wire common + normally closed. |
| 4 | M2 × 12 screws + M2 nuts | Switches to the bracket; nuts in the slotted pockets. |
| 4 | M2 × 12 self-tapping | Switch bracket to the post ends. |
| 2 | M2 × 8 self-tapping | Flag under the carriage tabs. |
| 4 | Female jumper leads, 20 cm | Switch leads to the Pi header; cut ends soldered to the C and NC tabs, heat-shrink. |
| 2 | Stick-on cable clips, small | Under the lid, holding the switch leads clear of the motor. |
| 1 | NFC sticker, NTAG213, about 20 × 8 mm | Pocket inside the rim band, behind the lettering; written with the portal link and locked. |
| 1 | EPDM foam 3 mm self-adhesive, and a 4 mm foam block | Sensor gasket frame against the right wall; block behind the sensor. |
| 1 | Smart LED, 5 mm through-hole (WS2812D-F5 or PL9823), + 330 Ω resistor | In its holder behind the front grille, so it glows through it. The resistor goes in series on the data lead, under heat-shrink. A plain 5 mm LED will not do: it must be addressable. |
| 1 | PTFE dry spray and a light PTFE or lithium grease | Spray on the grooves and rod; a thin film of grease on the screw. |
| 2 | Wall screws 4 mm with plugs | Wall model only, 60 mm apart. |
From the kit, unchanged: Raspberry Pi Zero WH, microSD, SEN63C (indoor) or SEN65 (outdoor) with the JST-GH lead, Adafruit SEN6x STEMMA QT power adapter, Qwiic-to-jumper cable (CAB-17261), 5 V 2.5 A adapter. No battery since 2026-09-28: the unit runs from the mains, and a read-only SD card will protect it when the power drops.
A lead screw. The motor turns the screw 8 mm of travel per turn, and the carriage, held straight by the posts, carries the rod up and down with it. The motion is linear: every millimetre costs the same number of steps (512 half-steps). The motor's 64:1 gearbox holds the flower in place with the power off. At the bottom the rod boss lands on the stop post. The controller finds home by driving down onto it on purpose; the gearbox skips harmlessly there. The flower uses 47.5 mm of travel, from the stop to about 1 mm under the roof sleeve.