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:
Wed Aug 24 07:43:33 2016 +0000
Revision:
15:5de8394fdb3c
Parent:
13:2caedc56b863
Child:
16:b53721840a38
Raw version, not tested yet

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bobgiesberts 2:1a203732fc95 1 /**
bobgiesberts 2:1a203732fc95 2 * @file main.cpp
bobgiesberts 2:1a203732fc95 3 * @brief This file programs the processor for the inductive force sensor
bobgiesberts 15:5de8394fdb3c 4 * using the library LDC1614.h and LDC1614.cpp.
bobgiesberts 15:5de8394fdb3c 5 * - Green Led: processing communication with LDC1614
bobgiesberts 15:5de8394fdb3c 6 * - Red Led: error
bobgiesberts 10:3cab80866536 7 *
bobgiesberts 4:ae441c5727b9 8 * Log protocol:
bobgiesberts 15:5de8394fdb3c 9 * - 0:30 minutes at 13 Hz
bobgiesberts 13:2caedc56b863 10 * - 14:30 minutes rest
bobgiesberts 2:1a203732fc95 11 *
bobgiesberts 2:1a203732fc95 12 * @author Bob Giesberts
bobgiesberts 2:1a203732fc95 13 *
bobgiesberts 15:5de8394fdb3c 14 * @date 2016-08-23
bobgiesberts 2:1a203732fc95 15 */
bobgiesberts 10:3cab80866536 16 #include "mbed.h"
bobgiesberts 15:5de8394fdb3c 17 #include "LDC1614.h" // inductive force sensor
bobgiesberts 11:599ca9982e45 18 #include "SDFileSystem.h" // control the SD card
bobgiesberts 11:599ca9982e45 19 #include "Bob.h" // processorboard
bobgiesberts 11:599ca9982e45 20 #include "DS1825.h" // thermometer
bobgiesberts 10:3cab80866536 21
bobgiesberts 10:3cab80866536 22 #include <iostream>
bobgiesberts 10:3cab80866536 23 #include <vector>
bobgiesberts 10:3cab80866536 24 #include <string>
bobgiesberts 10:3cab80866536 25 using namespace std;
bobgiesberts 10:3cab80866536 26
bobgiesberts 5:736a81a59f3c 27 // SETTINGS
bobgiesberts 12:cceece4f3afb 28 bool DEBUG = false;
bobgiesberts 12:cceece4f3afb 29 float C = 120E-12; // Capacitor in F
bobgiesberts 15:5de8394fdb3c 30 int sensors = 2; // number of attached sensors
bobgiesberts 13:2caedc56b863 31 uint16_t INTERVAL_FIRST = 3600; // First sampling time in seconds. 60:00 minutes = 3600 sec
bobgiesberts 12:cceece4f3afb 32 uint16_t INTERVAL_OFF = 870; // Waiting interval in seconds. 14:30 minutes = 870 sec (14*60+30)
bobgiesberts 12:cceece4f3afb 33 uint16_t INTERVAL_ON = 30; // Sampling interval in seconds. 0:30 minutes = 30 sec
bobgiesberts 12:cceece4f3afb 34
bobgiesberts 15:5de8394fdb3c 35 // Leds
bobgiesberts 15:5de8394fdb3c 36 PinName _LED_PROCESS = PTB1; // Green led (PTB0 for the first sensor) // old = new: PTB1
bobgiesberts 15:5de8394fdb3c 37 PinName _LED_ERROR = PTB0; // Red led // new: PTB0;
bobgiesberts 15:5de8394fdb3c 38
bobgiesberts 15:5de8394fdb3c 39 // Thermometer
bobgiesberts 15:5de8394fdb3c 40 PinName _Tpin = PTC1; // OneWire system (PTB1 for the first sensor) // old = PTB0, new: PTC1
bobgiesberts 15:5de8394fdb3c 41
bobgiesberts 15:5de8394fdb3c 42 // LDC1614
bobgiesberts 15:5de8394fdb3c 43 PinName _LDC_SDA = PTC5; // I2C: SDA
bobgiesberts 15:5de8394fdb3c 44 PinName _LDC_SCL = PTC4; // I2C: SCL
bobgiesberts 15:5de8394fdb3c 45 PinName _LDC_SD = PTC6; // Shutdown
bobgiesberts 15:5de8394fdb3c 46
bobgiesberts 15:5de8394fdb3c 47 // SD File system
bobgiesberts 15:5de8394fdb3c 48 PinName _SD_ENABLE = PTC3;
bobgiesberts 15:5de8394fdb3c 49 PinName _SD_PRESENT = PTE0; // card detect // old = new: PTE0
bobgiesberts 15:5de8394fdb3c 50 PinName _SD_MOSI = PTD6; // mosi // old = new: PTD6
bobgiesberts 15:5de8394fdb3c 51 PinName _SD_MISO = PTD7; // miso // old = new: PTD7
bobgiesberts 15:5de8394fdb3c 52 PinName _SD_SCLK = PTD5; // sclk // old = new: PTD5
bobgiesberts 15:5de8394fdb3c 53 PinName _SD_CS = PTD4; // cs // old = new: PTD4
bobgiesberts 15:5de8394fdb3c 54
bobgiesberts 15:5de8394fdb3c 55 // Other components
bobgiesberts 15:5de8394fdb3c 56 PinName _OSCILLATOR = PTC3;
bobgiesberts 15:5de8394fdb3c 57 PinName _BATTERY = PTC2; // voltage // old = new: PTC2
bobgiesberts 15:5de8394fdb3c 58 PinName _BUTTON = PTA4;
bobgiesberts 12:cceece4f3afb 59
bobgiesberts 0:e81b68888268 60
bobgiesberts 5:736a81a59f3c 61 // load libraries
bobgiesberts 15:5de8394fdb3c 62 Bob bob( _LED_PROCESS, _SD_ENABLE, _SD_PRESENT, _BATTERY, _BUTTON );
bobgiesberts 15:5de8394fdb3c 63 Serial pc(USBTX, USBRX);
bobgiesberts 4:ae441c5727b9 64
bobgiesberts 4:ae441c5727b9 65 // timer variables
bobgiesberts 6:ff39d60061ca 66 uint32_t now = 0, next = 0, prev = 0;
bobgiesberts 8:8cc1960467ae 67 uint8_t t_high = 0;
bobgiesberts 11:599ca9982e45 68 uint32_t t_lost = 0, lost_prev = 0;
bobgiesberts 8:8cc1960467ae 69 uint8_t lost_high = 0;
bobgiesberts 11:599ca9982e45 70 uint32_t t_sleep = 0;
bobgiesberts 12:cceece4f3afb 71 uint32_t t;
bobgiesberts 4:ae441c5727b9 72
bobgiesberts 4:ae441c5727b9 73 // file variables
bobgiesberts 4:ae441c5727b9 74 FILE *fp;
bobgiesberts 4:ae441c5727b9 75 string filename = "/sd/data00.txt";
bobgiesberts 4:ae441c5727b9 76 const char *fn;
bobgiesberts 4:ae441c5727b9 77
bobgiesberts 11:599ca9982e45 78 // temperature variables
bobgiesberts 11:599ca9982e45 79 uint8_t Tdata[9];
bobgiesberts 11:599ca9982e45 80 int16_t T_bin;
bobgiesberts 11:599ca9982e45 81 float T;
bobgiesberts 11:599ca9982e45 82
bobgiesberts 5:736a81a59f3c 83 // temporal storage for data samples
bobgiesberts 12:cceece4f3afb 84 const uint8_t package_size = 60; // ±12-13 Hz, so 60 would take about 5 sec.
bobgiesberts 12:cceece4f3afb 85 struct mydata {
bobgiesberts 12:cceece4f3afb 86 uint32_t t[package_size]; // time (s)
bobgiesberts 12:cceece4f3afb 87 uint32_t L[package_size]; // LHR_DATA
bobgiesberts 12:cceece4f3afb 88 } collected;
bobgiesberts 12:cceece4f3afb 89 uint8_t counter = 0;
bobgiesberts 15:5de8394fdb3c 90 uint8_t status;
bobgiesberts 12:cceece4f3afb 91
bobgiesberts 12:cceece4f3afb 92 // function to write all data to the SD card
bobgiesberts 12:cceece4f3afb 93 void storeit( float T )
bobgiesberts 12:cceece4f3afb 94 {
bobgiesberts 13:2caedc56b863 95 // TODO: writing to SD card more efficient!
bobgiesberts 13:2caedc56b863 96 // t 32-bit | 0.00 2000000.00 3-10x8-bit | FFFFFFFF 8x8
bobgiesberts 13:2caedc56b863 97 // L 24-bit | 0 1677216 6- 7x8-bit | FFFFFF 6x8
bobgiesberts 13:2caedc56b863 98 // V 8-bit | 3.10 4.20 4x8-bit | FF 2x8
bobgiesberts 13:2caedc56b863 99 // T 16-bit | -20.0000 85.0000 7x8-bit | FFFF 4x8
bobgiesberts 13:2caedc56b863 100
bobgiesberts 13:2caedc56b863 101
bobgiesberts 13:2caedc56b863 102 // construct data
bobgiesberts 13:2caedc56b863 103 /*
bobgiesberts 13:2caedc56b863 104 bob.ledon();
bobgiesberts 13:2caedc56b863 105 // fp = fopen( fn, "a" ); // open file (append)
bobgiesberts 13:2caedc56b863 106 char buffer[16]; memset(buffer, 0, sizeof(buffer));
bobgiesberts 13:2caedc56b863 107 char towrite[64]; memset(towrite, 0, sizeof(towrite));
bobgiesberts 13:2caedc56b863 108 int n = 0, m = 0;
bobgiesberts 13:2caedc56b863 109 for( int i = 0; i < counter; i++ )
bobgiesberts 13:2caedc56b863 110 {
bobgiesberts 13:2caedc56b863 111 for( int j = 0; j < 4; j++ )
bobgiesberts 13:2caedc56b863 112 {
bobgiesberts 13:2caedc56b863 113 // build up next 'word'
bobgiesberts 13:2caedc56b863 114 switch(j)
bobgiesberts 13:2caedc56b863 115 {
bobgiesberts 13:2caedc56b863 116 case 0: n = sprintf(buffer, "%.2f;", (float) collected.t[i]/100.0); break;
bobgiesberts 13:2caedc56b863 117 case 1: n = sprintf(buffer, "%d;", collected.L[i]); break;
bobgiesberts 13:2caedc56b863 118 case 2: n = sprintf(buffer, "%.2f;", bob.battery()); break;
bobgiesberts 13:2caedc56b863 119 case 3: n = sprintf(buffer, "%.4f\r\n", T); break;
bobgiesberts 13:2caedc56b863 120 }
bobgiesberts 13:2caedc56b863 121
bobgiesberts 13:2caedc56b863 122 // calculate if there is still room left for that word
bobgiesberts 13:2caedc56b863 123 if( strlen(towrite) + n > 64 )
bobgiesberts 13:2caedc56b863 124 {
bobgiesberts 13:2caedc56b863 125
bobgiesberts 13:2caedc56b863 126 // pc.printf( "%s", towrite);
bobgiesberts 13:2caedc56b863 127 fp = fopen( fn, "a" ); // open file (append)
bobgiesberts 13:2caedc56b863 128 fprintf( fp, "%s", towrite);
bobgiesberts 13:2caedc56b863 129 fclose( fp ); // close file
bobgiesberts 13:2caedc56b863 130
bobgiesberts 13:2caedc56b863 131 memset(towrite, 0, sizeof(towrite));
bobgiesberts 13:2caedc56b863 132 }
bobgiesberts 13:2caedc56b863 133
bobgiesberts 13:2caedc56b863 134 // build up letter with the next word
bobgiesberts 13:2caedc56b863 135 m = sprintf(towrite, "%s%s", towrite, buffer);
bobgiesberts 13:2caedc56b863 136 }
bobgiesberts 13:2caedc56b863 137 }
bobgiesberts 13:2caedc56b863 138 if(m > 0)
bobgiesberts 13:2caedc56b863 139 {
bobgiesberts 13:2caedc56b863 140 fp = fopen( fn, "a" ); // open file (append)
bobgiesberts 13:2caedc56b863 141 fprintf( fp, "%s", towrite);
bobgiesberts 13:2caedc56b863 142 fclose( fp ); // close file
bobgiesberts 13:2caedc56b863 143 //pc.printf( "%s", towrite);
bobgiesberts 13:2caedc56b863 144 }
bobgiesberts 13:2caedc56b863 145 //fclose( fp ); // close file
bobgiesberts 13:2caedc56b863 146 bob.ledoff();
bobgiesberts 15:5de8394fdb3c 147 */
bobgiesberts 13:2caedc56b863 148
bobgiesberts 12:cceece4f3afb 149 // write data to SD card
bobgiesberts 12:cceece4f3afb 150 bob.ledon();
bobgiesberts 12:cceece4f3afb 151 fp = fopen( fn, "a" ); // open file (append)
bobgiesberts 12:cceece4f3afb 152 for( int i = 0; i < counter; i++ )
bobgiesberts 13:2caedc56b863 153 fprintf( fp, "%.2f;%d;%.2f;%.4f\r\n", (float) collected.t[i]/100.0, collected.L[i], bob.battery(), T ); // write to file
bobgiesberts 12:cceece4f3afb 154 fclose( fp ); // close file
bobgiesberts 13:2caedc56b863 155
bobgiesberts 13:2caedc56b863 156 // write to screen
bobgiesberts 13:2caedc56b863 157 //pc.printf( "%.2f;%d;%.2f;%.4f\r\n", (float) collected.t[counter-1]/100.0, collected.L[counter-1], bob.battery(), T ); // write to screen
bobgiesberts 13:2caedc56b863 158
bobgiesberts 12:cceece4f3afb 159 bob.ledoff();
bobgiesberts 12:cceece4f3afb 160
bobgiesberts 12:cceece4f3afb 161 // Reset data
bobgiesberts 12:cceece4f3afb 162 memset(collected.t, 0, counter);
bobgiesberts 12:cceece4f3afb 163 memset(collected.L, 0, counter);
bobgiesberts 12:cceece4f3afb 164 counter = 0;
bobgiesberts 12:cceece4f3afb 165 }
bobgiesberts 5:736a81a59f3c 166
bobgiesberts 10:3cab80866536 167 int main(void)
bobgiesberts 10:3cab80866536 168 {
bobgiesberts 15:5de8394fdb3c 169 if( DEBUG )
bobgiesberts 15:5de8394fdb3c 170 {
bobgiesberts 15:5de8394fdb3c 171 Serial pc( USBTX, USBRX );
bobgiesberts 15:5de8394fdb3c 172
bobgiesberts 15:5de8394fdb3c 173 LDC1614 ldc( _LDC_SDA, _LDC_SCL, _LDC_SD, _OSCILLATOR, 16E6, sensors, C );
bobgiesberts 15:5de8394fdb3c 174
bobgiesberts 15:5de8394fdb3c 175 uint8_t status;
bobgiesberts 15:5de8394fdb3c 176
bobgiesberts 15:5de8394fdb3c 177 while( 1 ) {
bobgiesberts 15:5de8394fdb3c 178 // check the sensor
bobgiesberts 15:5de8394fdb3c 179 status = ldc.get_status();
bobgiesberts 15:5de8394fdb3c 180
bobgiesberts 15:5de8394fdb3c 181 // if there is an error turn on the red led
bobgiesberts 15:5de8394fdb3c 182 if( ldc.is_error( status ) )
bobgiesberts 15:5de8394fdb3c 183 {
bobgiesberts 15:5de8394fdb3c 184 // error
bobgiesberts 15:5de8394fdb3c 185 // bob.error();
bobgiesberts 15:5de8394fdb3c 186 }else{
bobgiesberts 15:5de8394fdb3c 187 if( ldc.is_ready( status ) )
bobgiesberts 15:5de8394fdb3c 188 {
bobgiesberts 15:5de8394fdb3c 189 //bob.no_error();
bobgiesberts 15:5de8394fdb3c 190 pc.printf( "sensor 1: %d | sensor 2: %d\r\n", ldc.get_Data( 0 ), ldc.get_Data( 1 ) );
bobgiesberts 15:5de8394fdb3c 191 }
bobgiesberts 15:5de8394fdb3c 192 }
bobgiesberts 15:5de8394fdb3c 193 }
bobgiesberts 15:5de8394fdb3c 194 }
bobgiesberts 15:5de8394fdb3c 195
bobgiesberts 15:5de8394fdb3c 196
bobgiesberts 13:2caedc56b863 197
bobgiesberts 13:2caedc56b863 198 // TODO:
bobgiesberts 13:2caedc56b863 199 // - implement this data conversion in writing to SD!!
bobgiesberts 13:2caedc56b863 200 // - use T as uint16_t, not float!
bobgiesberts 13:2caedc56b863 201 // - use V as uint16_t, not float!
bobgiesberts 13:2caedc56b863 202 // - write blocks of 512 bit (4x 32 + 32 + 16 + 16)
bobgiesberts 13:2caedc56b863 203 //
bobgiesberts 13:2caedc56b863 204 // float temp_a = 127.9375;
bobgiesberts 13:2caedc56b863 205 // pc.printf( "A: %.4f (%08x); \r\n", temp_a, * (uint32_t *) &temp_a);
bobgiesberts 13:2caedc56b863 206
bobgiesberts 6:ff39d60061ca 207 // Load SD File system
bobgiesberts 12:cceece4f3afb 208 // - the Raspberry Pie SD cards give a warning here that might just be ignored:
bobgiesberts 12:cceece4f3afb 209 // "Not in idle state after sending CMD8 (not an SD card?)
bobgiesberts 12:cceece4f3afb 210 // Didn't get a response from the disk
bobgiesberts 12:cceece4f3afb 211 // Set 512-byte block timed out"
bobgiesberts 12:cceece4f3afb 212 // TODO: buy 'better' SD cards from IAPC / the Stores (Kingston ...)
bobgiesberts 11:599ca9982e45 213 bob.wakeup();
bobgiesberts 15:5de8394fdb3c 214 SDFileSystem *sd = new SDFileSystem( _SD_MOSI, _SD_MISO, _SD_SCLK, _SD_CS, "sd" );
bobgiesberts 10:3cab80866536 215
bobgiesberts 6:ff39d60061ca 216 // Create a new data file (data00.txt)
bobgiesberts 10:3cab80866536 217 mkdir("/sd", 0777);
bobgiesberts 11:599ca9982e45 218 for(uint8_t i = 0; i < 100; i++)
bobgiesberts 11:599ca9982e45 219 {
bobgiesberts 6:ff39d60061ca 220 filename[8] = i/10 + '0';
bobgiesberts 4:ae441c5727b9 221 filename[9] = i%10 + '0';
bobgiesberts 4:ae441c5727b9 222 fp = fopen( filename.c_str() , "r" );
bobgiesberts 11:599ca9982e45 223 if( fp == NULL ) // read failed so file does not exist
bobgiesberts 11:599ca9982e45 224 {
bobgiesberts 4:ae441c5727b9 225 fp = fopen( filename.c_str(), "w" ); // create it
bobgiesberts 11:599ca9982e45 226 if( fp != NULL )
bobgiesberts 11:599ca9982e45 227 {
bobgiesberts 4:ae441c5727b9 228 fn = filename.c_str();
bobgiesberts 6:ff39d60061ca 229 fclose( fp );
bobgiesberts 4:ae441c5727b9 230 break;
bobgiesberts 10:3cab80866536 231 } else {
bobgiesberts 12:cceece4f3afb 232 bob.ledon(); // error: unable to create new file
bobgiesberts 4:ae441c5727b9 233 }
bobgiesberts 10:3cab80866536 234 } else { // file already exists
bobgiesberts 4:ae441c5727b9 235 fclose( fp );
bobgiesberts 4:ae441c5727b9 236 }
bobgiesberts 1:22c272515015 237 }
bobgiesberts 11:599ca9982e45 238 if( fp == NULL )
bobgiesberts 11:599ca9982e45 239 {
bobgiesberts 12:cceece4f3afb 240 bob.ledon(); // error: file 00 - 99 already exists
bobgiesberts 12:cceece4f3afb 241 // pc.printf( "/sd/data00.txt t/m /sd/data99.txt already exist!\n" );
bobgiesberts 11:599ca9982e45 242 }
bobgiesberts 10:3cab80866536 243
bobgiesberts 6:ff39d60061ca 244 // Unload SD File system
bobgiesberts 10:3cab80866536 245 delete sd;
bobgiesberts 10:3cab80866536 246 sd = NULL;
bobgiesberts 12:cceece4f3afb 247
bobgiesberts 11:599ca9982e45 248 while(1)
bobgiesberts 11:599ca9982e45 249 {
bobgiesberts 11:599ca9982e45 250 // Wakeup: SD + LDC1101 on
bobgiesberts 11:599ca9982e45 251 bob.wakeup();
bobgiesberts 10:3cab80866536 252
bobgiesberts 11:599ca9982e45 253 // what time is it now?
bobgiesberts 8:8cc1960467ae 254 prev = now; // 0 -> 429 496 --> (4 294,96 s) (71 min)
bobgiesberts 8:8cc1960467ae 255 now = (uint32_t) clock(); // 0 -> 429 496 --> (4 294,96 s) (71 min)
bobgiesberts 11:599ca9982e45 256 if( now < prev )
bobgiesberts 11:599ca9982e45 257 t_high++; // 0 -> 255 --> (255*4 294,96 s) (12 days)
bobgiesberts 11:599ca9982e45 258 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high; // 0 -> 219 901 952 --> (2 199 019,52 s) (25 days)
bobgiesberts 11:599ca9982e45 259
bobgiesberts 15:5de8394fdb3c 260 // load libraries to take control over the communication
bobgiesberts 15:5de8394fdb3c 261 LDC1614 *ldc = new LDC1614(_LDC_SDA, _LDC_SCL, _LDC_SD, _OSCILLATOR, 16E6, sensors, C);
bobgiesberts 15:5de8394fdb3c 262 DS1825 *thermometer = new DS1825( _Tpin ); // load thermometer (DS1825) library
bobgiesberts 15:5de8394fdb3c 263 SDFileSystem *sd = new SDFileSystem(_SD_MOSI, _SD_MISO, _SD_SCLK, _SD_CS, "sd"); // load SD system
bobgiesberts 11:599ca9982e45 264 mkdir("/sd", 0777); // select folder
bobgiesberts 10:3cab80866536 265
bobgiesberts 12:cceece4f3afb 266 // How long should we takes samples?
bobgiesberts 11:599ca9982e45 267 if( next == 0 )
bobgiesberts 11:599ca9982e45 268 {
bobgiesberts 11:599ca9982e45 269 next = t + INTERVAL_FIRST*100;
bobgiesberts 10:3cab80866536 270 } else {
bobgiesberts 11:599ca9982e45 271 next = t + INTERVAL_ON*100; // 0 -> 219 904 952 --> (2 199 049,52 s) (25 days)
bobgiesberts 8:8cc1960467ae 272 }
bobgiesberts 10:3cab80866536 273
bobgiesberts 6:ff39d60061ca 274 // Take samples for INTERVAL_ON seconds
bobgiesberts 11:599ca9982e45 275 while( t < next )
bobgiesberts 11:599ca9982e45 276 {
bobgiesberts 12:cceece4f3afb 277 // what time is it now?
bobgiesberts 12:cceece4f3afb 278 prev = now;
bobgiesberts 12:cceece4f3afb 279 now = (uint32_t) clock();
bobgiesberts 12:cceece4f3afb 280 if( now < prev )
bobgiesberts 12:cceece4f3afb 281 t_high++;
bobgiesberts 12:cceece4f3afb 282 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high;
bobgiesberts 10:3cab80866536 283
bobgiesberts 15:5de8394fdb3c 284 status = ldc->get_status();
bobgiesberts 15:5de8394fdb3c 285
bobgiesberts 15:5de8394fdb3c 286 // Is there any error?
bobgiesberts 15:5de8394fdb3c 287 if( ldc->is_error(status) )
bobgiesberts 12:cceece4f3afb 288 {
bobgiesberts 15:5de8394fdb3c 289 // red led on
bobgiesberts 15:5de8394fdb3c 290 // bob.error();
bobgiesberts 15:5de8394fdb3c 291 }else{
bobgiesberts 15:5de8394fdb3c 292 // red led off
bobgiesberts 15:5de8394fdb3c 293 // bob.no_error();
bobgiesberts 15:5de8394fdb3c 294
bobgiesberts 15:5de8394fdb3c 295 if( ldc->is_ready(status) ) // data from all sensors is ready
bobgiesberts 15:5de8394fdb3c 296 {
bobgiesberts 15:5de8394fdb3c 297 // Store data in temporal memory
bobgiesberts 15:5de8394fdb3c 298 collected.t[counter] = t;
bobgiesberts 15:5de8394fdb3c 299 collected.L[counter] = ldc->get_Data( 0 );
bobgiesberts 15:5de8394fdb3c 300 counter++;
bobgiesberts 15:5de8394fdb3c 301
bobgiesberts 15:5de8394fdb3c 302 // Write a full package of data points to the SD card
bobgiesberts 15:5de8394fdb3c 303 if( counter >= package_size-1 )
bobgiesberts 15:5de8394fdb3c 304 storeit( thermometer->getTemperature() );
bobgiesberts 15:5de8394fdb3c 305 }
bobgiesberts 6:ff39d60061ca 306 }
bobgiesberts 15:5de8394fdb3c 307
bobgiesberts 15:5de8394fdb3c 308
bobgiesberts 10:3cab80866536 309 }
bobgiesberts 12:cceece4f3afb 310
bobgiesberts 12:cceece4f3afb 311 // Write remaining data to the SD card
bobgiesberts 12:cceece4f3afb 312 if( counter > 0 )
bobgiesberts 12:cceece4f3afb 313 storeit( thermometer->getTemperature() );
bobgiesberts 10:3cab80866536 314
bobgiesberts 11:599ca9982e45 315 // prepare for sleep, power down the SD and the LDC1101
bobgiesberts 12:cceece4f3afb 316 delete sd; sd = NULL; // unload library to be able to power down completely
bobgiesberts 12:cceece4f3afb 317 delete ldc; ldc = NULL; // unload library to be able to power down completely
bobgiesberts 12:cceece4f3afb 318 delete thermometer; thermometer = NULL; // unload library to be able to power down completely
bobgiesberts 11:599ca9982e45 319 bob.beforesleep();
bobgiesberts 12:cceece4f3afb 320
bobgiesberts 12:cceece4f3afb 321 // if the battery is almost empty (Vbatt < 3.10 V), the termometer stops
bobgiesberts 12:cceece4f3afb 322 // working well and L can not be corrected. So just shut down...
bobgiesberts 12:cceece4f3afb 323 if( bob.battery() < 3.10f )
bobgiesberts 12:cceece4f3afb 324 {
bobgiesberts 12:cceece4f3afb 325 bob.ledon(); // error: battery empty
bobgiesberts 12:cceece4f3afb 326 // pc.printf( "Battery empty (%.1f V), shutting down.\n", bob.battery() );
bobgiesberts 12:cceece4f3afb 327 exit(0);
bobgiesberts 12:cceece4f3afb 328 }
bobgiesberts 10:3cab80866536 329
bobgiesberts 11:599ca9982e45 330 // what time is it now?
bobgiesberts 11:599ca9982e45 331 prev = now;
bobgiesberts 11:599ca9982e45 332 now = (uint32_t) clock();
bobgiesberts 11:599ca9982e45 333 if( now < prev )
bobgiesberts 11:599ca9982e45 334 t_high++;
bobgiesberts 11:599ca9982e45 335 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high;
bobgiesberts 10:3cab80866536 336
bobgiesberts 8:8cc1960467ae 337 // Calculate sleeping time (correction to INTERVAL_OFF)
bobgiesberts 12:cceece4f3afb 338 // t has passed the limit of next. Those few ms are substracted from INTERVAL_OFF.
bobgiesberts 11:599ca9982e45 339 t_sleep = INTERVAL_OFF*100 - (t - next);
bobgiesberts 8:8cc1960467ae 340
bobgiesberts 12:cceece4f3afb 341 // Calculate time that will be lost during sleep
bobgiesberts 11:599ca9982e45 342 lost_prev = t_lost;
bobgiesberts 11:599ca9982e45 343 t_lost += t_sleep;
bobgiesberts 11:599ca9982e45 344 if( t_lost < lost_prev )
bobgiesberts 11:599ca9982e45 345 lost_high++;
bobgiesberts 13:2caedc56b863 346
bobgiesberts 11:599ca9982e45 347 // Sleep now (ms), enter low power mode
bobgiesberts 11:599ca9982e45 348 bob.sleep( t_sleep * 10 );
bobgiesberts 10:3cab80866536 349
bobgiesberts 0:e81b68888268 350 }
bobgiesberts 6:ff39d60061ca 351
bobgiesberts 11:599ca9982e45 352
bobgiesberts 11:599ca9982e45 353
bobgiesberts 11:599ca9982e45 354
bobgiesberts 12:cceece4f3afb 355 }
bobgiesberts 12:cceece4f3afb 356