Weather Meters (Sparkfun) http://mbed.org/users/okini3939/notebook/weatherduino-on-mbed/

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WeatherMeters.cpp Source File

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 }