This project makes a weather cloud using a Raspberry Pi Zero W. It connects to the Yahoo Weather API and depending on the forecast for the next day changes colors.
I was inspired by the Wisconsin Gas Building that has a flame on the roof that changes depending on the forecast. Its an iconic landmark in Milwaukee, WI.
The following poem goes with it.
When the flame is red, it’s warm weather ahead!
When the flame is gold, watch out for cold!
When the flame is blue, there’s no change in view!
When there’s a flickering flame, expect snow or rain!
I thought a cloud would look nicer on the wall. For the code if the forecasted high for the next day is greater than 10% warmer it will be red, if the forecasted low is more than 10% colder it will be gold. But just in case both criteria are met the color red will always win. If neither criteria is met the cloud stays blue. If there is any rain or snow in the forecast it will blink.
Step 1: Update 2019
It looks like Yahoo has discontinued this API that I used for this. So currently this guide will not work for that portion. More info can be seen at https://developer.yahoo.com/weather/
Step 2: Parts Needed
- Neopixels Strip - 60 LEDS per meter
- Sawtooth Picture Frame Hangers
- 3M SJ5302 Clear Bumpon
- 1/2 in. x 6 in. x 3 ft. S4S Oak Board
- 1/8" Hardboard
- 1/8" Acrylic White Translucent
- 1/8" wood dowel
- Watco Natural Danish Oil Wood Finish also Dark Walnut optional for some of extra clouds
- Wood Glue
- Hot Glue Gun
- Staple gun
- Silicone Cover Stranded-Core Wire - 25ft 26AWG - Red, Black, and Blue
- Raspberry Pi Zero W
- Micro SD Card
- USB Cable White - or cut apart one you got laying around
Step 3: Cutout the Parts
I have included the svg file for cutting these out. As you see there is 4 layers. You may see in the rest of the guide that i have my parts flipped because I had a cut mishap on the top layer and flipped it to hide the blemish.
On layer 2 & 4 there needs to be a 1/8 deep inset between the inner path and middle path. That will allow the diffuser and backplate to be recessed in. I used translucent acrylic for the diffuser and hardboard for the backplate.
This was the preview image on my Shapeoko3 before cutting the parts out. We reuse the inside clouds later in the guide, so don't trash them.
The cloud shape used was from softicons.com since my drawing skills are not as good.
Step 4: Assemble the Cloud
Once the parts are cut you can glue it together, only two pieces need the glue. The 1/8 dowel is then put in the holes to help align. I didn't use any glue in those so I could remove them once the layers are glued together.
Use some clamps to keep the parts tight together while drying. Wipe away any excess glue that spills out from the seams.
While the glue is drying I took the scrap pieces from the inside and sanded them down with 150 grit and then 220 grit. I then applied a wipe on stain. I used Watco Danish Oil in Dark Walnut for some and Natural for the others. With a clean cloth put some stain on and just wipe on the clouds. Set aside and let dry. Make sure to properly hang out cloth to dry so it doesn't combust from the oils.
It is also a good time to stain the top layer. This way you aren't getting stain all over the diffuser later on.
Stain the main cloud
Once the glue is dry you can then sand and stain the main cloud using the natural danish oil.
Step 5: Add the Neopixel Strip
To determine the amount of the strip needed I set it inside and made sure it reached all parts. I ended up using 19 strips. But after gluing realized I should have used 20.
I then removed the rubber sheath around the strip since I didn't need that part. Now I needed to add wires to the strip to attach to the Pi Zero.
I've found it works better if you pre-solder the end on the strip along with the ends of the wire.
Now solder the wires to strip.
With the back inset plate on apply a dab of hot glue to a few spots to hold the NeoPixel strip to the edges of the cloud. Try to keep the strip as close to the back plate as possible. As you can see here I should've used another LED on the strip.
Step 6: Add the Diffuser and Top Layer
Set the diffuser layer in the inset and apply a light amount of glue around the the top.
Now same as before attach the top layer and clamp it down. Make sure to align it to the other layers as best as possible and wipe away in excess glue.
Step 7: Solder It Up
Wiring is pretty simple for this.
GPIO 18 on the Pi to Din Neopixel
5V from Pi to 5V Neopixel
GND from Pi to GND Neopixel
Before soldering the USB cable we need to drill a hole for it. My cord was a tad under 3mm so I drilled a hole using a 3mm bit making sure not to drill in to the neopixel strip.
Cut off the end off that doesnt have the Male end that plugs in to the computer. Then remove some of the shielding to access the wires. We only need the Red(5V) and Black(GND) wires.
Here is how it should look all soldered up.
Step 8: Setup the Pi
First thing needed is a sd card the the operating system loaded. I used Raspbian Jessie Lite.
Use a program such as etcher.io to burn the image to the sd card. Once that is complete we will need to add two files to the boot directory so the pi will have ssh enabled and the correct wifi information.
Open the wpa_supplicant.conf file with a text editor and put your wifi ssid and password in it. Then add the file to the sd card. To enable ssh we just need a file labeled ssh with no extensions put on the sd card also.
A better explanation of this can also be found on this guide at adafruit.com
Connect to Pi
I use a program called putty and SSH in to the Pi. Some documentation on doing this can be found on the Raspberry Pi website.
One difference is there they have you find the IP of the pi. I have found it easier to just use the hostname to connect which is raspberrypi.local
Install libraries needed
First we need pip so run this command
sudo apt-get install python-pip
Now we can install requests.
pip install requests
sudo apt-get install build-essential python-dev git scons swig
After that we run these commands
git clone <a href="https://github.com/jgarff/rpi_ws281x.git"> https://github.com/jgarff/rpi_ws281x.git > cd rpi_ws281x scons
cd python sudo python setup.py install
Now the required libraries should all be installed.
Get the program on the Pi
I would recommend getting the files from the GitHub repository as the code may change or be fixed at some times. https://github.com/keebie81/Weather-Forecast-Cloud
You can cut and paste the contents into a new file or use WinSCP to transfer the files.
If cutting and pasting you will want to make a new file using this command
sudo nano cloud.py
Then paste in the contents of cloud.py
Once you there you might need to change a few values. If you used a different amount of NeoPixels or GPIO pin
If the amount of NeoPixels used is different change LED_COUNT. Same if the GPIO pin used is different change LED_PIN
Also on line 72 you need the change the location, unless you want the forecast for sheboygan.
Run the code
Once you got your changes made you can test out the code.
sudo python cloud.py
The cloud should light up now and in the terminal window you should see it output what today's high and low is along with tomorrows high and low.
Set to auto run at startup
To configure auto start I followed this guide from the Raspberry Pi website
This is the line of code I added to the rc.local file.
python /home/pi/cloud.py &
Step 9: Finish Assembly
I used a marker to measure and try to find center as best as I could. I then attached the sawtooth hangers and then two rubber bumpers.
To attach the Pi I went back to my trusty hot glue gun and put a dab of hot glue on the back of the Pi and attached it to the back panel.
I used a screwdriver to create a space in the staple.
I then bend the staples over to hold the back plate in.
Finish up small clouds
The small clouds each need a hanger and two bumpers.
Step 10: 3d Printing
I have also included the STL files for if you do not have access to wood CNC machine. The Autodesk Fusion 360 design file is also included. That way you can modify the design to optimize for printing.
Step 11: Final Thoughts
This project came out pretty well. I really like the look of the oak compared to the MDF in another project I did. I would have liked to do this with a esp8266 board but my skills with the Arduino IDE and JSON isnt as good as with the Pi.
Some future additions to this project would be a 7 segment display behind the diffuser so it could show the current temperature also.
I have also put the files up GitHub and added code for if you have a Pimoroni Blinkt, Pimoroni Unicorn PHAT or a Raspberry PI Sense Hat
Grand Prize in the
Internet of Things Contest 2017
Runner Up in the
Second Prize in the
Lights Contest 2017