Weather Meters (Sparkfun) http://mbed.org/users/okini3939/notebook/weather-platform/
Dependents: WeatherStation Wetterstation
WeatherMeters.cpp
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 }
Generated on Wed Jul 13 2022 00:58:49 by 1.7.2