t
Dependencies: SDFileSystem BLE_API BufferedSerial DHT22_3 mbed-dev_2 nRF51822 nrf51_rtc
Fork of SDFileSystem_HelloWorld by
Diff: main.cpp
- Revision:
- 1:d6e971d1bca9
- Parent:
- 0:bdbd3d6fc5d5
- Child:
- 3:42fbb9bc132b
--- a/main.cpp Fri Dec 07 11:25:01 2012 +0000 +++ b/main.cpp Fri Nov 10 20:54:05 2017 +0000 @@ -1,19 +1,506 @@ +#define LOGDELAY 290 + #include "mbed.h" +#include "BufferedSerial.h" #include "SDFileSystem.h" - -SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board - -int main() { - printf("Hello World!\n"); - - mkdir("/sd/mydir", 0777); +#include "ble/BLE.h" +#include "ble/services/DeviceInformationService.h" +#include "nrf_soc.h" // for internal Thermo sensor +#include "nrf51_rtc.h" +#include "Dht22.h" +#include <string> + +//Serial pc(USBTX, USBRX); + + +char DEVICE_NAME[] = "IAQ"; //enter device name +const static char datapath[] = "/sd/datalog.txt"; +Ticker wakeUp; +char hpmbuffer[10]; +bool triggered = true; + +/* +// Sensen Pin Configuration +*/ + +SDFileSystem sd(p25, p28, p29, p23, "sd");//Create an SDFileSystem object mosi, miso, sclk +I2C i2c(p30 , p7); //sda, scl +DigitalOut adp(p21); +DigitalOut sample_led(p17); //yellow - sampling +DigitalOut status_led(p18); //red - status + + + +/* +// Sensor Configuration +*/ + +//analog sensors +AnalogIn spec(p1); +AnalogIn figCO(p2); +AnalogIn sharpVOut(p3); + +//digital sensors +BufferedSerial hpm(p9,p11); //tx, rx +//SoftwareSerial plantower(p10, p12); +DigitalOut sharpLED(p13); //low = on +DigitalOut plantowerReset(p10); +DigitalOut plantowerSet(p12); +Dht22 dht(p14); +const int figCO2 = 0x69 << 1; // 8bit I2C address, 0x69 for figaro CO2 +const int DS1307 = 0x68 << 1; + + +/* +// Global variables for data +*/ +char rtcbuff[8]; +float dataBuffer[30]; +uint32_t timeNow = 0; +uint32_t wakeTime = 0; +float sharpPM = 0.0; +float specCO = 0.0; +float figaroCO = 0.0; +int dhtTemp = 0; +int dhtHum = 0; +int figaroCO2 = 0; +int honeywellPM2_5 = 0; +int honeywellPM10 = 0; +int plantowerPM1 = 0; +int plantowerPM2_5 = 0; +int plantowerPM10 = 0; +int32_t p_temp = 0; +float temperature = 0; + +/* +// I2C functions +*/ + +void writeReg(int addr8bit, char reg, char val) +{ + char tempData[2]; + tempData[0] = reg; + tempData[1] = val; + i2c.write(addr8bit, tempData, 2); +} + +void readReg(int addr8bit, uint8_t reg) +{ + char tempData[2]; + tempData[0] = reg; + i2c.write(addr8bit, &tempData[0], 1, true); + i2c.read(addr8bit, &tempData[1], 1, false); +} + +int twosComp( char bit_msb, char bit_lsb) +{ + int16_t myInt=0; + myInt = (bit_msb << 8) | (bit_lsb & 0xff); + return myInt; +} + + +/* +// Sensor interface functions +*/ + +void getDHT() +{ + dht.read(); + dhtTemp = dht.getCelsius(); + dhtHum = dht.getHumidity(); +} + +void getFigaroCO2() +{ + char readme_msb, readme_lsb; + + char reg = 0x03; + i2c.write(figCO2, ®, 1, true); + i2c.read(figCO2, &readme_lsb, 1, false); + + reg = 0x04; + i2c.write(figCO2, ®, 1, true); + i2c.read(figCO2, &readme_msb, 1, false); + + figaroCO2 = twosComp(readme_msb,readme_lsb); +} + +void getSharpPM() +{ + sharpVOut.read(); + wait_ms(5); + sharpLED = 0; + wait_us(280); + sharpPM = sharpVOut.read(); + wait_us(40); + sharpLED = 1; + wait_us(9680); +} + +void getSpecCO() +{ + spec.read(); + wait_ms(5); + specCO = 0.0; + for(int i=0; i<128; i++) + { + specCO += spec.read(); + wait_ms(2); + } + specCO = specCO/128.0; +} + +void getFigaroCO() +{ + figCO.read(); + wait_ms(5); + figaroCO = 0.0; + //for(int i=0; i<128; i++) + //{ + figaroCO = figCO.read(); + // wait_ms(2); + //} + //figaroCO = figaroCO/128.0; +} + +void getHPM() +{ + for(int i=0; i<8; i++) { + hpmbuffer[i]=1; + } + for(int i=0; i<100; i++) { + if(hpm.getc()==0x42) { + if(hpm.getc()==0x4d) { + for(int i=0; i<8; i++) { + hpmbuffer[i]=hpm.getc(); + } + honeywellPM2_5 = twosComp(hpmbuffer[4],hpmbuffer[5]); + honeywellPM10 = twosComp(hpmbuffer[6],hpmbuffer[7]); + break; + } + } + } +} + +void getTime() +{ + char readreg; + + char reg = 0x00; + i2c.write(DS1307, ®, 1, true); + i2c.read(DS1307, &readreg, 1, false); + rtcbuff[0] = readreg - 6 * (readreg >> 4);; + + reg = 0x01; + i2c.write(DS1307, ®, 1, true); + i2c.read(DS1307, &readreg, 1, false); + rtcbuff[1] = readreg - 6 * (readreg >> 4);; + + reg = 0x02; + i2c.write(DS1307, ®, 1, true); + i2c.read(DS1307, &readreg, 1, false); + rtcbuff[2] = readreg - 6 * (readreg >> 4);; + + reg = 0x03; + i2c.write(DS1307, ®, 1, true); + i2c.read(DS1307, &readreg, 1, false); + rtcbuff[3] = readreg - 6 * (readreg >> 4);; + + reg = 0x04; + i2c.write(DS1307, ®, 1, true); + i2c.read(DS1307, &readreg, 1, false); + rtcbuff[4] = readreg - 6 * (readreg >> 4);; + + reg = 0x05; + i2c.write(DS1307, ®, 1, true); + i2c.read(DS1307, &readreg, 1, false); + rtcbuff[5] = readreg - 6 * (readreg >> 4);; + + reg = 0x06; + i2c.write(DS1307, ®, 1, true); + i2c.read(DS1307, &readreg, 1, false); + rtcbuff[6] = readreg - 6 * (readreg >> 4);; + + struct tm t; + + t.tm_year = (int)rtcbuff[6]+100; + t.tm_mon = (int)rtcbuff[5]-1; // Month, 0 - jan + t.tm_mday = (int)rtcbuff[4]; // Day of the month + t.tm_hour = (int)rtcbuff[2]; + t.tm_min = (int)rtcbuff[1]; + t.tm_sec = (int)rtcbuff[0]; + t.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown + timeNow = mktime(&t); +} + + +void getData() +{ + getSharpPM(); + wait(0.25); + + getSpecCO(); + wait(0.25); + + getFigaroCO(); + wait(0.25); - FILE *fp = fopen("/sd/mydir/sdtest.txt", "w"); - if(fp == NULL) { - error("Could not open file for write\n"); + getFigaroCO2(); + wait(0.25); + + getHPM(); + for(int i = 0; i<5; i++) + { + if (honeywellPM2_5 == 0 && honeywellPM10 == 0) + { + wait(0.25); + getHPM(); + } + } + wait(0.25); + + getDHT(); + if (dhtTemp == 0) + { + wait(5); + getDHT(); + } + wait(0.25); + + +} + + + + + + + +/* +// SD functions +*/ + +void sd_begin() +{ + DigitalOut mosi(p25); //out + DigitalIn miso(p28); //in + miso.mode(PullUp); + DigitalOut sclk(p29); //out + DigitalOut cs(p23,1); //out + + plantowerReset = 1; + plantowerSet = 1; + adp = 1; //turn on ADP194 + sharpLED = 1; + status_led=1; //turn on status led - red + wait(0.25); +} + + +void sd_sleep() +{ + wait(0.25); + status_led=0; //turn off status led - red + adp = 0; //turn off ADP194 + sharpLED = 0; + //set all SPI as outputs pulled down + DigitalOut mosi(p25,0); + DigitalOut miso(p28,0); + DigitalOut sclk(p29,0); + DigitalOut cs(p23,0); +} + +void sd_header_write()//Write header sd card +{ + sd.mount();//Mount the filesystem + wait(0.25);//wait for stabilization + + FILE *fp = fopen(datapath, "a"); //will overwrite any existing datalog.txt file + if (fp != NULL) { + fprintf(fp,"Time,PM2_5,PM10,sharpPM,dhtTemp,dhtHum,specCO,figaroCO,figaroCO2\r\n"); + wait(0.25); //seconds + } + fclose(fp); + sd.unmount();//Unmount the filesystem +} + +void saveData() +{ + sd.mount();//Mount the filesystem + wait(0.25);//wait for stabilization + + FILE *fp = fopen(datapath, "a"); //will overwrite any existing datalog.txt file + if (fp != NULL) { + //fprintf(fp,"%d,%.4f\r\n",temperature); + fprintf(fp,"%d,%d,%d,%.4f,%d,%d,%.4f,%.4f,%d\r\n",timeNow,honeywellPM2_5,honeywellPM10,sharpPM,dhtTemp,dhtHum,specCO,figaroCO,figaroCO2); + wait(0.25); //seconds + } + fclose(fp); + sd.unmount();//Unmount the filesystem + +} + +/* +// Clock functions +*/ + +void checkTime() +{ + timeNow = rtc.time(); + if (timeNow > wakeTime) { + triggered = true; } - fprintf(fp, "Hello fun SD Card World!"); - fclose(fp); + //timeNow = rtc.time(); + //wakeTime = timeNow + LOGDELAY; +} + + + + + +int main(void) +{ + /* + //set time + int val = 5; + val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); + writeReg(DS1307,0x00,val); + + val = 5; + val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); + writeReg(DS1307,0x01,val); + + val = 0; + val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); + writeReg(DS1307,0x02,val); + + val = 20; + val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); + writeReg(DS1307,0x03,val); + + val = 26; + val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); + writeReg(DS1307,0x04,val); + + val = 10; + val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); + writeReg(DS1307,0x05,val); + + val = 17; + val = ( ( val / 10 ) * 0x10 ) + ( val % 10 ); + writeReg(DS1307,0x06,val); + + while(1) + { + sample_led = !sample_led; + wait(1); + } + + */ + + //pc.printf("starting up... \n"); + /* + sd_begin(); + while(1) + { + + + while(1) + { + if(hpm.getc()==0x42) + { + if(hpm.getc()==0x4d) + { + for(int i=0;i<8;i++) + { + hpmbuffer[i]=hpm.getc(); + } + break; + } + } + } + + FILE *fp = fopen(datapath, "a"); //will overwrite any existing datalog.txt file + if (fp != NULL) { + fprintf(fp,"%x,%x,%x,%x\r\n",hpmbuffer[4],hpmbuffer[5],hpmbuffer[6],hpmbuffer[7]); + //fprintf(fp,"%d,%.4f,%.4f,%.4f,%.4f\r\n",timeNow,sharpPM,specCO,figaroCO,figaroCO2 + } + fclose(fp); + */ + +/* + char readme_msb, readme_lsb; + + char reg = 0x03; + i2c.write(figCO2, ®, 1, true); + i2c.read(figCO2, &readme_lsb, 1, false); + + reg = 0x04; + i2c.write(figCO2, ®, 1, true); + i2c.read(figCO2, &readme_msb, 1, false); + + int16_t xval = twosComp(readme_msb,readme_lsb); + figaroCO2 = (float)xval/15987; + + pc.printf("figaroCO2 %f\n", figaroCO2); + wait(1); + */ - printf("Goodbye World!\n"); -} + BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE); + ble.init(); + sd_begin(); + sd_header_write(); + sample_led = 1; + + while (ble.hasInitialized() == false) { + } + + while(true) { + + //wait(5); + if(triggered) + { + sd_begin(); + wait(1); +/* + getTime(); + getDHT(); + 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]); + pc.printf("%d,%d\n\r",dhtTemp,dhtHum); + wait(5); +*/ + + //getData(); + //specCO = spec.read(); + //sd_temp_get(&p_temp); + //temperature = float(p_temp)/4.; + + //pc.printf("%.4f\n",specCO); + + getTime(); + wakeTime = timeNow + LOGDELAY; + + for(int i = 0; i < 2; i++) + { + getTime(); + sample_led = 1; + getData(); + sample_led = 0; + saveData(); + } + + + rtc.set_time(timeNow); + triggered = false; + sd_sleep(); //powers off everything + } + else + { + wakeUp.attach(&checkTime, 10); + ble.waitForEvent(); + __wfe(); + wakeUp.detach(); + } + } +} \ No newline at end of file