Suga koubou
/
WeatherMeters_lib
Weather Meters (Sparkfun) http://mbed.org/users/okini3939/notebook/weatherduino-on-mbed/
Embed:
(wiki syntax)
Show/hide line numbers
WeatherMeters.cpp
00001 /* 00002 * mbed library to use a Sparkfun Weather Meters 00003 * Copyright (c) 2010 Hiroshi Suga 00004 * Released under the MIT License: http://mbed.org/license/mit 00005 */ 00006 00007 #include "mbed.h" 00008 #include "WeatherMeters.h" 00009 00010 #define WEATHER_VREF 3.3 00011 00012 const float tbl_windvane[16][2] = { 00013 {0.0, 33000}, {22.5, 6570}, {45.0, 8200}, {67.5, 891}, 00014 {90.0, 1000}, {112.5, 688}, {135.0, 2200}, {157.5, 1410}, 00015 {180.0, 3900}, {202.5, 3140}, {225.0, 16000}, {247.5, 14120}, 00016 {270.0, 120000}, {292.5, 42120}, {315.0, 64900}, {337.5, 21880} 00017 }; 00018 00019 WeatherMeters::WeatherMeters (PinName p_anemometer, PinName p_windvane, PinName p_raingauge, Weather_mode w_mode) : int01(p_anemometer), int02(p_raingauge), ain01(p_windvane) { 00020 int i; 00021 00022 windspeed = 0; windvane = 0; raingauge = 0; 00023 count_anemo = 0; count_rain = 0; time_anemo = 0; time_rain = 0; 00024 for (i = 0; i < 12; i ++) { 00025 buf_anemo[i] = 0; 00026 buf_rain[i] = 0; 00027 } 00028 00029 mode = w_mode; 00030 int01.fall(this, &WeatherMeters::int_anemometer); 00031 int02.fall(this, &WeatherMeters::int_raingauge); 00032 ticker01.attach(this, &WeatherMeters::int_timer, 0.25); 00033 } 00034 00035 float WeatherMeters::get_windspeed() { 00036 float s; 00037 00038 if (mode == Weather_auto) { 00039 s = (float)windspeed * 0.667 / 3.0; // 0.667m/s/Hz (/3s) 00040 windspeed = 0; 00041 } else { 00042 s = (float)count_anemo * 0.667 / ((float)time_anemo / 4.0); // 0.667m/s/Hz 00043 time_anemo = 0; 00044 count_anemo = 0; 00045 } 00046 return s; 00047 } 00048 00049 float WeatherMeters::get_windvane() { 00050 int i; 00051 float v; 00052 00053 if (windspeed == 0) windvane = ain01; 00054 v = windvane * WEATHER_VREF; // V 00055 v = v / ((WEATHER_VREF - v) / 10000.0); // ohm 00056 for (i = 0; i < 16; i ++) { 00057 if (v > tbl_windvane[i][1] * 0.9 && v < tbl_windvane[i][1] * 1.1) { 00058 return tbl_windvane[i][0]; 00059 } 00060 } 00061 return 0; 00062 } 00063 00064 float WeatherMeters::get_raingauge() { 00065 return (float)raingauge * 0.2794; // 0.2794mm/Hz 00066 } 00067 00068 void WeatherMeters::int_anemometer () { 00069 count_anemo ++; 00070 } 00071 00072 void WeatherMeters::int_raingauge () { 00073 count_rain ++; 00074 } 00075 00076 void WeatherMeters::int_timer () { 00077 int i, n; 00078 00079 if (mode == Weather_auto) { 00080 n = 0; 00081 for (i = 11; i > 0; i --) { 00082 buf_anemo[i] = buf_anemo[i - 1]; 00083 n = n + buf_anemo[i]; 00084 } 00085 buf_anemo[0] = count_anemo; 00086 n = n + buf_anemo[0]; 00087 count_anemo = 0; 00088 if (n > windspeed) { 00089 windspeed = n; 00090 windvane = ain01; 00091 } 00092 } else { 00093 time_anemo ++; 00094 } 00095 00096 time_rain ++; 00097 if (time_rain >= 4 * 300) { 00098 n = 0; 00099 for (i = 11; i > 0; i --) { 00100 buf_rain[i] = buf_rain[i - 1]; 00101 n = n + buf_rain[i]; 00102 } 00103 buf_rain[0] = count_rain; 00104 n = n + buf_rain[0]; 00105 count_rain = 0; 00106 time_rain = 0; 00107 raingauge = n; 00108 } 00109 }
Generated on Thu Jul 21 2022 09:22:11 by 1.7.2