Dependencies:   ChaNFSSD mbed BMP085 SHT2x

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 が点灯する。