SD-Card Control Program / Using Micro-SD / based on SDCardTest Program (http://mbed.org/users/simon/programs/SDCardTest/gpdz4x/)
Dependencies: mbed SDFileSystem
Please refer following my Notebook page.
/users/kenjiArai/notebook/sd-card-control-new/#
main.cpp@1:484feaf2da84, 2014-10-03 (annotated)
- Committer:
- kenjiArai
- Date:
- Fri Oct 03 10:43:29 2014 +0000
- Revision:
- 1:484feaf2da84
- Parent:
- 0:3bd1cdc1f3f4
- Child:
- 2:1397a54382ec
Modified format and updated latest version of Library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 1:484feaf2da84 | 1 | /* |
kenjiArai | 1:484feaf2da84 | 2 | * mbed Application program |
kenjiArai | 1:484feaf2da84 | 3 | * SD-Card Control Program |
kenjiArai | 1:484feaf2da84 | 4 | * |
kenjiArai | 1:484feaf2da84 | 5 | * Copyright (c) 2010-2014 Kenji Arai / JH1PJL |
kenjiArai | 1:484feaf2da84 | 6 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 1:484feaf2da84 | 7 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 1:484feaf2da84 | 8 | * March 28th, 2010 Started |
kenjiArai | 1:484feaf2da84 | 9 | * April 3rd, 2010 |
kenjiArai | 1:484feaf2da84 | 10 | * October 3rd, 2014 use latest lib. |
kenjiArai | 1:484feaf2da84 | 11 | * |
kenjiArai | 1:484feaf2da84 | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
kenjiArai | 1:484feaf2da84 | 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
kenjiArai | 1:484feaf2da84 | 14 | * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
kenjiArai | 1:484feaf2da84 | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
kenjiArai | 1:484feaf2da84 | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
kenjiArai | 1:484feaf2da84 | 17 | */ |
kenjiArai | 1:484feaf2da84 | 18 | |
kenjiArai | 1:484feaf2da84 | 19 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 0:3bd1cdc1f3f4 | 20 | // Function |
kenjiArai | 0:3bd1cdc1f3f4 | 21 | // 5 channeles ADC data records into a file which is located in SD-Card |
kenjiArai | 0:3bd1cdc1f3f4 | 22 | // If USE_LCD = 1, data shows on a Text LCD |
kenjiArai | 0:3bd1cdc1f3f4 | 23 | // If USE_RTC = 1, time stamp also writes in the file |
kenjiArai | 0:3bd1cdc1f3f4 | 24 | // Connection |
kenjiArai | 0:3bd1cdc1f3f4 | 25 | // Analog input PIN 15,16,17,19,20 |
kenjiArai | 1:484feaf2da84 | 26 | // LCD PIN 22,21,8,7,6,5 |
kenjiArai | 0:3bd1cdc1f3f4 | 27 | // -> CAUTION!! pin assignment is different |
kenjiArai | 0:3bd1cdc1f3f4 | 28 | // with " http://mbed.org/projects/cookbook/wiki/TextLCD " |
kenjiArai | 0:3bd1cdc1f3f4 | 29 | // RTC PIN 3 needs to connect 3V Battery |
kenjiArai | 0:3bd1cdc1f3f4 | 30 | // -> Please refer my program " RTC_w_COM" for time adjustment |
kenjiArai | 0:3bd1cdc1f3f4 | 31 | // at " http://mbed.org/users/kenjiArai/programs/RTC_w_COM/5yi9a/ " |
kenjiArai | 1:484feaf2da84 | 32 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 1:484feaf2da84 | 33 | |
kenjiArai | 1:484feaf2da84 | 34 | // Include --------------------------------------------------------------------------------------- |
kenjiArai | 0:3bd1cdc1f3f4 | 35 | #include "mbed.h" |
kenjiArai | 0:3bd1cdc1f3f4 | 36 | #include "TextLCD.h" |
kenjiArai | 0:3bd1cdc1f3f4 | 37 | #include "SDFileSystem.h" |
kenjiArai | 0:3bd1cdc1f3f4 | 38 | |
kenjiArai | 1:484feaf2da84 | 39 | // Definition ------------------------------------------------------------------------------------ |
kenjiArai | 1:484feaf2da84 | 40 | #define DEBUG 1 // 1= Shows progress on PC via USB ( virtual COM line) |
kenjiArai | 1:484feaf2da84 | 41 | #define USE_LCD 1 // 1= Display the data on LCD |
kenjiArai | 1:484feaf2da84 | 42 | #define USE_RTC 1 // 1= Use RTC (need 3V supply and time adjustment before use) |
kenjiArai | 1:484feaf2da84 | 43 | |
kenjiArai | 1:484feaf2da84 | 44 | #define NO_OF_SAMPLE 100 // Total recording length -> unit=sec |
kenjiArai | 1:484feaf2da84 | 45 | #define TIM_INTVL 10 // Insert time stamp in the file every ?? sec |
kenjiArai | 0:3bd1cdc1f3f4 | 46 | |
kenjiArai | 1:484feaf2da84 | 47 | // Object ---------------------------------------------------------------------------------------- |
kenjiArai | 1:484feaf2da84 | 48 | DigitalOut myled(LED1); // Indicate the sampling period |
kenjiArai | 0:3bd1cdc1f3f4 | 49 | #if USE_LCD |
kenjiArai | 1:484feaf2da84 | 50 | TextLCD lcd(p22, p21, p8, p7, p6, p5, TextLCD::LCD40x2); // rs, e, d4-d7 |
kenjiArai | 1:484feaf2da84 | 51 | #endif |
kenjiArai | 1:484feaf2da84 | 52 | AnalogIn ain_G_X(p15); // G Sensor |
kenjiArai | 1:484feaf2da84 | 53 | AnalogIn ain_G_Y(p16); // G Sensor |
kenjiArai | 1:484feaf2da84 | 54 | AnalogIn ain_G_Z(p17); // G Sensor |
kenjiArai | 1:484feaf2da84 | 55 | AnalogIn ain_BAT(p19); // Battery Volt |
kenjiArai | 1:484feaf2da84 | 56 | AnalogIn ain_TEMP(p20); // Temperature Sensor |
kenjiArai | 1:484feaf2da84 | 57 | SDFileSystem sd(p11, p12, p13, p14, "sd"); // do,di,clk,cs |
kenjiArai | 1:484feaf2da84 | 58 | #if DEBUG |
kenjiArai | 1:484feaf2da84 | 59 | Serial pc(USBTX, USBRX); |
kenjiArai | 0:3bd1cdc1f3f4 | 60 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 61 | |
kenjiArai | 1:484feaf2da84 | 62 | // RAM ------------------------------------------------------------------------------------------- |
kenjiArai | 1:484feaf2da84 | 63 | |
kenjiArai | 1:484feaf2da84 | 64 | // ROM / Constant data --------------------------------------------------------------------------- |
kenjiArai | 1:484feaf2da84 | 65 | |
kenjiArai | 1:484feaf2da84 | 66 | // Function prototypes --------------------------------------------------------------------------- |
kenjiArai | 0:3bd1cdc1f3f4 | 67 | |
kenjiArai | 1:484feaf2da84 | 68 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 1:484feaf2da84 | 69 | // Control Program |
kenjiArai | 1:484feaf2da84 | 70 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 1:484feaf2da84 | 71 | int main() |
kenjiArai | 1:484feaf2da84 | 72 | { |
kenjiArai | 0:3bd1cdc1f3f4 | 73 | char buf[40]; // data buffer for text |
kenjiArai | 0:3bd1cdc1f3f4 | 74 | int count; // count for number of record |
kenjiArai | 0:3bd1cdc1f3f4 | 75 | float x,y,z,b,t; // Analog data |
kenjiArai | 1:484feaf2da84 | 76 | #if USE_RTC |
kenjiArai | 0:3bd1cdc1f3f4 | 77 | time_t seconds, old_sec; // RTC data based on seconds |
kenjiArai | 0:3bd1cdc1f3f4 | 78 | int i; |
kenjiArai | 1:484feaf2da84 | 79 | #endif |
kenjiArai | 1:484feaf2da84 | 80 | |
kenjiArai | 0:3bd1cdc1f3f4 | 81 | // Open the file |
kenjiArai | 0:3bd1cdc1f3f4 | 82 | #if USE_RTC |
kenjiArai | 0:3bd1cdc1f3f4 | 83 | seconds = time(NULL); |
kenjiArai | 0:3bd1cdc1f3f4 | 84 | seconds %= 100000000; // Adjust 8 charcters file name |
kenjiArai | 1:484feaf2da84 | 85 | sprintf(buf,"/sd/%d.txt",seconds); // File name is defined based on time from 1970/1/1 |
kenjiArai | 0:3bd1cdc1f3f4 | 86 | FILE *fp = fopen(buf, "w"); // Open "out.txt" on the local file system for writing |
kenjiArai | 1:484feaf2da84 | 87 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 88 | printf("\r\n %s \r\n", buf); // File name on the screen |
kenjiArai | 0:3bd1cdc1f3f4 | 89 | printf(" use RTC\r\n"); |
kenjiArai | 1:484feaf2da84 | 90 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 91 | #else |
kenjiArai | 0:3bd1cdc1f3f4 | 92 | FILE *fp = fopen("/sd/out.txt", "w");// Open "out.txt" on the local file system for writing |
kenjiArai | 1:484feaf2da84 | 93 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 94 | printf("\r\n /sd/out.txt\r\n"); // File name on the screen |
kenjiArai | 0:3bd1cdc1f3f4 | 95 | printf(" Not use RTC\r\n"); |
kenjiArai | 1:484feaf2da84 | 96 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 97 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 98 | if(fp == NULL) { |
kenjiArai | 1:484feaf2da84 | 99 | // File not open and stop |
kenjiArai | 1:484feaf2da84 | 100 | #if USE_LCD |
kenjiArai | 0:3bd1cdc1f3f4 | 101 | lcd.printf(" Could not open file for write\n"); |
kenjiArai | 1:484feaf2da84 | 102 | #endif |
kenjiArai | 1:484feaf2da84 | 103 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 104 | printf( "\r\n Could not open file for write\r\n"); |
kenjiArai | 1:484feaf2da84 | 105 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 106 | while(1) ; |
kenjiArai | 0:3bd1cdc1f3f4 | 107 | } |
kenjiArai | 1:484feaf2da84 | 108 | // Success file access |
kenjiArai | 0:3bd1cdc1f3f4 | 109 | fprintf(fp, "This is a test program for logging /by JH1PJL\r\n"); |
kenjiArai | 1:484feaf2da84 | 110 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 111 | printf( "This is a test program for logging /by JH1PJL\r\n"); |
kenjiArai | 0:3bd1cdc1f3f4 | 112 | printf("\r\nStart sampling\r\n"); |
kenjiArai | 1:484feaf2da84 | 113 | #endif |
kenjiArai | 1:484feaf2da84 | 114 | #if USE_LCD |
kenjiArai | 0:3bd1cdc1f3f4 | 115 | lcd.cls(); |
kenjiArai | 1:484feaf2da84 | 116 | #endif |
kenjiArai | 1:484feaf2da84 | 117 | |
kenjiArai | 0:3bd1cdc1f3f4 | 118 | count = 0; // Initialze counter |
kenjiArai | 0:3bd1cdc1f3f4 | 119 | #if USE_RTC |
kenjiArai | 0:3bd1cdc1f3f4 | 120 | seconds = time(NULL); // Put time stamp in the file |
kenjiArai | 1:484feaf2da84 | 121 | old_sec = seconds; |
kenjiArai | 0:3bd1cdc1f3f4 | 122 | strftime(buf,40, "Time:%I:%M:%S %p, %Y/%m/%d\r\n", localtime(&seconds)); |
kenjiArai | 0:3bd1cdc1f3f4 | 123 | fprintf(fp,buf); |
kenjiArai | 1:484feaf2da84 | 124 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 125 | printf(" %s \r\n", buf); |
kenjiArai | 1:484feaf2da84 | 126 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 127 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 128 | while(1) { |
kenjiArai | 0:3bd1cdc1f3f4 | 129 | // check time interval (1sec) |
kenjiArai | 1:484feaf2da84 | 130 | #if USE_RTC |
kenjiArai | 0:3bd1cdc1f3f4 | 131 | myled = 1; |
kenjiArai | 0:3bd1cdc1f3f4 | 132 | wait(0.5); |
kenjiArai | 0:3bd1cdc1f3f4 | 133 | myled = 0; |
kenjiArai | 0:3bd1cdc1f3f4 | 134 | while ((seconds = time(NULL)) == old_sec) ; // Wait 1 sec for loop |
kenjiArai | 0:3bd1cdc1f3f4 | 135 | old_sec = seconds; |
kenjiArai | 1:484feaf2da84 | 136 | #else |
kenjiArai | 0:3bd1cdc1f3f4 | 137 | myled = 1; |
kenjiArai | 0:3bd1cdc1f3f4 | 138 | wait(0.5); |
kenjiArai | 0:3bd1cdc1f3f4 | 139 | myled = 0; |
kenjiArai | 1:484feaf2da84 | 140 | wait(0.5); |
kenjiArai | 1:484feaf2da84 | 141 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 142 | // Get analog data from each port |
kenjiArai | 0:3bd1cdc1f3f4 | 143 | x=ain_G_X.read(); |
kenjiArai | 0:3bd1cdc1f3f4 | 144 | y=ain_G_Y.read(); |
kenjiArai | 0:3bd1cdc1f3f4 | 145 | z=ain_G_Z.read(); |
kenjiArai | 0:3bd1cdc1f3f4 | 146 | b=ain_BAT.read(); |
kenjiArai | 0:3bd1cdc1f3f4 | 147 | t=ain_TEMP.read(); |
kenjiArai | 0:3bd1cdc1f3f4 | 148 | // Write data into the file |
kenjiArai | 0:3bd1cdc1f3f4 | 149 | sprintf(buf, "G-Sen, %f, %f, %f \r\n", x, y, z); |
kenjiArai | 0:3bd1cdc1f3f4 | 150 | fprintf(fp,buf); |
kenjiArai | 1:484feaf2da84 | 151 | #if USE_LCD |
kenjiArai | 0:3bd1cdc1f3f4 | 152 | lcd.locate(0, 0); // 1st line top |
kenjiArai | 0:3bd1cdc1f3f4 | 153 | lcd.printf(buf); |
kenjiArai | 1:484feaf2da84 | 154 | #endif |
kenjiArai | 1:484feaf2da84 | 155 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 156 | printf(" %s", buf); |
kenjiArai | 1:484feaf2da84 | 157 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 158 | sprintf(buf, "VB, %f, T, %f \r\n", b, t); |
kenjiArai | 0:3bd1cdc1f3f4 | 159 | fprintf(fp,buf); |
kenjiArai | 1:484feaf2da84 | 160 | #if USE_LCD |
kenjiArai | 0:3bd1cdc1f3f4 | 161 | lcd.locate(0, 1); // 2nd line top |
kenjiArai | 0:3bd1cdc1f3f4 | 162 | lcd.printf(buf); |
kenjiArai | 1:484feaf2da84 | 163 | #endif |
kenjiArai | 1:484feaf2da84 | 164 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 165 | printf(" %s", buf); |
kenjiArai | 1:484feaf2da84 | 166 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 167 | // if reach to expected data number then finsh |
kenjiArai | 1:484feaf2da84 | 168 | if (++count > NO_OF_SAMPLE) { |
kenjiArai | 0:3bd1cdc1f3f4 | 169 | break; |
kenjiArai | 0:3bd1cdc1f3f4 | 170 | } |
kenjiArai | 0:3bd1cdc1f3f4 | 171 | // Set time satmp |
kenjiArai | 1:484feaf2da84 | 172 | #if USE_RTC |
kenjiArai | 0:3bd1cdc1f3f4 | 173 | i = count / TIM_INTVL; |
kenjiArai | 1:484feaf2da84 | 174 | if (count == i * TIM_INTVL) { |
kenjiArai | 1:484feaf2da84 | 175 | //seconds = time(NULL); // this line is wrong! BUG |
kenjiArai | 0:3bd1cdc1f3f4 | 176 | strftime(buf,40, "Time:%I:%M:%S %p, %Y/%m/%d\r\n", localtime(&seconds)); |
kenjiArai | 0:3bd1cdc1f3f4 | 177 | fprintf(fp, buf); |
kenjiArai | 1:484feaf2da84 | 178 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 179 | printf(" %s", buf); |
kenjiArai | 1:484feaf2da84 | 180 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 181 | } |
kenjiArai | 1:484feaf2da84 | 182 | #endif |
kenjiArai | 1:484feaf2da84 | 183 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 184 | printf("Sampling #%d/end=%d\r\n", count, NO_OF_SAMPLE); |
kenjiArai | 1:484feaf2da84 | 185 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 186 | } |
kenjiArai | 0:3bd1cdc1f3f4 | 187 | // Set time satmp |
kenjiArai | 0:3bd1cdc1f3f4 | 188 | #if USE_RTC |
kenjiArai | 0:3bd1cdc1f3f4 | 189 | sprintf(buf,"Sampling numbers: %d\r\n", count-1); |
kenjiArai | 0:3bd1cdc1f3f4 | 190 | fprintf(fp, buf); |
kenjiArai | 1:484feaf2da84 | 191 | seconds = time(NULL); |
kenjiArai | 0:3bd1cdc1f3f4 | 192 | strftime(buf,40, "Time:%I:%M:%S %p, %Y/%m/%d\r\n", localtime(&seconds)); |
kenjiArai | 0:3bd1cdc1f3f4 | 193 | fprintf(fp, buf); |
kenjiArai | 1:484feaf2da84 | 194 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 195 | printf(" %s", buf); |
kenjiArai | 1:484feaf2da84 | 196 | #endif |
kenjiArai | 1:484feaf2da84 | 197 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 198 | fclose(fp); |
kenjiArai | 0:3bd1cdc1f3f4 | 199 | // for debug |
kenjiArai | 1:484feaf2da84 | 200 | #if DEBUG |
kenjiArai | 0:3bd1cdc1f3f4 | 201 | printf("\r\nFinished sampling\r\n"); |
kenjiArai | 1:484feaf2da84 | 202 | #endif |
kenjiArai | 0:3bd1cdc1f3f4 | 203 | } |