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:
Sun Sep 11 15:09:14 2016 +0000
Revision:
20:1c5ea04a3b2a
Parent:
19:c0707d20bada
Child:
21:b96a3de88002
Working version with most functions checked.

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