Weather Alert System
Fork of WeatherMeters by
WeatherMeters.cpp@3:7db4d6319754, 2013-04-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |