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

Committer:
okini3939
Date:
Mon Jul 04 15:16:45 2011 +0000
Revision:
0:bdb53686c194
Child:
1:6c7141895545

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }