Amit Gandhi / Sensen-classic-v8-IAQ_copy_4

Dependencies:   SDFileSystem BLE_API BufferedSerial DHT22_3 mbed-dev_2 nRF51822 nrf51_rtc

Fork of SDFileSystem_HelloWorld by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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, &reg, 1, true);
00120     i2c.read(figCO2, &readme_lsb, 1, false);
00121     
00122     reg = 0x04;
00123     i2c.write(figCO2, &reg, 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, &reg, 1, true);
00192         i2c.read(DS1307, &readreg, 1, false);
00193         rtcbuff[0] = readreg - 6 * (readreg >> 4);;
00194         
00195         reg = 0x01;
00196         i2c.write(DS1307, &reg, 1, true);
00197         i2c.read(DS1307, &readreg, 1, false);
00198         rtcbuff[1] = readreg - 6 * (readreg >> 4);;
00199         
00200         reg = 0x02;
00201         i2c.write(DS1307, &reg, 1, true);
00202         i2c.read(DS1307, &readreg, 1, false);
00203         rtcbuff[2] = readreg - 6 * (readreg >> 4);;
00204         
00205         reg = 0x03;
00206         i2c.write(DS1307, &reg, 1, true);
00207         i2c.read(DS1307, &readreg, 1, false);
00208         rtcbuff[3] = readreg - 6 * (readreg >> 4);;
00209         
00210         reg = 0x04;
00211         i2c.write(DS1307, &reg, 1, true);
00212         i2c.read(DS1307, &readreg, 1, false);
00213         rtcbuff[4] = readreg - 6 * (readreg >> 4);;
00214         
00215         reg = 0x05;
00216         i2c.write(DS1307, &reg, 1, true);
00217         i2c.read(DS1307, &readreg, 1, false);
00218         rtcbuff[5] = readreg - 6 * (readreg >> 4);;
00219         
00220         reg = 0x06;
00221         i2c.write(DS1307, &reg, 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, &reg, 1, true);
00437         i2c.read(figCO2, &readme_lsb, 1, false);
00438         
00439         reg = 0x04;
00440         i2c.write(figCO2, &reg, 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 }