Weather Alert System

Fork of WeatherMeters by Suga koubou

Committer:
yongqiangwang
Date:
Mon Apr 29 23:39:45 2013 +0000
Revision:
3:7db4d6319754
Parent:
2:6a62f29b1bb5
Weather Alert System

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:dc42aeff64e6 1 /*
okini3939 0:dc42aeff64e6 2 * mbed library to use a Sparkfun Weather Meters
okini3939 2:6a62f29b1bb5 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 0:dc42aeff64e6 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:dc42aeff64e6 5 */
okini3939 0:dc42aeff64e6 6
okini3939 1:fa262295fa7e 7 /** @file WeatherMeters.cpp
okini3939 1:fa262295fa7e 8 * @brief mbed library to use a Sparkfun Weather Meters
okini3939 1:fa262295fa7e 9 * Anemometer, Wind vane, Rain gauge
okini3939 1:fa262295fa7e 10 * interface: digital, analog
okini3939 1:fa262295fa7e 11 */
okini3939 1:fa262295fa7e 12
okini3939 0:dc42aeff64e6 13 #include "mbed.h"
okini3939 0:dc42aeff64e6 14 #include "WeatherMeters.h"
okini3939 0:dc42aeff64e6 15
okini3939 0:dc42aeff64e6 16 #define WEATHER_VREF 3.3
okini3939 0:dc42aeff64e6 17
yongqiangwang 3:7db4d6319754 18
yongqiangwang 3:7db4d6319754 19 DigitalOut rain(LED2);
yongqiangwang 3:7db4d6319754 20 DigitalOut test(LED3);
yongqiangwang 3:7db4d6319754 21
okini3939 0:dc42aeff64e6 22 const float tbl_windvane[16][2] = {
okini3939 0:dc42aeff64e6 23 {0.0, 33000}, {22.5, 6570}, {45.0, 8200}, {67.5, 891},
okini3939 0:dc42aeff64e6 24 {90.0, 1000}, {112.5, 688}, {135.0, 2200}, {157.5, 1410},
okini3939 0:dc42aeff64e6 25 {180.0, 3900}, {202.5, 3140}, {225.0, 16000}, {247.5, 14120},
okini3939 0:dc42aeff64e6 26 {270.0, 120000}, {292.5, 42120}, {315.0, 64900}, {337.5, 21880}
okini3939 0:dc42aeff64e6 27 };
okini3939 0:dc42aeff64e6 28
okini3939 1:fa262295fa7e 29 /**
okini3939 1:fa262295fa7e 30 * @brief Initializes interface
okini3939 1:fa262295fa7e 31 * @param p_anemometer port of Anemometer
okini3939 1:fa262295fa7e 32 * @param p_windvane port of Wind vane (analog)
okini3939 1:fa262295fa7e 33 * @param p_raingauge parameter of Rain gauge
okini3939 1:fa262295fa7e 34 * @param w_mode parameter of Anemometer
okini3939 1:fa262295fa7e 35 */
okini3939 0:dc42aeff64e6 36 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:dc42aeff64e6 37 int i;
okini3939 0:dc42aeff64e6 38
okini3939 0:dc42aeff64e6 39 windspeed = 0; windvane = 0; raingauge = 0;
okini3939 0:dc42aeff64e6 40 count_anemo = 0; count_rain = 0; time_anemo = 0; time_rain = 0;
okini3939 0:dc42aeff64e6 41 for (i = 0; i < 12; i ++) {
okini3939 0:dc42aeff64e6 42 buf_anemo[i] = 0;
okini3939 0:dc42aeff64e6 43 buf_rain[i] = 0;
okini3939 0:dc42aeff64e6 44 }
okini3939 0:dc42aeff64e6 45
okini3939 0:dc42aeff64e6 46 mode = w_mode;
okini3939 0:dc42aeff64e6 47 int01.fall(this, &WeatherMeters::int_anemometer);
okini3939 0:dc42aeff64e6 48 int02.fall(this, &WeatherMeters::int_raingauge);
okini3939 0:dc42aeff64e6 49 ticker01.attach(this, &WeatherMeters::int_timer, 0.25);
okini3939 0:dc42aeff64e6 50 }
okini3939 0:dc42aeff64e6 51
okini3939 1:fa262295fa7e 52 /**
okini3939 1:fa262295fa7e 53 * @brief Get wind speed
okini3939 1:fa262295fa7e 54 * @return wind speed (m/s)
okini3939 2:6a62f29b1bb5 55 * mode=Weather_auto: average from 12sample/2sec
okini3939 2:6a62f29b1bb5 56 * mode=Weather_manual: average from last measurement
okini3939 1:fa262295fa7e 57 */
okini3939 0:dc42aeff64e6 58 float WeatherMeters::get_windspeed() {
okini3939 0:dc42aeff64e6 59 float s;
okini3939 0:dc42aeff64e6 60
okini3939 0:dc42aeff64e6 61 if (mode == Weather_auto) {
okini3939 0:dc42aeff64e6 62 s = (float)windspeed * 0.667 / 3.0; // 0.667m/s/Hz (/3s)
okini3939 0:dc42aeff64e6 63 windspeed = 0;
okini3939 0:dc42aeff64e6 64 } else {
okini3939 0:dc42aeff64e6 65 s = (float)count_anemo * 0.667 / ((float)time_anemo / 4.0); // 0.667m/s/Hz
okini3939 0:dc42aeff64e6 66 time_anemo = 0;
okini3939 0:dc42aeff64e6 67 count_anemo = 0;
okini3939 0:dc42aeff64e6 68 }
okini3939 0:dc42aeff64e6 69 return s;
okini3939 0:dc42aeff64e6 70 }
okini3939 0:dc42aeff64e6 71
okini3939 1:fa262295fa7e 72 /**
okini3939 1:fa262295fa7e 73 * @brief Get wind vane
okini3939 1:fa262295fa7e 74 * @return wind vane (`)
okini3939 2:6a62f29b1bb5 75 * mode=Weather_auto: wind speed at the highest
okini3939 2:6a62f29b1bb5 76 * mode=Weather_manual: current wind vane
okini3939 1:fa262295fa7e 77 */
okini3939 0:dc42aeff64e6 78 float WeatherMeters::get_windvane() {
okini3939 0:dc42aeff64e6 79 int i;
okini3939 0:dc42aeff64e6 80 float v;
okini3939 0:dc42aeff64e6 81
okini3939 0:dc42aeff64e6 82 if (windspeed == 0) windvane = ain01;
okini3939 0:dc42aeff64e6 83 v = windvane * WEATHER_VREF; // V
okini3939 0:dc42aeff64e6 84 v = v / ((WEATHER_VREF - v) / 10000.0); // ohm
okini3939 0:dc42aeff64e6 85 for (i = 0; i < 16; i ++) {
okini3939 0:dc42aeff64e6 86 if (v > tbl_windvane[i][1] * 0.9 && v < tbl_windvane[i][1] * 1.1) {
okini3939 0:dc42aeff64e6 87 return tbl_windvane[i][0];
okini3939 0:dc42aeff64e6 88 }
okini3939 0:dc42aeff64e6 89 }
okini3939 0:dc42aeff64e6 90 return 0;
okini3939 0:dc42aeff64e6 91 }
okini3939 0:dc42aeff64e6 92
okini3939 1:fa262295fa7e 93 /**
okini3939 1:fa262295fa7e 94 * @brief Get rain gauge
okini3939 1:fa262295fa7e 95 * @return wind speed (mm/h)
okini3939 2:6a62f29b1bb5 96 * average from 12sample/60min (update 5min)
okini3939 1:fa262295fa7e 97 */
okini3939 0:dc42aeff64e6 98 float WeatherMeters::get_raingauge() {
okini3939 0:dc42aeff64e6 99 return (float)raingauge * 0.2794; // 0.2794mm/Hz
okini3939 0:dc42aeff64e6 100 }
okini3939 0:dc42aeff64e6 101
okini3939 0:dc42aeff64e6 102 void WeatherMeters::int_anemometer () {
okini3939 0:dc42aeff64e6 103 count_anemo ++;
okini3939 0:dc42aeff64e6 104 }
okini3939 0:dc42aeff64e6 105
okini3939 0:dc42aeff64e6 106 void WeatherMeters::int_raingauge () {
yongqiangwang 3:7db4d6319754 107 if (rain == 1)
yongqiangwang 3:7db4d6319754 108 {
yongqiangwang 3:7db4d6319754 109 rain = 0;
yongqiangwang 3:7db4d6319754 110 wait (0.1);
yongqiangwang 3:7db4d6319754 111 }
yongqiangwang 3:7db4d6319754 112 else
yongqiangwang 3:7db4d6319754 113 {
yongqiangwang 3:7db4d6319754 114 rain = 1;
yongqiangwang 3:7db4d6319754 115 wait (0.1);
yongqiangwang 3:7db4d6319754 116 }
okini3939 0:dc42aeff64e6 117 count_rain ++;
okini3939 0:dc42aeff64e6 118 }
okini3939 0:dc42aeff64e6 119
okini3939 0:dc42aeff64e6 120 void WeatherMeters::int_timer () {
okini3939 0:dc42aeff64e6 121 int i, n;
okini3939 0:dc42aeff64e6 122
okini3939 0:dc42aeff64e6 123 if (mode == Weather_auto) {
okini3939 0:dc42aeff64e6 124 n = 0;
okini3939 0:dc42aeff64e6 125 for (i = 11; i > 0; i --) {
okini3939 0:dc42aeff64e6 126 buf_anemo[i] = buf_anemo[i - 1];
okini3939 0:dc42aeff64e6 127 n = n + buf_anemo[i];
okini3939 0:dc42aeff64e6 128 }
okini3939 0:dc42aeff64e6 129 buf_anemo[0] = count_anemo;
okini3939 0:dc42aeff64e6 130 n = n + buf_anemo[0];
okini3939 0:dc42aeff64e6 131 count_anemo = 0;
okini3939 0:dc42aeff64e6 132 if (n > windspeed) {
okini3939 0:dc42aeff64e6 133 windspeed = n;
okini3939 0:dc42aeff64e6 134 windvane = ain01;
okini3939 0:dc42aeff64e6 135 }
okini3939 0:dc42aeff64e6 136 } else {
okini3939 0:dc42aeff64e6 137 time_anemo ++;
okini3939 0:dc42aeff64e6 138 }
okini3939 0:dc42aeff64e6 139
okini3939 0:dc42aeff64e6 140 time_rain ++;
yongqiangwang 3:7db4d6319754 141 if (time_rain >= 100) {
okini3939 0:dc42aeff64e6 142 n = 0;
okini3939 0:dc42aeff64e6 143 for (i = 11; i > 0; i --) {
okini3939 0:dc42aeff64e6 144 buf_rain[i] = buf_rain[i - 1];
okini3939 0:dc42aeff64e6 145 n = n + buf_rain[i];
yongqiangwang 3:7db4d6319754 146
okini3939 0:dc42aeff64e6 147 }
okini3939 0:dc42aeff64e6 148 buf_rain[0] = count_rain;
okini3939 0:dc42aeff64e6 149 n = n + buf_rain[0];
yongqiangwang 3:7db4d6319754 150
yongqiangwang 3:7db4d6319754 151
okini3939 0:dc42aeff64e6 152 count_rain = 0;
okini3939 0:dc42aeff64e6 153 time_rain = 0;
okini3939 0:dc42aeff64e6 154 raingauge = n;
okini3939 0:dc42aeff64e6 155 }
yongqiangwang 3:7db4d6319754 156
yongqiangwang 3:7db4d6319754 157 if (test == 1)
yongqiangwang 3:7db4d6319754 158 {
yongqiangwang 3:7db4d6319754 159 test = 0;
yongqiangwang 3:7db4d6319754 160 wait (0.2);
yongqiangwang 3:7db4d6319754 161 }
yongqiangwang 3:7db4d6319754 162 else
yongqiangwang 3:7db4d6319754 163 {
yongqiangwang 3:7db4d6319754 164 test = 1;
yongqiangwang 3:7db4d6319754 165 wait (0.2);
yongqiangwang 3:7db4d6319754 166 }
okini3939 0:dc42aeff64e6 167 }