On boot, logs 10 seconds of current draw information from an INA169 breakout board to an SD card.
Dependencies: SDFileSystem mbed
main.cpp
- Committer:
- ShawnHymel
- Date:
- 2015-07-24
- Revision:
- 0:c407693ac016
File content as of revision 0:c407693ac016:
/** * Current Log-O-Matic * Author: Shawn Hymel @ SparkFun Electronics * Date: July 1, 2015 * * Measures current using an INA169 breakout board. Stores current and timestamp * to an SD card. * * INA169 Vout -> Pin 15 * SD Card DI -> Pin 5 * SD Card DO -> Pin 6 * SD Card SCK -> Pin 7 * SD Card CS -> Pin 8 * * This code is beerware; if you see me (or any other SparkFun * employee) at the local, and you've found our code helpful, please * buy us a round! * * Distributed as-is; no warranty is given. */ #include "mbed.h" #include "SDFileSystem.h" #define DEBUG 1 // 1 to print to console. 0 to turn off. #define MAX_FILES 100 // Maximum number of log files to store on SD #define DELAY_MS 0.02 // Time between samples (in seconds) #define NUM_SAMPLES 500 // Number of samples to collect #define RS 0.5 // Value of RS (sensing resistor) in ohms #define RL 10000 // Value of RL (output resistor) in ohms // Digital output (status LED) DigitalOut status_led(LED1); // Analog input (pin 15) AnalogIn ain(p15); // USB serial (tx, rx) Serial pc(USBTX, USBRX); // SD card (SPI pins) SDFileSystem sd(p5, p6, p7, p8, "sd"); // Global variables const char file_root[] = "idata"; const char file_suffix[] = ".csv"; char filename[20]; Timer timer; // Return true if file (or directory) 'filename' is present in directory 'root' // Based on: https://developer.mbed.org/forum/mbed/topic/463/ bool exists(char * root, char *filename) { DIR *d = opendir(root); struct dirent *p; bool found = false; if ( d != NULL ) { while ( !found && (p = readdir(d)) != NULL ) { if ( strcmp(p->d_name, filename) == 0 ) found = true; } } closedir(d); return found; } // Main int main( void ) { FILE *file; char str[5]; int i; int led_state; float voltage_in; float current; float timestamp; // Debugging start #if DEBUG == 1 printf("\n\r"); printf("-------------------\n\r"); printf("Current Log-O-Matic\n\r"); printf("-------------------\n\r"); #endif // Create next file in sequence for ( i = 0; i < MAX_FILES; i++ ) { // Construct filename strcpy(filename, file_root); sprintf(str, "%d", i); strcat(filename, str); strcat(filename, file_suffix); // If file exists, skip to next. If not, create it. if ( exists("/sd", filename) ) { #if DEBUG == 1 printf ("%s found\n\r", filename); #endif if ( i == (MAX_FILES - 1) ) { error("ERROR: Too many files!\n\r"); return -1; } } else { #if DEBUG == 1 printf ("%s not found. Creating.\n\r", filename); #endif break; } } // Construct absolute path to file strcpy(filename, "/sd/"); strcat(filename, file_root); sprintf(str, "%d", i); strcat(filename, str); strcat(filename, file_suffix); // Open file for writing #if DEBUG == 1 printf("Opening %s\n\r", filename); #endif file = fopen(filename, "w"); if ( file == NULL ) { error("ERROR: Could not open file for writing!\n\r"); return -1; } // Write header to file fprintf(file, "Time,Current\n\r"); // Start timer and begin sampling led_state = 0; #if DEBUG == 1 printf("Sampling. Do not remove SD card!\n\r"); #endif timer.start(); for ( i = 0; i < NUM_SAMPLES; i++ ) { // Write data to csv file timestamp = timer.read(); voltage_in = ain * 3.3; current = (voltage_in * 1000) / (RS * RL); fprintf(file, "%2.2f,%1.3f\n", timestamp, current); #if DEBUG == 1 printf("%2.2f, %1.3f\n\r", timestamp, current); #endif // Toggle LED to show logging led_state ^= 1; status_led = led_state; // Wait until next sample cycle as defined by sample delay while ( (timer.read() - timestamp) < DELAY_MS ); } // Close file #if DEBUG == 1 printf("Done! Closing file"); #endif fclose(file); // Turn off LED to show done status_led = 0; return 0; }