This repository contains the STL files to print the panel pieces, a detailed parts list, and helpful information for anyone looking to build a similar panel... More to follow! (I think my actual code would generate more questions than answers, which I would not have time to address, so for now, the code is not here.)
The STL files for the five panels are in the STL folder. The sixth panel is the Pi 7" touch screen assembly. I used Inland PLA+ gray filament. See the panel layout image below:
The frame is called a "Floater Frame" and for this project is 9.25 inches x 15.75 inches.
The panels are held in place with a combination of M2.5 and M3 nylon stand offs such as these. The M3 stand offs are drectly attached to the holes in the panels, while the M2.5 are used behind the LED seven segment displays to extend them to the back of the frame.
If you want the frame to mount flush to the wall, don't forget to drill extra space for any screw heads on the back of the frame!
For everything except the display:
Quantity | Part Description | Vendor/link | Notes |
---|---|---|---|
1 | M3 Nylon Stand Off Set | Amazon | |
1 | 3.3V Buck Regulator | SparkFun | |
1 | Tactile Push Button Caps, Black | Amazon | For top display |
1 | 2 pack 12x16 Inches Green Translucent Acrylic/Plexiglass Sheet | Amazon | Mounted in back of frame |
2 | 10Pcs Non Locking Push Button Switch 19x19mm with LED | Amazon | |
1 | Gel filter for 7 segment LEDs | Amazon | |
30 | 220 ohm 5% resistors | Various | |
10 | 1k ohm 5% resistors | Various | |
1 | Bi-Color (Red/Green) 24-Bar Bargraph w/I2C Backpack | Adafruit | |
3 | 3mm Plastic Bevel LED Holder - Pack of 5 | Adafruit | |
1 | Adafruit Perma-Proto 40-Pin Raspberry Pi Half-Size PCB Kit | Adafruit | |
3 | Adafruit MCP23017 I2C GPIO Expander Breakout | Adafruit | |
3 | Adafruit 0.56" 4-Digit 7-Segment Display with I2C Backpack - Red | Adafruit | |
1 | Key Switch 2PCS 16MM with Key Latching SPDT (2 Position 1NO1NC Round Yellow) | Amazon | For safe mode switching |
1 | Emergency Stop Mushroom Push Button Switch | DFRobot | For valve shutoff |
1 | Lystaii 320pcs M2 Nylon Hex Spacer Standoff Kit | Amazon | For mounting 7 seg displays |
1 | Colorful 12mm Square Tactile Button Switch Assortment | Adafruit | |
1 | CHANZON 100 pcs 3mm Red & Green Diffused LED Diode Lights Common Cathode | Amazon | |
3 | Radio Shack SPST Rocker Switch with LED #275-013 | Radio Shack | Bottom row - Discontinued |
2 | Raspberry Pi 3B+ with SD card | Various | Can probably be combined into one unit |
2 | Raspberry Pi POE HAT | Raspberry Pi | PoE+ HAT will not fit ribbon cable |
4 | GPIO Stacking Header | Adafruit | To allow ribbon cable and POE HAT - see notes |
1 | Diffused Red Indicator LED - 15mm Square | Adafruit | For alarm LED at top left |
1 | 5V Buzzer | Adafruit | |
1 | Pi Foundation Display - 7" Touchscreen | Raspberry Pi |
Additional items:
- wire, various sizes and gauges
- dupont cables, female
- various proto boards to mount tactile switches
- headers for PCBs
- floater frame, glue, and clamp (see above section)
- All of the LEDs and switches are connected directly to various Pi GPIO pins. (I'm using lgpio/rpi-lgpio for GPIO access)
- Everything else is connected via I2C Qwiic connectors
All of the software runs in containers, which can be accomplished using regular Docker or my favorite platform for embedded devices - balenaCloud. (Note that everything runs locally on the device with balena - the "cloud" part is an optional dashboard for updating, rebooting, and troubleshooting the Pi.)
Commands are sent to Home Assistant (when buttons are pressed) via the Home Assistant REST API: https://developers.home-assistant.io/docs/api/rest/ All the code is written in Python, and the Requests library is used to call the API.
The LEDs are updated based on real time updates from Home Assistant using Python and the web socket API: https://developers.home-assistant.io/docs/api/websocket
The touch display is running custom dashboards made for HADashboard which is part of a Home Assistant plugin called AppDaemon.
It's displayed on a Chromium browser in a container via a project called the browser block.