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
main.cpp
- Committer:
- okini3939
- Date:
- 2010-12-10
- Revision:
- 0:4265d973a98f
- Child:
- 1:86d4b7431fbe
File content as of revision 0:4265d973a98f:
/* * mbed Weather Platform * Copyright (c) 2010 Hiroshi Suga * Released under the MIT License: http://mbed.org/license/mit */ /** mbed Weather Platform * @auther Suga koubou Co.,Ltd. */ #include "mbed.h" #include "BMP085.h" #include "SHT.h" #include "WeatherMeters.h" //#include "I2CLCD.h" #include "ConfigFile.h" #include "SDFileSystem.h" #include "EthernetNetIf.h" #include "NTPClient.h" #include "HTTPClient.h" #define VERSION "mbed Weather Platform 0.1a (C) 2010 Suga koubou Co.,Ltd." #define TIMEZONE 9 //#define NONBLOCKING Serial pc(USBTX, USBRX); int seq = 0; char filename[20]; ConfigFile conf; DigitalOut led1(LED1), led2(LED2), led3(LED3); SDFileSystem sd(p5, p6, p7, p8, "sd"); // Sensors float pres, temp, humi, light, anemo, vane, rain, uv, moist, temp2; I2C i2c(p9, p10); BMP085 bmp085(i2c, BMP085_oss4); //I2CLCD i2clcd(i2c); SHT sht15(p12, p11, SHT_high); // sclock, data WeatherMeters wmeters(p21, p15, p22); // anemo, vane, rain AnalogIn ailight(p16), aimoist(p18), aiuv(p17); // Ethernet EthernetNetIf *eth; NTPClient *ntp; HTTPClient *clientP; DigitalOut led_g(p25), led_y(p26); DigitalIn eth_link(P1_25), eth_speed(P1_26); float get_photo (AnalogIn &ain) { float f; f = ain * 5.0 / 1000; // A return f / 0.0000026; // lx } float get_moist (AnalogIn &ain) { float f; f = ain * 5.0; // V return f / ((3.3 - f) / 10.0); // k ohm } float get_uv (AnalogIn &ain) { float f; f = ain * 5.0 / 100000; // A return f / 0.000384; // mW/cm2 } void writefile (char *buf) { FILE *fp; led3 = 1; fp = fopen(filename, "a"); if (fp) { fprintf(fp, buf); fclose(fp); } else { led2 = 0; conf.filetype = 0; } led3 = 0; } void cb_clientP (HTTPResult status) { if (status != HTTP_OK) { pc.printf("Pachube failure (%d)\r\n", status); // pc.printf("Pachube failure (%d, %d)\r\n", status, clientP->getHTTPResponseCode()); } } void pachube (char *buf) { char uri[100]; HTTPText csvContent("text/csv"); led3 = 1; clientP->setRequestHeader("X-PachubeApiKey", conf.pachube_apikey); csvContent.set(buf); strcpy(uri, "http://api.pachube.com/v1/feeds/"); strcat(uri, conf.pachube_feedid); strcat(uri, ".csv?_method=put"); #ifdef NONBLOCKING Net::poll(); clientP->post(uri, csvContent, NULL, &cb_clientP); Net::poll(); #else clientP->post(uri, csvContent, NULL); #endif led3 = 0; } void cb_settime (NTPResult status) { if (status == NTP_OK) { time_t sec = time(NULL) + (60 * 60 * TIMEZONE); set_time(sec); pc.printf("Ntp success: %s\r\n", ctime(&sec)); } else { pc.printf("Ntp failure (%d)\r\n", status); } // ntp->close(); } void ntpdate () { ntp = new NTPClient; Host ntpserver(IpAddr(), 123, conf.ntpserver); #ifdef NONBLOCKING Net::poll(); ntp->setTime(ntpserver, &cb_settime); Net::poll(); #else ntp->setTime(ntpserver); time_t sec = time(NULL) + (60 * 60 * TIMEZONE); set_time(sec); #endif } void init () { FILE *fp; conf.load("/sd/weather.cf"); if (conf.ipaddr[0]) { // use ethernet eth_link.mode(PullUp); eth_speed.mode(PullUp); led_g = eth_link ? 1 : 0; led_y = eth_speed ? 1 : 0; if (conf.ipaddr[0] == 255) { // dhcp eth = new EthernetNetIf; } else { // static eth = new EthernetNetIf(conf.ipaddr, conf.netmask, conf.gateway, conf.nameserver); } EthernetErr ethErr = eth->setup(); if(ethErr) { // error conf.ipaddr = IpAddr(0, 0, 0, 0); } else if (conf.ipaddr[0] == 255) { // succeed dhcp conf.ipaddr = eth->getIp(); } pc.printf("Ethernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]); if (conf.ipaddr[0] && conf.ntpserver[0]) { // ntp pc.printf("Ntp: %s\r\n", conf.ntpserver); ntpdate(); } if (conf.ipaddr[0]) { clientP = new HTTPClient; } } if (conf.filetype) { // seq num fp = fopen("/sd/weather.seq", "r"); if (fp) { fscanf(fp, "%d", &seq); fclose(fp); } seq ++; fp = fopen("/sd/weather.seq", "w"); if (fp) { fprintf(fp, "%d", seq); fclose(fp); // create csv filename if (conf.filetype == 1) { sprintf(filename, "/sd/w%05d.csv", seq); } else if (conf.filetype == 2) { sprintf(filename, "/usb/w%05d.csv", seq); } pc.printf("Filename: %s\r\n", filename); led2 = 1; } } } int main () { int i; Timer timer; time_t sec; char buf[100]; led1 = 1; init(); pc.printf(VERSION "\r\n\r\n"); pc.printf("[%s|%s|%s|%s]\r\n", conf.pachube_apikey, conf.pachube_feedid, conf.twitter_user, conf.twitter_pwd); if (conf.filetype) { strcpy(buf, "date,pres(hPa),temp(`C),humi(%%),anemo(m/s),vane(`),rain(mm),light(lx),uv(mW/cm2),moist(kohm),\r\n"); writefile(buf); } timer.start(); #ifdef NONBLOCKING while (timer.read() < 5) { Net::poll(); } timer.reset(); #endif while(1) { led1 = 0; sec = time(NULL); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&sec)); // sensors bmp085.update(); pres = bmp085.get_pressure(); temp2 = bmp085.get_temperature(); sht15.update(SHT_high); temp = sht15.get_temperature(); humi = sht15.get_humidity(); anemo = wmeters.get_windspeed(); vane = wmeters.get_windvane(); rain = wmeters.get_raingauge(); light = get_photo(ailight); moist = get_moist(aimoist); uv = get_uv(aiuv); /* i2clcd.locate(0, 0); i2clcd.printf("%4.1f hPa", p); i2clcd.locate(0, 1); i2clcd.printf("%2.1f C / %2.1f %%", t, h); */ 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); pc.printf(buf); if (conf.filetype) { // csv writefile(buf); } /* if (actionscount) { // pin action i = check_action(); if (i == 0) { outpin = 0; } else if (i == 1) { outpin = 1; } } */ if (conf.ipaddr[0]) { if (conf.pachube_apikey[0] && conf.pachube_feedid[0]) { // pachube pachube(&buf[20]); } if (conf.twitter_user[0] && conf.twitter_pwd[0]) { // twitter } } led1 = 1; while (timer.read() < conf.interval) { // wait(1); // pc.putc('.'); led_g = eth_link ? 1 : 0; led_y = eth_speed ? 1 : 0; #ifdef NONBLOCKING Net::poll(); #endif } timer.reset(); } }