Yongqiang Wang / WeatherMeters

Fork of WeatherMeters by Suga koubou

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 
00019 DigitalOut rain(LED2);
00020 DigitalOut test(LED3);
00021 
00022 const float tbl_windvane[16][2] = {
00023   {0.0, 33000}, {22.5, 6570}, {45.0, 8200}, {67.5, 891},
00024   {90.0, 1000}, {112.5, 688}, {135.0, 2200}, {157.5, 1410},
00025   {180.0, 3900}, {202.5, 3140}, {225.0, 16000}, {247.5, 14120},
00026   {270.0, 120000}, {292.5, 42120}, {315.0, 64900}, {337.5, 21880} 
00027 };
00028 
00029 /**
00030  * @brief Initializes interface
00031  * @param p_anemometer port of Anemometer
00032  * @param p_windvane port of Wind vane (analog)
00033  * @param p_raingauge parameter of Rain gauge
00034  * @param w_mode parameter of Anemometer
00035  */
00036 WeatherMeters::WeatherMeters (PinName p_anemometer, PinName p_windvane, PinName p_raingauge, Weather_mode w_mode) : int01(p_anemometer), int02(p_raingauge), ain01(p_windvane) {
00037     int i;
00038 
00039     windspeed = 0; windvane = 0; raingauge = 0;
00040     count_anemo = 0; count_rain = 0; time_anemo = 0; time_rain = 0;
00041     for (i = 0; i < 12; i ++) {
00042         buf_anemo[i] = 0;
00043         buf_rain[i] = 0;
00044     }
00045 
00046     mode = w_mode;
00047     int01.fall(this, &WeatherMeters::int_anemometer);
00048     int02.fall(this, &WeatherMeters::int_raingauge);
00049     ticker01.attach(this, &WeatherMeters::int_timer, 0.25); 
00050 }
00051 
00052 /**
00053  * @brief Get wind speed
00054  * @return wind speed (m/s)
00055  * mode=Weather_auto: average from 12sample/2sec
00056  * mode=Weather_manual: average from last measurement
00057  */
00058 float WeatherMeters::get_windspeed() {
00059     float s;
00060     
00061     if (mode == Weather_auto) { 
00062         s = (float)windspeed * 0.667 / 3.0; // 0.667m/s/Hz (/3s)
00063         windspeed = 0;
00064     } else {
00065         s = (float)count_anemo * 0.667 / ((float)time_anemo / 4.0); // 0.667m/s/Hz
00066         time_anemo = 0;
00067         count_anemo = 0;
00068     }
00069     return s;
00070 }
00071 
00072 /**
00073  * @brief Get wind vane
00074  * @return wind vane (`)
00075  * mode=Weather_auto: wind speed at the highest
00076  * mode=Weather_manual: current wind vane
00077  */
00078 float WeatherMeters::get_windvane() {
00079     int i;
00080     float v;
00081 
00082     if (windspeed == 0) windvane = ain01;
00083     v = windvane * WEATHER_VREF; // V
00084     v = v / ((WEATHER_VREF - v) / 10000.0); // ohm
00085     for (i = 0; i < 16; i ++) {
00086         if (v > tbl_windvane[i][1] * 0.9 && v < tbl_windvane[i][1] * 1.1) {
00087             return tbl_windvane[i][0];
00088         }
00089     }
00090     return 0;
00091 }
00092 
00093 /**
00094  * @brief Get rain gauge
00095  * @return wind speed (mm/h)
00096  * average from 12sample/60min (update 5min)
00097  */
00098 float WeatherMeters::get_raingauge() {
00099     return (float)raingauge * 0.2794; // 0.2794mm/Hz
00100 }
00101 
00102 void WeatherMeters::int_anemometer () {
00103     count_anemo ++;
00104 }
00105 
00106 void WeatherMeters::int_raingauge () {
00107     if (rain == 1)
00108     {
00109         rain = 0;
00110         wait (0.1);
00111     }
00112     else 
00113     {
00114         rain = 1;
00115         wait (0.1);
00116     }   
00117     count_rain ++;
00118 }
00119 
00120 void WeatherMeters::int_timer () {
00121     int i, n;
00122     
00123     if (mode == Weather_auto) {
00124         n = 0;
00125         for (i = 11; i > 0; i --) {
00126             buf_anemo[i] = buf_anemo[i - 1];
00127             n = n + buf_anemo[i];
00128         }
00129         buf_anemo[0] = count_anemo;
00130         n = n + buf_anemo[0];
00131         count_anemo = 0;
00132         if (n > windspeed) {
00133             windspeed = n;
00134             windvane = ain01;
00135         }
00136     } else {
00137         time_anemo ++;
00138     }
00139     
00140     time_rain ++;
00141     if (time_rain >= 100) {
00142         n = 0;
00143         for (i = 11; i > 0; i --) {
00144             buf_rain[i] = buf_rain[i - 1];
00145             n = n + buf_rain[i];
00146             
00147         }
00148         buf_rain[0] = count_rain;
00149         n = n + buf_rain[0];
00150       
00151      
00152         count_rain = 0;
00153         time_rain = 0;
00154         raingauge = n;
00155     }
00156     
00157       if (test == 1)
00158             {
00159                 test  = 0;
00160                 wait (0.2);
00161             }
00162             else
00163             { 
00164                 test = 1;
00165                 wait (0.2);
00166              }
00167 }