mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/
Dependencies: ChaNFSSD EthernetNetIf I2CLEDDisp Agentbed ChaNFSUSB ILinterpreter mbed BMP085 WeatherMeters ConfigFile ChaNFS I2CLCD
sensor.cpp@0:bdb53686c194, 2011-07-04 (annotated)
- Committer:
- okini3939
- Date:
- Mon Jul 04 15:16:45 2011 +0000
- Revision:
- 0:bdb53686c194
- Child:
- 1:6c7141895545
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:bdb53686c194 | 1 | #include "mbed.h" |
okini3939 | 0:bdb53686c194 | 2 | #include "weather.h" |
okini3939 | 0:bdb53686c194 | 3 | #include "BMP085.h" |
okini3939 | 0:bdb53686c194 | 4 | #include "SHT.h" |
okini3939 | 0:bdb53686c194 | 5 | #include "WeatherMeters.h" |
okini3939 | 0:bdb53686c194 | 6 | |
okini3939 | 0:bdb53686c194 | 7 | #define AREF 3.3 // V |
okini3939 | 0:bdb53686c194 | 8 | |
okini3939 | 0:bdb53686c194 | 9 | Sensor sensor, offset, sensor_old; |
okini3939 | 0:bdb53686c194 | 10 | I2C i2c(p9, p10); |
okini3939 | 0:bdb53686c194 | 11 | static BMP085 bmp085(i2c, BMP085_oss4); |
okini3939 | 0:bdb53686c194 | 12 | static SHT sht15(p12, p11, SHT_high); // sclock, data |
okini3939 | 0:bdb53686c194 | 13 | static WeatherMeters wmeters(p21, p15, p22); // anemo, vane, rain |
okini3939 | 0:bdb53686c194 | 14 | static AnalogIn ailight(p16), aiuv(p17); |
okini3939 | 0:bdb53686c194 | 15 | static AnalogIn *aimoist; |
okini3939 | 0:bdb53686c194 | 16 | static InterruptIn *intin; |
okini3939 | 0:bdb53686c194 | 17 | static volatile int count_counter; |
okini3939 | 0:bdb53686c194 | 18 | static volatile unsigned long lastCountTime; |
okini3939 | 0:bdb53686c194 | 19 | static volatile int inputtype; |
okini3939 | 0:bdb53686c194 | 20 | |
okini3939 | 0:bdb53686c194 | 21 | float get_light (AnalogIn &ain) { |
okini3939 | 0:bdb53686c194 | 22 | float f; |
okini3939 | 0:bdb53686c194 | 23 | |
okini3939 | 0:bdb53686c194 | 24 | f = ain * AREF / 1000; // A |
okini3939 | 0:bdb53686c194 | 25 | return f / 0.0000026; // lx |
okini3939 | 0:bdb53686c194 | 26 | } |
okini3939 | 0:bdb53686c194 | 27 | |
okini3939 | 0:bdb53686c194 | 28 | float get_uv (AnalogIn &ain) { |
okini3939 | 0:bdb53686c194 | 29 | float f; |
okini3939 | 0:bdb53686c194 | 30 | |
okini3939 | 0:bdb53686c194 | 31 | f = ain * AREF / 100000; // A |
okini3939 | 0:bdb53686c194 | 32 | f = f / 0.000384; // mW/cm2 |
okini3939 | 0:bdb53686c194 | 33 | if (f < 0) f = 0; |
okini3939 | 0:bdb53686c194 | 34 | return f; |
okini3939 | 0:bdb53686c194 | 35 | } |
okini3939 | 0:bdb53686c194 | 36 | |
okini3939 | 0:bdb53686c194 | 37 | float get_moist (AnalogIn &ain) { |
okini3939 | 0:bdb53686c194 | 38 | float f; |
okini3939 | 0:bdb53686c194 | 39 | |
okini3939 | 0:bdb53686c194 | 40 | f = ain * AREF; // V |
okini3939 | 0:bdb53686c194 | 41 | f = f / ((AREF - f) / 10.0); // k ohm |
okini3939 | 0:bdb53686c194 | 42 | if (f < 0) f = 0; |
okini3939 | 0:bdb53686c194 | 43 | return f; |
okini3939 | 0:bdb53686c194 | 44 | } |
okini3939 | 0:bdb53686c194 | 45 | |
okini3939 | 0:bdb53686c194 | 46 | void isr_counter () { |
okini3939 | 0:bdb53686c194 | 47 | count_counter ++; |
okini3939 | 0:bdb53686c194 | 48 | } |
okini3939 | 0:bdb53686c194 | 49 | |
okini3939 | 0:bdb53686c194 | 50 | float get_counter (char flg) { |
okini3939 | 0:bdb53686c194 | 51 | float t; |
okini3939 | 0:bdb53686c194 | 52 | |
okini3939 | 0:bdb53686c194 | 53 | if (flg) { |
okini3939 | 0:bdb53686c194 | 54 | // count |
okini3939 | 0:bdb53686c194 | 55 | t = (float)count_counter; |
okini3939 | 0:bdb53686c194 | 56 | } else { |
okini3939 | 0:bdb53686c194 | 57 | // count/min |
okini3939 | 0:bdb53686c194 | 58 | if (locUpTime > lastCountTime) { |
okini3939 | 0:bdb53686c194 | 59 | t = (float)(locUpTime - lastCountTime) / 6000.0; |
okini3939 | 0:bdb53686c194 | 60 | } else { |
okini3939 | 0:bdb53686c194 | 61 | t = (float)(0xffffffff - lastCountTime + locUpTime) / 6000.0; |
okini3939 | 0:bdb53686c194 | 62 | } |
okini3939 | 0:bdb53686c194 | 63 | t = (float)count_counter / t; |
okini3939 | 0:bdb53686c194 | 64 | } |
okini3939 | 0:bdb53686c194 | 65 | lastCountTime = locUpTime; |
okini3939 | 0:bdb53686c194 | 66 | count_counter = 0; |
okini3939 | 0:bdb53686c194 | 67 | return t; |
okini3939 | 0:bdb53686c194 | 68 | } |
okini3939 | 0:bdb53686c194 | 69 | |
okini3939 | 0:bdb53686c194 | 70 | int update_sensor () { |
okini3939 | 0:bdb53686c194 | 71 | |
okini3939 | 0:bdb53686c194 | 72 | sensor.sec = time(NULL); |
okini3939 | 0:bdb53686c194 | 73 | |
okini3939 | 0:bdb53686c194 | 74 | bmp085.update(); |
okini3939 | 0:bdb53686c194 | 75 | sensor.pres = bmp085.get_pressure() + offset.pres; |
okini3939 | 0:bdb53686c194 | 76 | sensor.temp2 = bmp085.get_temperature(); |
okini3939 | 0:bdb53686c194 | 77 | |
okini3939 | 0:bdb53686c194 | 78 | sht15.update(SHT_high); |
okini3939 | 0:bdb53686c194 | 79 | sensor.temp = sht15.get_temperature() + offset.temp; |
okini3939 | 0:bdb53686c194 | 80 | sensor.humi = sht15.get_humidity() + offset.humi; |
okini3939 | 0:bdb53686c194 | 81 | |
okini3939 | 0:bdb53686c194 | 82 | sensor.anemo = wmeters.get_windspeed(); |
okini3939 | 0:bdb53686c194 | 83 | sensor.vane = wmeters.get_windvane(); |
okini3939 | 0:bdb53686c194 | 84 | sensor.rain = wmeters.get_raingauge(); |
okini3939 | 0:bdb53686c194 | 85 | |
okini3939 | 0:bdb53686c194 | 86 | sensor.light = get_light(ailight); |
okini3939 | 0:bdb53686c194 | 87 | sensor.uv = get_uv(aiuv); |
okini3939 | 0:bdb53686c194 | 88 | |
okini3939 | 0:bdb53686c194 | 89 | if (inputtype) { |
okini3939 | 0:bdb53686c194 | 90 | // counter |
okini3939 | 0:bdb53686c194 | 91 | sensor.moist = get_counter(inputtype & INPUT_CPM ? 0 : 1); |
okini3939 | 0:bdb53686c194 | 92 | } else { |
okini3939 | 0:bdb53686c194 | 93 | // moist sensor |
okini3939 | 0:bdb53686c194 | 94 | sensor.moist = get_moist(*aimoist); |
okini3939 | 0:bdb53686c194 | 95 | } |
okini3939 | 0:bdb53686c194 | 96 | |
okini3939 | 0:bdb53686c194 | 97 | return 0; |
okini3939 | 0:bdb53686c194 | 98 | } |
okini3939 | 0:bdb53686c194 | 99 | |
okini3939 | 0:bdb53686c194 | 100 | int init_sensor () { |
okini3939 | 0:bdb53686c194 | 101 | char buf[20]; |
okini3939 | 0:bdb53686c194 | 102 | |
okini3939 | 0:bdb53686c194 | 103 | memset(&sensor, 0, sizeof(sensor)); |
okini3939 | 0:bdb53686c194 | 104 | sensor.sec = time(NULL); |
okini3939 | 0:bdb53686c194 | 105 | sensor_old = sensor; |
okini3939 | 0:bdb53686c194 | 106 | offset = sensor; |
okini3939 | 0:bdb53686c194 | 107 | |
okini3939 | 0:bdb53686c194 | 108 | // moist sensor or counter |
okini3939 | 0:bdb53686c194 | 109 | if (cfg.getValue("INPUT", buf, sizeof(buf))) { |
okini3939 | 0:bdb53686c194 | 110 | // counter |
okini3939 | 0:bdb53686c194 | 111 | inputtype = atoi(buf); |
okini3939 | 0:bdb53686c194 | 112 | intin = new InterruptIn(p18); |
okini3939 | 0:bdb53686c194 | 113 | if (inputtype & INPUT_FALL) { |
okini3939 | 0:bdb53686c194 | 114 | intin->fall(&isr_counter); |
okini3939 | 0:bdb53686c194 | 115 | } |
okini3939 | 0:bdb53686c194 | 116 | if (inputtype & INPUT_RISE) { |
okini3939 | 0:bdb53686c194 | 117 | intin->rise(&isr_counter); |
okini3939 | 0:bdb53686c194 | 118 | } |
okini3939 | 0:bdb53686c194 | 119 | } else { |
okini3939 | 0:bdb53686c194 | 120 | // moist |
okini3939 | 0:bdb53686c194 | 121 | aimoist = new AnalogIn(p18); |
okini3939 | 0:bdb53686c194 | 122 | } |
okini3939 | 0:bdb53686c194 | 123 | |
okini3939 | 0:bdb53686c194 | 124 | if (cfg.getValue("OFFSET[P]", buf, sizeof(buf))) { |
okini3939 | 0:bdb53686c194 | 125 | offset.pres = atof(buf); |
okini3939 | 0:bdb53686c194 | 126 | } |
okini3939 | 0:bdb53686c194 | 127 | if (cfg.getValue("OFFSET[T]", buf, sizeof(buf))) { |
okini3939 | 0:bdb53686c194 | 128 | offset.temp = atof(buf); |
okini3939 | 0:bdb53686c194 | 129 | } |
okini3939 | 0:bdb53686c194 | 130 | if (cfg.getValue("OFFSET[H]", buf, sizeof(buf))) { |
okini3939 | 0:bdb53686c194 | 131 | offset.humi = atof(buf); |
okini3939 | 0:bdb53686c194 | 132 | } |
okini3939 | 0:bdb53686c194 | 133 | |
okini3939 | 0:bdb53686c194 | 134 | return 0; |
okini3939 | 0:bdb53686c194 | 135 | } |
okini3939 | 0:bdb53686c194 | 136 | |
okini3939 | 0:bdb53686c194 | 137 | char *format_str (const char *fmt, char *buf, int len) { |
okini3939 | 0:bdb53686c194 | 138 | int i, j, flg; |
okini3939 | 0:bdb53686c194 | 139 | char c; |
okini3939 | 0:bdb53686c194 | 140 | float value; |
okini3939 | 0:bdb53686c194 | 141 | time_t sec = time(NULL); |
okini3939 | 0:bdb53686c194 | 142 | struct tm *tim = localtime(&sec); |
okini3939 | 0:bdb53686c194 | 143 | |
okini3939 | 0:bdb53686c194 | 144 | j = 0; |
okini3939 | 0:bdb53686c194 | 145 | for (i = 0; i < strlen(fmt) && j < len; i ++) { |
okini3939 | 0:bdb53686c194 | 146 | c = fmt[i]; |
okini3939 | 0:bdb53686c194 | 147 | if (c == '%') { |
okini3939 | 0:bdb53686c194 | 148 | flg = 0; |
okini3939 | 0:bdb53686c194 | 149 | i ++; |
okini3939 | 0:bdb53686c194 | 150 | c = fmt[i]; |
okini3939 | 0:bdb53686c194 | 151 | |
okini3939 | 0:bdb53686c194 | 152 | if (c == '.') { |
okini3939 | 0:bdb53686c194 | 153 | // float format |
okini3939 | 0:bdb53686c194 | 154 | if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') { |
okini3939 | 0:bdb53686c194 | 155 | flg = fmt[i + 1] - '0'; |
okini3939 | 0:bdb53686c194 | 156 | i ++; |
okini3939 | 0:bdb53686c194 | 157 | |
okini3939 | 0:bdb53686c194 | 158 | c = fmt[i + 1]; |
okini3939 | 0:bdb53686c194 | 159 | i ++; |
okini3939 | 0:bdb53686c194 | 160 | } |
okini3939 | 0:bdb53686c194 | 161 | } |
okini3939 | 0:bdb53686c194 | 162 | |
okini3939 | 0:bdb53686c194 | 163 | switch (c) { |
okini3939 | 0:bdb53686c194 | 164 | case 'P': |
okini3939 | 0:bdb53686c194 | 165 | value = sensor.pres; |
okini3939 | 0:bdb53686c194 | 166 | break; |
okini3939 | 0:bdb53686c194 | 167 | case 'T': |
okini3939 | 0:bdb53686c194 | 168 | value = sensor.temp; |
okini3939 | 0:bdb53686c194 | 169 | break; |
okini3939 | 0:bdb53686c194 | 170 | case 'H': |
okini3939 | 0:bdb53686c194 | 171 | value = sensor.humi; |
okini3939 | 0:bdb53686c194 | 172 | break; |
okini3939 | 0:bdb53686c194 | 173 | case 'A': |
okini3939 | 0:bdb53686c194 | 174 | value = sensor.anemo; |
okini3939 | 0:bdb53686c194 | 175 | break; |
okini3939 | 0:bdb53686c194 | 176 | case 'V': |
okini3939 | 0:bdb53686c194 | 177 | value = sensor.vane; |
okini3939 | 0:bdb53686c194 | 178 | break; |
okini3939 | 0:bdb53686c194 | 179 | case 'R': |
okini3939 | 0:bdb53686c194 | 180 | value = sensor.rain; |
okini3939 | 0:bdb53686c194 | 181 | break; |
okini3939 | 0:bdb53686c194 | 182 | case 'L': |
okini3939 | 0:bdb53686c194 | 183 | value = sensor.light; |
okini3939 | 0:bdb53686c194 | 184 | break; |
okini3939 | 0:bdb53686c194 | 185 | case 'U': |
okini3939 | 0:bdb53686c194 | 186 | value = sensor.uv; |
okini3939 | 0:bdb53686c194 | 187 | break; |
okini3939 | 0:bdb53686c194 | 188 | case 'M': |
okini3939 | 0:bdb53686c194 | 189 | value = sensor.moist; |
okini3939 | 0:bdb53686c194 | 190 | break; |
okini3939 | 0:bdb53686c194 | 191 | case 'p': |
okini3939 | 0:bdb53686c194 | 192 | value = sensor.temp; |
okini3939 | 0:bdb53686c194 | 193 | break; |
okini3939 | 0:bdb53686c194 | 194 | |
okini3939 | 0:bdb53686c194 | 195 | case 'y': |
okini3939 | 0:bdb53686c194 | 196 | value = tim->tm_year + 1900; |
okini3939 | 0:bdb53686c194 | 197 | flg = -1; |
okini3939 | 0:bdb53686c194 | 198 | break; |
okini3939 | 0:bdb53686c194 | 199 | case 'm': |
okini3939 | 0:bdb53686c194 | 200 | value = tim->tm_mon; |
okini3939 | 0:bdb53686c194 | 201 | flg = -1; |
okini3939 | 0:bdb53686c194 | 202 | break; |
okini3939 | 0:bdb53686c194 | 203 | case 'd': |
okini3939 | 0:bdb53686c194 | 204 | value = tim->tm_mday; |
okini3939 | 0:bdb53686c194 | 205 | flg = -1; |
okini3939 | 0:bdb53686c194 | 206 | break; |
okini3939 | 0:bdb53686c194 | 207 | case 'h': |
okini3939 | 0:bdb53686c194 | 208 | value = tim->tm_hour; |
okini3939 | 0:bdb53686c194 | 209 | flg = -1; |
okini3939 | 0:bdb53686c194 | 210 | break; |
okini3939 | 0:bdb53686c194 | 211 | case 'i': |
okini3939 | 0:bdb53686c194 | 212 | value = tim->tm_min; |
okini3939 | 0:bdb53686c194 | 213 | flg = -1; |
okini3939 | 0:bdb53686c194 | 214 | break; |
okini3939 | 0:bdb53686c194 | 215 | case 's': |
okini3939 | 0:bdb53686c194 | 216 | value = tim->tm_sec; |
okini3939 | 0:bdb53686c194 | 217 | flg = -1; |
okini3939 | 0:bdb53686c194 | 218 | break; |
okini3939 | 0:bdb53686c194 | 219 | |
okini3939 | 0:bdb53686c194 | 220 | case '0': |
okini3939 | 0:bdb53686c194 | 221 | case '1': |
okini3939 | 0:bdb53686c194 | 222 | case '2': |
okini3939 | 0:bdb53686c194 | 223 | case '3': |
okini3939 | 0:bdb53686c194 | 224 | case '4': |
okini3939 | 0:bdb53686c194 | 225 | case '5': |
okini3939 | 0:bdb53686c194 | 226 | case '6': |
okini3939 | 0:bdb53686c194 | 227 | case '7': |
okini3939 | 0:bdb53686c194 | 228 | case '8': |
okini3939 | 0:bdb53686c194 | 229 | case '9': |
okini3939 | 0:bdb53686c194 | 230 | // Ascii code |
okini3939 | 0:bdb53686c194 | 231 | c = c - '0'; |
okini3939 | 0:bdb53686c194 | 232 | if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') { |
okini3939 | 0:bdb53686c194 | 233 | c = (c << 3) | (fmt[i + 1] - '0'); |
okini3939 | 0:bdb53686c194 | 234 | i ++; |
okini3939 | 0:bdb53686c194 | 235 | if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') { |
okini3939 | 0:bdb53686c194 | 236 | c = (c << 3) | (fmt[i + 1] - '0'); |
okini3939 | 0:bdb53686c194 | 237 | i ++; |
okini3939 | 0:bdb53686c194 | 238 | } |
okini3939 | 0:bdb53686c194 | 239 | } |
okini3939 | 0:bdb53686c194 | 240 | buf[j] = c; |
okini3939 | 0:bdb53686c194 | 241 | j ++; |
okini3939 | 0:bdb53686c194 | 242 | continue; |
okini3939 | 0:bdb53686c194 | 243 | |
okini3939 | 0:bdb53686c194 | 244 | default: |
okini3939 | 0:bdb53686c194 | 245 | buf[j] = c; |
okini3939 | 0:bdb53686c194 | 246 | j ++; |
okini3939 | 0:bdb53686c194 | 247 | continue; |
okini3939 | 0:bdb53686c194 | 248 | } |
okini3939 | 0:bdb53686c194 | 249 | |
okini3939 | 0:bdb53686c194 | 250 | switch (flg) { |
okini3939 | 0:bdb53686c194 | 251 | case 1: |
okini3939 | 0:bdb53686c194 | 252 | sprintf(&buf[j], "%.1f", value); |
okini3939 | 0:bdb53686c194 | 253 | break; |
okini3939 | 0:bdb53686c194 | 254 | case 2: |
okini3939 | 0:bdb53686c194 | 255 | sprintf(&buf[j], "%.2f", value); |
okini3939 | 0:bdb53686c194 | 256 | break; |
okini3939 | 0:bdb53686c194 | 257 | case -1: |
okini3939 | 0:bdb53686c194 | 258 | sprintf(&buf[j], "%02d", (int)value); |
okini3939 | 0:bdb53686c194 | 259 | break; |
okini3939 | 0:bdb53686c194 | 260 | default: |
okini3939 | 0:bdb53686c194 | 261 | sprintf(&buf[j], "%d", (int)value); |
okini3939 | 0:bdb53686c194 | 262 | break; |
okini3939 | 0:bdb53686c194 | 263 | } |
okini3939 | 0:bdb53686c194 | 264 | j = strlen(buf); |
okini3939 | 0:bdb53686c194 | 265 | } else { |
okini3939 | 0:bdb53686c194 | 266 | // plain |
okini3939 | 0:bdb53686c194 | 267 | buf[j] = c; |
okini3939 | 0:bdb53686c194 | 268 | j ++; |
okini3939 | 0:bdb53686c194 | 269 | } |
okini3939 | 0:bdb53686c194 | 270 | } |
okini3939 | 0:bdb53686c194 | 271 | buf[j] = 0; |
okini3939 | 0:bdb53686c194 | 272 | return buf; |
okini3939 | 0:bdb53686c194 | 273 | } |