Dependencies:   ChaNFSSD mbed BMP085 SHT2x

Committer:
tosihisa
Date:
Sat Feb 04 17:01:17 2012 +0000
Revision:
4:879b8dcfee15
Parent:
3:844fbe607dae
Child:
5:3a1ce282892c
V0.81

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tosihisa 1:83960ee4d9a2 1 /*
tosihisa 1:83960ee4d9a2 2 * このソフトウェアは、大阪市立大学と京都大学生存圏ミッション研究の共同研究の成果物です。
tosihisa 1:83960ee4d9a2 3 * ソースコードそのもののライセンスは、各ソースコードのライセンスに沿って公開します。
tosihisa 1:83960ee4d9a2 4 * 2012-1-4 Toshihisa T
tosihisa 1:83960ee4d9a2 5 */
tosihisa 3:844fbe607dae 6
tosihisa 4:879b8dcfee15 7 #define __MY_VERSION__ "0.81"
tosihisa 4:879b8dcfee15 8
tosihisa 3:844fbe607dae 9 #define HAVE_TOGGLE_SW
tosihisa 3:844fbe607dae 10 #define HAVE_MICROSD
tosihisa 3:844fbe607dae 11
tosihisa 0:6089ae824f06 12 #include "mbed.h"
tosihisa 0:6089ae824f06 13 #include "NMEA_parse.h"
tosihisa 0:6089ae824f06 14 #include "SDFileSystem.h"
tosihisa 0:6089ae824f06 15 #include "libT/mbed/tserialbuffer.h"
tosihisa 0:6089ae824f06 16 #include "BMP085.h"
tosihisa 0:6089ae824f06 17 #include "SHT2x.h"
tosihisa 0:6089ae824f06 18 #include "AD7994.h"
tosihisa 0:6089ae824f06 19 //#include "TextLCD.h"
tosihisa 0:6089ae824f06 20 #include "TextLCD_20X4.h"
tosihisa 1:83960ee4d9a2 21 #include "UBXPacket.h"
tosihisa 0:6089ae824f06 22
tosihisa 0:6089ae824f06 23 using namespace libT;
tosihisa 0:6089ae824f06 24
tosihisa 0:6089ae824f06 25 #define _USE_FS_NAME "sd"
tosihisa 0:6089ae824f06 26
tosihisa 0:6089ae824f06 27 Serial debug(USBTX,USBRX);
tosihisa 0:6089ae824f06 28
tosihisa 0:6089ae824f06 29 DigitalIn gps_int0(p24);
tosihisa 0:6089ae824f06 30 DigitalOut gps_reset(p25);
tosihisa 0:6089ae824f06 31 InterruptIn gps_pps(p26);
tosihisa 0:6089ae824f06 32 tSerialBuffer gps(p28,p27);
tosihisa 0:6089ae824f06 33 DigitalOut gps_pps_led(LED2);
tosihisa 1:83960ee4d9a2 34 I2C i2c(p9, p10); // sda, scl
tosihisa 0:6089ae824f06 35 BMP085 bmp085(p9, p10);
tosihisa 4:879b8dcfee15 36 int bmp085_find = 0;
tosihisa 2:f546aaa0e1d5 37 SHT2x sht25(p9,p10);
tosihisa 4:879b8dcfee15 38 int sht25_find = 0;
tosihisa 0:6089ae824f06 39 AD7994 ad7994(p9,p10);
tosihisa 4:879b8dcfee15 40 int ad7994_find = 0;
tosihisa 0:6089ae824f06 41 TextLCD_20X4 lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
tosihisa 3:844fbe607dae 42 #ifdef HAVE_TOGGLE_SW /* { */
tosihisa 3:844fbe607dae 43 DigitalIn toggleSW(p22);
tosihisa 3:844fbe607dae 44 int toggleSW_scan = 0;
tosihisa 3:844fbe607dae 45 int toggleSW_pre = -1;
tosihisa 3:844fbe607dae 46 #endif /* } */
tosihisa 3:844fbe607dae 47 int toggleSW_now = 0;
tosihisa 3:844fbe607dae 48 Ticker tick;
tosihisa 4:879b8dcfee15 49 tSerialBuffer CO2(p13,p14);
tosihisa 4:879b8dcfee15 50 Timer CO2_TMOUT;
tosihisa 0:6089ae824f06 51
tosihisa 1:83960ee4d9a2 52 SDFileSystem sd(p5, p6, p7, p8, _USE_FS_NAME);
tosihisa 3:844fbe607dae 53 int avaiableSD = -1;
tosihisa 3:844fbe607dae 54 unsigned short logNextCount = 0;
tosihisa 3:844fbe607dae 55 FILE *csvFP = NULL;
tosihisa 3:844fbe607dae 56 FILE *gpsFP = NULL;
tosihisa 3:844fbe607dae 57 int logSW = 0;
tosihisa 4:879b8dcfee15 58
tosihisa 3:844fbe607dae 59 DigitalOut logled(LED3);
tosihisa 0:6089ae824f06 60 DigitalOut myled(LED1);
tosihisa 0:6089ae824f06 61
tosihisa 1:83960ee4d9a2 62 struct UBXPacket_s UBXPacket;
tosihisa 1:83960ee4d9a2 63
tosihisa 0:6089ae824f06 64 int pps_count = 0;
tosihisa 0:6089ae824f06 65 void gps_pps_rise()
tosihisa 0:6089ae824f06 66 {
tosihisa 0:6089ae824f06 67 gps_pps_led = ((pps_count+=1) & 1) ? 1 : 0;
tosihisa 0:6089ae824f06 68 }
tosihisa 0:6089ae824f06 69
tosihisa 3:844fbe607dae 70 void logFile_Init() {
tosihisa 0:6089ae824f06 71 DIR *d;
tosihisa 0:6089ae824f06 72 struct dirent *p;
tosihisa 3:844fbe607dae 73 unsigned short countCandidate;
tosihisa 3:844fbe607dae 74 char *endptr;
tosihisa 0:6089ae824f06 75
tosihisa 3:844fbe607dae 76 avaiableSD = 0;
tosihisa 0:6089ae824f06 77 d = opendir("/" _USE_FS_NAME);
tosihisa 0:6089ae824f06 78 if ( d != NULL ) {
tosihisa 0:6089ae824f06 79 while ( (p = readdir(d)) != NULL ) {
tosihisa 0:6089ae824f06 80 debug.printf("FILE - %s\x0d\x0a", p->d_name);
tosihisa 3:844fbe607dae 81 if (strlen(p->d_name) == (sizeof("ENVxxxxx.CSV")-1)) {
tosihisa 3:844fbe607dae 82 if ( ((p->d_name[0] == 'E') || (p->d_name[0] == 'e'))
tosihisa 3:844fbe607dae 83 && ((p->d_name[1] == 'N') || (p->d_name[1] == 'n'))
tosihisa 3:844fbe607dae 84 && ((p->d_name[2] == 'V') || (p->d_name[2] == 'v'))) {
tosihisa 3:844fbe607dae 85 }
tosihisa 3:844fbe607dae 86 countCandidate = (unsigned short)strtoul(&(p->d_name[3]),&endptr,10);
tosihisa 3:844fbe607dae 87 if (strcasecmp(endptr,".CSV") == 0) {
tosihisa 3:844fbe607dae 88 if (countCandidate > logNextCount) {
tosihisa 3:844fbe607dae 89 logNextCount = countCandidate;
tosihisa 3:844fbe607dae 90 }
tosihisa 3:844fbe607dae 91 }
tosihisa 3:844fbe607dae 92 }
tosihisa 0:6089ae824f06 93 }
tosihisa 0:6089ae824f06 94 closedir(d);
tosihisa 3:844fbe607dae 95 logNextCount++;
tosihisa 3:844fbe607dae 96 avaiableSD = 1;
tosihisa 0:6089ae824f06 97 }
tosihisa 0:6089ae824f06 98 }
tosihisa 0:6089ae824f06 99
tosihisa 0:6089ae824f06 100
tosihisa 0:6089ae824f06 101 int CO2_Read(unsigned short *val)
tosihisa 0:6089ae824f06 102 {
tosihisa 0:6089ae824f06 103 unsigned char sbuf[] = { 0xFE, 0x04, 0x00, 0x03, 0x00, 0x01, 0xD5, 0xC5 };
tosihisa 0:6089ae824f06 104 unsigned char rbuf[7];
tosihisa 0:6089ae824f06 105 int i;
tosihisa 0:6089ae824f06 106 unsigned short crc;
tosihisa 0:6089ae824f06 107 extern unsigned short modbus_CRC(unsigned char *DataPtr, unsigned short len);
tosihisa 0:6089ae824f06 108
tosihisa 0:6089ae824f06 109 for(i=0;i < sizeof(sbuf);i++){
tosihisa 0:6089ae824f06 110 //debug.printf("0x%02x ",sbuf[i]);
tosihisa 0:6089ae824f06 111 CO2.putc(sbuf[i]);
tosihisa 0:6089ae824f06 112 }
tosihisa 4:879b8dcfee15 113 CO2_TMOUT.start();
tosihisa 0:6089ae824f06 114 for(i=0;i < sizeof(rbuf);i++){
tosihisa 4:879b8dcfee15 115 while(!CO2.readable()){
tosihisa 4:879b8dcfee15 116 if(CO2_TMOUT.read_ms() >= 1000){
tosihisa 4:879b8dcfee15 117 return -99; /* TIMEOUT */
tosihisa 4:879b8dcfee15 118 }
tosihisa 4:879b8dcfee15 119 }
tosihisa 0:6089ae824f06 120 rbuf[i] = CO2.getc();
tosihisa 0:6089ae824f06 121 }
tosihisa 1:83960ee4d9a2 122 if(rbuf[0] != 0xFE){
tosihisa 1:83960ee4d9a2 123 return -4;
tosihisa 1:83960ee4d9a2 124 }
tosihisa 1:83960ee4d9a2 125 if(rbuf[1] != 0x04){
tosihisa 1:83960ee4d9a2 126 return -1;
tosihisa 1:83960ee4d9a2 127 }
tosihisa 1:83960ee4d9a2 128 if(rbuf[2] != 0x02){
tosihisa 1:83960ee4d9a2 129 return -2;
tosihisa 1:83960ee4d9a2 130 }
tosihisa 0:6089ae824f06 131 crc = rbuf[6];
tosihisa 0:6089ae824f06 132 crc = (crc << 8) | rbuf[5];
tosihisa 0:6089ae824f06 133 if(crc != modbus_CRC(rbuf,5)){
tosihisa 1:83960ee4d9a2 134 return -3;
tosihisa 0:6089ae824f06 135 }
tosihisa 0:6089ae824f06 136 *val = rbuf[3];
tosihisa 0:6089ae824f06 137 *val = (*val << 8) | rbuf[4];
tosihisa 0:6089ae824f06 138 return 0;
tosihisa 0:6089ae824f06 139 }
tosihisa 0:6089ae824f06 140
tosihisa 0:6089ae824f06 141 // BMP085 0xee
tosihisa 4:879b8dcfee15 142 // AD7994 0x44
tosihisa 4:879b8dcfee15 143 // SHT2x 0x80
tosihisa 0:6089ae824f06 144 int i2c_found() {
tosihisa 0:6089ae824f06 145 int count = 0;
tosihisa 1:83960ee4d9a2 146 lcd.locate(0,2);
tosihisa 1:83960ee4d9a2 147 lcd.printf("%-19s","I2C Dev:");
tosihisa 1:83960ee4d9a2 148 lcd.locate(8,2);
tosihisa 0:6089ae824f06 149 for (int address=0; address<256; address+=2) {
tosihisa 0:6089ae824f06 150 if (!i2c.write(address, NULL, 0)) { // 0 returned is ok
tosihisa 4:879b8dcfee15 151 switch(address){
tosihisa 4:879b8dcfee15 152 case 0xee: bmp085_find = 1; break;
tosihisa 4:879b8dcfee15 153 case 0x44: ad7994_find = 1; break;
tosihisa 4:879b8dcfee15 154 case 0x80: sht25_find = 1; break;
tosihisa 4:879b8dcfee15 155 default: break;
tosihisa 4:879b8dcfee15 156 }
tosihisa 1:83960ee4d9a2 157 lcd.printf("%02X ",address);
tosihisa 0:6089ae824f06 158 count++;
tosihisa 0:6089ae824f06 159 }
tosihisa 0:6089ae824f06 160 }
tosihisa 0:6089ae824f06 161 return count;
tosihisa 0:6089ae824f06 162 }
tosihisa 1:83960ee4d9a2 163
tosihisa 1:83960ee4d9a2 164 unsigned char NMEA_CalcSum(unsigned char *str,int len)
tosihisa 1:83960ee4d9a2 165 {
tosihisa 1:83960ee4d9a2 166 unsigned char sum = 0;
tosihisa 1:83960ee4d9a2 167 int i;
tosihisa 1:83960ee4d9a2 168 for(i = 0;i < len;i++){
tosihisa 1:83960ee4d9a2 169 sum = sum ^ (*(str + i));
tosihisa 1:83960ee4d9a2 170 }
tosihisa 1:83960ee4d9a2 171 return sum;
tosihisa 1:83960ee4d9a2 172 }
tosihisa 1:83960ee4d9a2 173
tosihisa 1:83960ee4d9a2 174 void UBX_CalcSum(unsigned char *str,int len,unsigned char *sum)
tosihisa 1:83960ee4d9a2 175 {
tosihisa 1:83960ee4d9a2 176 int i;
tosihisa 1:83960ee4d9a2 177 *(sum + 0) = *(sum + 1) = 0;
tosihisa 1:83960ee4d9a2 178 for(i = 0;i < len;i++){
tosihisa 1:83960ee4d9a2 179 *(sum + 0) = *(sum + 0) + *(str+i);
tosihisa 1:83960ee4d9a2 180 *(sum + 1) = *(sum + 1) + *(sum + 0);
tosihisa 1:83960ee4d9a2 181 }
tosihisa 1:83960ee4d9a2 182 }
tosihisa 1:83960ee4d9a2 183
tosihisa 1:83960ee4d9a2 184 int UBX_WaitAck(struct UBXPacket_s *info)
tosihisa 1:83960ee4d9a2 185 {
tosihisa 1:83960ee4d9a2 186 UBXPacket.cjobst = 0;
tosihisa 1:83960ee4d9a2 187
tosihisa 1:83960ee4d9a2 188 while(1){
tosihisa 1:83960ee4d9a2 189 while(gps.readable()) {
tosihisa 1:83960ee4d9a2 190 if(UBXPacket_Parse(&UBXPacket,gps.getc()) == 100){
tosihisa 1:83960ee4d9a2 191 if((UBXPacket.cls == 0x05) && (UBXPacket.id == 0x01)){
tosihisa 1:83960ee4d9a2 192 return 1; /* ACK */
tosihisa 1:83960ee4d9a2 193 } else if((UBXPacket.cls == 0x05) && (UBXPacket.id == 0x00)){
tosihisa 1:83960ee4d9a2 194 return 0; /* NAK */
tosihisa 1:83960ee4d9a2 195 } else {
tosihisa 1:83960ee4d9a2 196 UBXPacket.cjobst = 0;
tosihisa 1:83960ee4d9a2 197 }
tosihisa 1:83960ee4d9a2 198 }
tosihisa 1:83960ee4d9a2 199 }
tosihisa 1:83960ee4d9a2 200 }
tosihisa 3:844fbe607dae 201 }
tosihisa 3:844fbe607dae 202
tosihisa 4:879b8dcfee15 203 unsigned long scanCount = 0;
tosihisa 3:844fbe607dae 204 unsigned long tickCount = 0;
tosihisa 3:844fbe607dae 205 unsigned long hzCount = 0;
tosihisa 3:844fbe607dae 206 unsigned long hzCount_tmp = 0;
tosihisa 3:844fbe607dae 207 void tickHandler()
tosihisa 3:844fbe607dae 208 {
tosihisa 4:879b8dcfee15 209 scanCount++;
tosihisa 3:844fbe607dae 210 tickCount++;
tosihisa 3:844fbe607dae 211 hzCount_tmp++;
tosihisa 3:844fbe607dae 212 if(hzCount_tmp >= 50){
tosihisa 3:844fbe607dae 213 hzCount_tmp = 0;
tosihisa 3:844fbe607dae 214 hzCount++;
tosihisa 3:844fbe607dae 215 }
tosihisa 3:844fbe607dae 216 #ifdef HAVE_TOGGLE_SW /* { */
tosihisa 3:844fbe607dae 217 int nowRead;
tosihisa 3:844fbe607dae 218 nowRead = toggleSW.read();
tosihisa 3:844fbe607dae 219 if(nowRead != toggleSW_pre){
tosihisa 3:844fbe607dae 220 toggleSW_pre = nowRead;
tosihisa 3:844fbe607dae 221 toggleSW_scan = 0;
tosihisa 3:844fbe607dae 222 } else {
tosihisa 3:844fbe607dae 223 toggleSW_scan++;
tosihisa 3:844fbe607dae 224 if(toggleSW_scan >= 3){
tosihisa 3:844fbe607dae 225 toggleSW_now = toggleSW_pre;
tosihisa 3:844fbe607dae 226 toggleSW_scan = 0;
tosihisa 3:844fbe607dae 227 }
tosihisa 3:844fbe607dae 228 }
tosihisa 3:844fbe607dae 229 #endif
tosihisa 3:844fbe607dae 230 }
tosihisa 3:844fbe607dae 231
tosihisa 3:844fbe607dae 232 void logCheckProc()
tosihisa 3:844fbe607dae 233 {
tosihisa 3:844fbe607dae 234 if((logSW == 0) && (toggleSW_now != 0)){
tosihisa 3:844fbe607dae 235 if(csvFP != NULL){
tosihisa 3:844fbe607dae 236 fclose(csvFP);
tosihisa 3:844fbe607dae 237 csvFP = NULL;
tosihisa 3:844fbe607dae 238 if(gpsFP != NULL){
tosihisa 3:844fbe607dae 239 fclose(gpsFP);
tosihisa 3:844fbe607dae 240 gpsFP = NULL;
tosihisa 3:844fbe607dae 241 }
tosihisa 3:844fbe607dae 242 logled = 0; /* No logging */
tosihisa 3:844fbe607dae 243 logNextCount++;
tosihisa 3:844fbe607dae 244 } else {
tosihisa 3:844fbe607dae 245 char name[64];
tosihisa 3:844fbe607dae 246 sprintf(name,"/%s/ENV%05d.CSV",_USE_FS_NAME,logNextCount);
tosihisa 3:844fbe607dae 247 csvFP = fopen(name,"w+b");
tosihisa 3:844fbe607dae 248 sprintf(name,"/%s/ENV%05d.GPS",_USE_FS_NAME,logNextCount);
tosihisa 3:844fbe607dae 249 gpsFP = fopen(name,"w+b");
tosihisa 3:844fbe607dae 250 if((csvFP != NULL) && (gpsFP != NULL)){
tosihisa 3:844fbe607dae 251 logled = 1; /* logging */
tosihisa 3:844fbe607dae 252 } else {
tosihisa 3:844fbe607dae 253 if(csvFP) fclose(csvFP);
tosihisa 3:844fbe607dae 254 if(gpsFP) fclose(gpsFP);
tosihisa 3:844fbe607dae 255 logled = 0; /* Cannot start logging */
tosihisa 3:844fbe607dae 256 }
tosihisa 3:844fbe607dae 257 }
tosihisa 3:844fbe607dae 258 }
tosihisa 3:844fbe607dae 259 logSW = toggleSW_now;
tosihisa 1:83960ee4d9a2 260 }
tosihisa 1:83960ee4d9a2 261
tosihisa 1:83960ee4d9a2 262 unsigned char wbuf[1024];
tosihisa 2:f546aaa0e1d5 263 int widx = 0;
tosihisa 0:6089ae824f06 264
tosihisa 4:879b8dcfee15 265 void ClearScreen(void)
tosihisa 4:879b8dcfee15 266 {
tosihisa 4:879b8dcfee15 267 lcd.locate(0,0); lcd.printf("%20s"," ");
tosihisa 4:879b8dcfee15 268 lcd.locate(0,1); lcd.printf("%20s"," ");
tosihisa 4:879b8dcfee15 269 lcd.locate(0,2); lcd.printf("%20s"," ");
tosihisa 4:879b8dcfee15 270 lcd.locate(0,3); lcd.printf("%20s"," ");
tosihisa 4:879b8dcfee15 271 }
tosihisa 4:879b8dcfee15 272
tosihisa 0:6089ae824f06 273 int main() {
tosihisa 0:6089ae824f06 274 int ret = 0;
tosihisa 3:844fbe607dae 275 float p, t1;
tosihisa 3:844fbe607dae 276 float h, t2;
tosihisa 0:6089ae824f06 277 int temp;
tosihisa 4:879b8dcfee15 278 unsigned short CO2_val = 0;
tosihisa 1:83960ee4d9a2 279 char c;
tosihisa 2:f546aaa0e1d5 280 unsigned long UBXCount = 0;
tosihisa 4:879b8dcfee15 281 int GPS_isRaw = 0;
tosihisa 4:879b8dcfee15 282 int CO2_find = 0;
tosihisa 4:879b8dcfee15 283 int year=0;
tosihisa 4:879b8dcfee15 284 int mon=0;
tosihisa 4:879b8dcfee15 285 int day=0;
tosihisa 4:879b8dcfee15 286 int hour=0;
tosihisa 4:879b8dcfee15 287 int min=0;
tosihisa 4:879b8dcfee15 288 int sec=0;
tosihisa 4:879b8dcfee15 289 int pre_sec = -1;
tosihisa 0:6089ae824f06 290
tosihisa 4:879b8dcfee15 291 p = -99.0;
tosihisa 4:879b8dcfee15 292 t1 = -99.0;
tosihisa 4:879b8dcfee15 293 t2 = -99.0;
tosihisa 4:879b8dcfee15 294 h = -99.0;
tosihisa 4:879b8dcfee15 295
tosihisa 3:844fbe607dae 296 tick.attach_us(&tickHandler,(10*1000));
tosihisa 3:844fbe607dae 297
tosihisa 0:6089ae824f06 298 debug.format(8,Serial::None,1);
tosihisa 0:6089ae824f06 299 debug.baud(115200);
tosihisa 4:879b8dcfee15 300 debug.printf("ENV Logger \"%s\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\n",__MY_VERSION__);
tosihisa 0:6089ae824f06 301
tosihisa 0:6089ae824f06 302 lcd.locate(0,0);
tosihisa 4:879b8dcfee15 303 lcd.printf("ENV Logger \"%s\"",__MY_VERSION__);
tosihisa 2:f546aaa0e1d5 304
tosihisa 2:f546aaa0e1d5 305 lcd.locate(0,1);
tosihisa 2:f546aaa0e1d5 306 lcd.printf("WAKE UP I/O...");
tosihisa 1:83960ee4d9a2 307 wait(5.0);
tosihisa 0:6089ae824f06 308
tosihisa 4:879b8dcfee15 309 ClearScreen();
tosihisa 4:879b8dcfee15 310
tosihisa 3:844fbe607dae 311 #ifdef HAVE_MICROSD
tosihisa 4:879b8dcfee15 312 lcd.locate(0,0);
tosihisa 4:879b8dcfee15 313 lcd.printf("Check MicroSD:");
tosihisa 3:844fbe607dae 314 logFile_Init();
tosihisa 3:844fbe607dae 315 #endif
tosihisa 4:879b8dcfee15 316 lcd.locate(0,0);
tosihisa 3:844fbe607dae 317 switch(avaiableSD){
tosihisa 3:844fbe607dae 318 case 0:
tosihisa 4:879b8dcfee15 319 lcd.printf("Check MicroSD:NG");
tosihisa 3:844fbe607dae 320 break;
tosihisa 3:844fbe607dae 321 case 1:
tosihisa 4:879b8dcfee15 322 lcd.printf("Check MicroSD:OK");
tosihisa 3:844fbe607dae 323 break;
tosihisa 3:844fbe607dae 324 default:
tosihisa 4:879b8dcfee15 325 lcd.printf("Check MicroSD:DO\'NT USE");
tosihisa 3:844fbe607dae 326 break;
tosihisa 3:844fbe607dae 327 }
tosihisa 3:844fbe607dae 328
tosihisa 4:879b8dcfee15 329 lcd.locate(0,1);
tosihisa 4:879b8dcfee15 330 lcd.printf("Initalize GPS:");
tosihisa 2:f546aaa0e1d5 331
tosihisa 1:83960ee4d9a2 332 UBXPacket.cjobst = 0;
tosihisa 1:83960ee4d9a2 333
tosihisa 0:6089ae824f06 334 gps_pps.rise(gps_pps_rise);
tosihisa 0:6089ae824f06 335 gps.format(8,Serial::None,1);
tosihisa 0:6089ae824f06 336 gps.baud(9600);
tosihisa 0:6089ae824f06 337
tosihisa 0:6089ae824f06 338 gps_reset = 1;
tosihisa 0:6089ae824f06 339 wait(0.5);
tosihisa 0:6089ae824f06 340 gps_reset = 0;
tosihisa 0:6089ae824f06 341
tosihisa 1:83960ee4d9a2 342 wait(0.5);
tosihisa 1:83960ee4d9a2 343 if(1){
tosihisa 1:83960ee4d9a2 344 //unsigned char modeStr[] = "PUBX,41,1,0007,0003,115200,0";
tosihisa 1:83960ee4d9a2 345 unsigned char modeStr[] = "PUBX,41,1,0007,0001,115200,0";
tosihisa 1:83960ee4d9a2 346 unsigned char sum = NMEA_CalcSum(modeStr,strlen((char *)modeStr));
tosihisa 1:83960ee4d9a2 347 debug.printf("SEND:[%s](0x%02X)\n",modeStr,sum);
tosihisa 1:83960ee4d9a2 348 gps.printf("$%s*%02X%c%c",modeStr,sum,0x0d,0x0a);
tosihisa 1:83960ee4d9a2 349
tosihisa 1:83960ee4d9a2 350 debug.printf("CHG BAUD:115200\n");
tosihisa 1:83960ee4d9a2 351 gps.format(8,Serial::None,1);
tosihisa 1:83960ee4d9a2 352 gps.baud(115200);
tosihisa 1:83960ee4d9a2 353 }
tosihisa 1:83960ee4d9a2 354
tosihisa 1:83960ee4d9a2 355 gps.recvStart();
tosihisa 1:83960ee4d9a2 356 wait(0.5);
tosihisa 0:6089ae824f06 357
tosihisa 4:879b8dcfee15 358 GPS_isRaw = 1;
tosihisa 1:83960ee4d9a2 359 if(1){
tosihisa 1:83960ee4d9a2 360 unsigned char chkStr[][11] = {
tosihisa 4:879b8dcfee15 361 { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x10,0x01,0xFF,0xFF }, //RXM-RAW (0x02 0x10)
tosihisa 4:879b8dcfee15 362 { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x30,0x01,0xFF,0xFF }, //RXM-ALM (0x02 0x30)
tosihisa 4:879b8dcfee15 363 { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x31,0x01,0xFF,0xFF }, //RXM-EPH (0x02 0x31)
tosihisa 1:83960ee4d9a2 364 //{ 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x41,0x02,0xFF,0xFF },
tosihisa 4:879b8dcfee15 365 { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x11,0x01,0xFF,0xFF }, //RXM-SFRB (0x02 0x11)
tosihisa 4:879b8dcfee15 366 { 0xB5,0x62,0x06,0x01,0x03,0x00,0x02,0x20,0x01,0xFF,0xFF }, //RXM-SVSI (0x02 0x20)
tosihisa 4:879b8dcfee15 367 { 0xB5,0x62,0x06,0x01,0x03,0x00,0x01,0x21,0x01,0xFF,0xFF }, //NAV-TIMEUTC (0x01 0x21)
tosihisa 1:83960ee4d9a2 368 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF }, //END
tosihisa 1:83960ee4d9a2 369 };
tosihisa 1:83960ee4d9a2 370 int i,j;
tosihisa 4:879b8dcfee15 371 int isAck;
tosihisa 1:83960ee4d9a2 372
tosihisa 1:83960ee4d9a2 373 for(j=0;chkStr[j][0] != 0x00;j++){
tosihisa 1:83960ee4d9a2 374 UBX_CalcSum(&chkStr[j][2],7,&chkStr[j][9]);
tosihisa 1:83960ee4d9a2 375 for(i = 0; i < sizeof(chkStr[0]);i++){
tosihisa 1:83960ee4d9a2 376 gps.putc(chkStr[j][i]);
tosihisa 1:83960ee4d9a2 377 }
tosihisa 4:879b8dcfee15 378 isAck = UBX_WaitAck(&UBXPacket);
tosihisa 4:879b8dcfee15 379 debug.printf("%d : SET UBX Rate : %s\n",j,(isAck == 1) ? "ACK" : "NAK");
tosihisa 4:879b8dcfee15 380 if(isAck != 1){
tosihisa 4:879b8dcfee15 381 GPS_isRaw = 0;
tosihisa 4:879b8dcfee15 382 }
tosihisa 1:83960ee4d9a2 383 }
tosihisa 1:83960ee4d9a2 384 }
tosihisa 1:83960ee4d9a2 385 UBXPacket.cjobst = 0;
tosihisa 4:879b8dcfee15 386 lcd.locate(0,1);
tosihisa 4:879b8dcfee15 387 lcd.printf("Initalize GPS:%s",(GPS_isRaw) ? "OK" : "NG");
tosihisa 4:879b8dcfee15 388
tosihisa 4:879b8dcfee15 389 i2c_found();
tosihisa 1:83960ee4d9a2 390
tosihisa 1:83960ee4d9a2 391 // ad7994.Start();
tosihisa 1:83960ee4d9a2 392
tosihisa 0:6089ae824f06 393 CO2.format(8,Serial::None,1);
tosihisa 0:6089ae824f06 394 CO2.baud(9600);
tosihisa 0:6089ae824f06 395 CO2.recvStart();
tosihisa 0:6089ae824f06 396
tosihisa 4:879b8dcfee15 397 lcd.locate(0,3);
tosihisa 4:879b8dcfee15 398 lcd.printf("Check CO2:");
tosihisa 4:879b8dcfee15 399 CO2_find = 0;
tosihisa 4:879b8dcfee15 400 ret = CO2_Read(&CO2_val);
tosihisa 4:879b8dcfee15 401 switch(ret){
tosihisa 4:879b8dcfee15 402 case 0:
tosihisa 4:879b8dcfee15 403 lcd.printf("OK");
tosihisa 4:879b8dcfee15 404 CO2_find = 1;
tosihisa 4:879b8dcfee15 405 break;
tosihisa 4:879b8dcfee15 406 case -99:
tosihisa 4:879b8dcfee15 407 lcd.printf("NOT FOUND");
tosihisa 4:879b8dcfee15 408 break;
tosihisa 4:879b8dcfee15 409 default:
tosihisa 4:879b8dcfee15 410 lcd.printf("NG");
tosihisa 4:879b8dcfee15 411 break;
tosihisa 4:879b8dcfee15 412 }
tosihisa 4:879b8dcfee15 413 CO2_val = 0;
tosihisa 3:844fbe607dae 414
tosihisa 4:879b8dcfee15 415 wait(3.0);
tosihisa 4:879b8dcfee15 416
tosihisa 4:879b8dcfee15 417 ClearScreen();
tosihisa 4:879b8dcfee15 418
tosihisa 4:879b8dcfee15 419 pre_sec = -1;
tosihisa 0:6089ae824f06 420 while(1) {
tosihisa 0:6089ae824f06 421 //lcd.cls();
tosihisa 2:f546aaa0e1d5 422 //lcd.locate(0,0);
tosihisa 2:f546aaa0e1d5 423 //lcd.printf("SCAN:%-10ld",scanCount);
tosihisa 3:844fbe607dae 424
tosihisa 3:844fbe607dae 425 logCheckProc();
tosihisa 0:6089ae824f06 426
tosihisa 0:6089ae824f06 427 while(gps.readable()) {
tosihisa 1:83960ee4d9a2 428 c = gps.getc();
tosihisa 1:83960ee4d9a2 429 if(UBXPacket_Parse(&UBXPacket,c) == 100){
tosihisa 2:f546aaa0e1d5 430 UBXCount++;
tosihisa 4:879b8dcfee15 431 if((UBXPacket.cls == 0x01) && (UBXPacket.id == 0x21)){
tosihisa 4:879b8dcfee15 432 /* NAV-TIMEUTC */
tosihisa 4:879b8dcfee15 433 year = (((unsigned short)UBXPacket.body[13]) << 8) | UBXPacket.body[12];
tosihisa 4:879b8dcfee15 434 mon = UBXPacket.body[14];
tosihisa 4:879b8dcfee15 435 day = UBXPacket.body[15];
tosihisa 4:879b8dcfee15 436 hour = UBXPacket.body[16];
tosihisa 4:879b8dcfee15 437 min = UBXPacket.body[17];
tosihisa 4:879b8dcfee15 438 sec = UBXPacket.body[18];
tosihisa 4:879b8dcfee15 439 }
tosihisa 1:83960ee4d9a2 440 debug.printf("%ld : GET UBX Packet (Class=0x%02X,ID=0x%02X,LEN=%d)\n",
tosihisa 1:83960ee4d9a2 441 scanCount,
tosihisa 1:83960ee4d9a2 442 UBXPacket.cls,
tosihisa 1:83960ee4d9a2 443 UBXPacket.id,
tosihisa 1:83960ee4d9a2 444 UBXPacket.len );
tosihisa 1:83960ee4d9a2 445 UBXPacket.cjobst = 0;
tosihisa 1:83960ee4d9a2 446 }
tosihisa 3:844fbe607dae 447 if(gpsFP != NULL){
tosihisa 3:844fbe607dae 448 wbuf[widx] = c;
tosihisa 3:844fbe607dae 449 widx++;
tosihisa 3:844fbe607dae 450 if(widx >= sizeof(wbuf)){
tosihisa 3:844fbe607dae 451 fwrite(&wbuf,sizeof(wbuf[0]),widx,gpsFP);
tosihisa 3:844fbe607dae 452 widx = 0;
tosihisa 3:844fbe607dae 453 }
tosihisa 3:844fbe607dae 454 }
tosihisa 0:6089ae824f06 455 }
tosihisa 4:879b8dcfee15 456 lcd.locate(0,0);
tosihisa 4:879b8dcfee15 457 lcd.printf("%04d-%02d-%02d %02d:%02d:%02d",year,mon,day,hour,min,sec);
tosihisa 0:6089ae824f06 458
tosihisa 4:879b8dcfee15 459 if(pre_sec != sec){
tosihisa 4:879b8dcfee15 460 pre_sec = sec;
tosihisa 4:879b8dcfee15 461
tosihisa 4:879b8dcfee15 462 if(bmp085_find){
tosihisa 4:879b8dcfee15 463 float tmp1,tmp2;
tosihisa 4:879b8dcfee15 464 bmp085.update();
tosihisa 4:879b8dcfee15 465 tmp1 = bmp085.get_pressure();
tosihisa 4:879b8dcfee15 466 tmp2 = bmp085.get_temperature();
tosihisa 4:879b8dcfee15 467 if(tmp2 < 100.0){
tosihisa 4:879b8dcfee15 468 p = tmp1;
tosihisa 4:879b8dcfee15 469 t1 = tmp2;
tosihisa 4:879b8dcfee15 470 }
tosihisa 4:879b8dcfee15 471 }
tosihisa 4:879b8dcfee15 472 lcd.locate(0,1); lcd.printf("%-8.2fhPa %-6.2fC", p, t1);
tosihisa 0:6089ae824f06 473
tosihisa 4:879b8dcfee15 474 if(sht25_find){
tosihisa 4:879b8dcfee15 475 sht25.SHT2x_MeasurePoll(TEMP,&temp);
tosihisa 4:879b8dcfee15 476 t2 = sht25.SHT2x_CalcTemperatureC(temp);
tosihisa 4:879b8dcfee15 477 sht25.SHT2x_MeasurePoll(HUMIDITY,&temp);
tosihisa 4:879b8dcfee15 478 h = sht25.SHT2x_CalcRH(temp);
tosihisa 4:879b8dcfee15 479 }
tosihisa 4:879b8dcfee15 480 lcd.locate(0,2); lcd.printf("%-6.2fC %-6.2fRH", t2, h);
tosihisa 1:83960ee4d9a2 481
tosihisa 4:879b8dcfee15 482 if(CO2_find){
tosihisa 4:879b8dcfee15 483 if((ret = CO2_Read(&CO2_val)) != 0){
tosihisa 4:879b8dcfee15 484 CO2_val = 0;
tosihisa 4:879b8dcfee15 485 CO2_find = 0;
tosihisa 4:879b8dcfee15 486 }
tosihisa 4:879b8dcfee15 487 }
tosihisa 4:879b8dcfee15 488 lcd.locate(0,3); lcd.printf("CO2:%5d.%1dppm\n",CO2_val/10,CO2_val%10);
tosihisa 0:6089ae824f06 489
tosihisa 4:879b8dcfee15 490 if(csvFP){
tosihisa 4:879b8dcfee15 491 fprintf(csvFP,"%04d-%02d-%02d %02d:%02d:%02d,",year,mon,day,hour,min,sec);
tosihisa 3:844fbe607dae 492 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);
tosihisa 3:844fbe607dae 493 }
tosihisa 3:844fbe607dae 494 }
tosihisa 1:83960ee4d9a2 495 #if 0
tosihisa 0:6089ae824f06 496 ad7994.update();
tosihisa 0:6089ae824f06 497 lcd.locate(0,3);
tosihisa 0:6089ae824f06 498 lcd.printf("A/D:%04X/%04X",
tosihisa 0:6089ae824f06 499 ad7994.readChn(0),
tosihisa 0:6089ae824f06 500 ad7994.readChn(1));
tosihisa 1:83960ee4d9a2 501 #endif
tosihisa 3:844fbe607dae 502 myled = (hzCount & 1);
tosihisa 4:879b8dcfee15 503 //wait(0.1);
tosihisa 0:6089ae824f06 504 }
tosihisa 0:6089ae824f06 505 }
tosihisa 2:f546aaa0e1d5 506
tosihisa 2:f546aaa0e1d5 507 /*
tosihisa 4:879b8dcfee15 508 * 2012-2-5 V0.81
tosihisa 4:879b8dcfee15 509 * 気圧センサーが時々不正な値を出力する。気温が100度を超える値になる。
tosihisa 4:879b8dcfee15 510 * ソフトバグか、センサー自身の問題かは切り分けていないが、気温が100度を
tosihisa 4:879b8dcfee15 511 * 超えることはあり得ないので、100度を超える気温は値として採用しない様に
tosihisa 4:879b8dcfee15 512 * した。
tosihisa 4:879b8dcfee15 513 */
tosihisa 4:879b8dcfee15 514 /*
tosihisa 4:879b8dcfee15 515 * 2012-2-5 V0.8
tosihisa 4:879b8dcfee15 516 * 1) GPS レシーバ受信バッファが少ないので拡大(512->8K)
tosihisa 4:879b8dcfee15 517 * 2) 起動時に、各センサーの接続チェックを行い、起動時に見つかった
tosihisa 4:879b8dcfee15 518 * センサーとだけ通信するようにした。これにより CO2 センサーが
tosihisa 4:879b8dcfee15 519 * 無くても動きます。
tosihisa 4:879b8dcfee15 520 * 3) NAV-TIMEUTC を受信し、表示するようにした。
tosihisa 4:879b8dcfee15 521 * 4) センサーデータのスキャンタイミングを、NAV-TIMEUTC の
tosihisa 4:879b8dcfee15 522 * 秒が変わった直後とした。つまり1秒おきにセンサーデータを
tosihisa 4:879b8dcfee15 523 * スキャンする。
tosihisa 4:879b8dcfee15 524 * 5) センサーデータの保存データ(ENVnnnnn.CSV) の先頭に
tosihisa 4:879b8dcfee15 525 * NAV-TIMEUTC の日付時刻を入れるようにした。
tosihisa 4:879b8dcfee15 526 * これで何時何分のセンサーデータか分かるようにした。
tosihisa 4:879b8dcfee15 527 */
tosihisa 4:879b8dcfee15 528 /*
tosihisa 3:844fbe607dae 529 * 2012-1-29 V0.7
tosihisa 3:844fbe607dae 530 * ログ機能の追加。スイッチを押すとログのON/OFFが出来る。
tosihisa 3:844fbe607dae 531 * ログ収集中は、mbed LED3 が点灯する。
tosihisa 3:844fbe607dae 532 */
tosihisa 3:844fbe607dae 533 /*
tosihisa 3:844fbe607dae 534 * 2012-1-29 V0.6
tosihisa 3:844fbe607dae 535 * 1) スキャンカウントの変更。今までは1秒周期だったが、
tosihisa 3:844fbe607dae 536 * 100ミリ秒周期でセンサーデータを得るようにした。
tosihisa 3:844fbe607dae 537 * 2) モーメンタリSW対応。
tosihisa 3:844fbe607dae 538 */
tosihisa 3:844fbe607dae 539 /*
tosihisa 2:f546aaa0e1d5 540 * 2012-1-23 V0.5
tosihisa 2:f546aaa0e1d5 541 * U-Blox,気圧センサー,温度センサー,CO2センサーの値を表示するようにした。
tosihisa 2:f546aaa0e1d5 542 * U-Blox は受信できたパケット数を表示する。
tosihisa 2:f546aaa0e1d5 543 * マイクロSDへの保存機能はまだ(H/W的に動くのは確認済み)
tosihisa 2:f546aaa0e1d5 544 */