SchoolAir · physical air-quality indicator

Wilting Flower Assembly

Sheet
Exploded view and build order
Rev
H · 2026-10-06 · bench reprint: limit switches, stem gland, rim band, gusseted guide posts
Source
wilting-flower.scad, breakout.scad
Units
mm

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.

Exploded view

Exploded rendering of the wilting flower, bottom to top: dock base with the Pi, sensor and driver board; the stepper motor; the dock lid with two gusseted guide posts and the stop post; the limit-switch bracket; the coupler; the lead screw; the carriage with its switch flag; the drive rod; the vase shell; the stem gland; the dish; the gland nut; the rim band; and the stem beside them
Parts lifted apart along the assembly axis, rendered from the CAD file. Electronics are drawn as blocks at their real sizes. The motor is shown lifted out of the dock; in the unit it hangs under the lid, inside the dock. The switch bracket (7) is drawn pulled back from the post ends it screws to.
№PartWhat it doesSource
1Dock baseRounded 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
2Raspberry Pi Zero WHAlong 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
3Air sensor, SEN63C or SEN65SEN63C 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
4ULN2003 driver boardOn 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
5Stepper motor 28BYJ-48, 5 VFace 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
6Dock lidThe 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
7Limit-switch bracket and two switchesTwo 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
8Coupler⌀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
9Lead screw Tr8×88 mm trapezoidal, four starts, 8 mm per turn, 100 long. The motor turns it; it never moves up or down itself.buy · Tr8×8
10CarriageSleeve 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
11Switch flagScrews 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
12Drive rodM3 threaded rod, 146 long, bottom flush with the boss. Slides up inside the stem. Round its top tip.buy · M3 rod
13Pot shellThe 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
14Stem glandIts 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
15Planter dishShallow 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
16Gland nutIts 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
17Rim bandThe 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
18Stem and flowerThe 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

Build order

  1. Dock electronics. Stick the four rubber feet under the corners. Screw the Pi (2) to its standoffs (M2.5 × 6), the driver board (4) to its posts (M3 × 6) and the sensor's power adapter to its posts at the front-right (M2.5 × 6). Push the LED into its holder behind the front grille from the back, until its rim stops; the leads come out the back. Run the Qwiic-to-jumper cable from one of the adapter's Qwiic ports to the Pi's I2C pins and leave the other port free. Fit the 1000 µF capacitor across the driver's 5 V and ground, long leg to 5 V.
  2. Sensor. Stick the gasket frame to the inside of the right wall behind the grille, with its divider between the two zones. Drop the sensor (3) into its pocket openings-first, push the foam block in behind it and plug its lead into the power adapter.
  3. Motor under the lid. Turn the lid (6) over. Push the motor's (5) shaft up through the lid's hole from below, ears flat against the underside, lead pointing to the back. Drive two M3 × 6 self-tapping screws through the ears into the lid. Firm, not tight: the screws cut their own thread in the plastic.
  4. Coupler. Lid the right way up. Press the coupler (8) onto the D-shaft with the flats aligned, until it sits 0.5 mm above the lid. Turn its grub-screw holes toward the open side between the posts, so a key can reach them.
  5. Screw and carriage. Screw the switch flag (11) under the carriage's tabs with two M2 × 8. Thread the carriage (10) onto the top of the screw (9), sleeve end first. It should turn on with light finger force; if it binds, stop and reprint rather than force it. Lower the screw into the coupler's top pocket with the carriage's tabs sliding down the post grooves. Push the screw to the bottom of the pocket and tighten both grub screws on the thread.
  6. Home by hand. Turn the coupler slowly (the motor's gearbox makes it stiff) until the carriage's rod boss rests on the stop post. That is home, the wilted position, and the position a kit ships in.
  7. Rod. Round the top tip of the M3 rod (12) with a file. Feed it down through the boss from above until its bottom is flush with the boss's underside, then tighten the M3 × 6 set screw.
  8. Limit switches. Screw both switches to the bracket (7) with M2 × 12, nuts in the slotted pockets, the free end of each lever toward the middle. Screw the bracket to the back ends of the posts with four M2 × 12 self-tapping screws. Solder a lead to the C and NC tabs of each switch, heat-shrink, lay the leads in the bracket's channel and down through the 5 mm hole in the lid; two stick-on clips under the lid keep them clear of the motor. Slide each switch in its slots until the bottom one clicks just before the boss lands on the stop and the top one clicks at erect.
  9. Wiring, lid into base. Plug the motor lead into the driver board's socket. Six jumpers from the board to the Pi header, plus the four switch leads (pins to be set with the firmware): IN1–IN4 to pins 11, 13, 15 and 16 (GPIO17, 27, 22, 23), + to pin 2 (5 V), − to pin 9 (ground). On a flower unit, add the strap: one jumper link from pin 37 (GPIO26) to pin 39 (ground), which tells the firmware a flower is fitted. Drop the lid in with its clipped corner at the back-left; it rests on the ledge and clicks under the barbs. To open it later, lift its edge at the notch in the back wall.
  10. Shell, dish, stem. Press the stem gland's (14) foot into the bore in the roof of the shell (13) with a drop of CA, flange on the roof, collet up. Set the dish (15) on the roof, not glued; its centre hole goes over the collet. Run the gland nut (16) onto the collet a few turns. Feed the stem (18) down through the nut and the gland until about 20 mm shows below the roof, set the height you want, and tighten the nut by hand until the tube is held. No glue on the tube: loosen the nut to adjust the stem later.
  11. Lock the vase. Guide the rod up through the throat into the stem and lower the shell over the posts, with its slots over the three lugs. Press down and turn 30° clockwise until it stops. To remove, turn back and lift.
  12. Rim band. Glue the NFC tag into the pocket inside the rim band (17), behind the lettering. Drop the band over the top of the vase until its lip rests on the dish's rim, and turn it until SCHOOLAIR.ORG faces the room. If the flower head is wider than 111 mm, fit the band before the head.
  13. Flower on, power up. Push the weighted head into the top of the stem and dress the dish with moss or gravel. Plug in the 5 V adapter. On first power-up the flower runs a full cycle as a self-test: down to the stop, up to erect, then to the height for the current air. On a wall: two screws 60 mm apart, slide the dock down onto them.
The carriage cannot turn: its tabs sit in the post grooves, so turning the screw can only move it up or down. The sliding pairs are the printed nut on the screw, the tabs in the grooves and the rod in the stem. Lubricate them lightly and differently: a thin film of PTFE or light lithium grease on the screw, and dry PTFE spray elsewhere. Do not use the water-based cable gel; it dries and gums. The shell can seat in any of three positions 120° apart, since nothing inside depends on its rotation; the rim band, not the shell, sets where the lettering faces.

Order list for one unit

Everything not printed, grouped by where it goes. Quantities are per unit; most items come in packs.

QtyItemWhere it goes
128BYJ-48 stepper, 5 V, with ULN2003 driver boardMotor 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.
1Tr8×8 lead screw, 100 mmIn the coupler. Screw only; the nut is printed into the carriage.
2M3 × 6 self-tappingMotor ears into the lid, from below.
2M3 × 4 grub screwsLead screw in the coupler.
1M3 × 6 self-tappingRod set screw in the carriage boss.
1 + 1Stem 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.
1M3 threaded rod, 146 mmDrive rod, in the carriage boss. Round the top tip.
6Jumper wires, female–female, 10–20 cm, 2.54 mm DuPontDriver board to the Pi header. The shorter the better: long wires fill the dock.
1Jumper link, 2.54 mmFlower strap: Pi pin 37 (GPIO26) to pin 39 (ground). Tells the firmware a flower is fitted; left off on the box model.
11000 µF 10 V electrolytic capacitorAcross 5 V and ground at the driver board.
1Flower with its 150 mm hollow stem, washers to 12 gStem through the gland in the roof; washers on the head's stub.
4Rubber feet, stick-on, 3 mm highUnder the dock's corners.
8M2.5 × 6 self-tappingPi Zero to its standoffs, and the sensor's power adapter to its posts.
4M3 × 6 self-tappingDriver board to its posts.
2Lever micro-switches, SS-5 size (20 × 9.7 × 6.5, hinge lever)Limit switches, top and bottom, on the bracket. Wire common + normally closed.
4M2 × 12 screws + M2 nutsSwitches to the bracket; nuts in the slotted pockets.
4M2 × 12 self-tappingSwitch bracket to the post ends.
2M2 × 8 self-tappingFlag under the carriage tabs.
4Female jumper leads, 20 cmSwitch leads to the Pi header; cut ends soldered to the C and NC tabs, heat-shrink.
2Stick-on cable clips, smallUnder the lid, holding the switch leads clear of the motor.
1NFC sticker, NTAG213, about 20 × 8 mmPocket inside the rim band, behind the lettering; written with the portal link and locked.
1EPDM foam 3 mm self-adhesive, and a 4 mm foam blockSensor gasket frame against the right wall; block behind the sensor.
1Smart LED, 5 mm through-hole (WS2812D-F5 or PL9823), + 330 Ω resistorIn 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.
1PTFE dry spray and a light PTFE or lithium greaseSpray on the grooves and rod; a thin film of grease on the screw.
2Wall screws 4 mm with plugsWall 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.

How it moves

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.

lid motor, under the lid coupler Tr8×8 screw, turns stop post carriage + printed nut drive rod, up into the stem 47.5 wilted 0 (25) horizontal 5 (30) leaning 20.5 (45.5) erect 47.5 (72.5) rod boss height, mm
Schematic, to scale in height: the carriage on the stop at wilted (solid) and at erect (dashed). Heights are above the stop post; the numbers in brackets are above the older, lower stop, which is the frame the controller's calibration uses.