Claes Ekengren
/
Measurement_system
main.cpp
- Committer:
- CE
- Date:
- 2011-01-06
- Revision:
- 0:0732b16d9a92
File content as of revision 0:0732b16d9a92:
#include "mbed.h" #include "TFT_4DGL.h" #include "MSCFileSystem.h" #include "IniFile.h" // Ini file value (int/bool/string) // Key1 = 123 -> 123 (int) // Key2 = 0x123 -> 291 (int) // Key3 = FALSE -> false (bool) // Key4 = TRUE -> true (bool) // Key5 = 123 -> true (bool) // key6 = abc "def -> 'abc "def' (string) // key7 = " ghi "jkl " -> ' ghi "jkl '(string) // #comment line //uLCD-32PT(SGC) 4d-systems display TFT_4DGL display(p9,p10,p11); // serial tx, serial rx, reset pin; Serial pc2(USBTX, USBRX); // tx, rx DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DigitalIn adc_stop(p12); AnalogIn Sense1(p15); //Sensor 1 AnalogIn Sense2(p16); //Sensor 2 AnalogIn Sense3(p17); //Sensor 3 AnalogIn Sense4(p18); //Sensor 4 AnalogIn Sense5(p19); //Sensor 5 AnalogIn Sense6(p20); //Sensor 6 Ticker t1; //Timer 1 Ticker t2; //Timer 2 Timer timer; #ifndef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifndef ABS #define ABS(a) (((a) < 0) ? -(a) : (a)) #endif #define ROOT_PATH "/local/" #define ROOT_LEN (sizeof(ROOT_PATH) - 1) const char INI_FILE[] = ROOT_PATH "param.ini"; const char DEFAULT_ADC_FILENAME[] = "data.csv"; const int DEFAULT_SAMPLES = 200; const int DEFAULT_SPEED = 100; const int INI_BUF = 100; // Function Declarations void tint1( void ); void tint2( void ); void alarm( int val, int lim); float convert( char *str); float analog1( int val2); float analog2( int val2); float analog3( int val2); float analog4( int val2); float analog5( int val2); float analog6( int val2); float FloatingAverage1( float newval1); float FloatingAverage2( float newval2); float FloatingAverage3( float newval3); float FloatingAverage4( float newval4); float FloatingAverage5( float newval5); float FloatingAverage6( float newval6); int intflag1; int intflag2; int x = 0, y = 0, status, xc = 0, yc = 0; int begin, end; float adc_time = 0.1; int main() { char s[100]; unsigned int v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0; unsigned int Dcount = 0; float ComVal = 0.0; unsigned short usCurrentValue; float Voltage1; float Voltage2; float Voltage3; float Voltage4; float Voltage5; float Voltage6; pc2.baud(115200); int file_nr = 0; char clear[] = {27, '[', '2', 'J'}; char home[] = {27, '[', '0', '0', 'H'}; char adc_filename[INI_BUF]; int adc_samples = DEFAULT_SAMPLES; int adc_speed_ms = DEFAULT_SPEED; LocalFileSystem local("local"); { pc2.printf("%s", clear); pc2.printf("%s", home); strcpy(adc_filename, DEFAULT_ADC_FILENAME); IniFile::getval(INI_FILE, "FILENAME", adc_filename, sizeof(adc_filename)); IniFile::getval(INI_FILE, "SAMPLES", adc_samples); IniFile::getval(INI_FILE, "SPEED", adc_speed_ms); printf("\n\n"); printf("FILENAME = %s\n", adc_filename); printf("SAMPLES = %d\n", adc_samples); printf("SPEED = %d\n", adc_speed_ms); wait(1); adc_time = (float) adc_speed_ms/1000.0; printf("\nadc_time = %.2f sec", adc_time); } display.baudrate(256000); //display.uSD_Image(0, 0, 0x000000); //Display the mbed image - X-pos, Y-pos, Sector Address //wait(4.0); //display.cls(); //display.uSD_Image(80, 240, 0x00E2); //Display the mbed image - X-pos, Y-pos, Sector Address //wait(4.0); display.cls(); display.background_color(LGREY); display.pen_size(WIREFRAME); display.text_mode(TRANSPARENT); display.text_string("ADC LOGGER ver 1.01", 3, 1, FONT_8X8, 0x000000); display.pen_size(SOLID); display.pen_size(WIREFRAME); display.rectangle(18, 132, 220, 301, 0x000000); display.pen_size(SOLID); display.rectangle(19, 133, 219, 300, 0xFFFFFF); display.text_string("SAMPLES : ", 3, 8, FONT_8X8, 0x000000); display.text_string("ADC1: ", 3, 10, FONT_8X8, BLACK); display.text_string("ADC2: ", 3, 11, FONT_8X8, BLUE); display.text_string("ADC3: ", 3, 12, FONT_8X8, RED); display.text_string("ADC4: ", 3, 13, FONT_8X8, DGREEN); display.text_string("ADC5: ", 3, 14, FONT_8X8, BROWN); display.text_string("ADC6: ", 3, 15, FONT_8X8, MAGENTA); t1.attach(&tint1,adc_time); t2.attach(&tint2,1.0); display.set_font(FONT_8X8); display.pen_size(SOLID); display.text_mode(OPAQUE); display.color( 0x000000); display.display_control(TOUCH_CTRL, ENABLE); display.set_touch(0, 0, 239, 319); pc2.printf("%s", clear); pc2.printf("%s", home); while (1) { MSCFileSystem msc("local"); // Mount flash drive under the name "local" { display.text_mode(TRANSPARENT); display.text_button("START", UP, 20, 30, 0x00FF00, FONT_12X16, BLACK, 1, 1); display.text_mode(OPAQUE); while (!((x > 20 && x < 88) && (y > 30 && y < 53))) { display.Pause_Until_Touch(&x, &y); pc2.printf("x=%i\n",x); pc2.printf("y=%i\n",y); } x = 0; y = 0; display.pen_size(SOLID); display.rectangle(20, 30, 88, 53, LGREY); Dcount = 19; file_nr = file_nr + 1; int i; char path[INI_BUF]; sprintf(path, "/local/%i%s", file_nr, adc_filename); printf(path, "\n/local/%i%s", file_nr, adc_filename); printf("\n"); FILE *fp = fopen(path, "w"); // Open "adc_filename.csv" on the local file system for writing display.rectangle(19, 133, 219, 300, 0xFFFFFF); ComVal = adc_samples; timer.start(); begin = timer.read_us(); for (i=0; i < ComVal ; i++) { led4 = 1; while (intflag1 == 0) { wait_us(10); } intflag1 = 0; pc2.printf("i = %i\n", i+1) ; display.locate(13,8); sprintf(s, "%d ",i+1); display.puts(s); display.locate(20,8); sprintf(s, "(%.0f) ",ComVal); display.puts(s); Voltage1 = FloatingAverage1(analog1(usCurrentValue)); Voltage2 = FloatingAverage2(analog2(usCurrentValue)); Voltage3 = FloatingAverage3(analog3(usCurrentValue)); Voltage4 = FloatingAverage4(analog4(usCurrentValue)); Voltage5 = FloatingAverage5(analog5(usCurrentValue)); Voltage6 = FloatingAverage6(analog6(usCurrentValue)); if (Dcount >= 219) { Dcount = 19; display.rectangle(19, 133, 219, 300, 0xFFFFFF); } v1 = Voltage1 * 50; v1 = 299 - v1; display.pixel(Dcount, v1, BLACK); v2 = Voltage2 * 50; v2 = 299 - v2; display.pixel(Dcount, v2, BLUE); v3 = Voltage3 * 50; v3 = 299 - v3; display.pixel(Dcount, v3, RED); v4 = Voltage4 * 50; v4 = 299 - v4; display.pixel(Dcount, v4, DGREEN); v5 = Voltage5 * 50; v5 = 299 - v5; display.pixel(Dcount, v5, ORANGE); v6 = Voltage6 * 50; v6 = 299 - v6; display.pixel(Dcount, v6, MAGENTA); Dcount++; if (intflag2 == 1) { display.locate(9,10); sprintf(s, "%.3f volt ", MAX(Voltage1,0)); display.puts(s); display.locate(9,11); sprintf(s, "%.3f volt ", MAX(Voltage2,0)); display.puts(s); display.locate(9,12); sprintf(s, "%.3f volt ", MAX(Voltage3,0)); display.puts(s); display.locate(9,13); sprintf(s, "%.3f volt ", MAX(Voltage4,0)); display.puts(s); display.locate(9,14); sprintf(s, "%.1f deg c ",Voltage5*100-273.12); display.puts(s); display.locate(9,15); sprintf(s, "%.1f deg c ",Voltage6*100-273.12); display.puts(s); intflag2 = 0; } fprintf(fp, "%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\r\n",(i+1) , Voltage1, Voltage2, Voltage3, Voltage4, Voltage5, Voltage6); if (!adc_stop) { i = ComVal; } } end = timer.read_us(); printf("Time = %d us\n", end - begin); fclose(fp); led4 = 0; } } } // Convert command float convert( char *str) { float ComVal; ComVal = atoi(str+1); return ComVal; } // Interrupt for the Timer 1 void tint1( void ) { led2 = !led2; intflag1 = 1; } // Interrupt for the Timer 2 void tint2( void ) { led3 = !led3; intflag2 = 1; } // ADC1 float analog1( int val2) { float usCurrentValue = Sense1.read_u16()/16; return usCurrentValue*3.3/4095; } // ADC2 float analog2( int val2) { float usCurrentValue = Sense2.read_u16()/16; return usCurrentValue*3.3/4095; } // ADC3 float analog3( int val2) { float usCurrentValue = Sense3.read_u16()/16; return usCurrentValue*3.3/4095; } // ADC4 float analog4( int val2) { float usCurrentValue = Sense4.read_u16()/16; return usCurrentValue*3.3/4095; } // ADC5 float analog5( int val2) { float usCurrentValue = Sense5.read_u16()/16; return usCurrentValue*3.3/4095; } // ADC6 float analog6( int val2) { float usCurrentValue = Sense6.read_u16()/16; return usCurrentValue*3.3/4095; } // Floating Average routine 1 float FloatingAverage1(float newval1) { static float numbers[5]; static float sum = 0; static int count = 0; int size; int i; size = sizeof(numbers)/sizeof(float); if (count < size) { count++; } else { sum -= numbers[0]; } for (i = size - count ; i < size-1; i++) { numbers[i] = numbers[i+1]; } sum += newval1; numbers[size-1] = newval1; return sum / (float)count; } // Floating Average routine 2 float FloatingAverage2(float newval2) { static float numbers[5]; static float sum = 0; static int count = 0; int size; int i; size = sizeof(numbers)/sizeof(float); if (count < size) { count++; } else { sum -= numbers[0]; } for (i = size - count ; i < size-1; i++) { numbers[i] = numbers[i+1]; } sum += newval2; numbers[size-1] = newval2; return sum / (float)count; } // Floating Average routine 3 float FloatingAverage3(float newval3) { static float numbers[5]; static float sum = 0; static int count = 0; int size; int i; size = sizeof(numbers)/sizeof(float); if (count < size) { count++; } else { sum -= numbers[0]; } for (i = size - count ; i < size-1; i++) { numbers[i] = numbers[i+1]; } sum += newval3; numbers[size-1] = newval3; return sum / (float)count; } // Floating Average routine 4 float FloatingAverage4(float newval4) { static float numbers[5]; static float sum = 0; static int count = 0; int size; int i; size = sizeof(numbers)/sizeof(float); if (count < size) { count++; } else { sum -= numbers[0]; } for (i = size - count ; i < size-1; i++) { numbers[i] = numbers[i+1]; } sum += newval4; numbers[size-1] = newval4; return sum / (float)count; } // Floating Average routine 5 float FloatingAverage5(float newval5) { static float numbers[5]; static float sum = 0; static int count = 0; int size; int i; size = sizeof(numbers)/sizeof(float); if (count < size) { count++; } else { sum -= numbers[0]; } for (i = size - count ; i < size-1; i++) { numbers[i] = numbers[i+1]; } sum += newval5; numbers[size-1] = newval5; return sum / (float)count; } // Floating Average routine 6 float FloatingAverage6(float newval6) { static float numbers[5]; static float sum = 0; static int count = 0; int size; int i; size = sizeof(numbers)/sizeof(float); if (count < size) { count++; } else { sum -= numbers[0]; } for (i = size - count ; i < size-1; i++) { numbers[i] = numbers[i+1]; } sum += newval6; numbers[size-1] = newval6; return sum / (float)count; }