mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/

Dependencies:   EthernetNetIf SDHCFileSystem I2CLEDDisp Agentbed NTPClient_NetServices mbed BMP085 HTTPClient ConfigFile I2CLCD

Committer:
okini3939
Date:
Mon Dec 13 16:40:19 2010 +0000
Revision:
2:4125fe2283ef
Parent:
1:86d4b7431fbe
Child:
3:60f5f6d5f765

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:4265d973a98f 1 /*
okini3939 0:4265d973a98f 2 * mbed Weather Platform
okini3939 0:4265d973a98f 3 * Copyright (c) 2010 Hiroshi Suga
okini3939 0:4265d973a98f 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:4265d973a98f 5 */
okini3939 1:86d4b7431fbe 6
okini3939 1:86d4b7431fbe 7 /** @file
okini3939 1:86d4b7431fbe 8 * @brief mbed Weather Platform
okini3939 0:4265d973a98f 9 */
okini3939 0:4265d973a98f 10 #include "mbed.h"
okini3939 0:4265d973a98f 11 #include "BMP085.h"
okini3939 0:4265d973a98f 12 #include "SHT.h"
okini3939 0:4265d973a98f 13 #include "WeatherMeters.h"
okini3939 0:4265d973a98f 14 //#include "I2CLCD.h"
okini3939 0:4265d973a98f 15 #include "ConfigFile.h"
okini3939 0:4265d973a98f 16 #include "SDFileSystem.h"
okini3939 2:4125fe2283ef 17 #include "MSCFileSystem.h"
okini3939 0:4265d973a98f 18 #include "EthernetNetIf.h"
okini3939 0:4265d973a98f 19 #include "NTPClient.h"
okini3939 0:4265d973a98f 20 #include "HTTPClient.h"
okini3939 0:4265d973a98f 21
okini3939 0:4265d973a98f 22 #define VERSION "mbed Weather Platform 0.1a (C) 2010 Suga koubou Co.,Ltd."
okini3939 0:4265d973a98f 23
okini3939 0:4265d973a98f 24 //#define NONBLOCKING
okini3939 0:4265d973a98f 25
okini3939 0:4265d973a98f 26 Serial pc(USBTX, USBRX);
okini3939 0:4265d973a98f 27 int seq = 0;
okini3939 0:4265d973a98f 28 char filename[20];
okini3939 0:4265d973a98f 29 ConfigFile conf;
okini3939 1:86d4b7431fbe 30 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 0:4265d973a98f 31 SDFileSystem sd(p5, p6, p7, p8, "sd");
okini3939 2:4125fe2283ef 32 MSCFileSystem *usb;
okini3939 0:4265d973a98f 33
okini3939 0:4265d973a98f 34 // Sensors
okini3939 0:4265d973a98f 35 float pres, temp, humi, light, anemo, vane, rain, uv, moist, temp2;
okini3939 0:4265d973a98f 36 I2C i2c(p9, p10);
okini3939 0:4265d973a98f 37 BMP085 bmp085(i2c, BMP085_oss4);
okini3939 0:4265d973a98f 38 //I2CLCD i2clcd(i2c);
okini3939 0:4265d973a98f 39 SHT sht15(p12, p11, SHT_high); // sclock, data
okini3939 0:4265d973a98f 40 WeatherMeters wmeters(p21, p15, p22); // anemo, vane, rain
okini3939 0:4265d973a98f 41 AnalogIn ailight(p16), aimoist(p18), aiuv(p17);
okini3939 0:4265d973a98f 42
okini3939 0:4265d973a98f 43 // Ethernet
okini3939 0:4265d973a98f 44 EthernetNetIf *eth;
okini3939 0:4265d973a98f 45 NTPClient *ntp;
okini3939 1:86d4b7431fbe 46 HTTPClient *clientP, *clientT;
okini3939 0:4265d973a98f 47 DigitalOut led_g(p25), led_y(p26);
okini3939 0:4265d973a98f 48 DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:4265d973a98f 49
okini3939 1:86d4b7431fbe 50 void writefile (char *);
okini3939 1:86d4b7431fbe 51 void pachube (char *);
okini3939 1:86d4b7431fbe 52 void twitter ();
okini3939 1:86d4b7431fbe 53 void ntpdate ();
okini3939 1:86d4b7431fbe 54 int check_action (char);
okini3939 0:4265d973a98f 55
okini3939 0:4265d973a98f 56 float get_photo (AnalogIn &ain) {
okini3939 0:4265d973a98f 57 float f;
okini3939 0:4265d973a98f 58
okini3939 0:4265d973a98f 59 f = ain * 5.0 / 1000; // A
okini3939 0:4265d973a98f 60 return f / 0.0000026; // lx
okini3939 0:4265d973a98f 61 }
okini3939 0:4265d973a98f 62
okini3939 0:4265d973a98f 63 float get_moist (AnalogIn &ain) {
okini3939 0:4265d973a98f 64 float f;
okini3939 0:4265d973a98f 65
okini3939 0:4265d973a98f 66 f = ain * 5.0; // V
okini3939 2:4125fe2283ef 67 f = f / ((3.3 - f) / 10.0); // k ohm
okini3939 2:4125fe2283ef 68 if (f < 0) f = 0;
okini3939 2:4125fe2283ef 69 return f;
okini3939 0:4265d973a98f 70 }
okini3939 0:4265d973a98f 71
okini3939 0:4265d973a98f 72 float get_uv (AnalogIn &ain) {
okini3939 0:4265d973a98f 73 float f;
okini3939 0:4265d973a98f 74
okini3939 0:4265d973a98f 75 f = ain * 5.0 / 100000; // A
okini3939 2:4125fe2283ef 76 f = f / 0.000384; // mW/cm2
okini3939 2:4125fe2283ef 77 if (f < 0) f = 0;
okini3939 2:4125fe2283ef 78 return f;
okini3939 0:4265d973a98f 79 }
okini3939 0:4265d973a98f 80
okini3939 1:86d4b7431fbe 81 void action (char *buf) {
okini3939 1:86d4b7431fbe 82 if (check_action('H')) {
okini3939 1:86d4b7431fbe 83 pc.putc('H');
okini3939 1:86d4b7431fbe 84 led4 = 1;
okini3939 0:4265d973a98f 85 }
okini3939 1:86d4b7431fbe 86 if (check_action('L')) {
okini3939 1:86d4b7431fbe 87 pc.putc('L');
okini3939 1:86d4b7431fbe 88 led4 = 0;
okini3939 0:4265d973a98f 89 }
okini3939 1:86d4b7431fbe 90 if (check_action('P')) {
okini3939 1:86d4b7431fbe 91 if (conf.ipaddr[0] && conf.pachube_apikey[0] && conf.pachube_feedid[0]) {
okini3939 1:86d4b7431fbe 92 pc.putc('P');
okini3939 1:86d4b7431fbe 93 pachube(buf);
okini3939 1:86d4b7431fbe 94 }
okini3939 0:4265d973a98f 95 }
okini3939 1:86d4b7431fbe 96 if (check_action('T')) {
okini3939 1:86d4b7431fbe 97 if (conf.ipaddr[0] && conf.twitter_user[0] && conf.twitter_pwd[0]) {
okini3939 1:86d4b7431fbe 98 pc.putc('T');
okini3939 1:86d4b7431fbe 99 twitter();
okini3939 1:86d4b7431fbe 100 }
okini3939 1:86d4b7431fbe 101 }
okini3939 0:4265d973a98f 102 }
okini3939 0:4265d973a98f 103
okini3939 0:4265d973a98f 104 void init () {
okini3939 0:4265d973a98f 105 FILE *fp;
okini3939 0:4265d973a98f 106
okini3939 0:4265d973a98f 107 conf.load("/sd/weather.cf");
okini3939 0:4265d973a98f 108
okini3939 2:4125fe2283ef 109 pc.printf("Interval: %d sec\r\n", conf.interval);
okini3939 2:4125fe2283ef 110
okini3939 0:4265d973a98f 111 if (conf.ipaddr[0]) {
okini3939 0:4265d973a98f 112 // use ethernet
okini3939 0:4265d973a98f 113
okini3939 0:4265d973a98f 114 eth_link.mode(PullUp);
okini3939 0:4265d973a98f 115 eth_speed.mode(PullUp);
okini3939 0:4265d973a98f 116 led_g = eth_link ? 1 : 0;
okini3939 0:4265d973a98f 117 led_y = eth_speed ? 1 : 0;
okini3939 0:4265d973a98f 118 if (conf.ipaddr[0] == 255) {
okini3939 0:4265d973a98f 119 // dhcp
okini3939 0:4265d973a98f 120 eth = new EthernetNetIf;
okini3939 0:4265d973a98f 121 } else {
okini3939 0:4265d973a98f 122 // static
okini3939 0:4265d973a98f 123 eth = new EthernetNetIf(conf.ipaddr, conf.netmask, conf.gateway, conf.nameserver);
okini3939 0:4265d973a98f 124 }
okini3939 0:4265d973a98f 125
okini3939 0:4265d973a98f 126 EthernetErr ethErr = eth->setup();
okini3939 0:4265d973a98f 127 if(ethErr) {
okini3939 0:4265d973a98f 128 // error
okini3939 0:4265d973a98f 129 conf.ipaddr = IpAddr(0, 0, 0, 0);
okini3939 0:4265d973a98f 130 } else
okini3939 0:4265d973a98f 131 if (conf.ipaddr[0] == 255) {
okini3939 0:4265d973a98f 132 // succeed dhcp
okini3939 0:4265d973a98f 133 conf.ipaddr = eth->getIp();
okini3939 0:4265d973a98f 134 }
okini3939 0:4265d973a98f 135 pc.printf("Ethernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]);
okini3939 0:4265d973a98f 136
okini3939 0:4265d973a98f 137 if (conf.ipaddr[0] && conf.ntpserver[0]) {
okini3939 0:4265d973a98f 138 // ntp
okini3939 0:4265d973a98f 139 pc.printf("Ntp: %s\r\n", conf.ntpserver);
okini3939 0:4265d973a98f 140 ntpdate();
okini3939 0:4265d973a98f 141 }
okini3939 0:4265d973a98f 142
okini3939 0:4265d973a98f 143 if (conf.ipaddr[0]) {
okini3939 0:4265d973a98f 144 clientP = new HTTPClient;
okini3939 1:86d4b7431fbe 145 clientT = new HTTPClient;
okini3939 0:4265d973a98f 146 }
okini3939 0:4265d973a98f 147 }
okini3939 0:4265d973a98f 148
okini3939 0:4265d973a98f 149 if (conf.filetype) {
okini3939 0:4265d973a98f 150 // seq num
okini3939 2:4125fe2283ef 151
okini3939 2:4125fe2283ef 152 if (conf.filetype == 1) {
okini3939 2:4125fe2283ef 153 strcpy(filename, "/sd");
okini3939 2:4125fe2283ef 154 } else
okini3939 2:4125fe2283ef 155 if (conf.filetype == 2) {
okini3939 2:4125fe2283ef 156 usb = new MSCFileSystem("usb");
okini3939 2:4125fe2283ef 157 strcpy(filename, "/usb");
okini3939 2:4125fe2283ef 158 }
okini3939 2:4125fe2283ef 159 strcat(filename, "/weather.seq");
okini3939 2:4125fe2283ef 160
okini3939 2:4125fe2283ef 161 // load
okini3939 2:4125fe2283ef 162 fp = fopen(filename, "r");
okini3939 0:4265d973a98f 163 if (fp) {
okini3939 0:4265d973a98f 164 fscanf(fp, "%d", &seq);
okini3939 0:4265d973a98f 165 fclose(fp);
okini3939 0:4265d973a98f 166 }
okini3939 0:4265d973a98f 167 seq ++;
okini3939 2:4125fe2283ef 168 // save
okini3939 2:4125fe2283ef 169 fp = fopen(filename, "w");
okini3939 0:4265d973a98f 170 if (fp) {
okini3939 0:4265d973a98f 171 fprintf(fp, "%d", seq);
okini3939 0:4265d973a98f 172 fclose(fp);
okini3939 2:4125fe2283ef 173 // csv filename
okini3939 0:4265d973a98f 174 if (conf.filetype == 1) {
okini3939 0:4265d973a98f 175 sprintf(filename, "/sd/w%05d.csv", seq);
okini3939 0:4265d973a98f 176 } else
okini3939 0:4265d973a98f 177 if (conf.filetype == 2) {
okini3939 0:4265d973a98f 178 sprintf(filename, "/usb/w%05d.csv", seq);
okini3939 0:4265d973a98f 179 }
okini3939 0:4265d973a98f 180 pc.printf("Filename: %s\r\n", filename);
okini3939 0:4265d973a98f 181 led2 = 1;
okini3939 0:4265d973a98f 182 }
okini3939 0:4265d973a98f 183 }
okini3939 0:4265d973a98f 184 }
okini3939 0:4265d973a98f 185
okini3939 0:4265d973a98f 186 int main () {
okini3939 0:4265d973a98f 187 Timer timer;
okini3939 0:4265d973a98f 188 time_t sec;
okini3939 0:4265d973a98f 189 char buf[100];
okini3939 0:4265d973a98f 190
okini3939 0:4265d973a98f 191 led1 = 1;
okini3939 0:4265d973a98f 192 init();
okini3939 0:4265d973a98f 193 pc.printf(VERSION "\r\n\r\n");
okini3939 0:4265d973a98f 194
okini3939 0:4265d973a98f 195 if (conf.filetype) {
okini3939 0:4265d973a98f 196 strcpy(buf, "date,pres(hPa),temp(`C),humi(%%),anemo(m/s),vane(`),rain(mm),light(lx),uv(mW/cm2),moist(kohm),\r\n");
okini3939 0:4265d973a98f 197 writefile(buf);
okini3939 0:4265d973a98f 198 }
okini3939 0:4265d973a98f 199
okini3939 0:4265d973a98f 200 timer.start();
okini3939 0:4265d973a98f 201 #ifdef NONBLOCKING
okini3939 0:4265d973a98f 202 while (timer.read() < 5) {
okini3939 0:4265d973a98f 203 Net::poll();
okini3939 0:4265d973a98f 204 }
okini3939 0:4265d973a98f 205 timer.reset();
okini3939 0:4265d973a98f 206 #endif
okini3939 0:4265d973a98f 207
okini3939 0:4265d973a98f 208 while(1) {
okini3939 0:4265d973a98f 209 led1 = 0;
okini3939 0:4265d973a98f 210
okini3939 0:4265d973a98f 211 sec = time(NULL);
okini3939 0:4265d973a98f 212 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&sec));
okini3939 0:4265d973a98f 213
okini3939 0:4265d973a98f 214 // sensors
okini3939 0:4265d973a98f 215 bmp085.update();
okini3939 0:4265d973a98f 216 pres = bmp085.get_pressure();
okini3939 0:4265d973a98f 217 temp2 = bmp085.get_temperature();
okini3939 0:4265d973a98f 218
okini3939 0:4265d973a98f 219 sht15.update(SHT_high);
okini3939 0:4265d973a98f 220 temp = sht15.get_temperature();
okini3939 0:4265d973a98f 221 humi = sht15.get_humidity();
okini3939 0:4265d973a98f 222
okini3939 0:4265d973a98f 223 anemo = wmeters.get_windspeed();
okini3939 0:4265d973a98f 224 vane = wmeters.get_windvane();
okini3939 0:4265d973a98f 225 rain = wmeters.get_raingauge();
okini3939 0:4265d973a98f 226
okini3939 0:4265d973a98f 227 light = get_photo(ailight);
okini3939 0:4265d973a98f 228 moist = get_moist(aimoist);
okini3939 0:4265d973a98f 229 uv = get_uv(aiuv);
okini3939 0:4265d973a98f 230 /*
okini3939 0:4265d973a98f 231 i2clcd.locate(0, 0);
okini3939 0:4265d973a98f 232 i2clcd.printf("%4.1f hPa", p);
okini3939 0:4265d973a98f 233 i2clcd.locate(0, 1);
okini3939 0:4265d973a98f 234 i2clcd.printf("%2.1f C / %2.1f %%", t, h);
okini3939 0:4265d973a98f 235 */
okini3939 0:4265d973a98f 236
okini3939 0:4265d973a98f 237 sprintf(&buf[strlen(buf)], ",%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n", pres, temp, humi, anemo, vane, rain, light, uv, moist, temp2);
okini3939 0:4265d973a98f 238 pc.printf(buf);
okini3939 0:4265d973a98f 239 if (conf.filetype) {
okini3939 0:4265d973a98f 240 // csv
okini3939 0:4265d973a98f 241 writefile(buf);
okini3939 0:4265d973a98f 242 }
okini3939 1:86d4b7431fbe 243
okini3939 1:86d4b7431fbe 244 action(&buf[20]);
okini3939 0:4265d973a98f 245 /*
okini3939 0:4265d973a98f 246 if (conf.ipaddr[0]) {
okini3939 0:4265d973a98f 247 if (conf.pachube_apikey[0] && conf.pachube_feedid[0]) {
okini3939 0:4265d973a98f 248 // pachube
okini3939 0:4265d973a98f 249 pachube(&buf[20]);
okini3939 0:4265d973a98f 250 }
okini3939 0:4265d973a98f 251 if (conf.twitter_user[0] && conf.twitter_pwd[0]) {
okini3939 0:4265d973a98f 252 // twitter
okini3939 1:86d4b7431fbe 253 // twitter();
okini3939 0:4265d973a98f 254 }
okini3939 0:4265d973a98f 255 }
okini3939 1:86d4b7431fbe 256 */
okini3939 0:4265d973a98f 257 led1 = 1;
okini3939 0:4265d973a98f 258
okini3939 0:4265d973a98f 259 while (timer.read() < conf.interval) {
okini3939 0:4265d973a98f 260 // wait(1);
okini3939 0:4265d973a98f 261 // pc.putc('.');
okini3939 0:4265d973a98f 262 led_g = eth_link ? 1 : 0;
okini3939 0:4265d973a98f 263 led_y = eth_speed ? 1 : 0;
okini3939 0:4265d973a98f 264 #ifdef NONBLOCKING
okini3939 0:4265d973a98f 265 Net::poll();
okini3939 0:4265d973a98f 266 #endif
okini3939 0:4265d973a98f 267 }
okini3939 0:4265d973a98f 268 timer.reset();
okini3939 0:4265d973a98f 269 }
okini3939 0:4265d973a98f 270 }