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:
Fri Dec 10 17:15:15 2010 +0000
Revision:
0:4265d973a98f
Child:
1:86d4b7431fbe

        

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