PiWeather Board For The Raspberry Pi / Arduino - Grove
Features
- Provides an excellent interface for a Weather Station hookup to Raspberry Pi or Arduino
- Supports Grove Connectors
- Includes 4 channel I2C Mux based on the TCA9545
- Includes Arduino and Raspberry Pi Software
- Supports SwitchDoc Labs WeatherRack Wind Vane / Anemometer / Rain Bucket
- Contains I2C BME680 Barometer / Temperature / Humidity / Air Quality sensor
- Directly powered from Raspberry Pi / Arduino
- Works with Raspberry Pi (3.3V) GPIO and Arduino (5.0V) GPIO as well as the 5.0V Pi2Grover Board
Want to build a Weather Station with the PiWeather board?
Look at these sources:
- PiWeather Board Specification V1.2
- SkyWeather Manuals
- WeatherRack Weather Sensors now available.
- Outdoor Temperature and Humidity Sensors now available.
Downloads
- Raspberry Pi Software (Coming Soon)
- SkyWeather Software for the PiWeather Board
- You can download the Full Weather Board Specification here
- Arduino Software (coming soon)
- Arduino Software for the WeatherRack and the Weather Board is here (coming soon)
What are Grove Connectors?
Grove connectors are standardized plugs for connecting devices together easily and without soldering. See our Full Grove Tutorial here.
Weather Board and Weather Rack
Block Diagram
It was specifically designed to interface with the SwitchDoc WeatherRack and ArgentData Weather Sensors.
Interfaces on Weather Board
- I2C for Raspberry Pi and Arduino (Board works at 3.3V and 5V)
- RJ11 Plugs installed for SwitchDoc Labs WeatherRack, etc.
- Wind Vane, Rain Bucket, Anemometer computer connections for Raspberry Pi and Arduino
- Grove Connections for all interfaces
I2C devices Included with the Weather Board
- BME680 Barometer / Temperature / Humidity / IAQI Sensor
- ADS1015 4 Channel 12 bit ADC
I2C Device Specifications
SwitchDoc Labs WeatherRack Sensors
The SDL_Weather_80422 class library is designed to provide all the functions of the SwitchDoc WeatherRack, ArgentData Weather Sensors, SparkFun Weather Meters SEN-08942 in one C++ class. The library is easy to use and hides the complexity of the interface to the sensors. The C++ class has two Interrupt Service Routines (ISR), one each for the anemometer and the rain bucket. The wind vane is connected to an Analog to Digital Converter (ADC) input pin on the Arduino. Note that the C++ class is designed to be a singleton, in other words, you only can interface one sensor package without some additional work (mostly involving Interrupts). The article in Raspberry Pi Geek magazine discusses this in detail. There are two main modes for the class.
SDL_MODE_SAMPLE
SDL_MODE_SAMPLE mode means return immediately after asking for the wind speed. The wind speed is averaged at sampleTime or since you last asked, whichever is longer. If the sample time has not passed since the last call, the class returns the last calculated wind speed. That means that you will never see changes faster than the specified sample time. This allows you to not wait for the wind speed, you can just grab the last valid reading.
SDL_MODE_DELAY
SDL_MODE_DELAY mode means to wait for the set sample time to expire and return the average wind speed at the expiration. You would use this if you want to make sure you have the latest value and your program architecture allows you to pause for the sample time before continuing. Which mode you use depends on the specific software architecture of your Arduino application. Typically, I use SDL_MODE_SAMPLE because I can tolerate not having a current value of wind speed. The example code for the SDL_Weather_80422 library is shown below:
/* SDL_Weather_80422_Library.ino - Example for using SDL_Weather_80422 Library For SwitchDoc Labs WeatherRack Weather Sensor Assembly 80422 Argent Data Systems SparkFun Created by SwitchDoc Labs July 27, 2014. Released into the public domain. */ #include #include #include "SDL_Weather_80422.h" #define pinLED 13 // LED connected to digital pin 13 #define pinAnem 18 // Anenometer connected to pin 18 - Int 5 #define pinRain 2 #define intAnem 5 #define intRain 0 // for mega, have to use Port B - only Port B works. /* Arduino Pins PORT ------------ ---- Digital 0-7 D Digital 8-13 B Analog 0-5 C */ // initialize SDL_Weather_80422 library SDL_Weather_80422 weatherStation(pinAnem, pinRain, intAnem, intRain, A0, SDL_MODE_INTERNAL_AD); uint8_t i; float currentWindSpeed; float currentWindGust; float totalRain; void setup() { Serial.begin(57600); Serial.println("-----------"); Serial.println("WeatherPiArduino SDL_Weather_80422 Class Test"); Serial.println("Version 1.0"); Serial.println("-----------"); weatherStation.setWindMode(SDL_MODE_SAMPLE, 5.0); //weatherStation.setWindMode(SDL_MODE_DELAY, 5.0); totalRain = 0.0; } void loop() { Serial.println("----------------"); currentWindSpeed = weatherStation.current_wind_speed()/1.6; currentWindGust = weatherStation.get_wind_gust()/1.6; totalRain = totalRain + weatherStation.get_current_rain_total()/25.4; Serial.print("rain_total="); Serial.print(totalRain); Serial.print(""" wind_speed="); Serial.print(currentWindSpeed); Serial.print("MPH wind_gust="); Serial.print(currentWindGust); Serial.print("MPH wind_direction="); Serial.println(weatherStation.current_wind_direction()); delay(1000); }
When you run this, you should get a result similar to this:
----------- WeatherArduino SDL_Weather_80422 Class Test Version 1.0 ----------- ---------------- rain_total=0.00 wind_speed=13.20MPH wind_gust=12.40MPH wind_direction=90.00 ---------------- rain_total=0.00 wind_speed=9.60MPH wind_gust=9.48MPH wind_direction=90.00 ---------------- rain_total=0.00 wind_speed=10.20MPH wind_gust=9.23MPH wind_direction=90.00 ---------------- rain_total=0.00 wind_speed=11.10MPH wind_gust=9.84MPH wind_direction=90.00