Suga koubou
/
WeatherMeters_lib
Weather Meters (Sparkfun) http://mbed.org/users/okini3939/notebook/weatherduino-on-mbed/
Revision 0:7f3a988c1be5, committed 2010-09-27
- Comitter:
- okini3939
- Date:
- Mon Sep 27 16:03:25 2010 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r 7f3a988c1be5 WeatherMeters/WeatherMeters.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WeatherMeters/WeatherMeters.cpp Mon Sep 27 16:03:25 2010 +0000 @@ -0,0 +1,109 @@ +/* + * mbed library to use a Sparkfun Weather Meters + * Copyright (c) 2010 Hiroshi Suga + * Released under the MIT License: http://mbed.org/license/mit + */ + +#include "mbed.h" +#include "WeatherMeters.h" + +#define WEATHER_VREF 3.3 + +const float tbl_windvane[16][2] = { + {0.0, 33000}, {22.5, 6570}, {45.0, 8200}, {67.5, 891}, + {90.0, 1000}, {112.5, 688}, {135.0, 2200}, {157.5, 1410}, + {180.0, 3900}, {202.5, 3140}, {225.0, 16000}, {247.5, 14120}, + {270.0, 120000}, {292.5, 42120}, {315.0, 64900}, {337.5, 21880} +}; + +WeatherMeters::WeatherMeters (PinName p_anemometer, PinName p_windvane, PinName p_raingauge, Weather_mode w_mode) : int01(p_anemometer), int02(p_raingauge), ain01(p_windvane) { + int i; + + windspeed = 0; windvane = 0; raingauge = 0; + count_anemo = 0; count_rain = 0; time_anemo = 0; time_rain = 0; + for (i = 0; i < 12; i ++) { + buf_anemo[i] = 0; + buf_rain[i] = 0; + } + + mode = w_mode; + int01.fall(this, &WeatherMeters::int_anemometer); + int02.fall(this, &WeatherMeters::int_raingauge); + ticker01.attach(this, &WeatherMeters::int_timer, 0.25); +} + +float WeatherMeters::get_windspeed() { + float s; + + if (mode == Weather_auto) { + s = (float)windspeed * 0.667 / 3.0; // 0.667m/s/Hz (/3s) + windspeed = 0; + } else { + s = (float)count_anemo * 0.667 / ((float)time_anemo / 4.0); // 0.667m/s/Hz + time_anemo = 0; + count_anemo = 0; + } + return s; +} + +float WeatherMeters::get_windvane() { + int i; + float v; + + if (windspeed == 0) windvane = ain01; + v = windvane * WEATHER_VREF; // V + v = v / ((WEATHER_VREF - v) / 10000.0); // ohm + for (i = 0; i < 16; i ++) { + if (v > tbl_windvane[i][1] * 0.9 && v < tbl_windvane[i][1] * 1.1) { + return tbl_windvane[i][0]; + } + } + return 0; +} + +float WeatherMeters::get_raingauge() { + return (float)raingauge * 0.2794; // 0.2794mm/Hz +} + +void WeatherMeters::int_anemometer () { + count_anemo ++; +} + +void WeatherMeters::int_raingauge () { + count_rain ++; +} + +void WeatherMeters::int_timer () { + int i, n; + + if (mode == Weather_auto) { + n = 0; + for (i = 11; i > 0; i --) { + buf_anemo[i] = buf_anemo[i - 1]; + n = n + buf_anemo[i]; + } + buf_anemo[0] = count_anemo; + n = n + buf_anemo[0]; + count_anemo = 0; + if (n > windspeed) { + windspeed = n; + windvane = ain01; + } + } else { + time_anemo ++; + } + + time_rain ++; + if (time_rain >= 4 * 300) { + n = 0; + for (i = 11; i > 0; i --) { + buf_rain[i] = buf_rain[i - 1]; + n = n + buf_rain[i]; + } + buf_rain[0] = count_rain; + n = n + buf_rain[0]; + count_rain = 0; + time_rain = 0; + raingauge = n; + } +}
diff -r 000000000000 -r 7f3a988c1be5 WeatherMeters/WeatherMeters.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WeatherMeters/WeatherMeters.h Mon Sep 27 16:03:25 2010 +0000 @@ -0,0 +1,44 @@ +/* + * mbed library to use a Sparkfun Weather Meters + * Copyright (c) 2010 Hiroshi Suga + * Released under the MIT License: http://mbed.org/license/mit + */ + +#ifndef WeatherMeters_H +#define WeatherMeters_H + +#include "mbed.h" + +enum Weather_mode { + Weather_manual = 0, + Weather_auto = 1 +}; + +class WeatherMeters : public Base { +public: + WeatherMeters(PinName p_anemometer, PinName p_windvane, PinName p_raingauge, Weather_mode w_mode = Weather_auto); + + float get_windspeed(); + float get_windvane(); + float get_raingauge(); + void update(); + +protected: + void int_anemometer (); + void int_raingauge (); + void int_timer (); + + InterruptIn int01, int02; + AnalogIn ain01; + Ticker ticker01; + int windspeed, raingauge; + float windvane; + int mode; + +private: + + int count_anemo, count_rain, time_anemo, time_rain; + int buf_anemo[12], buf_rain[12]; +}; + +#endif
diff -r 000000000000 -r 7f3a988c1be5 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Sep 27 16:03:25 2010 +0000 @@ -0,0 +1,18 @@ +#include "mbed.h" +#include "WeatherMeters.h" + +WeatherMeters wmeters(p30, p17, p21); // anemo, vane, rain + +DigitalOut myled(LED1); +Serial pc(USBTX, USBRX); + +int main() { + while(1) { + myled = 1; + + pc.printf("a:%6.2f m/s / v:%6.2f / r:%6.2f mm\n", wmeters.get_windspeed(), wmeters.get_windvane(), wmeters.get_raingauge()); + + myled = 0; + wait(10); + } +}
diff -r 000000000000 -r 7f3a988c1be5 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Sep 27 16:03:25 2010 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e