Nathaniel Garcia
/
SquareRoot_Calculator_KL46Z
Gets input from slider and returns the square root of that number
main.cpp@1:81905675b73e, 2016-10-07 (annotated)
- Committer:
- Raiden817
- Date:
- Fri Oct 07 02:16:15 2016 +0000
- Revision:
- 1:81905675b73e
- Parent:
- 0:be53fac41c7a
SquareRoot with slider
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Raiden817 | 0:be53fac41c7a | 1 | #include "mbed.h" |
Raiden817 | 0:be53fac41c7a | 2 | #include <math.h> |
Raiden817 | 0:be53fac41c7a | 3 | #include "TSISensor.h" |
Raiden817 | 0:be53fac41c7a | 4 | #include "SLCD.h" |
Raiden817 | 0:be53fac41c7a | 5 | |
Raiden817 | 0:be53fac41c7a | 6 | #define LEDON false |
Raiden817 | 0:be53fac41c7a | 7 | #define FEDOFF true |
Raiden817 | 0:be53fac41c7a | 8 | #define NUMBUTS 2 |
Raiden817 | 0:be53fac41c7a | 9 | #define LBUT PTC12 |
Raiden817 | 0:be53fac41c7a | 10 | #define RBUT PTC3 |
Raiden817 | 0:be53fac41c7a | 11 | #define ARGUENTSTATE 0 |
Raiden817 | 0:be53fac41c7a | 12 | #define ARGUMENTANSWER 1 |
Raiden817 | 0:be53fac41c7a | 13 | #define TSILIMIT 0.01 |
Raiden817 | 0:be53fac41c7a | 14 | #define PRINTDELTA 0.01 |
Raiden817 | 0:be53fac41c7a | 15 | #define LCDCHARLEN 10 |
Raiden817 | 0:be53fac41c7a | 16 | #define DATAINTERVAL 0.1 |
Raiden817 | 0:be53fac41c7a | 17 | #define BUTTONTIME 0.1 |
Raiden817 | 0:be53fac41c7a | 18 | #define PROGNAME "kSquareRoot_Calculator_KL46Z\n\r" |
Raiden817 | 0:be53fac41c7a | 19 | |
Raiden817 | 0:be53fac41c7a | 20 | SLCD slcd; //define LCD display |
Raiden817 | 0:be53fac41c7a | 21 | Serial pc(USBTX, USBRX); |
Raiden817 | 0:be53fac41c7a | 22 | |
Raiden817 | 0:be53fac41c7a | 23 | Timer dataTimer; |
Raiden817 | 0:be53fac41c7a | 24 | Timer buttonTimer; |
Raiden817 | 0:be53fac41c7a | 25 | DigitalIn buttons[NUMBUTS] = {RBUT, LBUT}; |
Raiden817 | 0:be53fac41c7a | 26 | |
Raiden817 | 0:be53fac41c7a | 27 | float tsiData; |
Raiden817 | 0:be53fac41c7a | 28 | int displayState; |
Raiden817 | 0:be53fac41c7a | 29 | |
Raiden817 | 0:be53fac41c7a | 30 | void initialize_global_vars(){ |
Raiden817 | 0:be53fac41c7a | 31 | pc.printf(PROGNAME); |
Raiden817 | 0:be53fac41c7a | 32 | |
Raiden817 | 0:be53fac41c7a | 33 | buttonTimer.start(); |
Raiden817 | 0:be53fac41c7a | 34 | buttonTimer.reset(); |
Raiden817 | 0:be53fac41c7a | 35 | dataTimer.start(); |
Raiden817 | 0:be53fac41c7a | 36 | dataTimer.reset(); |
Raiden817 | 0:be53fac41c7a | 37 | } |
Raiden817 | 0:be53fac41c7a | 38 | |
Raiden817 | 0:be53fac41c7a | 39 | void LCDMess(char *lMess){ |
Raiden817 | 0:be53fac41c7a | 40 | slcd.Home(); |
Raiden817 | 0:be53fac41c7a | 41 | slcd.clear(); |
Raiden817 | 0:be53fac41c7a | 42 | slcd.printf(lMess); |
Raiden817 | 0:be53fac41c7a | 43 | } |
Raiden817 | 0:be53fac41c7a | 44 | |
Raiden817 | 1:81905675b73e | 45 | float squareRoot(int val) { |
Raiden817 | 1:81905675b73e | 46 | float xNew = 0.0; |
Raiden817 | 1:81905675b73e | 47 | float xOld = val/2.0; |
Raiden817 | 1:81905675b73e | 48 | int max = 40; |
Raiden817 | 1:81905675b73e | 49 | float epsilon = 0.0000007; |
Raiden817 | 1:81905675b73e | 50 | float delta; |
Raiden817 | 0:be53fac41c7a | 51 | |
Raiden817 | 1:81905675b73e | 52 | for (int i = 0; i < max; i++) { |
Raiden817 | 1:81905675b73e | 53 | xNew = 0.5 * (xOld + (val/xOld) ); |
Raiden817 | 1:81905675b73e | 54 | delta = abs(xNew - xOld); |
Raiden817 | 1:81905675b73e | 55 | //Check Convergence |
Raiden817 | 1:81905675b73e | 56 | if (delta < epsilon) { |
Raiden817 | 1:81905675b73e | 57 | break; |
Raiden817 | 1:81905675b73e | 58 | } else { |
Raiden817 | 1:81905675b73e | 59 | xOld = xNew; |
Raiden817 | 1:81905675b73e | 60 | } |
Raiden817 | 1:81905675b73e | 61 | } |
Raiden817 | 1:81905675b73e | 62 | |
Raiden817 | 1:81905675b73e | 63 | return xNew; |
Raiden817 | 0:be53fac41c7a | 64 | } |
Raiden817 | 0:be53fac41c7a | 65 | |
Raiden817 | 0:be53fac41c7a | 66 | int main(void) { |
Raiden817 | 0:be53fac41c7a | 67 | int i; |
Raiden817 | 1:81905675b73e | 68 | float holdVal; |
Raiden817 | 0:be53fac41c7a | 69 | float lastTouch = 0.0; |
Raiden817 | 0:be53fac41c7a | 70 | char lcdData[LCDCHARLEN]; |
Raiden817 | 0:be53fac41c7a | 71 | PwmOut gled(LED_GREEN); |
Raiden817 | 0:be53fac41c7a | 72 | PwmOut rled(LED_RED); |
Raiden817 | 0:be53fac41c7a | 73 | pc.printf(PROGNAME); |
Raiden817 | 0:be53fac41c7a | 74 | TSISensor tsi; |
Raiden817 | 0:be53fac41c7a | 75 | float tempTSI; |
Raiden817 | 0:be53fac41c7a | 76 | |
Raiden817 | 0:be53fac41c7a | 77 | initialize_global_vars(); |
Raiden817 | 0:be53fac41c7a | 78 | |
Raiden817 | 0:be53fac41c7a | 79 | while (true) { |
Raiden817 | 0:be53fac41c7a | 80 | if (buttonTimer > BUTTONTIME) { |
Raiden817 | 0:be53fac41c7a | 81 | for (i = 0; i < NUMBUTS; i++) { |
Raiden817 | 0:be53fac41c7a | 82 | if(!buttons[i]) { |
Raiden817 | 0:be53fac41c7a | 83 | displayState = i; |
Raiden817 | 1:81905675b73e | 84 | |
Raiden817 | 0:be53fac41c7a | 85 | } |
Raiden817 | 0:be53fac41c7a | 86 | } |
Raiden817 | 0:be53fac41c7a | 87 | //Get slider value |
Raiden817 | 0:be53fac41c7a | 88 | if (displayState == 0) { |
Raiden817 | 1:81905675b73e | 89 | rled = 0.0; |
Raiden817 | 1:81905675b73e | 90 | gled = 1.0; |
Raiden817 | 0:be53fac41c7a | 91 | if (dataTimer.read() > DATAINTERVAL) { |
Raiden817 | 0:be53fac41c7a | 92 | dataTimer.reset(); |
Raiden817 | 1:81905675b73e | 93 | tempTSI = tsi.readPercentage() *100; |
Raiden817 | 0:be53fac41c7a | 94 | if (tempTSI > TSILIMIT) { |
Raiden817 | 0:be53fac41c7a | 95 | tsiData = tempTSI; |
Raiden817 | 0:be53fac41c7a | 96 | if (tempTSI > TSILIMIT) { |
Raiden817 | 0:be53fac41c7a | 97 | tsiData = tempTSI; |
Raiden817 | 0:be53fac41c7a | 98 | if (fabs(tsiData - lastTouch) > PRINTDELTA) { |
Raiden817 | 1:81905675b73e | 99 | pc.printf("Position %0.0f\n\r", tsiData); |
Raiden817 | 0:be53fac41c7a | 100 | } |
Raiden817 | 0:be53fac41c7a | 101 | } |
Raiden817 | 0:be53fac41c7a | 102 | lastTouch = tsiData; |
Raiden817 | 0:be53fac41c7a | 103 | } |
Raiden817 | 1:81905675b73e | 104 | |
Raiden817 | 1:81905675b73e | 105 | } |
Raiden817 | 1:81905675b73e | 106 | sprintf(lcdData,"%0.0f",tsiData); |
Raiden817 | 1:81905675b73e | 107 | LCDMess(lcdData); |
Raiden817 | 0:be53fac41c7a | 108 | } |
Raiden817 | 0:be53fac41c7a | 109 | //Perform SquareRoot |
Raiden817 | 1:81905675b73e | 110 | else { |
Raiden817 | 1:81905675b73e | 111 | rled = 1.0; |
Raiden817 | 1:81905675b73e | 112 | gled = 0.0; |
Raiden817 | 1:81905675b73e | 113 | |
Raiden817 | 1:81905675b73e | 114 | holdVal = squareRoot(tsiData); |
Raiden817 | 1:81905675b73e | 115 | sprintf(lcdData,"%2.2f",holdVal); |
Raiden817 | 1:81905675b73e | 116 | if (holdVal < 0.0) { |
Raiden817 | 1:81905675b73e | 117 | sprintf(lcdData, "z%2.2f", fabs(holdVal)); |
Raiden817 | 1:81905675b73e | 118 | } |
Raiden817 | 1:81905675b73e | 119 | |
Raiden817 | 1:81905675b73e | 120 | LCDMess(lcdData); |
Raiden817 | 0:be53fac41c7a | 121 | } |
Raiden817 | 0:be53fac41c7a | 122 | buttonTimer.reset(); |
Raiden817 | 0:be53fac41c7a | 123 | } |
Raiden817 | 0:be53fac41c7a | 124 | } |
Raiden817 | 0:be53fac41c7a | 125 | } |