Hello! Welcome to this project! :D
Since the dawn of time, people have wondered whether or not people are available to chat. AOL Instant Messenger was one of the solutions humankind's smartest people created to solve this problem. One could simply change their status and ALL their most important friends and family would instantly know what they were up to. Were they Available, were they Home, were they Away? Up until that time, no one would know! AOL Instant Messenger created the Roman style empire that Skype and Google Chat built their Colosseums on. But like the Romans, the empire eventually died due to a hard pivot towards being all business. Skype became Teams and disappeared from friend groups. Google Chat became Google Meet and no one knew what to google to find it due to the plethora of ads at the top of result. Slack and Discord arose but those are much more about updating a specific thread than being an invitation to chat. I'm sure some people have something that could possibly fill the void that AOL Instant Messenger but I can't be bothered to look - nor do I want to know BECAUSE we're going to make something better. We're going to make a physical status board that will hang on the wall and will be able to update the status of friends as they update the board. We'll use an IoT device and a custom PCB and some 3D printing to make a cute little device that you can make and setup to give to your tight group of friends so you know whether they're game to game or just game to have a six hour phone call about the benefits of sky diving.
GoalsThe goals of this project are very simple and are to DRASTICALLY IMPACT ALL OF HUMAN EXISTENCE! If that seems too difficult or not really that desired, then our goals should be split in to a few parts:
1. Build a custom PCB that has a bunch of lights
2. Connect that custom PCB to the interwebs
3. Update statuses in a somewhat secure way (I don't want to share that I am free to chat to just anyone).
4. Make an enclosure that looks retro but something you might actually use
5. Make a bunch of them (idk, three? Three is a relatively doable number I think).
Enclosure InspirationIt should give retro, it should give fun, and most importantly, it should give some sort of usefulness.
I had a mac mini (shout out to 2005!) and so a lot of my experience using chats was centered around iChat which was one of the better iterations of the whole chat room experience. I liked it because it would give someone's name and using the circle, you could tell if a person was active on their computer, yellow was away from their computer and red was like "don't message me." I think adding the status below like in the below picture would be too complicated to implement but I do like having people's names and status colors - more colors the better! Rainbow of colors!
We're going to make the image that I made at the top of this article. I spent way too long working on that and I don't want to spend a lot of time describing a picture that you should have already seen. If you didn't look at the picture at the top and don't care to look, here's what it describes:
There are 5 columns: First column is for names of cool people you know/would like to talk to sometimes, columns 2 to 5 are for statuses (like 'up to chat' or 'someone please pretend that there's an emergency so that I don't have to keep this conversation going with my in-laws, I'm desperate' or 'sleeping').
The bottom row is for you, the user, to update your own status so you can tell these cool people you know that you're also desperate for someone to fake an emergency so you can get out of a dinner that your in-laws insist on you coming to to discuss politics, religion, money and also your diet/exercise habits. You have some buttons that you can press to update it and a little row of lights so you know that the status actually updated.
In summary: we need a bunch of LEDs in a grid and a row of buttons. The entire thing shouldn't be huge but it doesn't need to be tiny. Enough to mount on a wall maybe.
What the collective 'we' settled on was to have five columns of LEDs and configured it for four people (including you, the person who is definitely going to build this). There will be a row of buttons under the bottom row of LEDs and that'll allow you to change your status. We'll 3D print an enclosure and print out a piece of paper that you can attach to the front so that you can personalize it a bit.
How Does This Thing Work?Does anyone know that answer? You will, by continuing on the journey that is this seemingly meander-y document.
We're going to use Adafruit IO to handle the status updates. There are other things you could use but I like Adafruit and I paid whatever their subscription costs so I'm going to use them. We're also going to use a Raspberry Pico W because I also like those and they're very cheap. We'll use some Neopixels which have a more official name somewhere else but I'm not going to find it and we're going to use the most generic buttons one can buy.
The structure of the software looks like this:
The Pico knows what number it is (U1, U2, U3, or U4) so it knows what the bottom row should be. Initially I'm just going to assign a color to each unit (so if it's in red, you know that U1).
The LEDs are arranged so that you have D1 through D20 but they're arranged like a snake to be more space efficient on the PCB design.
What this results in is:
- D20 to D16 -> Top Row (notice how it's going down?)
- D10 to D15 -> 2nd Row (notice how it's going up?)
- D10 to D6 -> 3rd Row
- D1 to D5 -> Bottom Row (notice how I didn't say anything about the direction for the 3rd row because you got it!)
The Pico connects to the internet and asks Adafruit IO for statuses. Adafruit IO verifies that the Pico has the right credentials and gives it to the device.
The Pico then updates the status on the board according to the rows.
So for U1:
- Top Row: U2's status
- 2nd Row: U3's status
- 3rd Row: U4's status
- Bottom Row: U1's status
Because of this snake pattern, we have to calculate what the status means:
- Top Row: 21-(U2's status)
- 2nd Row: 14+(U3's status)
- 3rd Row: 11-(U4's status)
- Bottom Row: (U1's status)
So if all of their status was just "1" meaning they were all Home, we'd expect:
- Top Row: 21 - 1 = D20
- 2nd Row: 14 + 1 = D15
- 3rd Row: 11 - 1 = D10
- Bottom Row: 1 = D1
And then we have to do that for all of the other boards but the same logic applies.
U2:
- Top Row: U1's status
- 2nd Row: U3's status
- 3rd Row: U4's status
- Bottom Row: U2's status
U3:
- Top Row: U1's status
- 2nd Row: U2's status
- 3rd Row: U4's status
- Bottom Row: U3's status
U4:
- Top Row: U1's status
- 2nd Row: U2's status
- 3rd Row: U3's status
- Bottom Row: U4's status
When you press a button, it will determine which button was pressed and then send that status to Adafruit IO for the other devices to pull down from. For now, we're just going to have it be hardwired (using the Pico's micro USB cable) but it can be expanded to be battery powered at a later date.
A Brief Description of how we know which button has been pressedBecause we have several buttons and only one is going to be pressed at a time, we're going to do something slightly clever and use an analog signal instead of multiple digital inputs.
The way we accomplish this is using our very good friend, a voltage divider.
If each button is tied to a different sized resistor, when the button is pressed, the voltage read on the analog input will be different. We can then give a minimum threshold for each button so we know which one is pressed. If the value is above 4V, we know it's the most extremely sized resistor and we can adjust.
- If B1 (SW1) is pressed: 1000 / (1000 + 10) = 99%
- If B2 (SW2) is pressed: 1000 / (1000 + 100) = 91%
- If B3 (SW3) is pressed: 1000 / (1000 + 500) = 67%
- If B4 (SW4) is pressed: 1000 / (1000 + 1000) = 50%
- If B5 (SW5) is pressed: 1000 / (1000 + 2000) = 33%
So if we receive more than 99% of the signal (3.26V or 1013 for analog input) then we know it's B1. If it's not B1, see if it's B2. If not B2, check if B3. If not B3 check if B4. If not B4, check if B5 (1.09V or 338 for analog value). If not B5, no button is currently being pressed.
How We Convert a 3.3V Output Signal to Control 5V circuitsWith a Single Power Supply, Single Buffer Gate with 3-State Output, CMOS Logic Level Shifter Level Shifter, SOT-23-5! So these Neopixels (also known as WS2812B in case you wanted to buy a cheap version of it) they require 5V to run. Technically they need 5V. I've used 3.3V and no capacitors before and it works fine as far as I can tell although some of the colors start to look ugly. I wanted really vibrant colors so I used a Boost Circuit:
We use a Single Power Supply, Single Buffer Gate with 3-State Output, CMOS Logic Level Shifter Level Shifter, SOT-23-5. It takes in the NeoPixel input and then D_IN goes to the Neopixel Chain.
We also ground the neopixel input so that it isn't reading something close to 0V but not 0V when we aren't sending a signal.
NeoPixel CircuitContinuing on our D_IN tag. It goes into the first neopixel which is chained with all of the other one.
The things to notice are:
A) Wow! This is such a clean and readable circuit!
B) I've left open a connector at the end of the Neopixel chain so I can test the voltages/outputs
C) The capacitors are because the datasheets suggest them to be there and as close as possible to the neopixel
D) All of the above!
Trick question, that wasn't a question.
Raspberry Pi Pico W CircuitI wanted a sixth button so that I could reset the Pico W from the front if needed. I also opted to have blank headers in case there was an issue with any pins, I could do something a little funky and get it to work. You can see that I have a bunch of power pins which were also for troubleshooting. I had micro USB power from the board, potentially battery power, I needed to step it up to 5V and also wanted to confirm the 3.3V power worked.
I think the circuit is relatively boring but just gives me a lot of options in case something is incorrect.
Unused but could be used Battery Charging CircuitSo I based this circuit off of the suggested battery charging diagram that you can find in the technical description of the MCP73831-2-OT. This will theoretically charge your battery. +5V would come from the micro USB power and would allow for the lithium battery to charge up. Once the micro USB cable is unplugged, the circuit shuts off and the battery can be used.
The primary reason why this circuit wasn't used at this time is because the SMD is really small for this and I couldn't figure out a non-bad way to solder it to the plate (I'd need a stencil made).
Unused but Stable 5V CircuitOnce the micro USB cable is disconnected, the power switches so that Raspberry Pi Pico W continues to function and can turn on lights and stuff. The Pico W would hold the Boost_EN on as much as it possibly could. When the device loses all power, Boost_EN turns off and everything needs to be powered again.
This circuit wasn't used at this time but it's there whenever I decide to make a stencil and see if it works out OK.
PCB DesignFinally! You've made it to approximately the 2, 000 word mark and you have yet to see how it was designed!
So the back of the circuit was more just to move stuff around. I wasn't planning on using the back for anything other than the SMD soldering and placing the Pico W. I knew that I wanted the Pico W's micro USB power to be easily gotten to from the side of it. I also have the battery connector (not used at this time) on the back so the eventual one could hide the battery behind everything.
All the buttons and LEDs and the resistors and capacitors because they're surface mounted. I also added in a big tiki mask design in the middle for fun.
PurchasingSo KiCAD has this plugin that you can get for PCBWay. It's annoyingly easy to do it so that's what I do.
These were the renderings I got from PCBWay
Front looks the same. Less cyber punk red but I thought blue would look nice (also my 3D filament is blue so figured it would blend in).
And then here they are as I received them:
And it looks pretty good I think.
I lied before about how these arrived. This is one of the 5 that I messed with trying to do the battery circuit and I had a terrible time because the size is too small. Other than that, it looks the same as what my KiCAD files look like.
PCB AssemblyThis part is kind of boring. You solder all the components. If you get a stencil it would be way easier to do this but I didn't so it wasn't. This is what it looks like once it's done:
Because I'm not using any of the battery charging circuitry (look how small U1 is!), I left the entire top blank. You can also see my breakout pins for the Pico W in case I want to test stuff later.
Now that all of the important stuff is done, we can get to the really important stuff like the enclosure that it goes in. I used a 3D Printer and a printout for the front but you could make it out of cardboard if you'd like? Or out of wood? Idk your skills but this is what the 3D model looks like:
And then the back:
I made a place for us to maybe hang it. I might but you'll probably want some blue tack (BlueTak? Idk what it's actually called). You could also put a little magnetic strip at the top and then you could put it on your fridge. The battery could be glued to that side part that's just going to be for the label later.
Once it's all made, this is what it looks like:
I didn't intentionally make this two toned - I ran out of filament partway through the process.
This is an earlier model than the one I showed because it's missing the hole at the top and the stand at the bottom but it's good enough for now.
ArtI needed to find a spot to place all the excellent graphic work that I did and this was the best place to put it I guess.
You could change the text or write in people's names ahead of time or just leave it all blank. Those bottom buttons need to be cut out but it only takes a few minutes so it's all good.
ProgrammingIt's a Pico W and I used Thonny. You can read the process for programming so I'm not going to waste your valuable time considering we are a brief 2720 words into this documented process not including the like title page and components and stuff. Here's what Raspberry Pi points to when you google it - https://projects.raspberrypi.org/en/projects/getting-started-with-the-pico/2
DemonstrationAt this point, I think you know it works right? Right? RIGHT!?!
Anyway, here's a video of it working:
Final ThoughtsWell if you followed all of that and replicated it for yourself, good for you! There are things that could be improved for a Rev 2 like making the battery charger circuit bigger, making traces a bit bigger in places and configuring it so it can charge with USB C instead of micro USB. I hope you liked what I made and maybe you get to try it too!












Comments