KBrat-SSD541-Midterm-Q2a

Dependencies:   SLCD TSI mbed

Fork of kl46z_slider_mid_v1 by Stanley Cohen

Committer:
tisbrat
Date:
Mon Oct 10 05:56:09 2016 +0000
Revision:
2:8b60d4eb7388
Parent:
1:44dcf262c7dd
KBrat-SSD541-Midterm-Q2a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
scohennm 0:04499bc54bee 1 #include "mbed.h"
tisbrat 2:8b60d4eb7388 2 #include <math.h>
tisbrat 2:8b60d4eb7388 3 #include <cmath>
scohennm 0:04499bc54bee 4 #include "TSISensor.h"
scohennm 0:04499bc54bee 5 #include "SLCD.h"
scohennm 1:44dcf262c7dd 6 #define LEDON false
scohennm 1:44dcf262c7dd 7 #define LEDOFF true
tisbrat 2:8b60d4eb7388 8 #define NUMBUTS 2 //two buttons
tisbrat 2:8b60d4eb7388 9 #define LBUT PTC12 //left button // port addresses for buttons
tisbrat 2:8b60d4eb7388 10 #define RBUT PTC3 //right button
tisbrat 2:8b60d4eb7388 11 #define ARGUMENTSTATE 0 //Switch case 0
tisbrat 2:8b60d4eb7388 12 #define ANSWERSTATE 1 //Switch case 1
tisbrat 2:8b60d4eb7388 13 #define LCDTIME 1.0 //LCD Timer 1 sec
tisbrat 2:8b60d4eb7388 14 #define TSILIMIT 0.01
scohennm 1:44dcf262c7dd 15 #define PRINTDELTA 0.01
scohennm 0:04499bc54bee 16 #define LCDCHARLEN 10
scohennm 0:04499bc54bee 17 #define DATAINTERVAL 0.1
scohennm 1:44dcf262c7dd 18 #define BUTTONTIME 0.1
tisbrat 2:8b60d4eb7388 19 #define PROGNAME "KBrat-SSD541-Midterm-Q2a \nNewton's Method of Square Root\n\r"
scohennm 0:04499bc54bee 20
tisbrat 2:8b60d4eb7388 21 SLCD slcd;//define LCD display globally define
scohennm 0:04499bc54bee 22 Serial pc(USBTX, USBRX);
scohennm 0:04499bc54bee 23
tisbrat 2:8b60d4eb7388 24 Timer LCDTimer; //for reading lcd input state for display
tisbrat 2:8b60d4eb7388 25 Timer dataTimer; //for reading data input states(from the slider 1-100)
tisbrat 2:8b60d4eb7388 26 Timer ButtonTimer; //for reading button states
scohennm 1:44dcf262c7dd 27 DigitalIn buttons[NUMBUTS] = {RBUT, LBUT};
scohennm 0:04499bc54bee 28 float tsidata;
tisbrat 2:8b60d4eb7388 29 int displayState = ARGUMENTSTATE;//Make initial state ARGUMENTSTATE
scohennm 1:44dcf262c7dd 30
scohennm 1:44dcf262c7dd 31 void initialize_global_vars(){
scohennm 1:44dcf262c7dd 32 pc.printf(PROGNAME);
scohennm 1:44dcf262c7dd 33 // set up DAQ timers
scohennm 1:44dcf262c7dd 34 ButtonTimer.start();
scohennm 1:44dcf262c7dd 35 ButtonTimer.reset();
scohennm 1:44dcf262c7dd 36 dataTimer.start();
tisbrat 2:8b60d4eb7388 37 dataTimer.reset();
tisbrat 2:8b60d4eb7388 38 LCDTimer.start();
tisbrat 2:8b60d4eb7388 39 LCDTimer.reset();
scohennm 1:44dcf262c7dd 40 }
scohennm 0:04499bc54bee 41
scohennm 0:04499bc54bee 42 void LCDMess(char *lMess){
scohennm 0:04499bc54bee 43 slcd.Home();
scohennm 0:04499bc54bee 44 slcd.clear();
scohennm 0:04499bc54bee 45 slcd.printf(lMess);
scohennm 0:04499bc54bee 46 }
scohennm 0:04499bc54bee 47
scohennm 0:04499bc54bee 48 int main(void) {
scohennm 1:44dcf262c7dd 49 int i;
scohennm 0:04499bc54bee 50 char lcdData[LCDCHARLEN];
tisbrat 2:8b60d4eb7388 51 float lastTouch = 0.0; //intial lastTouch starts at 0.0
scohennm 1:44dcf262c7dd 52 TSISensor tsi;
scohennm 1:44dcf262c7dd 53 float tempTSI;
scohennm 0:04499bc54bee 54 PwmOut gled(LED_GREEN);
scohennm 0:04499bc54bee 55 PwmOut rled(LED_RED);
scohennm 1:44dcf262c7dd 56
scohennm 1:44dcf262c7dd 57 initialize_global_vars();
scohennm 0:04499bc54bee 58
scohennm 0:04499bc54bee 59 while (true) {
scohennm 1:44dcf262c7dd 60 if (ButtonTimer > BUTTONTIME){
tisbrat 2:8b60d4eb7388 61 for (i=0; i<NUMBUTS; i++){ // index will be 0 or 1 //find buttons
scohennm 1:44dcf262c7dd 62 if(!buttons[i]) {
tisbrat 2:8b60d4eb7388 63 displayState = i;
scohennm 1:44dcf262c7dd 64 } // if ! buttons
scohennm 1:44dcf262c7dd 65 }// for loop to look at buttons
scohennm 1:44dcf262c7dd 66 ButtonTimer.reset();
tisbrat 2:8b60d4eb7388 67 }
tisbrat 2:8b60d4eb7388 68
tisbrat 2:8b60d4eb7388 69
tisbrat 2:8b60d4eb7388 70 if(LCDTimer.read() > LCDTIME){
tisbrat 2:8b60d4eb7388 71 LCDTimer.reset();
tisbrat 2:8b60d4eb7388 72 switch (displayState){//start switch case for displayState
tisbrat 2:8b60d4eb7388 73
tisbrat 2:8b60d4eb7388 74 case ARGUMENTSTATE: {// case #0
tisbrat 2:8b60d4eb7388 75 rled = 0.0;//red light on
tisbrat 2:8b60d4eb7388 76 gled = 1.0;//green light off
tisbrat 2:8b60d4eb7388 77
tisbrat 2:8b60d4eb7388 78 if(dataTimer.read() > DATAINTERVAL){
tisbrat 2:8b60d4eb7388 79 dataTimer.reset();
tisbrat 2:8b60d4eb7388 80 tempTSI = tsi.readPercentage();
tisbrat 2:8b60d4eb7388 81 if (tempTSI > TSILIMIT){
tisbrat 2:8b60d4eb7388 82 tsidata = tempTSI;
tisbrat 2:8b60d4eb7388 83 if (fabs(tsidata - lastTouch)> PRINTDELTA){
tisbrat 2:8b60d4eb7388 84 pc.printf("Position %2.0f\n\r", tsidata*100);//print to computer tsidata*100 to get a range from 1-100
tisbrat 2:8b60d4eb7388 85 }
tisbrat 2:8b60d4eb7388 86 }
tisbrat 2:8b60d4eb7388 87 lastTouch = tsidata;
tisbrat 2:8b60d4eb7388 88 }
tisbrat 2:8b60d4eb7388 89
tisbrat 2:8b60d4eb7388 90 sprintf (lcdData,"%2.1f",tsidata*100); //print to lcd screen tsidata*100 to get a range from 1-100
tisbrat 2:8b60d4eb7388 91 LCDMess(lcdData);
tisbrat 2:8b60d4eb7388 92
tisbrat 2:8b60d4eb7388 93 break;
tisbrat 2:8b60d4eb7388 94 }
tisbrat 2:8b60d4eb7388 95
tisbrat 2:8b60d4eb7388 96 case ANSWERSTATE: {
tisbrat 2:8b60d4eb7388 97
tisbrat 2:8b60d4eb7388 98 rled = 1.0;//red light off
tisbrat 2:8b60d4eb7388 99 gled = 0.0;//green light on
tisbrat 2:8b60d4eb7388 100
tisbrat 2:8b60d4eb7388 101 /*-------With built in sqrt function-----*/
tisbrat 2:8b60d4eb7388 102 /*double slid_input, sq_root;
tisbrat 2:8b60d4eb7388 103 slid_input = tsidata*100;
tisbrat 2:8b60d4eb7388 104 if (slid_input > 0){
tisbrat 2:8b60d4eb7388 105 sq_root = sqrt(slid_input);
tisbrat 2:8b60d4eb7388 106 pc.printf ("Square root(%f) = %f\n", slid_input, sq_root);
tisbrat 2:8b60d4eb7388 107 sprintf (lcdData,"%2.2f", sq_root);
tisbrat 2:8b60d4eb7388 108 LCDMess(lcdData);
tisbrat 2:8b60d4eb7388 109 //return 0;
tisbrat 2:8b60d4eb7388 110 }*/
tisbrat 2:8b60d4eb7388 111
tisbrat 2:8b60d4eb7388 112 /*-------Without built in sqrt function-----*/
tisbrat 2:8b60d4eb7388 113 double x1, slid_input, sq_root;
tisbrat 2:8b60d4eb7388 114 slid_input = tsidata*100;
tisbrat 2:8b60d4eb7388 115 if(slid_input > 0){
tisbrat 2:8b60d4eb7388 116 sq_root = log(slid_input);
tisbrat 2:8b60d4eb7388 117 do {
tisbrat 2:8b60d4eb7388 118 x1 = (sq_root - (((sq_root * sq_root) - slid_input)/(2* sq_root))); //Newton's Method
tisbrat 2:8b60d4eb7388 119 sq_root = x1;
tisbrat 2:8b60d4eb7388 120
tisbrat 2:8b60d4eb7388 121 } while ((x1 * x1) > slid_input);
tisbrat 2:8b60d4eb7388 122 pc.printf ("Newton's Method: Square root(%2.2f) = %2.2f\n", slid_input, sq_root);
tisbrat 2:8b60d4eb7388 123 sprintf (lcdData,"%2.2f", sq_root);
tisbrat 2:8b60d4eb7388 124 LCDMess(lcdData);
tisbrat 2:8b60d4eb7388 125 }
tisbrat 2:8b60d4eb7388 126 break;
tisbrat 2:8b60d4eb7388 127 }// end switch case displayState
tisbrat 2:8b60d4eb7388 128 }
scohennm 1:44dcf262c7dd 129 LCDMess(lcdData);
tisbrat 2:8b60d4eb7388 130 } // end LCD timer.read
scohennm 1:44dcf262c7dd 131
tisbrat 2:8b60d4eb7388 132 }// end while(true)
tisbrat 2:8b60d4eb7388 133
scohennm 0:04499bc54bee 134 }