Colin Monroe
/
CKM_algorithmsMidterm_Q2
CKM algorithms midterm: Question 2
main.cpp@2:1771e1827f75, 2016-10-09 (annotated)
- Committer:
- CKMonroe
- Date:
- Sun Oct 09 05:47:40 2016 +0000
- Revision:
- 2:1771e1827f75
- Parent:
- 1:859677d7ccb4
Final revision after tests of precision of slider (program remains the same)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
CKMonroe | 0:c4236b4df489 | 1 | #include "mbed.h" |
CKMonroe | 0:c4236b4df489 | 2 | #include <math.h> |
CKMonroe | 0:c4236b4df489 | 3 | #include "TSISensor.h" |
CKMonroe | 0:c4236b4df489 | 4 | #include "SLCD.h" |
CKMonroe | 0:c4236b4df489 | 5 | |
CKMonroe | 0:c4236b4df489 | 6 | #define LEDON false |
CKMonroe | 0:c4236b4df489 | 7 | #define LEDOFF true |
CKMonroe | 0:c4236b4df489 | 8 | #define NUMBUTS 2 |
CKMonroe | 0:c4236b4df489 | 9 | #define LBUT PTC12 // port addresses for buttons |
CKMonroe | 0:c4236b4df489 | 10 | #define RBUT PTC3 |
CKMonroe | 0:c4236b4df489 | 11 | #define ARGUMENTSTATE 0 |
CKMonroe | 0:c4236b4df489 | 12 | #define ANSWERSTATE 1 |
CKMonroe | 0:c4236b4df489 | 13 | #define TSILIMIT 0.01 |
CKMonroe | 1:859677d7ccb4 | 14 | #define PRINTDELTA 0.01 |
CKMonroe | 0:c4236b4df489 | 15 | #define LCDCHARLEN 10 |
CKMonroe | 0:c4236b4df489 | 16 | #define DATAINTERVAL 0.1 |
CKMonroe | 0:c4236b4df489 | 17 | #define BUTTONTIME 0.1 |
CKMonroe | 0:c4236b4df489 | 18 | #define PROGNAME "kl46z_slider_mid_v1\n\r" |
CKMonroe | 0:c4236b4df489 | 19 | |
CKMonroe | 0:c4236b4df489 | 20 | SLCD slcd; //define LCD display |
CKMonroe | 0:c4236b4df489 | 21 | Serial pc(USBTX, USBRX); |
CKMonroe | 0:c4236b4df489 | 22 | |
CKMonroe | 0:c4236b4df489 | 23 | Timer dataTimer; |
CKMonroe | 0:c4236b4df489 | 24 | Timer ButtonTimer; // for reading button states |
CKMonroe | 0:c4236b4df489 | 25 | DigitalIn buttons[NUMBUTS] = {RBUT, LBUT}; |
CKMonroe | 0:c4236b4df489 | 26 | float tsidata; |
CKMonroe | 0:c4236b4df489 | 27 | int displayState; |
CKMonroe | 0:c4236b4df489 | 28 | |
CKMonroe | 0:c4236b4df489 | 29 | void initialize_global_vars(){ |
CKMonroe | 0:c4236b4df489 | 30 | pc.printf(PROGNAME); |
CKMonroe | 0:c4236b4df489 | 31 | // set up DAQ timers |
CKMonroe | 0:c4236b4df489 | 32 | ButtonTimer.start(); |
CKMonroe | 0:c4236b4df489 | 33 | ButtonTimer.reset(); |
CKMonroe | 0:c4236b4df489 | 34 | dataTimer.start(); |
CKMonroe | 0:c4236b4df489 | 35 | dataTimer.reset(); |
CKMonroe | 0:c4236b4df489 | 36 | } |
CKMonroe | 0:c4236b4df489 | 37 | |
CKMonroe | 0:c4236b4df489 | 38 | void LCDMess(char *lMess){ |
CKMonroe | 0:c4236b4df489 | 39 | slcd.Home(); |
CKMonroe | 0:c4236b4df489 | 40 | slcd.clear(); |
CKMonroe | 0:c4236b4df489 | 41 | slcd.printf(lMess); |
CKMonroe | 0:c4236b4df489 | 42 | } |
CKMonroe | 0:c4236b4df489 | 43 | |
CKMonroe | 0:c4236b4df489 | 44 | int main(void) { |
CKMonroe | 0:c4236b4df489 | 45 | int i; |
CKMonroe | 0:c4236b4df489 | 46 | char lcdData[LCDCHARLEN]; |
CKMonroe | 0:c4236b4df489 | 47 | float lastTouch = 0.0; |
CKMonroe | 0:c4236b4df489 | 48 | TSISensor tsi; |
CKMonroe | 0:c4236b4df489 | 49 | float tempTSI; |
CKMonroe | 0:c4236b4df489 | 50 | PwmOut gled(LED_GREEN); |
CKMonroe | 0:c4236b4df489 | 51 | PwmOut rled(LED_RED); |
CKMonroe | 0:c4236b4df489 | 52 | |
CKMonroe | 0:c4236b4df489 | 53 | initialize_global_vars(); |
CKMonroe | 0:c4236b4df489 | 54 | |
CKMonroe | 0:c4236b4df489 | 55 | while (true) { |
CKMonroe | 0:c4236b4df489 | 56 | if (ButtonTimer > BUTTONTIME){ |
CKMonroe | 0:c4236b4df489 | 57 | for (i=0; i<NUMBUTS; i++){ // index will be 0 or 1 |
CKMonroe | 0:c4236b4df489 | 58 | if(!buttons[i]) { |
CKMonroe | 0:c4236b4df489 | 59 | displayState = i; //set display state |
CKMonroe | 0:c4236b4df489 | 60 | } // if ! buttons |
CKMonroe | 0:c4236b4df489 | 61 | }// for loop to look at buttons |
CKMonroe | 0:c4236b4df489 | 62 | |
CKMonroe | 0:c4236b4df489 | 63 | ButtonTimer.reset(); |
CKMonroe | 0:c4236b4df489 | 64 | }//end if buttonTimer |
CKMonroe | 0:c4236b4df489 | 65 | |
CKMonroe | 0:c4236b4df489 | 66 | //if statements to do stuff based off of display state |
CKMonroe | 0:c4236b4df489 | 67 | |
CKMonroe | 0:c4236b4df489 | 68 | //press right button - SELECT MODE (red led) |
CKMonroe | 0:c4236b4df489 | 69 | if (displayState == 0){ |
CKMonroe | 2:1771e1827f75 | 70 | |
CKMonroe | 2:1771e1827f75 | 71 | //turn on red led |
CKMonroe | 0:c4236b4df489 | 72 | rled = 0.0; |
CKMonroe | 0:c4236b4df489 | 73 | gled = 1.0; |
CKMonroe | 0:c4236b4df489 | 74 | |
CKMonroe | 2:1771e1827f75 | 75 | //send data to LCD |
CKMonroe | 2:1771e1827f75 | 76 | //note that the tsidata read from the slider |
CKMonroe | 2:1771e1827f75 | 77 | //only reads 2 digits past the decimal (i.e. 0.88) |
CKMonroe | 2:1771e1827f75 | 78 | //as a percentage. Therefore, if we have the slider |
CKMonroe | 2:1771e1827f75 | 79 | //reach a max value of 100, i do not think the slider |
CKMonroe | 2:1771e1827f75 | 80 | //is precise enough to still be able to measure a value |
CKMonroe | 2:1771e1827f75 | 81 | //as precise as 0.1 to use for a step. |
CKMonroe | 2:1771e1827f75 | 82 | sprintf (lcdData,"%2.1f",tsidata*100 ); |
CKMonroe | 0:c4236b4df489 | 83 | |
CKMonroe | 0:c4236b4df489 | 84 | //if statement to read tsi |
CKMonroe | 0:c4236b4df489 | 85 | if(dataTimer.read() > DATAINTERVAL){ |
CKMonroe | 0:c4236b4df489 | 86 | dataTimer.reset(); |
CKMonroe | 0:c4236b4df489 | 87 | tempTSI = tsi.readPercentage(); |
CKMonroe | 0:c4236b4df489 | 88 | if (tempTSI > TSILIMIT){ |
CKMonroe | 0:c4236b4df489 | 89 | tsidata = tempTSI; |
CKMonroe | 0:c4236b4df489 | 90 | if (fabs(tsidata - lastTouch)> PRINTDELTA){ |
CKMonroe | 0:c4236b4df489 | 91 | pc.printf("Position %0.4f\n\r", tsidata); |
CKMonroe | 0:c4236b4df489 | 92 | } |
CKMonroe | 0:c4236b4df489 | 93 | } |
CKMonroe | 0:c4236b4df489 | 94 | lastTouch=tsidata; |
CKMonroe | 0:c4236b4df489 | 95 | }// end if statement to read tsi |
CKMonroe | 0:c4236b4df489 | 96 | } //end if statement for display state = 0 |
CKMonroe | 0:c4236b4df489 | 97 | //press left button - CALC MODE (green led) |
CKMonroe | 0:c4236b4df489 | 98 | else if (displayState == 1){ |
CKMonroe | 2:1771e1827f75 | 99 | //turn on red led |
CKMonroe | 0:c4236b4df489 | 100 | rled = 1.0; |
CKMonroe | 0:c4236b4df489 | 101 | gled = 0.0; |
CKMonroe | 0:c4236b4df489 | 102 | |
CKMonroe | 2:1771e1827f75 | 103 | //multiply tsidata percentage by 100 |
CKMonroe | 0:c4236b4df489 | 104 | float data = tsidata*100; |
CKMonroe | 0:c4236b4df489 | 105 | |
CKMonroe | 2:1771e1827f75 | 106 | //initialize variables for calculation |
CKMonroe | 0:c4236b4df489 | 107 | float xOld = 0.0; |
CKMonroe | 0:c4236b4df489 | 108 | float xNew = 0.0; |
CKMonroe | 0:c4236b4df489 | 109 | |
CKMonroe | 0:c4236b4df489 | 110 | //calculate newton's method for square root |
CKMonroe | 0:c4236b4df489 | 111 | xOld = float(data/2.5); //make first guess |
CKMonroe | 0:c4236b4df489 | 112 | for (int x = 0; x< 20; x++){ |
CKMonroe | 0:c4236b4df489 | 113 | xNew = 0.5 * (xOld + data/xOld) ; |
CKMonroe | 0:c4236b4df489 | 114 | float delta = fabs(xNew-xOld); //compare new and old values |
CKMonroe | 0:c4236b4df489 | 115 | if (delta < 1e-7) |
CKMonroe | 0:c4236b4df489 | 116 | break; |
CKMonroe | 0:c4236b4df489 | 117 | else |
CKMonroe | 0:c4236b4df489 | 118 | xOld = xNew; //replace calculated value and retry |
CKMonroe | 0:c4236b4df489 | 119 | }//end for loop |
CKMonroe | 0:c4236b4df489 | 120 | |
CKMonroe | 0:c4236b4df489 | 121 | //display data |
CKMonroe | 0:c4236b4df489 | 122 | sprintf (lcdData,"%1.2f",xNew); |
CKMonroe | 0:c4236b4df489 | 123 | |
CKMonroe | 0:c4236b4df489 | 124 | } //end displaystate 1 |
CKMonroe | 0:c4236b4df489 | 125 | |
CKMonroe | 0:c4236b4df489 | 126 | |
CKMonroe | 0:c4236b4df489 | 127 | LCDMess(lcdData); |
CKMonroe | 0:c4236b4df489 | 128 | } //end while true |
CKMonroe | 0:c4236b4df489 | 129 | }//end main |