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

Dependencies:   mbed

Committer:
okini3939
Date:
Mon Sep 27 16:03:25 2010 +0000
Revision:
0:7f3a988c1be5

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:7f3a988c1be5 1 /*
okini3939 0:7f3a988c1be5 2 * mbed library to use a Sparkfun Weather Meters
okini3939 0:7f3a988c1be5 3 * Copyright (c) 2010 Hiroshi Suga
okini3939 0:7f3a988c1be5 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:7f3a988c1be5 5 */
okini3939 0:7f3a988c1be5 6
okini3939 0:7f3a988c1be5 7 #include "mbed.h"
okini3939 0:7f3a988c1be5 8 #include "WeatherMeters.h"
okini3939 0:7f3a988c1be5 9
okini3939 0:7f3a988c1be5 10 #define WEATHER_VREF 3.3
okini3939 0:7f3a988c1be5 11
okini3939 0:7f3a988c1be5 12 const float tbl_windvane[16][2] = {
okini3939 0:7f3a988c1be5 13 {0.0, 33000}, {22.5, 6570}, {45.0, 8200}, {67.5, 891},
okini3939 0:7f3a988c1be5 14 {90.0, 1000}, {112.5, 688}, {135.0, 2200}, {157.5, 1410},
okini3939 0:7f3a988c1be5 15 {180.0, 3900}, {202.5, 3140}, {225.0, 16000}, {247.5, 14120},
okini3939 0:7f3a988c1be5 16 {270.0, 120000}, {292.5, 42120}, {315.0, 64900}, {337.5, 21880}
okini3939 0:7f3a988c1be5 17 };
okini3939 0:7f3a988c1be5 18
okini3939 0:7f3a988c1be5 19 WeatherMeters::WeatherMeters (PinName p_anemometer, PinName p_windvane, PinName p_raingauge, Weather_mode w_mode) : int01(p_anemometer), int02(p_raingauge), ain01(p_windvane) {
okini3939 0:7f3a988c1be5 20 int i;
okini3939 0:7f3a988c1be5 21
okini3939 0:7f3a988c1be5 22 windspeed = 0; windvane = 0; raingauge = 0;
okini3939 0:7f3a988c1be5 23 count_anemo = 0; count_rain = 0; time_anemo = 0; time_rain = 0;
okini3939 0:7f3a988c1be5 24 for (i = 0; i < 12; i ++) {
okini3939 0:7f3a988c1be5 25 buf_anemo[i] = 0;
okini3939 0:7f3a988c1be5 26 buf_rain[i] = 0;
okini3939 0:7f3a988c1be5 27 }
okini3939 0:7f3a988c1be5 28
okini3939 0:7f3a988c1be5 29 mode = w_mode;
okini3939 0:7f3a988c1be5 30 int01.fall(this, &WeatherMeters::int_anemometer);
okini3939 0:7f3a988c1be5 31 int02.fall(this, &WeatherMeters::int_raingauge);
okini3939 0:7f3a988c1be5 32 ticker01.attach(this, &WeatherMeters::int_timer, 0.25);
okini3939 0:7f3a988c1be5 33 }
okini3939 0:7f3a988c1be5 34
okini3939 0:7f3a988c1be5 35 float WeatherMeters::get_windspeed() {
okini3939 0:7f3a988c1be5 36 float s;
okini3939 0:7f3a988c1be5 37
okini3939 0:7f3a988c1be5 38 if (mode == Weather_auto) {
okini3939 0:7f3a988c1be5 39 s = (float)windspeed * 0.667 / 3.0; // 0.667m/s/Hz (/3s)
okini3939 0:7f3a988c1be5 40 windspeed = 0;
okini3939 0:7f3a988c1be5 41 } else {
okini3939 0:7f3a988c1be5 42 s = (float)count_anemo * 0.667 / ((float)time_anemo / 4.0); // 0.667m/s/Hz
okini3939 0:7f3a988c1be5 43 time_anemo = 0;
okini3939 0:7f3a988c1be5 44 count_anemo = 0;
okini3939 0:7f3a988c1be5 45 }
okini3939 0:7f3a988c1be5 46 return s;
okini3939 0:7f3a988c1be5 47 }
okini3939 0:7f3a988c1be5 48
okini3939 0:7f3a988c1be5 49 float WeatherMeters::get_windvane() {
okini3939 0:7f3a988c1be5 50 int i;
okini3939 0:7f3a988c1be5 51 float v;
okini3939 0:7f3a988c1be5 52
okini3939 0:7f3a988c1be5 53 if (windspeed == 0) windvane = ain01;
okini3939 0:7f3a988c1be5 54 v = windvane * WEATHER_VREF; // V
okini3939 0:7f3a988c1be5 55 v = v / ((WEATHER_VREF - v) / 10000.0); // ohm
okini3939 0:7f3a988c1be5 56 for (i = 0; i < 16; i ++) {
okini3939 0:7f3a988c1be5 57 if (v > tbl_windvane[i][1] * 0.9 && v < tbl_windvane[i][1] * 1.1) {
okini3939 0:7f3a988c1be5 58 return tbl_windvane[i][0];
okini3939 0:7f3a988c1be5 59 }
okini3939 0:7f3a988c1be5 60 }
okini3939 0:7f3a988c1be5 61 return 0;
okini3939 0:7f3a988c1be5 62 }
okini3939 0:7f3a988c1be5 63
okini3939 0:7f3a988c1be5 64 float WeatherMeters::get_raingauge() {
okini3939 0:7f3a988c1be5 65 return (float)raingauge * 0.2794; // 0.2794mm/Hz
okini3939 0:7f3a988c1be5 66 }
okini3939 0:7f3a988c1be5 67
okini3939 0:7f3a988c1be5 68 void WeatherMeters::int_anemometer () {
okini3939 0:7f3a988c1be5 69 count_anemo ++;
okini3939 0:7f3a988c1be5 70 }
okini3939 0:7f3a988c1be5 71
okini3939 0:7f3a988c1be5 72 void WeatherMeters::int_raingauge () {
okini3939 0:7f3a988c1be5 73 count_rain ++;
okini3939 0:7f3a988c1be5 74 }
okini3939 0:7f3a988c1be5 75
okini3939 0:7f3a988c1be5 76 void WeatherMeters::int_timer () {
okini3939 0:7f3a988c1be5 77 int i, n;
okini3939 0:7f3a988c1be5 78
okini3939 0:7f3a988c1be5 79 if (mode == Weather_auto) {
okini3939 0:7f3a988c1be5 80 n = 0;
okini3939 0:7f3a988c1be5 81 for (i = 11; i > 0; i --) {
okini3939 0:7f3a988c1be5 82 buf_anemo[i] = buf_anemo[i - 1];
okini3939 0:7f3a988c1be5 83 n = n + buf_anemo[i];
okini3939 0:7f3a988c1be5 84 }
okini3939 0:7f3a988c1be5 85 buf_anemo[0] = count_anemo;
okini3939 0:7f3a988c1be5 86 n = n + buf_anemo[0];
okini3939 0:7f3a988c1be5 87 count_anemo = 0;
okini3939 0:7f3a988c1be5 88 if (n > windspeed) {
okini3939 0:7f3a988c1be5 89 windspeed = n;
okini3939 0:7f3a988c1be5 90 windvane = ain01;
okini3939 0:7f3a988c1be5 91 }
okini3939 0:7f3a988c1be5 92 } else {
okini3939 0:7f3a988c1be5 93 time_anemo ++;
okini3939 0:7f3a988c1be5 94 }
okini3939 0:7f3a988c1be5 95
okini3939 0:7f3a988c1be5 96 time_rain ++;
okini3939 0:7f3a988c1be5 97 if (time_rain >= 4 * 300) {
okini3939 0:7f3a988c1be5 98 n = 0;
okini3939 0:7f3a988c1be5 99 for (i = 11; i > 0; i --) {
okini3939 0:7f3a988c1be5 100 buf_rain[i] = buf_rain[i - 1];
okini3939 0:7f3a988c1be5 101 n = n + buf_rain[i];
okini3939 0:7f3a988c1be5 102 }
okini3939 0:7f3a988c1be5 103 buf_rain[0] = count_rain;
okini3939 0:7f3a988c1be5 104 n = n + buf_rain[0];
okini3939 0:7f3a988c1be5 105 count_rain = 0;
okini3939 0:7f3a988c1be5 106 time_rain = 0;
okini3939 0:7f3a988c1be5 107 raingauge = n;
okini3939 0:7f3a988c1be5 108 }
okini3939 0:7f3a988c1be5 109 }