Version 3.0: Switching to newer LDC1614 which is placed on the same PCB.

Dependencies:   Bob DS1825 LDC1614 LDC1101 SDFileSystem mbed

Fork of Inductive_Sensor by Bob Giesberts

Committer:
bobgiesberts
Date:
Tue Jan 05 11:04:25 2016 +0000
Revision:
4:ae441c5727b9
Parent:
2:1a203732fc95
Child:
5:736a81a59f3c
Fixed timing, filename and sleep options

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bobgiesberts 0:e81b68888268 1 #include "mbed.h"
bobgiesberts 0:e81b68888268 2 #include "LDC1101.h"
bobgiesberts 1:22c272515015 3 #include "SDFileSystem.h"
bobgiesberts 2:1a203732fc95 4 #include "Bob.h"
bobgiesberts 0:e81b68888268 5 #include <iostream>
bobgiesberts 4:ae441c5727b9 6 #include <string>
bobgiesberts 0:e81b68888268 7 using namespace std;
bobgiesberts 0:e81b68888268 8
bobgiesberts 2:1a203732fc95 9 /**
bobgiesberts 2:1a203732fc95 10 * @file main.cpp
bobgiesberts 2:1a203732fc95 11 * @brief This file programs the processor for the inductive force sensor
bobgiesberts 2:1a203732fc95 12 * using the library LDC1101.h and LDC1101.cpp.
bobgiesberts 2:1a203732fc95 13 * - Red Led: processing communication with LDC1101
bobgiesberts 2:1a203732fc95 14 * - Green Led: processing SD card
bobgiesberts 4:ae441c5727b9 15 *
bobgiesberts 4:ae441c5727b9 16 * Log protocol:
bobgiesberts 4:ae441c5727b9 17 * - 1 minute at 20 Hz
bobgiesberts 4:ae441c5727b9 18 * - 29 minutes rest
bobgiesberts 2:1a203732fc95 19 *
bobgiesberts 2:1a203732fc95 20 * @author Bob Giesberts
bobgiesberts 2:1a203732fc95 21 *
bobgiesberts 2:1a203732fc95 22 * @date 2015-12-17
bobgiesberts 2:1a203732fc95 23 */
bobgiesberts 0:e81b68888268 24
bobgiesberts 2:1a203732fc95 25 Bob bob(PTB0, PTB1, PTC3, PTE0); // red led, green led, sd_enable, sd_present
bobgiesberts 0:e81b68888268 26 Serial pc(USBTX, USBRX);
bobgiesberts 0:e81b68888268 27
bobgiesberts 4:ae441c5727b9 28 // battery
bobgiesberts 4:ae441c5727b9 29 AnalogIn batt(PTC2); // battery voltage: batt.read(); should be x.xV (min) < 3.7V (typ) < 4.22V (max)
bobgiesberts 4:ae441c5727b9 30 float battery;
bobgiesberts 4:ae441c5727b9 31
bobgiesberts 4:ae441c5727b9 32 // timer variables
bobgiesberts 4:ae441c5727b9 33 clock_t t;
bobgiesberts 4:ae441c5727b9 34 uint32_t t_new = 0, t_old = 0;
bobgiesberts 4:ae441c5727b9 35 int t_high = 0;
bobgiesberts 4:ae441c5727b9 36 float seconds = 0;
bobgiesberts 4:ae441c5727b9 37
bobgiesberts 4:ae441c5727b9 38 // file variables
bobgiesberts 4:ae441c5727b9 39 FILE *fp;
bobgiesberts 4:ae441c5727b9 40 string filename = "/sd/data00.txt";
bobgiesberts 4:ae441c5727b9 41 const char *fn;
bobgiesberts 4:ae441c5727b9 42
bobgiesberts 0:e81b68888268 43 int main(void){
bobgiesberts 0:e81b68888268 44
bobgiesberts 2:1a203732fc95 45 /** --- Connection to LDC1101 --- */
bobgiesberts 2:1a203732fc95 46 pc.printf("Connect to LDC1101...");
bobgiesberts 2:1a203732fc95 47 LDC1101 ldc(PTC6, PTC7, PTC5, PTC4, 120E-12, 16E6); // mosi, miso, sck, cs, capacitor (F), f_CLKIN (Hz)
bobgiesberts 2:1a203732fc95 48 pc.printf("success!\r\n");
bobgiesberts 2:1a203732fc95 49 bob.flash(2);
bobgiesberts 2:1a203732fc95 50 wait(0.2);
bobgiesberts 0:e81b68888268 51
bobgiesberts 2:1a203732fc95 52 /** --- Connection to sensor --- */
bobgiesberts 2:1a203732fc95 53 pc.printf("Connect to sensor...");
bobgiesberts 2:1a203732fc95 54 if(ldc.get_LHR_Data() != 16777215)
bobgiesberts 2:1a203732fc95 55 {
bobgiesberts 2:1a203732fc95 56 pc.printf("success!\r\n");
bobgiesberts 2:1a203732fc95 57 bob.flash_red(2);
bobgiesberts 2:1a203732fc95 58 }else{
bobgiesberts 2:1a203732fc95 59 pc.printf("failed!\r\n");
bobgiesberts 2:1a203732fc95 60 bob.red();
bobgiesberts 2:1a203732fc95 61 }
bobgiesberts 2:1a203732fc95 62
bobgiesberts 2:1a203732fc95 63 /** --- Start measuring! --- */
bobgiesberts 4:ae441c5727b9 64 /*
bobgiesberts 2:1a203732fc95 65 while(1)
bobgiesberts 2:1a203732fc95 66 {
bobgiesberts 2:1a203732fc95 67 clock_t t = clock();
bobgiesberts 2:1a203732fc95 68 int L = ldc.get_LHR_Data();
bobgiesberts 2:1a203732fc95 69 pc.printf("%.2f;%d\n", t/100.0, L);
bobgiesberts 2:1a203732fc95 70 wait(0.05); // 20 Hz
bobgiesberts 2:1a203732fc95 71 }
bobgiesberts 4:ae441c5727b9 72 */
bobgiesberts 0:e81b68888268 73
bobgiesberts 2:1a203732fc95 74
bobgiesberts 2:1a203732fc95 75 // --- Connection to SD card ---
bobgiesberts 2:1a203732fc95 76 pc.printf("Connect to SD card...");
bobgiesberts 2:1a203732fc95 77 if(bob.checkSD() == 1){
bobgiesberts 2:1a203732fc95 78 pc.printf("success!\r\n");
bobgiesberts 4:ae441c5727b9 79 bob.flash_green(2);
bobgiesberts 2:1a203732fc95 80 }else{
bobgiesberts 2:1a203732fc95 81 pc.printf("failed!\r\n");
bobgiesberts 4:ae441c5727b9 82 bob.green();
bobgiesberts 2:1a203732fc95 83 }
bobgiesberts 2:1a203732fc95 84
bobgiesberts 2:1a203732fc95 85 // Load SD File system
bobgiesberts 1:22c272515015 86 SDFileSystem SD(PTD6, PTD7, PTD5, PTD4, "sd"); // mosi, miso, sclk, cs, sd_name
bobgiesberts 2:1a203732fc95 87
bobgiesberts 4:ae441c5727b9 88 // Create a new data file
bobgiesberts 4:ae441c5727b9 89 pc.printf("Creating data file...");
bobgiesberts 4:ae441c5727b9 90 mkdir("/sd", 0777);
bobgiesberts 4:ae441c5727b9 91 for(uint8_t i = 0; i < 100; i++) {
bobgiesberts 4:ae441c5727b9 92 filename[8] = i/10 + '0'; // arrays count from 0 so the number is 16 and 17
bobgiesberts 4:ae441c5727b9 93 filename[9] = i%10 + '0';
bobgiesberts 4:ae441c5727b9 94 fp = fopen( filename.c_str() , "r" );
bobgiesberts 4:ae441c5727b9 95 if( fp == NULL ) { // read failed so file does not exist
bobgiesberts 4:ae441c5727b9 96 fp = fopen( filename.c_str(), "w" ); // create it
bobgiesberts 4:ae441c5727b9 97 if( fp != NULL ){
bobgiesberts 4:ae441c5727b9 98 fn = filename.c_str();
bobgiesberts 4:ae441c5727b9 99 pc.printf("success! Filename: %s\r\n", fn);
bobgiesberts 4:ae441c5727b9 100 break;
bobgiesberts 4:ae441c5727b9 101 }else{
bobgiesberts 4:ae441c5727b9 102 pc.printf("failed!\r\n");
bobgiesberts 4:ae441c5727b9 103 }
bobgiesberts 4:ae441c5727b9 104 }else{ // file already exists
bobgiesberts 4:ae441c5727b9 105 fclose( fp );
bobgiesberts 4:ae441c5727b9 106 }
bobgiesberts 1:22c272515015 107 }
bobgiesberts 2:1a203732fc95 108
bobgiesberts 2:1a203732fc95 109 // Write current settings to data file
bobgiesberts 4:ae441c5727b9 110 fp = fopen( fn, "w" );
bobgiesberts 4:ae441c5727b9 111 fprintf(fp, "DIVIDER : %d\r\n", ldc.get_divider());
bobgiesberts 4:ae441c5727b9 112 fprintf(fp, "RESPONSETIME : %d\r\n", ldc.get_responsetime());
bobgiesberts 4:ae441c5727b9 113 fprintf(fp, "RP_MIN : %.2f\r\n", ldc.get_RPmin());
bobgiesberts 4:ae441c5727b9 114 fprintf(fp, "LHR_RCOUNT : %d\r\n", ldc.get_Rcount());
bobgiesberts 2:1a203732fc95 115 fprintf(fp, "\r\n\r\n");
bobgiesberts 4:ae441c5727b9 116 fclose(fp);
bobgiesberts 4:ae441c5727b9 117
bobgiesberts 4:ae441c5727b9 118 // initialise timer
bobgiesberts 4:ae441c5727b9 119 t = clock();
bobgiesberts 4:ae441c5727b9 120 t_new = (uint32_t) t;
bobgiesberts 4:ae441c5727b9 121
bobgiesberts 0:e81b68888268 122 while(1)
bobgiesberts 4:ae441c5727b9 123 {
bobgiesberts 4:ae441c5727b9 124 // Store one continuous stream of data
bobgiesberts 4:ae441c5727b9 125 for( int i = 0; i < 1200; i++ ) { // FOR LATER: record 60 seconds --> 60 * 20 Hz = 1200
bobgiesberts 1:22c272515015 126
bobgiesberts 4:ae441c5727b9 127 // Set the timer
bobgiesberts 4:ae441c5727b9 128 t_old = t_new;
bobgiesberts 4:ae441c5727b9 129 t = clock();
bobgiesberts 4:ae441c5727b9 130 t_new = (uint32_t) t;
bobgiesberts 4:ae441c5727b9 131 if( t_new < t_old ) t_high++; // clock_t overflows at 2^32 = 4294.967296 sec = 71 min
bobgiesberts 4:ae441c5727b9 132 seconds = ((float) t_new/100.0) + 4294.967296*(float)t_high;
bobgiesberts 2:1a203732fc95 133
bobgiesberts 4:ae441c5727b9 134 // get the sensor value
bobgiesberts 4:ae441c5727b9 135 int L = ldc.get_LHR_Data();
bobgiesberts 2:1a203732fc95 136
bobgiesberts 4:ae441c5727b9 137 // get the current battery level
bobgiesberts 4:ae441c5727b9 138 battery = (float)batt.read()*3.0*2.0;
bobgiesberts 4:ae441c5727b9 139
bobgiesberts 4:ae441c5727b9 140 // if the sensor is connected
bobgiesberts 4:ae441c5727b9 141 if( L != 16777215 ) {
bobgiesberts 4:ae441c5727b9 142
bobgiesberts 4:ae441c5727b9 143 // Store data on SD card
bobgiesberts 4:ae441c5727b9 144 if( bob.checkSD() == 1 ) {
bobgiesberts 4:ae441c5727b9 145 fp = fopen( fn, "a" );
bobgiesberts 4:ae441c5727b9 146 fprintf( fp, "%.2f;%d;%.6f\r\n", seconds, L, battery );
bobgiesberts 4:ae441c5727b9 147 fclose(fp);
bobgiesberts 4:ae441c5727b9 148
bobgiesberts 4:ae441c5727b9 149 // pc.printf( "Time: %.2f sec; LHR_DATA: %d; Battery: %f V\r\n", seconds, L, battery );
bobgiesberts 4:ae441c5727b9 150
bobgiesberts 4:ae441c5727b9 151 wait( 0.03 ); // Write takes about 0.02 --> 20 Hz --> 0.05 - 0.02 = 0.03s
bobgiesberts 4:ae441c5727b9 152 }else{
bobgiesberts 4:ae441c5727b9 153 pc.printf("Error: SD card disconnected, please reinsert.\r\n");
bobgiesberts 4:ae441c5727b9 154 bob.green();
bobgiesberts 4:ae441c5727b9 155 }
bobgiesberts 4:ae441c5727b9 156
bobgiesberts 2:1a203732fc95 157 }else{
bobgiesberts 4:ae441c5727b9 158 pc.printf("Error: Sensor disconnected, please reconnect.\r\n");
bobgiesberts 4:ae441c5727b9 159 bob.red();
bobgiesberts 2:1a203732fc95 160 }
bobgiesberts 2:1a203732fc95 161 }
bobgiesberts 1:22c272515015 162
bobgiesberts 4:ae441c5727b9 163 // After measuring for a period of 60 seconds, wait for 29 minutes
bobgiesberts 4:ae441c5727b9 164 // While waiting, put every thing in lowest power modus
bobgiesberts 4:ae441c5727b9 165 bob.sleep();
bobgiesberts 4:ae441c5727b9 166 ldc.sleep();
bobgiesberts 2:1a203732fc95 167
bobgiesberts 4:ae441c5727b9 168 wait(1740); // FOR LATER: wait half an hour, 60 * 29 = 1740
bobgiesberts 4:ae441c5727b9 169
bobgiesberts 4:ae441c5727b9 170 // Now wake up.
bobgiesberts 4:ae441c5727b9 171 ldc.wakeup();
bobgiesberts 4:ae441c5727b9 172 bob.wakeup();
bobgiesberts 0:e81b68888268 173 }
bobgiesberts 0:e81b68888268 174 }