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

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
okini3939
Date:
Mon Sep 27 16:03:25 2010 +0000
Commit message:

Changed in this revision

WeatherMeters/WeatherMeters.cpp Show annotated file Show diff for this revision Revisions of this file
WeatherMeters/WeatherMeters.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
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