Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of WeatherMeters by
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 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 }
Generated on Thu Jul 21 2022 06:05:44 by
1.7.2
