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-13
- Revision:
- 2:4125fe2283ef
- Parent:
- 1:86d4b7431fbe
- Child:
- 3:60f5f6d5f765
File content as of revision 2:4125fe2283ef:
/* * mbed Weather Platform * Copyright (c) 2010 Hiroshi Suga * Released under the MIT License: http://mbed.org/license/mit */ /** @file * @brief mbed Weather Platform */ #include "mbed.h" #include "BMP085.h" #include "SHT.h" #include "WeatherMeters.h" //#include "I2CLCD.h" #include "ConfigFile.h" #include "SDFileSystem.h" #include "MSCFileSystem.h" #include "EthernetNetIf.h" #include "NTPClient.h" #include "HTTPClient.h" #define VERSION "mbed Weather Platform 0.1a (C) 2010 Suga koubou Co.,Ltd." //#define NONBLOCKING Serial pc(USBTX, USBRX); int seq = 0; char filename[20]; ConfigFile conf; DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); SDFileSystem sd(p5, p6, p7, p8, "sd"); MSCFileSystem *usb; // 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, *clientT; DigitalOut led_g(p25), led_y(p26); DigitalIn eth_link(P1_25), eth_speed(P1_26); void writefile (char *); void pachube (char *); void twitter (); void ntpdate (); int check_action (char); 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 f = f / ((3.3 - f) / 10.0); // k ohm if (f < 0) f = 0; return f; } float get_uv (AnalogIn &ain) { float f; f = ain * 5.0 / 100000; // A f = f / 0.000384; // mW/cm2 if (f < 0) f = 0; return f; } void action (char *buf) { if (check_action('H')) { pc.putc('H'); led4 = 1; } if (check_action('L')) { pc.putc('L'); led4 = 0; } if (check_action('P')) { if (conf.ipaddr[0] && conf.pachube_apikey[0] && conf.pachube_feedid[0]) { pc.putc('P'); pachube(buf); } } if (check_action('T')) { if (conf.ipaddr[0] && conf.twitter_user[0] && conf.twitter_pwd[0]) { pc.putc('T'); twitter(); } } } void init () { FILE *fp; conf.load("/sd/weather.cf"); pc.printf("Interval: %d sec\r\n", conf.interval); 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; clientT = new HTTPClient; } } if (conf.filetype) { // seq num if (conf.filetype == 1) { strcpy(filename, "/sd"); } else if (conf.filetype == 2) { usb = new MSCFileSystem("usb"); strcpy(filename, "/usb"); } strcat(filename, "/weather.seq"); // load fp = fopen(filename, "r"); if (fp) { fscanf(fp, "%d", &seq); fclose(fp); } seq ++; // save fp = fopen(filename, "w"); if (fp) { fprintf(fp, "%d", seq); fclose(fp); // 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 () { Timer timer; time_t sec; char buf[100]; led1 = 1; init(); pc.printf(VERSION "\r\n\r\n"); 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); } action(&buf[20]); /* 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 // 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(); } }