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
main.cpp@22:ac26f52ebaf8, 2016-10-05 (annotated)
- Committer:
- bobgiesberts
- Date:
- Wed Oct 05 08:15:57 2016 +0000
- Revision:
- 22:ac26f52ebaf8
- Parent:
- 21:b96a3de88002
Intermediate version for debugging power issues
Who changed what in which revision?
User | Revision | Line number | New 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 |