Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem BLE_API BufferedSerial DHT22_3 mbed-dev_2 nRF51822 nrf51_rtc
Fork of SDFileSystem_HelloWorld by
main.cpp
00001 #define LOGDELAY 291 00002 00003 #include "mbed.h" 00004 #include "BufferedSerial.h" 00005 #include "SDFileSystem.h" 00006 #include "ble/BLE.h" 00007 #include "ble/services/DeviceInformationService.h" 00008 #include "nrf_soc.h" // for internal Thermo sensor 00009 #include "nrf51_rtc.h" 00010 #include "Dht22.h" 00011 #include <string> 00012 00013 //Serial pc(USBTX, USBRX); 00014 00015 00016 char DEVICE_NAME[] = "IAQ"; //enter device name 00017 const static char datapath[] = "/sd/datalog.txt"; 00018 Ticker wakeUp; 00019 char hpmbuffer[10]; 00020 bool triggered = true; 00021 00022 /* 00023 // Sensen Pin Configuration 00024 */ 00025 00026 SDFileSystem sd(p25, p28, p29, p23, "sd");//Create an SDFileSystem object mosi, miso, sclk 00027 I2C i2c(p30 , p7); //sda, scl 00028 DigitalOut adp(p21); 00029 DigitalOut sample_led(p17); //yellow - sampling 00030 DigitalOut status_led(p18); //red - status 00031 00032 00033 00034 /* 00035 // Sensor Configuration 00036 */ 00037 00038 //analog sensors 00039 AnalogIn spec(p1); 00040 AnalogIn figCO(p2); 00041 AnalogIn sharpVOut(p3); 00042 00043 //digital sensors 00044 BufferedSerial hpm(p9,p11); //tx, rx 00045 //SoftwareSerial plantower(p10, p12); 00046 DigitalOut sharpLED(p13); //low = on 00047 DigitalOut plantowerReset(p10); 00048 DigitalOut plantowerSet(p12); 00049 Dht22 dht(p14); 00050 const int figCO2 = 0x69 << 1; // 8bit I2C address, 0x69 for figaro CO2 00051 const int DS1307 = 0x68 << 1; 00052 00053 00054 /* 00055 // Global variables for data 00056 */ 00057 char rtcbuff[8]; 00058 float dataBuffer[30]; 00059 uint32_t timeNow = 0; 00060 uint32_t wakeTime = 0; 00061 float sharpPM = 0.0; 00062 float specCO = 0.0; 00063 float figaroCO = 0.0; 00064 int dhtTemp = 0; 00065 int dhtHum = 0; 00066 int figaroCO2 = 0; 00067 int honeywellPM2_5 = 0; 00068 int honeywellPM10 = 0; 00069 int plantowerPM1 = 0; 00070 int plantowerPM2_5 = 0; 00071 int plantowerPM10 = 0; 00072 int32_t p_temp = 0; 00073 float temperature = 0; 00074 00075 /* 00076 // I2C functions 00077 */ 00078 00079 void writeReg(int addr8bit, char reg, char val) 00080 { 00081 char tempData[2]; 00082 tempData[0] = reg; 00083 tempData[1] = val; 00084 i2c.write(addr8bit, tempData, 2); 00085 } 00086 00087 void readReg(int addr8bit, uint8_t reg) 00088 { 00089 char tempData[2]; 00090 tempData[0] = reg; 00091 i2c.write(addr8bit, &tempData[0], 1, true); 00092 i2c.read(addr8bit, &tempData[1], 1, false); 00093 } 00094 00095 int twosComp( char bit_msb, char bit_lsb) 00096 { 00097 int16_t myInt=0; 00098 myInt = (bit_msb << 8) | (bit_lsb & 0xff); 00099 return myInt; 00100 } 00101 00102 00103 /* 00104 // Sensor interface functions 00105 */ 00106 00107 void getDHT() 00108 { 00109 dht.read(); 00110 dhtTemp = dht.getCelsius(); 00111 dhtHum = dht.getHumidity(); 00112 } 00113 00114 void getFigaroCO2() 00115 { 00116 char readme_msb, readme_lsb; 00117 00118 char reg = 0x03; 00119 i2c.write(figCO2, ®, 1, true); 00120 i2c.read(figCO2, &readme_lsb, 1, false); 00121 00122 reg = 0x04; 00123 i2c.write(figCO2, ®, 1, true); 00124 i2c.read(figCO2, &readme_msb, 1, false); 00125 00126 figaroCO2 = twosComp(readme_msb,readme_lsb); 00127 } 00128 00129 void getSharpPM() 00130 { 00131 sharpVOut.read(); 00132 wait_ms(5); 00133 sharpLED = 0; 00134 wait_us(280); 00135 sharpPM = sharpVOut.read(); 00136 wait_us(40); 00137 sharpLED = 1; 00138 wait_us(9680); 00139 } 00140 00141 void getSpecCO() 00142 { 00143 spec.read(); 00144 wait_ms(5); 00145 specCO = 0.0; 00146 for(int i=0; i<128; i++) 00147 { 00148 specCO += spec.read(); 00149 wait_ms(2); 00150 } 00151 specCO = specCO/128.0; 00152 } 00153 00154 void getFigaroCO() 00155 { 00156 figCO.read(); 00157 wait_ms(5); 00158 figaroCO = 0.0; 00159 //for(int i=0; i<128; i++) 00160 //{ 00161 figaroCO = figCO.read(); 00162 // wait_ms(2); 00163 //} 00164 //figaroCO = figaroCO/128.0; 00165 } 00166 00167 void getHPM() 00168 { 00169 for(int i=0; i<8; i++) { 00170 hpmbuffer[i]=1; 00171 } 00172 for(int i=0; i<100; i++) { 00173 if(hpm.getc()==0x42) { 00174 if(hpm.getc()==0x4d) { 00175 for(int i=0; i<8; i++) { 00176 hpmbuffer[i]=hpm.getc(); 00177 } 00178 honeywellPM2_5 = twosComp(hpmbuffer[4],hpmbuffer[5]); 00179 honeywellPM10 = twosComp(hpmbuffer[6],hpmbuffer[7]); 00180 break; 00181 } 00182 } 00183 } 00184 } 00185 00186 void getTime() 00187 { 00188 char readreg; 00189 00190 char reg = 0x00; 00191 i2c.write(DS1307, ®, 1, true); 00192 i2c.read(DS1307, &readreg, 1, false); 00193 rtcbuff[0] = readreg - 6 * (readreg >> 4);; 00194 00195 reg = 0x01; 00196 i2c.write(DS1307, ®, 1, true); 00197 i2c.read(DS1307, &readreg, 1, false); 00198 rtcbuff[1] = readreg - 6 * (readreg >> 4);; 00199 00200 reg = 0x02; 00201 i2c.write(DS1307, ®, 1, true); 00202 i2c.read(DS1307, &readreg, 1, false); 00203 rtcbuff[2] = readreg - 6 * (readreg >> 4);; 00204 00205 reg = 0x03; 00206 i2c.write(DS1307, ®, 1, true); 00207 i2c.read(DS1307, &readreg, 1, false); 00208 rtcbuff[3] = readreg - 6 * (readreg >> 4);; 00209 00210 reg = 0x04; 00211 i2c.write(DS1307, ®, 1, true); 00212 i2c.read(DS1307, &readreg, 1, false); 00213 rtcbuff[4] = readreg - 6 * (readreg >> 4);; 00214 00215 reg = 0x05; 00216 i2c.write(DS1307, ®, 1, true); 00217 i2c.read(DS1307, &readreg, 1, false); 00218 rtcbuff[5] = readreg - 6 * (readreg >> 4);; 00219 00220 reg = 0x06; 00221 i2c.write(DS1307, ®, 1, true); 00222 i2c.read(DS1307, &readreg, 1, false); 00223 rtcbuff[6] = readreg - 6 * (readreg >> 4);; 00224 00225 struct tm t; 00226 00227 t.tm_year = (int)rtcbuff[6]+100; 00228 t.tm_mon = (int)rtcbuff[5]-1; // Month, 0 - jan 00229 t.tm_mday = (int)rtcbuff[4]; // Day of the month 00230 t.tm_hour = (int)rtcbuff[2]; 00231 t.tm_min = (int)rtcbuff[1]; 00232 t.tm_sec = (int)rtcbuff[0]; 00233 t.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown 00234 timeNow = mktime(&t); 00235 } 00236 00237 00238 void getData() 00239 { 00240 getSharpPM(); 00241 wait(0.25); 00242 00243 getSpecCO(); 00244 wait(0.25); 00245 00246 getFigaroCO(); 00247 wait(0.25); 00248 00249 getFigaroCO2(); 00250 wait(0.25); 00251 00252 getHPM(); 00253 for(int i = 0; i<5; i++) 00254 { 00255 if (honeywellPM2_5 == 0 && honeywellPM10 == 0) 00256 { 00257 wait(0.25); 00258 getHPM(); 00259 } 00260 } 00261 wait(0.25); 00262 00263 getDHT(); 00264 if (dhtTemp == 0) 00265 { 00266 wait(5); 00267 getDHT(); 00268 } 00269 wait(0.25); 00270 00271 00272 } 00273 00274 00275 00276 00277 00278 00279 00280 /* 00281 // SD functions 00282 */ 00283 00284 void sd_begin() 00285 { 00286 DigitalOut mosi(p25); //out 00287 DigitalIn miso(p28); //in 00288 miso.mode(PullUp); 00289 DigitalOut sclk(p29); //out 00290 DigitalOut cs(p23,1); //out 00291 00292 plantowerReset = 1; 00293 plantowerSet = 1; 00294 adp = 1; //turn on ADP194 00295 sharpLED = 1; 00296 status_led=1; //turn on status led - red 00297 wait(0.25); 00298 } 00299 00300 00301 void sd_sleep() 00302 { 00303 wait(0.25); 00304 status_led=0; //turn off status led - red 00305 adp = 0; //turn off ADP194 00306 sharpLED = 0; 00307 //set all SPI as outputs pulled down 00308 DigitalOut mosi(p25,0); 00309 DigitalOut miso(p28,0); 00310 DigitalOut sclk(p29,0); 00311 DigitalOut cs(p23,0); 00312 } 00313 00314 void sd_header_write()//Write header sd card 00315 { 00316 sd.mount();//Mount the filesystem 00317 wait(0.25);//wait for stabilization 00318 00319 FILE *fp = fopen(datapath, "a"); //will overwrite any existing datalog.txt file 00320 if (fp != NULL) { 00321 fprintf(fp,"Time,PM2_5,PM10,sharpPM,dhtTemp,dhtHum,specCO,figaroCO,figaroCO2\r\n"); 00322 wait(0.25); //seconds 00323 } 00324 fclose(fp); 00325 sd.unmount();//Unmount the filesystem 00326 } 00327 00328 void saveData() 00329 { 00330 sd.mount();//Mount the filesystem 00331 wait(0.25);//wait for stabilization 00332 00333 FILE *fp = fopen(datapath, "a"); //will overwrite any existing datalog.txt file 00334 if (fp != NULL) { 00335 //fprintf(fp,"%d,%.4f\r\n",temperature); 00336 fprintf(fp,"%d,%d,%d,%.4f,%d,%d,%.4f,%.4f,%d\r\n",timeNow,honeywellPM2_5,honeywellPM10,sharpPM,dhtTemp,dhtHum,specCO,figaroCO,figaroCO2); 00337 wait(0.25); //seconds 00338 } 00339 fclose(fp); 00340 sd.unmount();//Unmount the filesystem 00341 00342 } 00343 00344 /* 00345 // Clock functions 00346 */ 00347 00348 void checkTime() 00349 { 00350 timeNow = rtc.time(); 00351 if (timeNow > wakeTime) { 00352 triggered = true; 00353 } 00354 //timeNow = rtc.time(); 00355 //wakeTime = timeNow + LOGDELAY; 00356 } 00357 00358 00359 00360 00361 00362 int main(void) 00363 { 00364 /* 00365 //set time 00366 int val = 5; 00367 val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); 00368 writeReg(DS1307,0x00,val); 00369 00370 val = 5; 00371 val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); 00372 writeReg(DS1307,0x01,val); 00373 00374 val = 0; 00375 val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); 00376 writeReg(DS1307,0x02,val); 00377 00378 val = 20; 00379 val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); 00380 writeReg(DS1307,0x03,val); 00381 00382 val = 26; 00383 val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); 00384 writeReg(DS1307,0x04,val); 00385 00386 val = 10; 00387 val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); 00388 writeReg(DS1307,0x05,val); 00389 00390 val = 17; 00391 val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); 00392 writeReg(DS1307,0x06,val); 00393 00394 while(1) 00395 { 00396 sample_led = !sample_led; 00397 wait(1); 00398 } 00399 00400 */ 00401 00402 //pc.printf("starting up... \n"); 00403 /* 00404 sd_begin(); 00405 while(1) 00406 { 00407 00408 00409 while(1) 00410 { 00411 if(hpm.getc()==0x42) 00412 { 00413 if(hpm.getc()==0x4d) 00414 { 00415 for(int i=0;i<8;i++) 00416 { 00417 hpmbuffer[i]=hpm.getc(); 00418 } 00419 break; 00420 } 00421 } 00422 } 00423 00424 FILE *fp = fopen(datapath, "a"); //will overwrite any existing datalog.txt file 00425 if (fp != NULL) { 00426 fprintf(fp,"%x,%x,%x,%x\r\n",hpmbuffer[4],hpmbuffer[5],hpmbuffer[6],hpmbuffer[7]); 00427 //fprintf(fp,"%d,%.4f,%.4f,%.4f,%.4f\r\n",timeNow,sharpPM,specCO,figaroCO,figaroCO2 00428 } 00429 fclose(fp); 00430 */ 00431 00432 /* 00433 char readme_msb, readme_lsb; 00434 00435 char reg = 0x03; 00436 i2c.write(figCO2, ®, 1, true); 00437 i2c.read(figCO2, &readme_lsb, 1, false); 00438 00439 reg = 0x04; 00440 i2c.write(figCO2, ®, 1, true); 00441 i2c.read(figCO2, &readme_msb, 1, false); 00442 00443 int16_t xval = twosComp(readme_msb,readme_lsb); 00444 figaroCO2 = (float)xval/15987; 00445 00446 pc.printf("figaroCO2 %f\n", figaroCO2); 00447 wait(1); 00448 */ 00449 00450 BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE); 00451 ble.init(); 00452 sd_begin(); 00453 sd_header_write(); 00454 sample_led = 1; 00455 00456 while (ble.hasInitialized() == false) { 00457 } 00458 00459 while(true) { 00460 00461 //wait(5); 00462 if(triggered) 00463 { 00464 sd_begin(); 00465 wait(1); 00466 /* 00467 getTime(); 00468 getDHT(); 00469 pc.printf("%ld,%d,%d,%d,%d,%d,%d,%d,",timeNow,rtcbuff[0],rtcbuff[1],rtcbuff[2],rtcbuff[3],rtcbuff[4],rtcbuff[5],rtcbuff[6]); 00470 pc.printf("%d,%d\n\r",dhtTemp,dhtHum); 00471 wait(5); 00472 */ 00473 00474 //getData(); 00475 //specCO = spec.read(); 00476 //sd_temp_get(&p_temp); 00477 //temperature = float(p_temp)/4.; 00478 00479 //pc.printf("%.4f\n",specCO); 00480 00481 getTime(); 00482 wakeTime = timeNow + LOGDELAY; 00483 00484 for(int i = 0; i < 2; i++) 00485 { 00486 getTime(); 00487 sample_led = 1; 00488 getData(); 00489 sample_led = 0; 00490 saveData(); 00491 } 00492 00493 00494 rtc.set_time(timeNow); 00495 triggered = false; 00496 sd_sleep(); //powers off everything 00497 } 00498 else 00499 { 00500 wakeUp.attach(&checkTime, 10); 00501 ble.waitForEvent(); 00502 __wfe(); 00503 wakeUp.detach(); 00504 } 00505 } 00506 }
Generated on Thu Jul 21 2022 22:43:29 by
1.7.2
