Weather Meters (Sparkfun) http://mbed.org/users/okini3939/notebook/weather-platform/

Dependents:   WeatherStation Wetterstation

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WeatherMeters.cpp Source File

WeatherMeters.cpp

Go to the documentation of this file.
00001 /*
00002  * mbed library to use a Sparkfun Weather Meters
00003  * Copyright (c) 2011 Hiroshi Suga
00004  * Released under the MIT License: http://mbed.org/license/mit
00005  */
00006 
00007 /** @file WeatherMeters.cpp
00008  * @brief mbed library to use a Sparkfun Weather Meters
00009  * Anemometer, Wind vane, Rain gauge
00010  * interface: digital, analog
00011  */
00012 
00013 #include "mbed.h"
00014 #include "WeatherMeters.h"
00015 
00016 #define WEATHER_VREF 3.3
00017 
00018 const float tbl_windvane[16][2] = {
00019   {0.0, 33000}, {22.5, 6570}, {45.0, 8200}, {67.5, 891},
00020   {90.0, 1000}, {112.5, 688}, {135.0, 2200}, {157.5, 1410},
00021   {180.0, 3900}, {202.5, 3140}, {225.0, 16000}, {247.5, 14120},
00022   {270.0, 120000}, {292.5, 42120}, {315.0, 64900}, {337.5, 21880} 
00023 };
00024 
00025 /**
00026  * @brief Initializes interface
00027  * @param p_anemometer port of Anemometer
00028  * @param p_windvane port of Wind vane (analog)
00029  * @param p_raingauge parameter of Rain gauge
00030  * @param w_mode parameter of Anemometer
00031  */
00032 WeatherMeters::WeatherMeters (PinName p_anemometer, PinName p_windvane, PinName p_raingauge, Weather_mode w_mode) : int01(p_anemometer), int02(p_raingauge), ain01(p_windvane) {
00033     int i;
00034 
00035     windspeed = 0; windvane = 0; raingauge = 0;
00036     count_anemo = 0; count_rain = 0; time_anemo = 0; time_rain = 0;
00037     for (i = 0; i < 12; i ++) {
00038         buf_anemo[i] = 0;
00039         buf_rain[i] = 0;
00040     }
00041 
00042     mode = w_mode;
00043     int01.fall(this, &WeatherMeters::int_anemometer);
00044     int02.fall(this, &WeatherMeters::int_raingauge);
00045     ticker01.attach(this, &WeatherMeters::int_timer, 0.25); 
00046 }
00047 
00048 /**
00049  * @brief Get wind speed
00050  * @return wind speed (m/s)
00051  * mode=Weather_auto: average from 12sample/2sec
00052  * mode=Weather_manual: average from last measurement
00053  */
00054 float WeatherMeters::get_windspeed() {
00055     float s;
00056     
00057     if (mode == Weather_auto) { 
00058         s = (float)windspeed * 0.667 / 3.0; // 0.667m/s/Hz (/3s)
00059         windspeed = 0;
00060     } else {
00061         s = (float)count_anemo * 0.667 / ((float)time_anemo / 4.0); // 0.667m/s/Hz
00062         time_anemo = 0;
00063         count_anemo = 0;
00064     }
00065     return s;
00066 }
00067 
00068 /**
00069  * @brief Get wind vane
00070  * @return wind vane (`)
00071  * mode=Weather_auto: wind speed at the highest
00072  * mode=Weather_manual: current wind vane
00073  */
00074 float WeatherMeters::get_windvane() {
00075     int i;
00076     float v;
00077 
00078     if (windspeed == 0) windvane = ain01;
00079     v = windvane * WEATHER_VREF; // V
00080     v = v / ((WEATHER_VREF - v) / 10000.0); // ohm
00081     for (i = 0; i < 16; i ++) {
00082         if (v > tbl_windvane[i][1] * 0.9 && v < tbl_windvane[i][1] * 1.1) {
00083             return tbl_windvane[i][0];
00084         }
00085     }
00086     return 0;
00087 }
00088 
00089 /**
00090  * @brief Get rain gauge
00091  * @return wind speed (mm/h)
00092  * average from 12sample/60min (update 5min)
00093  */
00094 float WeatherMeters::get_raingauge() {
00095     return (float)raingauge * 0.2794; // 0.2794mm/Hz
00096 }
00097 
00098 void WeatherMeters::int_anemometer () {
00099     count_anemo ++;
00100 }
00101 
00102 void WeatherMeters::int_raingauge () {
00103     count_rain ++;
00104 }
00105 
00106 void WeatherMeters::int_timer () {
00107     int i, n;
00108     
00109     if (mode == Weather_auto) {
00110         n = 0;
00111         for (i = 11; i > 0; i --) {
00112             buf_anemo[i] = buf_anemo[i - 1];
00113             n = n + buf_anemo[i];
00114         }
00115         buf_anemo[0] = count_anemo;
00116         n = n + buf_anemo[0];
00117         count_anemo = 0;
00118         if (n > windspeed) {
00119             windspeed = n;
00120             windvane = ain01;
00121         }
00122     } else {
00123         time_anemo ++;
00124     }
00125     
00126     time_rain ++;
00127     if (time_rain >= 4 * 300) {
00128         n = 0;
00129         for (i = 11; i > 0; i --) {
00130             buf_rain[i] = buf_rain[i - 1];
00131             n = n + buf_rain[i];
00132         }
00133         buf_rain[0] = count_rain;
00134         n = n + buf_rain[0];
00135         count_rain = 0;
00136         time_rain = 0;
00137         raingauge = n;
00138     }
00139 }