Dependencies: ChaNFSSD mbed BMP085 SHT2x
Diff: main.cpp
- Revision:
- 4:879b8dcfee15
- Parent:
- 3:844fbe607dae
- Child:
- 5:3a1ce282892c
--- a/main.cpp Sun Jan 29 14:06:48 2012 +0000 +++ b/main.cpp Sat Feb 04 17:01:17 2012 +0000 @@ -4,7 +4,8 @@ * 2012-1-4 Toshihisa T */ -//#define _I2C_TEST +#define __MY_VERSION__ "0.81" + #define HAVE_TOGGLE_SW #define HAVE_MICROSD @@ -30,13 +31,13 @@ InterruptIn gps_pps(p26); tSerialBuffer gps(p28,p27); DigitalOut gps_pps_led(LED2); -#ifdef _I2C_TEST /* { */ I2C i2c(p9, p10); // sda, scl -#endif /* } */ BMP085 bmp085(p9, p10); -//SHT25 sht25(p9, p10); +int bmp085_find = 0; SHT2x sht25(p9,p10); +int sht25_find = 0; AD7994 ad7994(p9,p10); +int ad7994_find = 0; TextLCD_20X4 lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7 #ifdef HAVE_TOGGLE_SW /* { */ DigitalIn toggleSW(p22); @@ -45,6 +46,8 @@ #endif /* } */ int toggleSW_now = 0; Ticker tick; +tSerialBuffer CO2(p13,p14); +Timer CO2_TMOUT; SDFileSystem sd(p5, p6, p7, p8, _USE_FS_NAME); int avaiableSD = -1; @@ -52,12 +55,10 @@ FILE *csvFP = NULL; FILE *gpsFP = NULL; int logSW = 0; + DigitalOut logled(LED3); - DigitalOut myled(LED1); -tSerialBuffer CO2(p13,p14); - struct UBXPacket_s UBXPacket; int pps_count = 0; @@ -109,8 +110,13 @@ //debug.printf("0x%02x ",sbuf[i]); CO2.putc(sbuf[i]); } + CO2_TMOUT.start(); for(i=0;i < sizeof(rbuf);i++){ - while(!CO2.readable()){} + while(!CO2.readable()){ + if(CO2_TMOUT.read_ms() >= 1000){ + return -99; /* TIMEOUT */ + } + } rbuf[i] = CO2.getc(); } if(rbuf[0] != 0xFE){ @@ -133,8 +139,8 @@ } // BMP085 0xee -// AD9774 0x44 -#ifdef _I2C_TEST /* { */ +// AD7994 0x44 +// SHT2x 0x80 int i2c_found() { int count = 0; lcd.locate(0,2); @@ -142,15 +148,18 @@ lcd.locate(8,2); for (int address=0; address<256; address+=2) { if (!i2c.write(address, NULL, 0)) { // 0 returned is ok + switch(address){ + case 0xee: bmp085_find = 1; break; + case 0x44: ad7994_find = 1; break; + case 0x80: sht25_find = 1; break; + default: break; + } lcd.printf("%02X ",address); count++; } } - lcd.printf("\n"); - lcd.printf("%d devices found", count); return count; } -#endif /* } */ unsigned char NMEA_CalcSum(unsigned char *str,int len) { @@ -191,13 +200,13 @@ } } +unsigned long scanCount = 0; unsigned long tickCount = 0; unsigned long hzCount = 0; unsigned long hzCount_tmp = 0; -unsigned long logTickCount = 0; void tickHandler() { - logTickCount++; + scanCount++; tickCount++; hzCount_tmp++; if(hzCount_tmp >= 50){ @@ -240,7 +249,6 @@ gpsFP = fopen(name,"w+b"); if((csvFP != NULL) && (gpsFP != NULL)){ logled = 1; /* logging */ - logTickCount = 100; } else { if(csvFP) fclose(csvFP); if(gpsFP) fclose(gpsFP); @@ -254,56 +262,72 @@ unsigned char wbuf[1024]; int widx = 0; +void ClearScreen(void) +{ + 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"," "); +} + int main() { int ret = 0; float p, t1; float h, t2; int temp; - unsigned short CO2_val; - unsigned long scanCount = 0; + unsigned short CO2_val = 0; char c; unsigned long UBXCount = 0; + int GPS_isRaw = 0; + int CO2_find = 0; + int year=0; + int mon=0; + int day=0; + int hour=0; + int min=0; + int sec=0; + int pre_sec = -1; + p = -99.0; + t1 = -99.0; + t2 = -99.0; + h = -99.0; + tick.attach_us(&tickHandler,(10*1000)); debug.format(8,Serial::None,1); debug.baud(115200); - debug.printf("ENV Logger \"V0.7\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\n"); - - debug.printf("LCD Display\n"); + debug.printf("ENV Logger \"%s\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\n",__MY_VERSION__); - //lcd.cls(); lcd.locate(0,0); - lcd.printf("ENV Logger \"V0.7\""); + lcd.printf("ENV Logger \"%s\"",__MY_VERSION__); lcd.locate(0,1); lcd.printf("WAKE UP I/O..."); wait(5.0); + ClearScreen(); + #ifdef HAVE_MICROSD - lcd.locate(0,2); - lcd.printf("CHECK MicroSD:"); + lcd.locate(0,0); + lcd.printf("Check MicroSD:"); logFile_Init(); #endif - lcd.locate(0,2); + lcd.locate(0,0); switch(avaiableSD){ case 0: - lcd.printf("CHECK MicroSD:NG"); + lcd.printf("Check MicroSD:NG"); break; case 1: - lcd.printf("CHECK MicroSD:OK"); + lcd.printf("Check MicroSD:OK"); break; default: - lcd.printf("CHECK MicroSD:DO\'NT USE"); + lcd.printf("Check MicroSD:DO\'NT USE"); break; } - wait(1.0); - //logFile_Init(); - //FileWriteTest(); - - lcd.locate(0,3); - lcd.printf("SETTING GPS..."); + lcd.locate(0,1); + lcd.printf("Initalize GPS:"); UBXPacket.cjobst = 0; @@ -331,29 +355,38 @@ gps.recvStart(); wait(0.5); + GPS_isRaw = 1; if(1){ unsigned char chkStr[][11] = { - { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x10,0x02,0xFF,0xFF }, //RXM-RAW (0x02 0x10) - { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x30,0x02,0xFF,0xFF }, //RXM-ALM (0x02 0x30) - { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x31,0x02,0xFF,0xFF }, //RXM-EPH (0x02 0x31) + { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x10,0x01,0xFF,0xFF }, //RXM-RAW (0x02 0x10) + { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x30,0x01,0xFF,0xFF }, //RXM-ALM (0x02 0x30) + { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x31,0x01,0xFF,0xFF }, //RXM-EPH (0x02 0x31) //{ 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x41,0x02,0xFF,0xFF }, - { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x11,0x02,0xFF,0xFF }, //RXM-SFRB (0x02 0x11) - { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x20,0x02,0xFF,0xFF }, //RXM-SVSI (0x02 0x20) + { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x11,0x01,0xFF,0xFF }, //RXM-SFRB (0x02 0x11) + { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x20,0x01,0xFF,0xFF }, //RXM-SVSI (0x02 0x20) + { 0xB5,0x62,0x06,0x01,0x03,0x00,0x01,0x21,0x01,0xFF,0xFF }, //NAV-TIMEUTC (0x01 0x21) { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF }, //END }; int i,j; + int isAck; for(j=0;chkStr[j][0] != 0x00;j++){ UBX_CalcSum(&chkStr[j][2],7,&chkStr[j][9]); for(i = 0; i < sizeof(chkStr[0]);i++){ gps.putc(chkStr[j][i]); } - debug.printf("%d : SET UBX Rate : %s\n",j,(UBX_WaitAck(&UBXPacket) == 1) ? "ACK" : "NAK"); + isAck = UBX_WaitAck(&UBXPacket); + debug.printf("%d : SET UBX Rate : %s\n",j,(isAck == 1) ? "ACK" : "NAK"); + if(isAck != 1){ + GPS_isRaw = 0; + } } } UBXPacket.cjobst = 0; - lcd.locate(0,3); - lcd.printf("SETTING GPS...Done."); + lcd.locate(0,1); + lcd.printf("Initalize GPS:%s",(GPS_isRaw) ? "OK" : "NG"); + + i2c_found(); // ad7994.Start(); @@ -361,18 +394,33 @@ 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"," "); + lcd.locate(0,3); + lcd.printf("Check CO2:"); + CO2_find = 0; + ret = CO2_Read(&CO2_val); + switch(ret){ + case 0: + lcd.printf("OK"); + CO2_find = 1; + break; + case -99: + lcd.printf("NOT FOUND"); + break; + default: + lcd.printf("NG"); + break; + } + CO2_val = 0; + wait(3.0); + + ClearScreen(); + + pre_sec = -1; while(1) { //lcd.cls(); //lcd.locate(0,0); //lcd.printf("SCAN:%-10ld",scanCount); - lcd.locate(0,0); - lcd.printf("%d ",toggleSW_now); logCheckProc(); @@ -380,8 +428,15 @@ c = gps.getc(); if(UBXPacket_Parse(&UBXPacket,c) == 100){ UBXCount++; - lcd.locate(2,0); - lcd.printf("UBX Recv:%-10ld",UBXCount); + if((UBXPacket.cls == 0x01) && (UBXPacket.id == 0x21)){ + /* NAV-TIMEUTC */ + year = (((unsigned short)UBXPacket.body[13]) << 8) | UBXPacket.body[12]; + mon = UBXPacket.body[14]; + day = UBXPacket.body[15]; + hour = UBXPacket.body[16]; + min = UBXPacket.body[17]; + sec = UBXPacket.body[18]; + } debug.printf("%ld : GET UBX Packet (Class=0x%02X,ID=0x%02X,LEN=%d)\n", scanCount, UBXPacket.cls, @@ -398,44 +453,45 @@ } } } + lcd.locate(0,0); + lcd.printf("%04d-%02d-%02d %02d:%02d:%02d",year,mon,day,hour,min,sec); - if(1){ - bmp085.update(); - p = bmp085.get_pressure(); - t1 = bmp085.get_temperature(); - lcd.locate(0,1); - lcd.printf("%-8.2fhPa %-6.2fC", p, t1); - } + if(pre_sec != sec){ + pre_sec = sec; + + if(bmp085_find){ + float tmp1,tmp2; + bmp085.update(); + tmp1 = bmp085.get_pressure(); + tmp2 = bmp085.get_temperature(); + if(tmp2 < 100.0){ + p = tmp1; + t1 = tmp2; + } + } + lcd.locate(0,1); lcd.printf("%-8.2fhPa %-6.2fC", p, t1); - if(1){ - sht25.SHT2x_MeasurePoll(TEMP,&temp); - t2 = sht25.SHT2x_CalcTemperatureC(temp); - sht25.SHT2x_MeasurePoll(HUMIDITY,&temp); - h = sht25.SHT2x_CalcRH(temp); - lcd.locate(0,2); - lcd.printf("%-6.2fC %-6.2fRH", t2, h); - //sht25.SHT2x_SoftReset(); - } + if(sht25_find){ + sht25.SHT2x_MeasurePoll(TEMP,&temp); + t2 = sht25.SHT2x_CalcTemperatureC(temp); + sht25.SHT2x_MeasurePoll(HUMIDITY,&temp); + h = sht25.SHT2x_CalcRH(temp); + } + lcd.locate(0,2); lcd.printf("%-6.2fC %-6.2fRH", t2, h); -#ifdef _I2C_TEST /* { */ - i2c_found(); -#endif /* } */ + if(CO2_find){ + if((ret = CO2_Read(&CO2_val)) != 0){ + CO2_val = 0; + CO2_find = 0; + } + } + lcd.locate(0,3); lcd.printf("CO2:%5d.%1dppm\n",CO2_val/10,CO2_val%10); - lcd.locate(0,3); - ret = CO2_Read(&CO2_val); - if(ret == 0){ - lcd.printf("CO2:%5d.%1dppm\n",CO2_val/10,CO2_val%10); - } else { - lcd.printf("CO2:NG(%d) \n",ret); - } - - if(csvFP){ - if(logTickCount >= 100){ + if(csvFP){ + fprintf(csvFP,"%04d-%02d-%02d %02d:%02d:%02d,",year,mon,day,hour,min,sec); 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); @@ -444,12 +500,32 @@ ad7994.readChn(1)); #endif myled = (hzCount & 1); - scanCount++; - wait(0.1); + //wait(0.1); } } /* + * 2012-2-5 V0.81 + * 気圧センサーが時々不正な値を出力する。気温が100度を超える値になる。 + * ソフトバグか、センサー自身の問題かは切り分けていないが、気温が100度を + * 超えることはあり得ないので、100度を超える気温は値として採用しない様に + * した。 + */ +/* + * 2012-2-5 V0.8 + * 1) GPS レシーバ受信バッファが少ないので拡大(512->8K) + * 2) 起動時に、各センサーの接続チェックを行い、起動時に見つかった + * センサーとだけ通信するようにした。これにより CO2 センサーが + * 無くても動きます。 + * 3) NAV-TIMEUTC を受信し、表示するようにした。 + * 4) センサーデータのスキャンタイミングを、NAV-TIMEUTC の + * 秒が変わった直後とした。つまり1秒おきにセンサーデータを + * スキャンする。 + * 5) センサーデータの保存データ(ENVnnnnn.CSV) の先頭に + * NAV-TIMEUTC の日付時刻を入れるようにした。 + * これで何時何分のセンサーデータか分かるようにした。 + */ +/* * 2012-1-29 V0.7 * ログ機能の追加。スイッチを押すとログのON/OFFが出来る。 * ログ収集中は、mbed LED3 が点灯する。