CKM algorithms midterm: Question 2

Dependencies:   SLCD TSI mbed

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?

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