Data logger with SD card storage and RTC

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

Committer:
dexterg
Date:
Tue Sep 29 21:32:10 2015 +0000
Revision:
0:e0a8ea9b571e
Child:
1:ab74071de2c8
master

Who changed what in which revision?

UserRevisionLine numberNew 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 }