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 Oct 05 08:20:08 2016 +0000
Revision:
23:7499936dc144
Parent:
22:ac26f52ebaf8
Intermediate version for power debugging purposes...

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 17:a4700b1c3c37 27
bobgiesberts 17:a4700b1c3c37 28
bobgiesberts 22:ac26f52ebaf8 29 bool DEBUG = true;
bobgiesberts 22:ac26f52ebaf8 30
bobgiesberts 17:a4700b1c3c37 31
bobgiesberts 17:a4700b1c3c37 32
bobgiesberts 5:736a81a59f3c 33 // SETTINGS
bobgiesberts 21:b96a3de88002 34 uint8_t C = 120; // Capacitor (in pF)
bobgiesberts 21:b96a3de88002 35 uint8_t f_CLKIN = 40; // Oscillator frequency (in MHz)
bobgiesberts 22:ac26f52ebaf8 36 const uint8_t sensors = 1; // number of attached sensors
bobgiesberts 21:b96a3de88002 37
bobgiesberts 22:ac26f52ebaf8 38 uint16_t INTERVAL_FIRST = 3600; // First sampling time in seconds. 60:00 minutes = 3600 sec
bobgiesberts 12:cceece4f3afb 39 uint16_t INTERVAL_OFF = 870; // Waiting interval in seconds. 14:30 minutes = 870 sec (14*60+30)
bobgiesberts 12:cceece4f3afb 40 uint16_t INTERVAL_ON = 30; // Sampling interval in seconds. 0:30 minutes = 30 sec
bobgiesberts 12:cceece4f3afb 41
bobgiesberts 22:ac26f52ebaf8 42 uint8_t SKIPPING = 2; // The first how many measurements should be skipped?
bobgiesberts 22:ac26f52ebaf8 43
bobgiesberts 15:5de8394fdb3c 44 // Leds
bobgiesberts 22:ac26f52ebaf8 45 PinName _LED_PROCESS = PTB1; // Green led
bobgiesberts 22:ac26f52ebaf8 46 PinName _LED_ERROR = PTB0; // Red led
bobgiesberts 15:5de8394fdb3c 47
bobgiesberts 15:5de8394fdb3c 48 // Thermometer
bobgiesberts 22:ac26f52ebaf8 49 PinName _Tpin = PTC1; // OneWire system (PTB1 for the first sensor)
bobgiesberts 15:5de8394fdb3c 50
bobgiesberts 15:5de8394fdb3c 51 // LDC1614
bobgiesberts 15:5de8394fdb3c 52 PinName _LDC_SDA = PTC5; // I2C: SDA
bobgiesberts 15:5de8394fdb3c 53 PinName _LDC_SCL = PTC4; // I2C: SCL
bobgiesberts 15:5de8394fdb3c 54 PinName _LDC_SD = PTC6; // Shutdown
bobgiesberts 15:5de8394fdb3c 55
bobgiesberts 15:5de8394fdb3c 56 // SD File system
bobgiesberts 22:ac26f52ebaf8 57 PinName _SD_PRESENT = PTE0; // card detect
bobgiesberts 22:ac26f52ebaf8 58 PinName _SD_MOSI = PTD6; // mosi
bobgiesberts 22:ac26f52ebaf8 59 PinName _SD_MISO = PTD7; // miso
bobgiesberts 22:ac26f52ebaf8 60 PinName _SD_SCLK = PTD5; // sclk
bobgiesberts 22:ac26f52ebaf8 61 PinName _SD_CS = PTD4; // cs
bobgiesberts 15:5de8394fdb3c 62
bobgiesberts 15:5de8394fdb3c 63 // Other components
bobgiesberts 22:ac26f52ebaf8 64 PinName _ENABLE = PTC3; // enables SD card and Crystal
bobgiesberts 22:ac26f52ebaf8 65 PinName _BATTERY = PTC2; // voltage
bobgiesberts 15:5de8394fdb3c 66 PinName _BUTTON = PTA4;
bobgiesberts 12:cceece4f3afb 67
bobgiesberts 0:e81b68888268 68
bobgiesberts 5:736a81a59f3c 69 // load libraries
bobgiesberts 17:a4700b1c3c37 70 Bob bob( _LED_PROCESS, _LED_ERROR, _BUTTON, _ENABLE, _SD_PRESENT, _BATTERY );
bobgiesberts 22:ac26f52ebaf8 71
bobgiesberts 4:ae441c5727b9 72
bobgiesberts 4:ae441c5727b9 73 // timer variables
bobgiesberts 6:ff39d60061ca 74 uint32_t now = 0, next = 0, prev = 0;
bobgiesberts 8:8cc1960467ae 75 uint8_t t_high = 0;
bobgiesberts 11:599ca9982e45 76 uint32_t t_lost = 0, lost_prev = 0;
bobgiesberts 8:8cc1960467ae 77 uint8_t lost_high = 0;
bobgiesberts 11:599ca9982e45 78 uint32_t t_sleep = 0;
bobgiesberts 12:cceece4f3afb 79 uint32_t t;
bobgiesberts 4:ae441c5727b9 80
bobgiesberts 4:ae441c5727b9 81 // file variables
bobgiesberts 4:ae441c5727b9 82 FILE *fp;
bobgiesberts 4:ae441c5727b9 83 string filename = "/sd/data00.txt";
bobgiesberts 4:ae441c5727b9 84 const char *fn;
bobgiesberts 4:ae441c5727b9 85
bobgiesberts 21:b96a3de88002 86 // LDC variables
bobgiesberts 21:b96a3de88002 87 uint32_t L;
bobgiesberts 21:b96a3de88002 88
bobgiesberts 5:736a81a59f3c 89 // temporal storage for data samples
bobgiesberts 21:b96a3de88002 90 const uint8_t package_size = 60; // ±12-13 Hz, so 60 would take about 5 sec.
bobgiesberts 12:cceece4f3afb 91 struct mydata {
bobgiesberts 21:b96a3de88002 92 uint32_t t[package_size]; // time (s)
bobgiesberts 22:ac26f52ebaf8 93 uint32_t L[sensors][package_size]; // DATA
bobgiesberts 22:ac26f52ebaf8 94 float T; // Temperature
bobgiesberts 12:cceece4f3afb 95 } collected;
bobgiesberts 12:cceece4f3afb 96 uint8_t counter = 0;
bobgiesberts 21:b96a3de88002 97 uint8_t skip = 0;
bobgiesberts 12:cceece4f3afb 98
bobgiesberts 22:ac26f52ebaf8 99
bobgiesberts 22:ac26f52ebaf8 100
bobgiesberts 12:cceece4f3afb 101 // function to write all data to the SD card
bobgiesberts 22:ac26f52ebaf8 102 void storeit( void )
bobgiesberts 22:ac26f52ebaf8 103 {
bobgiesberts 21:b96a3de88002 104 bob.processing();
bobgiesberts 21:b96a3de88002 105
bobgiesberts 22:ac26f52ebaf8 106 // write data to SD card
bobgiesberts 22:ac26f52ebaf8 107 fp = fopen( fn, "a" ); // open file (append)
bobgiesberts 22:ac26f52ebaf8 108 for( int i = 0; i < counter; i++ )
bobgiesberts 22:ac26f52ebaf8 109 {
bobgiesberts 22:ac26f52ebaf8 110 fprintf( fp, "%.2f;", (float) collected.t[i]/100.0); // write to file
bobgiesberts 22:ac26f52ebaf8 111 for(int sensor = 0; sensor < sensors; sensor++)
bobgiesberts 22:ac26f52ebaf8 112 fprintf( fp, "%d;", collected.L[sensor][i]); // write to file
bobgiesberts 22:ac26f52ebaf8 113 fprintf( fp, "%.4f;%.4f\r\n", bob.battery(), collected.T ); // write to file
bobgiesberts 22:ac26f52ebaf8 114 }
bobgiesberts 22:ac26f52ebaf8 115 fclose( fp ); // close file
bobgiesberts 13:2caedc56b863 116
bobgiesberts 17:a4700b1c3c37 117 bob.no_processing();
bobgiesberts 22:ac26f52ebaf8 118
bobgiesberts 22:ac26f52ebaf8 119 // write data to screen
bobgiesberts 22:ac26f52ebaf8 120 // debug( "Writing to SD: " );
bobgiesberts 22:ac26f52ebaf8 121 // debug( "%.2f;", (float) collected.t[0]/100.0); // write to file
bobgiesberts 22:ac26f52ebaf8 122 // for(int sensor = 0; sensor < sensors; sensor++)
bobgiesberts 22:ac26f52ebaf8 123 // debug( "%d;", collected.L[sensor][0]); // write to file
bobgiesberts 22:ac26f52ebaf8 124 // debug( "%.4f;%.4f\r\n", bob.battery(), collected.T ); // write to file
bobgiesberts 12:cceece4f3afb 125
bobgiesberts 12:cceece4f3afb 126 // Reset data
bobgiesberts 12:cceece4f3afb 127 memset(collected.t, 0, counter);
bobgiesberts 12:cceece4f3afb 128 memset(collected.L, 0, counter);
bobgiesberts 22:ac26f52ebaf8 129 collected.T = 0.0;
bobgiesberts 12:cceece4f3afb 130 counter = 0;
bobgiesberts 12:cceece4f3afb 131 }
bobgiesberts 5:736a81a59f3c 132
bobgiesberts 22:ac26f52ebaf8 133
bobgiesberts 22:ac26f52ebaf8 134
bobgiesberts 10:3cab80866536 135 int main(void)
bobgiesberts 10:3cab80866536 136 {
bobgiesberts 21:b96a3de88002 137 if( DEBUG )
bobgiesberts 22:ac26f52ebaf8 138 {
bobgiesberts 22:ac26f52ebaf8 139 while ( 1 ) {
bobgiesberts 22:ac26f52ebaf8 140
bobgiesberts 22:ac26f52ebaf8 141 // 5 sec awake
bobgiesberts 22:ac26f52ebaf8 142 wait( 5 );
bobgiesberts 22:ac26f52ebaf8 143
bobgiesberts 22:ac26f52ebaf8 144 // 5 sec asleep
bobgiesberts 22:ac26f52ebaf8 145 bob.sleep( 5 );
bobgiesberts 22:ac26f52ebaf8 146 }
bobgiesberts 22:ac26f52ebaf8 147
bobgiesberts 22:ac26f52ebaf8 148 /*
bobgiesberts 21:b96a3de88002 149 bob.wakeup_periphery( );
bobgiesberts 21:b96a3de88002 150 LDC1614 ldc( _LDC_SDA, _LDC_SCL, _LDC_SD, f_CLKIN, sensors, C );
bobgiesberts 21:b96a3de88002 151 DS1825 thermometer( _Tpin );
bobgiesberts 21:b96a3de88002 152
bobgiesberts 22:ac26f52ebaf8 153 wait(0.5);
bobgiesberts 22:ac26f52ebaf8 154
bobgiesberts 21:b96a3de88002 155 while( 1 ) {
bobgiesberts 21:b96a3de88002 156
bobgiesberts 21:b96a3de88002 157 prev = now;
bobgiesberts 21:b96a3de88002 158 now = (uint32_t) clock();
bobgiesberts 21:b96a3de88002 159
bobgiesberts 21:b96a3de88002 160 bob.processing();
bobgiesberts 21:b96a3de88002 161 for(int sensor = 0; sensor < sensors; sensor++)
bobgiesberts 21:b96a3de88002 162 {
bobgiesberts 22:ac26f52ebaf8 163 // ldc.autoDriveCurrent( sensor );
bobgiesberts 22:ac26f52ebaf8 164
bobgiesberts 21:b96a3de88002 165 // wait for a new conversion to be ready
bobgiesberts 21:b96a3de88002 166 while( !ldc.is_ready( sensor ) ) { }
bobgiesberts 21:b96a3de88002 167
bobgiesberts 21:b96a3de88002 168 // write to screen
bobgiesberts 21:b96a3de88002 169 L = ldc.get_Data( sensor );
bobgiesberts 21:b96a3de88002 170 if ( !ldc.get_error( sensor ) )
bobgiesberts 21:b96a3de88002 171 {
bobgiesberts 22:ac26f52ebaf8 172 debug( "[%.2f Hz] 0x%08X, %.6f MHz, Vbatt = %.2f V, T = %.2f C\r\n", 1/((now-prev)/100.0), L, ldc.get_fsensor( L )/1000000, bob.battery(), thermometer.getTemperature() );
bobgiesberts 21:b96a3de88002 173 bob.no_error();
bobgiesberts 21:b96a3de88002 174 }else{
bobgiesberts 22:ac26f52ebaf8 175 debug( "%d\r\n", L );
bobgiesberts 21:b96a3de88002 176 bob.error();
bobgiesberts 21:b96a3de88002 177 }
bobgiesberts 21:b96a3de88002 178 }
bobgiesberts 22:ac26f52ebaf8 179 debug( "\r\n", L );
bobgiesberts 22:ac26f52ebaf8 180
bobgiesberts 21:b96a3de88002 181 bob.no_processing();
bobgiesberts 22:ac26f52ebaf8 182
bobgiesberts 22:ac26f52ebaf8 183 wait(0.5);
bobgiesberts 22:ac26f52ebaf8 184 }
bobgiesberts 22:ac26f52ebaf8 185 */
bobgiesberts 21:b96a3de88002 186 }
bobgiesberts 22:ac26f52ebaf8 187
bobgiesberts 22:ac26f52ebaf8 188
bobgiesberts 22:ac26f52ebaf8 189
bobgiesberts 22:ac26f52ebaf8 190
bobgiesberts 22:ac26f52ebaf8 191
bobgiesberts 22:ac26f52ebaf8 192
bobgiesberts 22:ac26f52ebaf8 193
bobgiesberts 22:ac26f52ebaf8 194
bobgiesberts 22:ac26f52ebaf8 195
bobgiesberts 22:ac26f52ebaf8 196
bobgiesberts 22:ac26f52ebaf8 197
bobgiesberts 22:ac26f52ebaf8 198
bobgiesberts 22:ac26f52ebaf8 199
bobgiesberts 17:a4700b1c3c37 200
bobgiesberts 17:a4700b1c3c37 201 // This turns enable on, i.e. it powers the SD card system, the crystal and the LDC
bobgiesberts 17:a4700b1c3c37 202 bob.wakeup_periphery();
bobgiesberts 17:a4700b1c3c37 203
bobgiesberts 21:b96a3de88002 204 // check if both leds work
bobgiesberts 21:b96a3de88002 205 bob.flash( 1 );
bobgiesberts 21:b96a3de88002 206
bobgiesberts 17:a4700b1c3c37 207 // load SD File System
bobgiesberts 15:5de8394fdb3c 208 SDFileSystem *sd = new SDFileSystem( _SD_MOSI, _SD_MISO, _SD_SCLK, _SD_CS, "sd" );
bobgiesberts 10:3cab80866536 209
bobgiesberts 6:ff39d60061ca 210 // Create a new data file (data00.txt)
bobgiesberts 10:3cab80866536 211 mkdir("/sd", 0777);
bobgiesberts 11:599ca9982e45 212 for(uint8_t i = 0; i < 100; i++)
bobgiesberts 11:599ca9982e45 213 {
bobgiesberts 6:ff39d60061ca 214 filename[8] = i/10 + '0';
bobgiesberts 4:ae441c5727b9 215 filename[9] = i%10 + '0';
bobgiesberts 4:ae441c5727b9 216 fp = fopen( filename.c_str() , "r" );
bobgiesberts 11:599ca9982e45 217 if( fp == NULL ) // read failed so file does not exist
bobgiesberts 11:599ca9982e45 218 {
bobgiesberts 4:ae441c5727b9 219 fp = fopen( filename.c_str(), "w" ); // create it
bobgiesberts 11:599ca9982e45 220 if( fp != NULL )
bobgiesberts 11:599ca9982e45 221 {
bobgiesberts 4:ae441c5727b9 222 fn = filename.c_str();
bobgiesberts 6:ff39d60061ca 223 fclose( fp );
bobgiesberts 21:b96a3de88002 224 bob.processing( 1 );
bobgiesberts 4:ae441c5727b9 225 break;
bobgiesberts 10:3cab80866536 226 } else {
bobgiesberts 21:b96a3de88002 227 bob.error( 3 ); // error: unable to create new file
bobgiesberts 4:ae441c5727b9 228 }
bobgiesberts 10:3cab80866536 229 } else { // file already exists
bobgiesberts 4:ae441c5727b9 230 fclose( fp );
bobgiesberts 4:ae441c5727b9 231 }
bobgiesberts 22:ac26f52ebaf8 232 }
bobgiesberts 22:ac26f52ebaf8 233 // THIS ERROR IS NOT CATCHED PROPERLY!!!
bobgiesberts 11:599ca9982e45 234 if( fp == NULL )
bobgiesberts 11:599ca9982e45 235 {
bobgiesberts 21:b96a3de88002 236 bob.error( 4 ); // error: file 00 - 99 already exists
bobgiesberts 11:599ca9982e45 237 }
bobgiesberts 10:3cab80866536 238
bobgiesberts 22:ac26f52ebaf8 239
bobgiesberts 22:ac26f52ebaf8 240
bobgiesberts 22:ac26f52ebaf8 241
bobgiesberts 22:ac26f52ebaf8 242
bobgiesberts 22:ac26f52ebaf8 243
bobgiesberts 22:ac26f52ebaf8 244
bobgiesberts 22:ac26f52ebaf8 245
bobgiesberts 6:ff39d60061ca 246 // Unload SD File system
bobgiesberts 10:3cab80866536 247 delete sd;
bobgiesberts 10:3cab80866536 248 sd = NULL;
bobgiesberts 12:cceece4f3afb 249
bobgiesberts 11:599ca9982e45 250 while(1)
bobgiesberts 11:599ca9982e45 251 {
bobgiesberts 11:599ca9982e45 252 // what time is it now?
bobgiesberts 8:8cc1960467ae 253 prev = now; // 0 -> 429 496 --> (4 294,96 s) (71 min)
bobgiesberts 8:8cc1960467ae 254 now = (uint32_t) clock(); // 0 -> 429 496 --> (4 294,96 s) (71 min)
bobgiesberts 11:599ca9982e45 255 if( now < prev )
bobgiesberts 11:599ca9982e45 256 t_high++; // 0 -> 255 --> (255*4 294,96 s) (12 days)
bobgiesberts 11:599ca9982e45 257 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high; // 0 -> 219 901 952 --> (2 199 019,52 s) (25 days)
bobgiesberts 17:a4700b1c3c37 258
bobgiesberts 17:a4700b1c3c37 259 // How long should we takes samples?
bobgiesberts 17:a4700b1c3c37 260 next = t + ( (next == 0) ? INTERVAL_FIRST : INTERVAL_ON )*100; // 0 -> 219 904 952 --> (2 199 049,52 s) (25 days)
bobgiesberts 17:a4700b1c3c37 261
bobgiesberts 17:a4700b1c3c37 262
bobgiesberts 21:b96a3de88002 263 // Wakeup the periphery (3v3 on. Powers SD, crystal and LDC1614)
bobgiesberts 17:a4700b1c3c37 264 bob.wakeup_periphery();
bobgiesberts 11:599ca9982e45 265
bobgiesberts 15:5de8394fdb3c 266 // load libraries to take control over the communication
bobgiesberts 22:ac26f52ebaf8 267 LDC1614 *ldc = new LDC1614(_LDC_SDA, _LDC_SCL, _LDC_SD, f_CLKIN, sensors, C); // load LDC1614 libray
bobgiesberts 22:ac26f52ebaf8 268 DS1825 *thermometer = new DS1825( _Tpin ); // load thermometer (DS1825) library
bobgiesberts 21:b96a3de88002 269 SDFileSystem *sd = new SDFileSystem(_SD_MOSI, _SD_MISO, _SD_SCLK, _SD_CS, "sd"); // load SD File System library
bobgiesberts 11:599ca9982e45 270 mkdir("/sd", 0777); // select folder
bobgiesberts 10:3cab80866536 271
bobgiesberts 6:ff39d60061ca 272 // Take samples for INTERVAL_ON seconds
bobgiesberts 11:599ca9982e45 273 while( t < next )
bobgiesberts 11:599ca9982e45 274 {
bobgiesberts 12:cceece4f3afb 275 // what time is it now?
bobgiesberts 12:cceece4f3afb 276 prev = now;
bobgiesberts 12:cceece4f3afb 277 now = (uint32_t) clock();
bobgiesberts 12:cceece4f3afb 278 if( now < prev )
bobgiesberts 12:cceece4f3afb 279 t_high++;
bobgiesberts 12:cceece4f3afb 280 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high;
bobgiesberts 10:3cab80866536 281
bobgiesberts 21:b96a3de88002 282 // assess all sensors
bobgiesberts 21:b96a3de88002 283 for ( int sensor = 0; sensor < sensors; sensor++ )
bobgiesberts 21:b96a3de88002 284 {
bobgiesberts 21:b96a3de88002 285 // wait for a new conversion to be ready
bobgiesberts 21:b96a3de88002 286 while( !ldc->is_ready( sensor ) ) { }
bobgiesberts 21:b96a3de88002 287
bobgiesberts 21:b96a3de88002 288 // collect data
bobgiesberts 21:b96a3de88002 289 L = ldc->get_Data( sensor );
bobgiesberts 21:b96a3de88002 290
bobgiesberts 21:b96a3de88002 291 // catch errors (sensor broken / not connected)
bobgiesberts 21:b96a3de88002 292 if ( !ldc->get_error( sensor ) )
bobgiesberts 21:b96a3de88002 293 {
bobgiesberts 21:b96a3de88002 294 // skip the first few measurements (they are too low)
bobgiesberts 21:b96a3de88002 295 if ( skip >= SKIPPING )
bobgiesberts 21:b96a3de88002 296 {
bobgiesberts 21:b96a3de88002 297 // store data
bobgiesberts 21:b96a3de88002 298 collected.L[sensor][counter] = L;
bobgiesberts 20:1c5ea04a3b2a 299
bobgiesberts 21:b96a3de88002 300 // only store the time once
bobgiesberts 22:ac26f52ebaf8 301 // do this after the last sensor
bobgiesberts 22:ac26f52ebaf8 302 if ( sensor == sensors-1 )
bobgiesberts 21:b96a3de88002 303 {
bobgiesberts 21:b96a3de88002 304 collected.t[counter] = t;
bobgiesberts 21:b96a3de88002 305 counter++;
bobgiesberts 21:b96a3de88002 306 }
bobgiesberts 21:b96a3de88002 307 }else{
bobgiesberts 22:ac26f52ebaf8 308 // count the skipper in pairs, so after the last one
bobgiesberts 22:ac26f52ebaf8 309 if ( sensor == sensors-1 )
bobgiesberts 22:ac26f52ebaf8 310 skip++;
bobgiesberts 21:b96a3de88002 311 }
bobgiesberts 21:b96a3de88002 312 }else{
bobgiesberts 21:b96a3de88002 313 bob.error();
bobgiesberts 21:b96a3de88002 314 }
bobgiesberts 21:b96a3de88002 315 }
bobgiesberts 15:5de8394fdb3c 316
bobgiesberts 20:1c5ea04a3b2a 317 // Write a full package of data points to the SD card
bobgiesberts 20:1c5ea04a3b2a 318 if( counter >= package_size-1 )
bobgiesberts 20:1c5ea04a3b2a 319 {
bobgiesberts 22:ac26f52ebaf8 320 // No need to measure temperature with 10+ Hz
bobgiesberts 22:ac26f52ebaf8 321 // only calculate the temperature once every time data is stored
bobgiesberts 22:ac26f52ebaf8 322 collected.T = thermometer->getTemperature();
bobgiesberts 22:ac26f52ebaf8 323 storeit( );
bobgiesberts 6:ff39d60061ca 324 }
bobgiesberts 21:b96a3de88002 325
bobgiesberts 21:b96a3de88002 326 bob.no_error();
bobgiesberts 10:3cab80866536 327 }
bobgiesberts 22:ac26f52ebaf8 328
bobgiesberts 22:ac26f52ebaf8 329 // Reset the skipper
bobgiesberts 21:b96a3de88002 330 skip = 0;
bobgiesberts 12:cceece4f3afb 331
bobgiesberts 12:cceece4f3afb 332 // Write remaining data to the SD card
bobgiesberts 12:cceece4f3afb 333 if( counter > 0 )
bobgiesberts 20:1c5ea04a3b2a 334 {
bobgiesberts 22:ac26f52ebaf8 335 collected.T = thermometer->getTemperature();
bobgiesberts 22:ac26f52ebaf8 336 storeit( );
bobgiesberts 20:1c5ea04a3b2a 337 }
bobgiesberts 10:3cab80866536 338
bobgiesberts 17:a4700b1c3c37 339 // prepare for sleep: delete and power down the periphery (SD, crystal and LDC1614)
bobgiesberts 21:b96a3de88002 340 ldc->shutdown(); // _LDC_SD --> 1
bobgiesberts 21:b96a3de88002 341 bob.shutdown_periphery(); // 3V3 --> 0
bobgiesberts 21:b96a3de88002 342
bobgiesberts 21:b96a3de88002 343 // LDC I2C
bobgiesberts 12:cceece4f3afb 344 delete ldc; ldc = NULL; // unload library to be able to power down completely
bobgiesberts 21:b96a3de88002 345 bob.shutdown_pin( _LDC_SDA );
bobgiesberts 21:b96a3de88002 346 bob.shutdown_pin( _LDC_SCL );
bobgiesberts 22:ac26f52ebaf8 347 bob.shutdown_pin( _LDC_SD );
bobgiesberts 21:b96a3de88002 348
bobgiesberts 21:b96a3de88002 349 // SD SPI
bobgiesberts 21:b96a3de88002 350 delete sd; sd = NULL; // unload library to be able to power down completely
bobgiesberts 21:b96a3de88002 351 bob.shutdown_pin( _SD_PRESENT );
bobgiesberts 21:b96a3de88002 352 bob.shutdown_pin( _SD_CS );
bobgiesberts 21:b96a3de88002 353 bob.shutdown_pin( _SD_MOSI );
bobgiesberts 21:b96a3de88002 354 bob.shutdown_pin( _SD_SCLK );
bobgiesberts 21:b96a3de88002 355 bob.shutdown_pin( _SD_MISO );
bobgiesberts 21:b96a3de88002 356
bobgiesberts 21:b96a3de88002 357 // PC ports (SWD / UARTO)
bobgiesberts 21:b96a3de88002 358 bob.shutdown_pin( PTA0 ); // SWD_CLK
bobgiesberts 21:b96a3de88002 359 bob.shutdown_pin( PTA1 ); // UARTO_RX
bobgiesberts 21:b96a3de88002 360 bob.shutdown_pin( PTA2 ); // UARTO_TX
bobgiesberts 21:b96a3de88002 361 bob.shutdown_pin( PTA3 ); // SWD_DIO
bobgiesberts 22:ac26f52ebaf8 362
bobgiesberts 21:b96a3de88002 363 // bob.shutdown_pin( PTA20, 1 ); // RESET (does not work properly)
bobgiesberts 21:b96a3de88002 364
bobgiesberts 21:b96a3de88002 365 // Thermometer
bobgiesberts 21:b96a3de88002 366 delete thermometer; thermometer = NULL; // unload library to be able to power down completely
bobgiesberts 21:b96a3de88002 367 bob.shutdown_pin( _Tpin );
bobgiesberts 21:b96a3de88002 368
bobgiesberts 21:b96a3de88002 369 // Button
bobgiesberts 21:b96a3de88002 370 bob.shutdown_pin( _BUTTON );
bobgiesberts 21:b96a3de88002 371
bobgiesberts 12:cceece4f3afb 372
bobgiesberts 16:b53721840a38 373 // if the battery is almost empty (Vbatt < 3.10 V), the thermometer stops
bobgiesberts 12:cceece4f3afb 374 // working well and L can not be corrected. So just shut down...
bobgiesberts 12:cceece4f3afb 375 if( bob.battery() < 3.10f )
bobgiesberts 12:cceece4f3afb 376 {
bobgiesberts 21:b96a3de88002 377 bob.error( 5 ); // error: battery empty
bobgiesberts 12:cceece4f3afb 378 exit(0);
bobgiesberts 12:cceece4f3afb 379 }
bobgiesberts 10:3cab80866536 380
bobgiesberts 11:599ca9982e45 381 // what time is it now?
bobgiesberts 11:599ca9982e45 382 prev = now;
bobgiesberts 11:599ca9982e45 383 now = (uint32_t) clock();
bobgiesberts 11:599ca9982e45 384 if( now < prev )
bobgiesberts 11:599ca9982e45 385 t_high++;
bobgiesberts 11:599ca9982e45 386 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high;
bobgiesberts 10:3cab80866536 387
bobgiesberts 8:8cc1960467ae 388 // Calculate sleeping time (correction to INTERVAL_OFF)
bobgiesberts 12:cceece4f3afb 389 // t has passed the limit of next. Those few ms are substracted from INTERVAL_OFF.
bobgiesberts 11:599ca9982e45 390 t_sleep = INTERVAL_OFF*100 - (t - next);
bobgiesberts 8:8cc1960467ae 391
bobgiesberts 12:cceece4f3afb 392 // Calculate time that will be lost during sleep
bobgiesberts 11:599ca9982e45 393 lost_prev = t_lost;
bobgiesberts 11:599ca9982e45 394 t_lost += t_sleep;
bobgiesberts 11:599ca9982e45 395 if( t_lost < lost_prev )
bobgiesberts 11:599ca9982e45 396 lost_high++;
bobgiesberts 13:2caedc56b863 397
bobgiesberts 11:599ca9982e45 398 // Sleep now (ms), enter low power mode
bobgiesberts 11:599ca9982e45 399 bob.sleep( t_sleep * 10 );
bobgiesberts 10:3cab80866536 400
bobgiesberts 0:e81b68888268 401 }
bobgiesberts 21:b96a3de88002 402 }
bobgiesberts 11:599ca9982e45 403
bobgiesberts 11:599ca9982e45 404