Tutorial: Part 9 -Building a Solar Powered Raspberry Pi Weather Station – GroveWeatherPi

GroveWeatherPi
Lightning Detector Pylon

Tutorial: Part 9 -Building a Solar Powered Raspberry Pi Weather Station – GroveWeatherPi

The Raspberry Pi is a fabulous device to on which to build your projects.    The GroveWeatherPi project is designed to show the capabilities of this computer while remaining accessible to a diverse Maker community.

GroveWeatherPi is a Solar Powered Raspberry Pi WiFi connected weather station designed for Makers by SwitchDoc Labs ( www.switchdoc.com). This is a great system to build and tinker with. All of it is modifiable and all source code is included.

This tutorial for building your own Solar Powered Weather Station based on the Raspberry Pi consists of 14 parts.

[include-page id=”gdplinks”]

3D Printed Parts

One of the big changes in the way people build prototypes is the availability of inexpensive 3D Printers.  It used to be difficult to build prototype cases and stands for various electronic projects.   Now it is easy to design a case in one of many types of 3D software and then print it out using your 3D Printer.   For the GroveWeatherPi,  we used OpenSCAD ( https://www.openscad.org ) to do the design.  OpenSCAD is a free 3D CAD system that appeals to programmers.   Rather than doing the entire design in a graphical environment, you write code (consisting of various objects, joined together or subtracted from each other) that you then compile in the environment to form a design in 3D space.

We have three 3D Printed Parts.   These can be ordered from store.switchdoc.com if you don’t wish to build your own.

GroveWeatherPi 3D Print Complete
GroveWeatherPi 3D Print Complete

Solar Panel Mount

The Solar Panel Mount is attached via 4 screws to the door of the BUD enclosure.   The solar panels are then slid into the slot at the top, holding the panels at a 45 degree angle which is optimal for the latitude at SwitchDoc Labs.   If you are building GroveWeatherPi elsewhere in the world, you may want to adjust it to match your latitude.   We are currently rethinking this friction fit bracket.  It loosens up in the hot sun and we had to apply some glue to make sure it will stay connected.

Solar Panel Mount
Solar Panel Mount

Following is the openSCAD code for the Solar Panel Mount.

// 
// WXPi Solar System
//
// SwitchDoc Labs - 08/08/2016
// 
//
// WXLink outside Solar
//


include <write.scad>
include <joints.scad>

 


difference()
{
    union()
    {
cube([30,70,30]);
        translate([0,-10,0])
        cube([30,90,2]);
    }


rotate([0,45,0])
translate([0,-5,10])
    cube([3,90,40]);
    
    translate([-5,-5,20])
    cube([40,80,30]);
    
    rotate([0,45,0])
translate([-15,-5,5])
    #cube([10,90,40]);
    
    translate([19,-5,15])
    #cube([15,90,6]);
    
    // screw holes
    translate([5,-5,-10])
    #cylinder(h=15, r=2.8);
    
        // screw holes
    translate([25,-5,-10])
    #cylinder(h=15, r=2.8);
    
    
        // screw holes
    translate([5,75,-10])
    #cylinder(h=15, r=2.8);
    
        // screw holes
    translate([25,75,-10])
    #cylinder(h=15, r=2.8);
    
}

 

Radiation and Water Shield for AM2315 Outdoor Temperature/Humidity Sensor

The AM2315 is encased, but not totally water proof.   It needs to be protected from direct rain and also from direct sun.   If the device is in the direct sun, then the temperature will read too high and eventually the humidity sensor on the AM2315 will die.  The jury is still out whether we need to put a sun shade above the radiation shield.

Radiation and Water Shield
Radiation and Water Shield

Following is the openSCAD code for the Radiation and Water Shield:

// 
//GroveWeatherPi Solar System
//
// SwitchDoc Labs - 04/01/15
// 
//
//GroveWeatherPi AM2315 Outdoor temp cover
//


include 
include 


module Tube()
{
    
       // tube
    

    difference()
    {
        
     
     
   //     cylinder(h=130, r=28);
        cylinder(h=130, r=28);
    
        translate([0,0,-2])
        cylinder(h=132, r=26);
        
        translate([-30,-90,-2])
        #cube([231,90,135]);
        
        
          // vents
        
        translate([-20,100,100])
        rotate(90,[1,0,0])
        #cube([40,3,200]);
        
        translate([-20,100,90])
        rotate(90,[1,0,0])
        #cube([40,3,200]);
        
        translate([-20,100,80])
        rotate(90,[1,0,0])
        #cube([40,3,200]);
        
        translate([-20,100,70])
        rotate(90,[1,0,0])
        #cube([40,3,200]);
        
    }
    
}


module OutdoorCover()
{
    
    
    // sphere
    
    difference()
    {
        sphere(r=28);
    
        sphere(r=25);
       
        translate([-45,0,0])
        #cube([90,90, 100]);
        
        translate([-45,-45,-100])
        #cube([90,90, 100]);
        
        
    }
    
    // tube
    
    translate([0,130,0])
    rotate(90,[1,0,0])
    Tube();

    // mounting plates
    
    difference()
    {
        translate([-30,-35,0])
        cube([60,165,2]);
        
        
        translate([-20,-15,0])
        cube([40,145,2]);
        
        // screw holes
        
        translate([25,-24,-2])
        #cylinder(r=2,h=15);
        
        translate([-25,-24,-2])
        #cylinder(r=2,h=15);
        
      

    }
    
}


difference()
{

OutdoorCover();
    
      translate([-50,105,-10])
  #cube([100,100,100]);
    
}

Lightning Detector Pylon

The lighting detector pylon is to move the very sensitive MOD-1016G Lightning Detector away from the noisy electronics within the GroveWeatherPi.   We noticed early on that we were getting a lot of spurious lightning detection from the device.    Moving it about 30cm from the electronics in a separate pylon fixed that problem.

GroveWeatherPi
Lightning Detector Pylon

Following is the Lightning Detector Pylon openSCAD code:

//
// WeatherPi Lightning Sensor Block Extension
//
// SwitchDoc Labs 5/18/15
//
//

module sensorPylon()
{
    
    // tube
    
    difference()
    {
        union()
        {
            cylinder(120, r=12);
        
           // flanges
    
            translate([-15,-15,0])
            cube([30,30,2]);
        }
    
        translate([0,0,-10])
        cylinder(150, r=10.5);
        
        // screw holes
        translate([-12,-12,-5])   
        #cylinder(h=10,r=2.0,$fs=6);
        
         translate([-12,12,-5])   
        #cylinder(h=10,r=2.0,$fs=6);
        
         translate([12,12,-5])   
        #cylinder(h=10,r=2.0,$fs=6);
        
         translate([12,-12,-5])   
        #cylinder(h=10,r=2.0,$fs=6);
        
    }
    
    
   
    
    
    
    
}

module sensorBox()
{
    
    difference()
    {
        translate([-16.5,-16.5,0])
        cube([43,43,33]);
    
        translate([-15,-15,-2])
        cube([40,40,32]);
        
        translate([-15.5,-15.5,-1])
        cube([41,41,3]);
        
    }
    
    
}

module sensorPlatform()
{
    
    difference()
    {
        union()
        {
            translate([-17.95,-17.95,-1])
            cube([40.9,40.9,2]);
            
            translate([2.5,2.5,-5])
            #cylinder(5,r=10.4);
        }
        
        translate([2.5,2.5,-5])
        #cylinder(10,r=9.0); 
    }
    
    
}

/*
sensorPylon();

translate([0,0,180])
sensorBox();

translate([0,0,160])
sensorPlatform();
*/

translate([60,0,0])
sensorPylon();

rotate(180,[0,1,0])
{
translate([50,0,-33])
sensorBox();

translate([0,0,-1])
sensorPlatform();
}