Complete DIY Raspberry Pi Weather Station with Software

Picture of Complete DIY Raspberry Pi Weather Station with Software

Back in late February I saw this post on the Raspberry Pi site.…

They had created Raspberry Pi Weather Stations for Schools. I totally wanted one! But at that time (and I believe still as of writing this) they are not publicly available (you need to be in a select group of testers). Well, I wanted on and I didn’t feel like shelling out hundreds of dollars for an existing 3rd party system.

So, like a good Instructable user, I decided to make my own!!!

I did a little research and found some good commercial systems I could base mine off. I found some good Instructables to help with some of the Sensor or Raspberry PI concepts. I even found this site, which was pay dirt, they had tore down an existing Maplin system:

Fast forward about a month and I have a basic working system. This is a complete Raspberry Pi Weather system with just the base Raspberry Pi hardware, camera, and some assorted analog and digital sensors to make our measurements. No buying pre-made anemometers or rain gauges, we are making our own! Here’s it’s features:

  • Records info to RRD and CSV, so can be manipulated or exported/imported to other formats.
  • Uses the Weather Underground API to get cool info like historical highs and lows, moon phases, and sunrise/sunset.
  • Uses the Raspberry Pi Camera to take a picture once a minute (you can then use them to make timelapses).
  • Has webpages that display the data for the current conditions and some historical (last hour, day, 7 days, month, year). The website theme changes with the time of day (4 options: sunrise, sunset, day and night).

All of the software for record and displaying the information is in a Github, I’ve even done some bug tracking, feature requests in there as well:…

This project was a great learning experience for me, I got to really dive into the capabilities of the Raspberry Pi especially with the GPIO, and I hit some learning pain points as well. I hope you, the reader, can learn from some of my trials and tribulations.

Step 1: Materials

Picture of Materials



  • Raspberry Pi – I used the B+
  • Wireless adapter
  • Pi Camera
  • A solid 5V power adapter (this turned out to be painfully annoying, I eventually got the Adafruit one, otherwise the camera pulls too much juice and can/will hang the Pi, it’s here:


  • 2 Thrust Bearings (or skateboard or roller-skate bearings will work too), I got these on Amazon:
  • 2 Waterproof Enclosures (I used an electrical enclosure from the local big box store), doesn’t matter much, just need to find a good size enclosure that’s going to have enough space and protect everything).
  • Some PVC Pipe and End Caps (various sizes).
  • PVC mount brackets
  • Couple sheets of thin Plexiglass (nothing too fancy).
  • plastic standoffs
  • mini screws (I used #4 bolts and nuts).
  • 2 Plastic Christmas Tree Ornament – used for the anemometer, I got mine at the local Hobby Lobby.
  • Small dowel
  • Small piece of plywood.


  • Dremel
  • Glue Gun
  • Soldering Iron
  • Multimeter
  • Drill

Step 2: Main Enclosure – Pi, GPS, Camera, Light

The main enclosure houses the PI, the Camera, the GPS and the light sensor. It is designed to be waterproof since it houses all the critical components, the measurements are taking from the remote enclosure and that one is designed to be exposed/open to the elements.


Pick an enclosure, I used an electrical junction box, various project boxes and waterproof cases will work just as well. Key point is it has enough space to hold everything.

My Enclosure contains:

  • The raspberry pi (on standoffs) – Needs a WIFI chip, don’t want to be running Cat5e into the backyard!
  • The Camera (also on standoffs)
  • The GPS chip, connected via USB (using a sparkfun FTDI cable: – The GPS provides latitude and longitude, which is nice, but more importantly, I can get accurate time from the GPS!
  • two ethernet/cat 5 jacks to connect the Main enclosure to the other enclosure that houses the other sensors. This was just a convenient way of having cables going between the two boxes, I have roughly 12 wires, and the two cat5 provide 16 possible connections, so I have room to expand/change things around.

There is a window in the front of my enclosure for the Camera to see out of. The case with this window protects the camera, but I did have issues where the red led on the camera (when it’s taking a photo) reflects off the plexiglass and shows up in the photo. I used some black tape to mitigate this and try and block it (and other LEDs from the Pi and GPS), but it’s not 100% yet.

Step 3: ‘Remote Enclosure’ for Temperature, Humidity, Pressure

Picture of 'Remote Enclosure' for Temperature, Humidity, Pressure

This is where I stored the Temperature, Humidity, and Pressure sensors as well as the “hook ups” for the rain gauge, wind direction and wind speed sensors.

It’s all very straightforward, pins here connect via the ethernet cables to the required pins on the Raspberry Pi.

I tried to use Digital sensors where I could and then any Analog are added on to the MCP 3008 it takes up to 8 analog which was more than enough for my needs, but gives room to improve / expand.

This enclosure is open to the air (it has to be for accurate temperature, humidity and pressure). The bottom holes are popped out, so I gave some of the circuits a spray of a Silicone Conformal Coating spray (you can get it online or a place like Fry’s Electronics). Hopefully it should protect the metal from any moisture, though you have to be careful and not use it on some of the sensors.

The top of the enclosure is also where the wind speed sensor fits. It was a toss up, I could have put the wind speed or wind direction on top, I didn’t see any major advantages of one over the other. Overall you want both sensors (wind dir and speed) high enough where buildings, fences, obstacles don’t interfere with the measurements.

Step 4: Rain Gauge

I mostly followed this instructable to make the actual gauge:…

I made this out of plexiglass so I could see what was going on and I thought it would be cool. Overall the plexiglass worked ok, but combined with the Gluegun, rubber sealant and overall cutting and drilling it doesn’t stay looking that pristine, even with the protective film.

Key points:

  • The sensor is a simple reed switch and magnet treated like a button press in the RaspberryPi code, I simple count buckets over time and then make the conversion later to “inches of rain”.
  • Make it big enough to hold enough water to tip, but not so much that it needs a lot in order to tip. My first pass I made each tray not large enough so it would fill and start draining over the edge before it tipped.
  • I also found that residual water could add some error to the measurement. Meaning, completely dry it took X drops to fill a side and tip it, once wet it took Y drops (which is less than X) to fill and tip. Not a huge amount but came into affect when trying to calibrate and get a good “1 load equals how much” measurement.
  • Balance it, you can cheat by adding gluegun glue to the underneath ends if one side is vastly heavier then the other, but you need it as close to balanced as you can.
  • You can see in the photo I setup a little testing rig using some sponges and a wood holder to test and get it balanced properly before installing.

Step 5: Wind Direction

This was a simple weather vane. I based the electronics off the Maplin system:

Key Points:

  • This is an analog sensor. The eight reed switches combined with various resistors divide up the output into chunks so I can identify which coordinate the sensor is in by the value. (The concept is explained out in this instructable:…
  • After screwing on the weather vane part you do need to calibrate it so that “this direction is what points north”.
  • I made a test rig with wood so that I could switch in and out resistors easily that covered the full range of values for me, that was super helpful!
  • I used a thrust bearing, it did fine, I’m sure a regular skateboard or rollerskate bearing would have been just as fine.

Step 6: Wind Speed

Picture of Wind Speed

This one I once again turned to the Instructable community and found and followed this instructable:…

Key points:

  • You can use the hall sensor or switch to a reed sensor as well. The hall sensor is more of an analog sensor so if you are using it in a digital way, like a button press, you need to make sure the reading/voltage is high enough that it acts like a true button press, rather than not enough.
  • Size of the cup is crucial, so is the length of the stick! Originally I used ping pong balls and they were way too small. I also put them on long sticks which didn’t work either. I got very frustrated and then came across that instructable, Ptorelli did a great job explaining and it helped me out when my original design didn’t work as well.

Step 7: Software

Picture of Software

Software is written in Python to record the data from the sensors. I used some other 3rd party Git libraries from Adafruit and others to get the information from the sensors and GPS. There are also some cron jobs that pull some of the API information as well. Most is explained/outlined in the Git documentation at docs/install_notes.txt

The web software is in PHP to display it on the webpage while also utilizing YAML for the config files and of course the RRD tool to store and graph the data.

It utilizes the Weather Underground API to get some of the interesting data that sensors can’t pull: Record Hi’s and Lows, Phase of the Moon, Sunset and Sunrise times, there’s also Tides available on their API, which I thought was really neat, but I live in Austin TX which is very far from water.

All of it is available on Github and is actively maintained and currently being used as I further refine and calibrate my own system, so you can submit feature requests and bug reports as well.

The software goes through a theme change depending on the time of day, there are 4 stages. If the current time is + or – 2 hrs from sunrise or sunset then you will get the sunrise and sunset themes, respectively (right now just a different background, I will probably do different font/border colors in the future). Likewise outside those ranges gives the day or night theme.