Gets input from slider and returns the square root of that number

Dependencies:   SLCD TSI mbed

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?

UserRevisionLine numberNew 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 }