Dependencies: ChaNFSSD mbed BMP085 SHT2x
Diff: main.cpp
- Revision:
- 3:844fbe607dae
- Parent:
- 2:f546aaa0e1d5
- Child:
- 4:879b8dcfee15
--- a/main.cpp Mon Jan 23 15:04:58 2012 +0000 +++ b/main.cpp Sun Jan 29 14:06:48 2012 +0000 @@ -3,6 +3,11 @@ * ソースコードそのもののライセンスは、各ソースコードのライセンスに沿って公開します。 * 2012-1-4 Toshihisa T */ + +//#define _I2C_TEST +#define HAVE_TOGGLE_SW +#define HAVE_MICROSD + #include "mbed.h" #include "NMEA_parse.h" #include "SDFileSystem.h" @@ -16,9 +21,6 @@ using namespace libT; -//#define _CO2_TEST -//#define _I2C_TEST - #define _USE_FS_NAME "sd" Serial debug(USBTX,USBRX); @@ -36,8 +38,21 @@ SHT2x sht25(p9,p10); AD7994 ad7994(p9,p10); TextLCD_20X4 lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7 +#ifdef HAVE_TOGGLE_SW /* { */ +DigitalIn toggleSW(p22); +int toggleSW_scan = 0; +int toggleSW_pre = -1; +#endif /* } */ +int toggleSW_now = 0; +Ticker tick; SDFileSystem sd(p5, p6, p7, p8, _USE_FS_NAME); +int avaiableSD = -1; +unsigned short logNextCount = 0; +FILE *csvFP = NULL; +FILE *gpsFP = NULL; +int logSW = 0; +DigitalOut logled(LED3); DigitalOut myled(LED1); @@ -51,35 +66,36 @@ gps_pps_led = ((pps_count+=1) & 1) ? 1 : 0; } -void logFile_Init() -{ +void logFile_Init() { DIR *d; struct dirent *p; + unsigned short countCandidate; + char *endptr; + avaiableSD = 0; d = opendir("/" _USE_FS_NAME); if ( d != NULL ) { while ( (p = readdir(d)) != NULL ) { debug.printf("FILE - %s\x0d\x0a", p->d_name); + if (strlen(p->d_name) == (sizeof("ENVxxxxx.CSV")-1)) { + if ( ((p->d_name[0] == 'E') || (p->d_name[0] == 'e')) + && ((p->d_name[1] == 'N') || (p->d_name[1] == 'n')) + && ((p->d_name[2] == 'V') || (p->d_name[2] == 'v'))) { + } + countCandidate = (unsigned short)strtoul(&(p->d_name[3]),&endptr,10); + if (strcasecmp(endptr,".CSV") == 0) { + if (countCandidate > logNextCount) { + logNextCount = countCandidate; + } + } + } } closedir(d); + logNextCount++; + avaiableSD = 1; } } -void FileWriteTest() -{ - FILE *fp; - char *logname = "/" _USE_FS_NAME "/MBEDLOG.TXT"; - - debug.printf("FileWriteTest() open(%s) :", logname); - fp = fopen(logname,"a+w"); - if(fp == NULL){ - printf("NG\n"); - return; - } - printf("OK\n"); - fprintf(fp,"ENV Logger \"V1\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\x0d\x0a"); - fclose(fp); -} int CO2_Read(unsigned short *val) { @@ -173,7 +189,66 @@ } } } - return -1; +} + +unsigned long tickCount = 0; +unsigned long hzCount = 0; +unsigned long hzCount_tmp = 0; +unsigned long logTickCount = 0; +void tickHandler() +{ + logTickCount++; + tickCount++; + hzCount_tmp++; + if(hzCount_tmp >= 50){ + hzCount_tmp = 0; + hzCount++; + } +#ifdef HAVE_TOGGLE_SW /* { */ + int nowRead; + nowRead = toggleSW.read(); + if(nowRead != toggleSW_pre){ + toggleSW_pre = nowRead; + toggleSW_scan = 0; + } else { + toggleSW_scan++; + if(toggleSW_scan >= 3){ + toggleSW_now = toggleSW_pre; + toggleSW_scan = 0; + } + } +#endif +} + +void logCheckProc() +{ + if((logSW == 0) && (toggleSW_now != 0)){ + if(csvFP != NULL){ + fclose(csvFP); + csvFP = NULL; + if(gpsFP != NULL){ + fclose(gpsFP); + gpsFP = NULL; + } + logled = 0; /* No logging */ + logNextCount++; + } else { + char name[64]; + sprintf(name,"/%s/ENV%05d.CSV",_USE_FS_NAME,logNextCount); + csvFP = fopen(name,"w+b"); + sprintf(name,"/%s/ENV%05d.GPS",_USE_FS_NAME,logNextCount); + gpsFP = fopen(name,"w+b"); + if((csvFP != NULL) && (gpsFP != NULL)){ + logled = 1; /* logging */ + logTickCount = 100; + } else { + if(csvFP) fclose(csvFP); + if(gpsFP) fclose(gpsFP); + logled = 0; /* Cannot start logging */ + } + } + } + logSW = toggleSW_now; } unsigned char wbuf[1024]; @@ -181,33 +256,53 @@ int main() { int ret = 0; - float p, t; + float p, t1; + float h, t2; int temp; unsigned short CO2_val; unsigned long scanCount = 0; - FILE *fp; - char *logname = "/" _USE_FS_NAME "/ENVLOG.TXT"; char c; unsigned long UBXCount = 0; + tick.attach_us(&tickHandler,(10*1000)); + debug.format(8,Serial::None,1); debug.baud(115200); - debug.printf("ENV Logger \"V0.5\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\n"); + debug.printf("ENV Logger \"V0.7\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\n"); debug.printf("LCD Display\n"); //lcd.cls(); lcd.locate(0,0); - lcd.printf("ENV Logger \"V0.5\""); + lcd.printf("ENV Logger \"V0.7\""); lcd.locate(0,1); lcd.printf("WAKE UP I/O..."); wait(5.0); +#ifdef HAVE_MICROSD + lcd.locate(0,2); + lcd.printf("CHECK MicroSD:"); + logFile_Init(); +#endif + lcd.locate(0,2); + switch(avaiableSD){ + case 0: + lcd.printf("CHECK MicroSD:NG"); + break; + case 1: + lcd.printf("CHECK MicroSD:OK"); + break; + default: + lcd.printf("CHECK MicroSD:DO\'NT USE"); + break; + } + wait(1.0); + //logFile_Init(); //FileWriteTest(); - lcd.locate(0,1); + lcd.locate(0,3); lcd.printf("SETTING GPS..."); UBXPacket.cjobst = 0; @@ -257,35 +352,35 @@ } } UBXPacket.cjobst = 0; - lcd.locate(0,1); + lcd.locate(0,3); lcd.printf("SETTING GPS...Done."); -#if 0 - debug.printf("open(%s) :", logname); - if((fp = fopen(logname,"a+w")) == NULL){ - printf("NG\n"); - } else { - printf("OK\n"); - } - widx = 0; -#endif - // ad7994.Start(); CO2.format(8,Serial::None,1); CO2.baud(9600); CO2.recvStart(); + //Clear Screen. + lcd.locate(0,0); lcd.printf("%20s"," "); + lcd.locate(0,1); lcd.printf("%20s"," "); + lcd.locate(0,2); lcd.printf("%20s"," "); + lcd.locate(0,3); lcd.printf("%20s"," "); + while(1) { //lcd.cls(); //lcd.locate(0,0); //lcd.printf("SCAN:%-10ld",scanCount); + lcd.locate(0,0); + lcd.printf("%d ",toggleSW_now); + + logCheckProc(); while(gps.readable()) { c = gps.getc(); if(UBXPacket_Parse(&UBXPacket,c) == 100){ UBXCount++; - lcd.locate(0,0); + lcd.locate(2,0); lcd.printf("UBX Recv:%-10ld",UBXCount); debug.printf("%ld : GET UBX Packet (Class=0x%02X,ID=0x%02X,LEN=%d)\n", scanCount, @@ -294,31 +389,31 @@ UBXPacket.len ); UBXPacket.cjobst = 0; } - //if(fp != NULL){ - // wbuf[widx] = c; - // widx++; - // if(widx >= sizeof(wbuf)){ - // fwrite(&wbuf,sizeof(wbuf[0]),widx,fp); - // widx = 0; - // } - //} + if(gpsFP != NULL){ + wbuf[widx] = c; + widx++; + if(widx >= sizeof(wbuf)){ + fwrite(&wbuf,sizeof(wbuf[0]),widx,gpsFP); + widx = 0; + } + } } if(1){ bmp085.update(); p = bmp085.get_pressure(); - t = bmp085.get_temperature(); + t1 = bmp085.get_temperature(); lcd.locate(0,1); - lcd.printf("%-8.2fhPa %-6.2fC", p, t); + lcd.printf("%-8.2fhPa %-6.2fC", p, t1); } if(1){ sht25.SHT2x_MeasurePoll(TEMP,&temp); - p = sht25.SHT2x_CalcTemperatureC(temp); + t2 = sht25.SHT2x_CalcTemperatureC(temp); sht25.SHT2x_MeasurePoll(HUMIDITY,&temp); - t = sht25.SHT2x_CalcRH(temp); + h = sht25.SHT2x_CalcRH(temp); lcd.locate(0,2); - lcd.printf("%-6.2fC %-6.2fRH", p, t); + lcd.printf("%-6.2fC %-6.2fRH", t2, h); //sht25.SHT2x_SoftReset(); } @@ -334,6 +429,13 @@ lcd.printf("CO2:NG(%d) \n",ret); } + if(csvFP){ + if(logTickCount >= 100){ + fprintf(csvFP,"%-8.2f,hPa,%-6.2f,C,%-6.2f,C,%-6.2f,RH,%5d.%1d,ppm\x0d\x0a", p, t1, t2, h,CO2_val/10,CO2_val%10); + logTickCount = 0; + } + } + #if 0 ad7994.update(); lcd.locate(0,3); @@ -341,17 +443,24 @@ ad7994.readChn(0), ad7994.readChn(1)); #endif - - myled = 1; - wait(0.5); - myled = 0; - wait(0.5); - + myled = (hzCount & 1); scanCount++; + wait(0.1); } } /* + * 2012-1-29 V0.7 + * ログ機能の追加。スイッチを押すとログのON/OFFが出来る。 + * ログ収集中は、mbed LED3 が点灯する。 + */ +/* + * 2012-1-29 V0.6 + * 1) スキャンカウントの変更。今までは1秒周期だったが、 + * 100ミリ秒周期でセンサーデータを得るようにした。 + * 2) モーメンタリSW対応。 + */ +/* * 2012-1-23 V0.5 * U-Blox,気圧センサー,温度センサー,CO2センサーの値を表示するようにした。 * U-Blox は受信できたパケット数を表示する。