Data logger with SD card storage and RTC
Dependencies: SDFileSystem SoftSerial ds3231 mbed
main.cpp@0:e0a8ea9b571e, 2015-09-29 (annotated)
- Committer:
- dexterg
- Date:
- Tue Sep 29 21:32:10 2015 +0000
- Revision:
- 0:e0a8ea9b571e
- Child:
- 1:ab74071de2c8
master
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dexterg | 0:e0a8ea9b571e | 1 | #include "mbed.h" |
dexterg | 0:e0a8ea9b571e | 2 | #include "SDFileSystem.h" |
dexterg | 0:e0a8ea9b571e | 3 | #include "SoftSerial.h" |
dexterg | 0:e0a8ea9b571e | 4 | #include "ds3231.h" |
dexterg | 0:e0a8ea9b571e | 5 | DigitalOut externalTrig(P0_17); |
dexterg | 0:e0a8ea9b571e | 6 | DigitalOut myled(LED1); |
dexterg | 0:e0a8ea9b571e | 7 | //Serial usbPC(P0_19, P0_18); |
dexterg | 0:e0a8ea9b571e | 8 | |
dexterg | 0:e0a8ea9b571e | 9 | InterruptIn button(P0_23); |
dexterg | 0:e0a8ea9b571e | 10 | InterruptIn button2(P0_16); |
dexterg | 0:e0a8ea9b571e | 11 | |
dexterg | 0:e0a8ea9b571e | 12 | Serial fpga(P0_19, P0_18);//must change to new pins |
dexterg | 0:e0a8ea9b571e | 13 | |
dexterg | 0:e0a8ea9b571e | 14 | Ds3231 rtc(P0_5, P0_4);///must change to new pins |
dexterg | 0:e0a8ea9b571e | 15 | |
dexterg | 0:e0a8ea9b571e | 16 | SDFileSystem sd(P0_9, P0_8, P0_10, P0_2, "sd");//must change to new pins |
dexterg | 0:e0a8ea9b571e | 17 | float lifeTime = 0; |
dexterg | 0:e0a8ea9b571e | 18 | float oTwo = 0; |
dexterg | 0:e0a8ea9b571e | 19 | float peak = 0; |
dexterg | 0:e0a8ea9b571e | 20 | float trough = 0; |
dexterg | 0:e0a8ea9b571e | 21 | float ancil = 0; |
dexterg | 0:e0a8ea9b571e | 22 | char tbuff[32]; |
dexterg | 0:e0a8ea9b571e | 23 | char pbuff[250]; |
dexterg | 0:e0a8ea9b571e | 24 | void bPush() |
dexterg | 0:e0a8ea9b571e | 25 | { |
dexterg | 0:e0a8ea9b571e | 26 | time_t epoch_time; |
dexterg | 0:e0a8ea9b571e | 27 | epoch_time = rtc.get_epoch(); |
dexterg | 0:e0a8ea9b571e | 28 | |
dexterg | 0:e0a8ea9b571e | 29 | strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S %Z", localtime(&epoch_time)); |
dexterg | 0:e0a8ea9b571e | 30 | |
dexterg | 0:e0a8ea9b571e | 31 | FILE *fp = fopen("/sd/d.txt", "a"); |
dexterg | 0:e0a8ea9b571e | 32 | if(fp == NULL) { |
dexterg | 0:e0a8ea9b571e | 33 | } else { |
dexterg | 0:e0a8ea9b571e | 34 | fprintf(fp, "%s,%f,%f,%f,%f,%f\r\n",tbuff,lifeTime,oTwo,peak,trough,ancil); |
dexterg | 0:e0a8ea9b571e | 35 | } |
dexterg | 0:e0a8ea9b571e | 36 | fclose(fp); |
dexterg | 0:e0a8ea9b571e | 37 | fpga.printf("lifetime: %f o2: %f peak: %f trough: %f ancil: %f ",lifeTime,oTwo,peak,trough,ancil); |
dexterg | 0:e0a8ea9b571e | 38 | } |
dexterg | 0:e0a8ea9b571e | 39 | |
dexterg | 0:e0a8ea9b571e | 40 | void bPush2() |
dexterg | 0:e0a8ea9b571e | 41 | { |
dexterg | 0:e0a8ea9b571e | 42 | time_t epoch_time; |
dexterg | 0:e0a8ea9b571e | 43 | epoch_time = rtc.get_epoch(); |
dexterg | 0:e0a8ea9b571e | 44 | |
dexterg | 0:e0a8ea9b571e | 45 | externalTrig=1; |
dexterg | 0:e0a8ea9b571e | 46 | wait(0.1); |
dexterg | 0:e0a8ea9b571e | 47 | externalTrig=0; |
dexterg | 0:e0a8ea9b571e | 48 | |
dexterg | 0:e0a8ea9b571e | 49 | //strftime(tbuff, 32, "%X %x", localtime(&epoch_time)); |
dexterg | 0:e0a8ea9b571e | 50 | //printf("%s", tbuff); |
dexterg | 0:e0a8ea9b571e | 51 | } |
dexterg | 0:e0a8ea9b571e | 52 | const int buffer_size = 255; |
dexterg | 0:e0a8ea9b571e | 53 | char fpgaBuffer[buffer_size+1]; |
dexterg | 0:e0a8ea9b571e | 54 | volatile int rx_in=0; |
dexterg | 0:e0a8ea9b571e | 55 | volatile int rx_out=0; |
dexterg | 0:e0a8ea9b571e | 56 | int newData=0; |
dexterg | 0:e0a8ea9b571e | 57 | |
dexterg | 0:e0a8ea9b571e | 58 | void fpga_Rx_interrupt() |
dexterg | 0:e0a8ea9b571e | 59 | { |
dexterg | 0:e0a8ea9b571e | 60 | wait(0.1); |
dexterg | 0:e0a8ea9b571e | 61 | while ((fpga.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) { |
dexterg | 0:e0a8ea9b571e | 62 | fpgaBuffer[rx_in] = fpga.getc(); |
dexterg | 0:e0a8ea9b571e | 63 | // Uncomment to Echo to USB serial to watch data flow |
dexterg | 0:e0a8ea9b571e | 64 | rx_in = (rx_in + 1) % buffer_size; |
dexterg | 0:e0a8ea9b571e | 65 | } |
dexterg | 0:e0a8ea9b571e | 66 | |
dexterg | 0:e0a8ea9b571e | 67 | |
dexterg | 0:e0a8ea9b571e | 68 | ///convert to Shijie datagram |
dexterg | 0:e0a8ea9b571e | 69 | if(fpgaBuffer[2]!=0xFF) { |
dexterg | 0:e0a8ea9b571e | 70 | lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0); |
dexterg | 0:e0a8ea9b571e | 71 | oTwo = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0); |
dexterg | 0:e0a8ea9b571e | 72 | peak = (256 * (fpgaBuffer[4]))+fpgaBuffer[5]; |
dexterg | 0:e0a8ea9b571e | 73 | trough = (256 * (fpgaBuffer[6]))+fpgaBuffer[7]; |
dexterg | 0:e0a8ea9b571e | 74 | ancil = (10 * (fpgaBuffer[8] >> 4)) + (fpgaBuffer[8] & 15)+(((10.0 * (fpgaBuffer[9] >> 4)) + 1.0*(fpgaBuffer[9] & 15))/100.0); |
dexterg | 0:e0a8ea9b571e | 75 | fpga.printf("%x %x %x %x %x %x %x %x %x %x",fpgaBuffer[0],fpgaBuffer[1],fpgaBuffer[2],fpgaBuffer[3],fpgaBuffer[4],fpgaBuffer[5],fpgaBuffer[6],fpgaBuffer[7],fpgaBuffer[8],fpgaBuffer[9]); |
dexterg | 0:e0a8ea9b571e | 76 | } else { |
dexterg | 0:e0a8ea9b571e | 77 | lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0); |
dexterg | 0:e0a8ea9b571e | 78 | oTwo = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0); |
dexterg | 0:e0a8ea9b571e | 79 | peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7]; |
dexterg | 0:e0a8ea9b571e | 80 | trough = (256 * (fpgaBuffer[9]))+fpgaBuffer[10]; |
dexterg | 0:e0a8ea9b571e | 81 | ancil = (10 * (fpgaBuffer[12] >> 4)) + (fpgaBuffer[12] & 15)+(((10.0 * (fpgaBuffer[13] >> 4)) + 1.0*(fpgaBuffer[13] & 15))/100.0); |
dexterg | 0:e0a8ea9b571e | 82 | fpga.printf("%x %x %x %x %x %x %x %x %x %x",fpgaBuffer[0],fpgaBuffer[1],fpgaBuffer[3],fpgaBuffer[4],fpgaBuffer[6],fpgaBuffer[7],fpgaBuffer[9],fpgaBuffer[10],fpgaBuffer[12],fpgaBuffer[13]); |
dexterg | 0:e0a8ea9b571e | 83 | } |
dexterg | 0:e0a8ea9b571e | 84 | //fpga.printf("lifetime: %f o2: %f peak: %f trough: %f ancil: %f ",lifeTime,oTwo,peak,trough,ancil); |
dexterg | 0:e0a8ea9b571e | 85 | //fpga.printf(fpgaBuffer); |
dexterg | 0:e0a8ea9b571e | 86 | |
dexterg | 0:e0a8ea9b571e | 87 | //fpga.printf("%x %x %x %x %x %x %x %x %x %x",fpgaBuffer[0],fpgaBuffer[1],fpgaBuffer[2],fpgaBuffer[3],fpgaBuffer[4],fpgaBuffer[5],fpgaBuffer[6],fpgaBuffer[7],fpgaBuffer[8],fpgaBuffer[9]); |
dexterg | 0:e0a8ea9b571e | 88 | |
dexterg | 0:e0a8ea9b571e | 89 | newData=1; |
dexterg | 0:e0a8ea9b571e | 90 | |
dexterg | 0:e0a8ea9b571e | 91 | rx_in=0; |
dexterg | 0:e0a8ea9b571e | 92 | |
dexterg | 0:e0a8ea9b571e | 93 | |
dexterg | 0:e0a8ea9b571e | 94 | |
dexterg | 0:e0a8ea9b571e | 95 | |
dexterg | 0:e0a8ea9b571e | 96 | |
dexterg | 0:e0a8ea9b571e | 97 | //fpga.printf("rx received\r\n"); |
dexterg | 0:e0a8ea9b571e | 98 | return; |
dexterg | 0:e0a8ea9b571e | 99 | } |
dexterg | 0:e0a8ea9b571e | 100 | int createFile=0; |
dexterg | 0:e0a8ea9b571e | 101 | int main() |
dexterg | 0:e0a8ea9b571e | 102 | { |
dexterg | 0:e0a8ea9b571e | 103 | externalTrig=0; |
dexterg | 0:e0a8ea9b571e | 104 | button.mode(PullUp); |
dexterg | 0:e0a8ea9b571e | 105 | button.fall(&bPush); |
dexterg | 0:e0a8ea9b571e | 106 | button2.mode(PullUp); |
dexterg | 0:e0a8ea9b571e | 107 | button2.fall(&bPush2); |
dexterg | 0:e0a8ea9b571e | 108 | |
dexterg | 0:e0a8ea9b571e | 109 | |
dexterg | 0:e0a8ea9b571e | 110 | fpga.baud(9600); |
dexterg | 0:e0a8ea9b571e | 111 | fpga.printf("start"); |
dexterg | 0:e0a8ea9b571e | 112 | |
dexterg | 0:e0a8ea9b571e | 113 | fpga.attach(&fpga_Rx_interrupt,Serial::RxIrq); |
dexterg | 0:e0a8ea9b571e | 114 | |
dexterg | 0:e0a8ea9b571e | 115 | FILE *fpo = fopen("/sd/d.txt", "r"); |
dexterg | 0:e0a8ea9b571e | 116 | if(fpo == NULL) { |
dexterg | 0:e0a8ea9b571e | 117 | createFile=1; |
dexterg | 0:e0a8ea9b571e | 118 | } |
dexterg | 0:e0a8ea9b571e | 119 | |
dexterg | 0:e0a8ea9b571e | 120 | FILE *fp = fopen("/sd/d.txt", "a"); |
dexterg | 0:e0a8ea9b571e | 121 | if(fp == NULL) { |
dexterg | 0:e0a8ea9b571e | 122 | fpga.printf("file system failed\r\n"); |
dexterg | 0:e0a8ea9b571e | 123 | } else { |
dexterg | 0:e0a8ea9b571e | 124 | fpga.printf("file system active\r\n"); |
dexterg | 0:e0a8ea9b571e | 125 | if(createFile==1){ |
dexterg | 0:e0a8ea9b571e | 126 | fprintf(fp, "DateTime,Lifetime,02,Peak,Trough,Ancil\r\n"); |
dexterg | 0:e0a8ea9b571e | 127 | } |
dexterg | 0:e0a8ea9b571e | 128 | } |
dexterg | 0:e0a8ea9b571e | 129 | fclose(fp); |
dexterg | 0:e0a8ea9b571e | 130 | |
dexterg | 0:e0a8ea9b571e | 131 | ds3231_cntl_stat_t rtc_control_status = {1,1}; |
dexterg | 0:e0a8ea9b571e | 132 | rtc.set_cntl_stat_reg(rtc_control_status); |
dexterg | 0:e0a8ea9b571e | 133 | |
dexterg | 0:e0a8ea9b571e | 134 | time_t epoch_time; |
dexterg | 0:e0a8ea9b571e | 135 | epoch_time = rtc.get_epoch(); |
dexterg | 0:e0a8ea9b571e | 136 | |
dexterg | 0:e0a8ea9b571e | 137 | |
dexterg | 0:e0a8ea9b571e | 138 | |
dexterg | 0:e0a8ea9b571e | 139 | //ds3231_calendar_t rtc_calendar={1,11,8,15}; |
dexterg | 0:e0a8ea9b571e | 140 | //fpga.printf("set calendar:%d",rtc.set_calendar(rtc_calendar)); |
dexterg | 0:e0a8ea9b571e | 141 | //wait(1); |
dexterg | 0:e0a8ea9b571e | 142 | //ds3231_time_t rtc_time={0,26,20,0,0}; |
dexterg | 0:e0a8ea9b571e | 143 | //rtc.set_time(rtc_time); |
dexterg | 0:e0a8ea9b571e | 144 | |
dexterg | 0:e0a8ea9b571e | 145 | |
dexterg | 0:e0a8ea9b571e | 146 | |
dexterg | 0:e0a8ea9b571e | 147 | |
dexterg | 0:e0a8ea9b571e | 148 | while(1) { |
dexterg | 0:e0a8ea9b571e | 149 | myled = 1; |
dexterg | 0:e0a8ea9b571e | 150 | wait(0.2); |
dexterg | 0:e0a8ea9b571e | 151 | myled = 0; |
dexterg | 0:e0a8ea9b571e | 152 | wait(0.2); |
dexterg | 0:e0a8ea9b571e | 153 | |
dexterg | 0:e0a8ea9b571e | 154 | |
dexterg | 0:e0a8ea9b571e | 155 | if(newData==1) { |
dexterg | 0:e0a8ea9b571e | 156 | //fpga.printf("lifetime: %f o2: %f peak: %f trough: %f ancil: %f ",lifeTime,oTwo,peak,trough,ancil); |
dexterg | 0:e0a8ea9b571e | 157 | //sprintf(pbuff,"lifetime: %f o2: %f peak: %f trough: %f ancil: %f ",lifeTime,oTwo,peak,trough,ancil); |
dexterg | 0:e0a8ea9b571e | 158 | sprintf(pbuff,"%f, %f, %f, %f, %f",lifeTime,oTwo,peak,trough,ancil); |
dexterg | 0:e0a8ea9b571e | 159 | fpga.printf("%s",pbuff); |
dexterg | 0:e0a8ea9b571e | 160 | |
dexterg | 0:e0a8ea9b571e | 161 | //fpga.printf("Data Rxd\r\n"); |
dexterg | 0:e0a8ea9b571e | 162 | |
dexterg | 0:e0a8ea9b571e | 163 | time_t epoch_time; |
dexterg | 0:e0a8ea9b571e | 164 | epoch_time = rtc.get_epoch(); |
dexterg | 0:e0a8ea9b571e | 165 | strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S %Z", localtime(&epoch_time)); |
dexterg | 0:e0a8ea9b571e | 166 | FILE *fp = fopen("/sd/d.txt", "a"); |
dexterg | 0:e0a8ea9b571e | 167 | if(fp == NULL) { |
dexterg | 0:e0a8ea9b571e | 168 | } else { |
dexterg | 0:e0a8ea9b571e | 169 | //fprintf(fp, "%s,%f,%f,%f,%f,%f\r\n",tbuff,lifeTime,oTwo,peak,trough,ancil); |
dexterg | 0:e0a8ea9b571e | 170 | fprintf(fp, "%s,%s\r\n",tbuff,pbuff); |
dexterg | 0:e0a8ea9b571e | 171 | } |
dexterg | 0:e0a8ea9b571e | 172 | fclose(fp); |
dexterg | 0:e0a8ea9b571e | 173 | |
dexterg | 0:e0a8ea9b571e | 174 | newData=0; |
dexterg | 0:e0a8ea9b571e | 175 | } |
dexterg | 0:e0a8ea9b571e | 176 | |
dexterg | 0:e0a8ea9b571e | 177 | //fpga.printf("ee\r\n"); |
dexterg | 0:e0a8ea9b571e | 178 | |
dexterg | 0:e0a8ea9b571e | 179 | //time_t epoch_time; |
dexterg | 0:e0a8ea9b571e | 180 | //epoch_time = rtc.get_epoch(); |
dexterg | 0:e0a8ea9b571e | 181 | //fpga.printf("\nTime as seconds since January 1, 1970 = %d\r\n", epoch_time); |
dexterg | 0:e0a8ea9b571e | 182 | |
dexterg | 0:e0a8ea9b571e | 183 | //fpga.printf("\nTime as a basic string = %s\r\n", ctime(&epoch_time)); |
dexterg | 0:e0a8ea9b571e | 184 | |
dexterg | 0:e0a8ea9b571e | 185 | //if(fpga.readable()) { |
dexterg | 0:e0a8ea9b571e | 186 | // wait(1); |
dexterg | 0:e0a8ea9b571e | 187 | //} |
dexterg | 0:e0a8ea9b571e | 188 | |
dexterg | 0:e0a8ea9b571e | 189 | |
dexterg | 0:e0a8ea9b571e | 190 | } |
dexterg | 0:e0a8ea9b571e | 191 | } |