Embed Fibonacci calculation in existing program KL46Z

Dependencies:   MAG3110 SLCD TSI mbed

Fork of magsensor_46_v2 by Stanley Cohen

Committer:
scohennm
Date:
Tue Oct 07 16:27:54 2014 +0000
Revision:
1:dbfbefd3189f
Embed Fibonacci calculation in existing program KL46Z

Who changed what in which revision?

UserRevisionLine numberNew contents of line
scohennm 1:dbfbefd3189f 1
scohennm 1:dbfbefd3189f 2 #include "mbed.h"
scohennm 1:dbfbefd3189f 3 #include "MAG3110.h"
scohennm 1:dbfbefd3189f 4 #include "SLCD.h"
scohennm 1:dbfbefd3189f 5 #include "TSISensor.h"
scohennm 1:dbfbefd3189f 6 /*
scohennm 1:dbfbefd3189f 7 Test of magnetometer and other sensors on the KL46Z board. Not clear to me at this
scohennm 1:dbfbefd3189f 8 time what the conversion factor of the magnetic field values map to.
scohennm 1:dbfbefd3189f 9 set up state machine to cycle through what is displayed on the LCD screen. Remember
scohennm 1:dbfbefd3189f 10 there are 4 characthers plus a "free" decimal point. - 140721 sc
scohennm 1:dbfbefd3189f 11 */
scohennm 1:dbfbefd3189f 12 #define MESSTIME 0.5
scohennm 1:dbfbefd3189f 13 #define BLINKTIME 200 // ms offset
scohennm 1:dbfbefd3189f 14 #define BLINKMAX 1000 // touch sensor returns 0 - 0.99
scohennm 1:dbfbefd3189f 15 #define DATATIME 200
scohennm 1:dbfbefd3189f 16 #define LEDOFF 1
scohennm 1:dbfbefd3189f 17 #define LEDON 0
scohennm 1:dbfbefd3189f 18 #define MESSAGETIME 0.3
scohennm 1:dbfbefd3189f 19 #define LIGHT "LGHT"
scohennm 1:dbfbefd3189f 20 #define MAGX_LBL "MAGX"
scohennm 1:dbfbefd3189f 21 #define MAGY_LBL "MAGY"
scohennm 1:dbfbefd3189f 22 #define BOTIX_LBL "ANIN"
scohennm 1:dbfbefd3189f 23 #define ONEORDER 10
scohennm 1:dbfbefd3189f 24 #define TWOORDERS 100
scohennm 1:dbfbefd3189f 25 #define NULLVAL 20
scohennm 1:dbfbefd3189f 26
scohennm 1:dbfbefd3189f 27 // States
scohennm 1:dbfbefd3189f 28 #define NUMSTATES 4
scohennm 1:dbfbefd3189f 29 #define L_STATE 0
scohennm 1:dbfbefd3189f 30 #define MAGX_STATE 1
scohennm 1:dbfbefd3189f 31 #define MAGY_STATE 2
scohennm 1:dbfbefd3189f 32 #define BOTIX_STATE 3
scohennm 1:dbfbefd3189f 33
scohennm 1:dbfbefd3189f 34 #define PROGNAME "FIBBO v1\r\n"
scohennm 1:dbfbefd3189f 35 #define LPRNAME "MV2.0"
scohennm 1:dbfbefd3189f 36
scohennm 1:dbfbefd3189f 37 // look at this site for PIN defintions. http://mbed.org/platforms/FRDM-KL46Z/
scohennm 1:dbfbefd3189f 38 // #define PRINTDBUG
scohennm 1:dbfbefd3189f 39
scohennm 1:dbfbefd3189f 40 MAG3110 mag(PTE25, PTE24);
scohennm 1:dbfbefd3189f 41
scohennm 1:dbfbefd3189f 42 SLCD slcd; //define LCD display
scohennm 1:dbfbefd3189f 43 AnalogIn LightSensor(PTE22);
scohennm 1:dbfbefd3189f 44 AnalogIn MaxBotix(PTB0);
scohennm 1:dbfbefd3189f 45 Serial pc(USBTX, USBRX);
scohennm 1:dbfbefd3189f 46 Timer LEDTimer;
scohennm 1:dbfbefd3189f 47 Timer DATATimer;
scohennm 1:dbfbefd3189f 48 TSISensor tsiScaling; // Capacitive sensor/slider
scohennm 1:dbfbefd3189f 49
scohennm 1:dbfbefd3189f 50 void LCDMess(char *lMess){
scohennm 1:dbfbefd3189f 51 slcd.Home();
scohennm 1:dbfbefd3189f 52 slcd.clear();
scohennm 1:dbfbefd3189f 53 slcd.printf(lMess);
scohennm 1:dbfbefd3189f 54 }
scohennm 1:dbfbefd3189f 55
scohennm 1:dbfbefd3189f 56 void LCDTMess(char *lMess, float Ddelay){
scohennm 1:dbfbefd3189f 57 slcd.Home();
scohennm 1:dbfbefd3189f 58 slcd.clear();
scohennm 1:dbfbefd3189f 59 slcd.printf(lMess);
scohennm 1:dbfbefd3189f 60 wait(Ddelay);
scohennm 1:dbfbefd3189f 61 }
scohennm 1:dbfbefd3189f 62 // insert fibonacci here
scohennm 1:dbfbefd3189f 63 float fibbo( int fib_stop){
scohennm 1:dbfbefd3189f 64 int Fnm_1=0;
scohennm 1:dbfbefd3189f 65 int Fn = 1;
scohennm 1:dbfbefd3189f 66 float phi_n = 0.0;
scohennm 1:dbfbefd3189f 67 int Fnext;
scohennm 1:dbfbefd3189f 68 float phi_n_1 = 0.0; //# keep the previous phi
scohennm 1:dbfbefd3189f 69 int fib_counter = 2; // # minimum counts
scohennm 1:dbfbefd3189f 70 float epsilon = 1e-7;
scohennm 1:dbfbefd3189f 71 float delta_phi = 0.0;
scohennm 1:dbfbefd3189f 72 // fib_stop = int(input('Stop at element number: n= '))
scohennm 1:dbfbefd3189f 73 if (fib_stop < fib_counter){
scohennm 1:dbfbefd3189f 74 pc.printf(" -> %d \n\r",Fnm_1);
scohennm 1:dbfbefd3189f 75 pc.printf(" -> %d \n\r",Fn);
scohennm 1:dbfbefd3189f 76 }
scohennm 1:dbfbefd3189f 77 while (fib_stop > fib_counter){
scohennm 1:dbfbefd3189f 78 Fnext = Fn + Fnm_1;
scohennm 1:dbfbefd3189f 79 phi_n = (float)(Fnext) / (float)(Fn);
scohennm 1:dbfbefd3189f 80 delta_phi = abs(phi_n - phi_n_1);
scohennm 1:dbfbefd3189f 81 pc.printf("%d - %d, %f, %e\r\n ",fib_counter, Fnext, phi_n, delta_phi);
scohennm 1:dbfbefd3189f 82 if (epsilon > delta_phi){
scohennm 1:dbfbefd3189f 83 break;
scohennm 1:dbfbefd3189f 84 }
scohennm 1:dbfbefd3189f 85 Fnm_1 = Fn;
scohennm 1:dbfbefd3189f 86 Fn = Fnext;
scohennm 1:dbfbefd3189f 87 phi_n_1 = phi_n; //# stor the previous phi for comparison
scohennm 1:dbfbefd3189f 88 fib_counter++;
scohennm 1:dbfbefd3189f 89 }
scohennm 1:dbfbefd3189f 90 pc.printf("Done\r\n");
scohennm 1:dbfbefd3189f 91 return(fib_stop);
scohennm 1:dbfbefd3189f 92 }
scohennm 1:dbfbefd3189f 93
scohennm 1:dbfbefd3189f 94 int main() {
scohennm 1:dbfbefd3189f 95 DigitalOut Rled(LED_RED);
scohennm 1:dbfbefd3189f 96 DigitalOut Gled(LED_GREEN);
scohennm 1:dbfbefd3189f 97 int displayState = 2; // show magy first on LCD
scohennm 1:dbfbefd3189f 98 int LButtonState;
scohennm 1:dbfbefd3189f 99 DigitalIn LftButton(PTC3);
scohennm 1:dbfbefd3189f 100 int ledState = true;
scohennm 1:dbfbefd3189f 101 float lightValue; //Read from ADC connected to ambient light sensor (photo transistor)
scohennm 1:dbfbefd3189f 102 int magX = 0, magY = 0, magZ = 0; // Magnetic field data
scohennm 1:dbfbefd3189f 103 float MaxBValue;
scohennm 1:dbfbefd3189f 104 char lcdData[10];
scohennm 1:dbfbefd3189f 105 int magXVal;
scohennm 1:dbfbefd3189f 106 int nullState = false;
scohennm 1:dbfbefd3189f 107 float touchValue = 0.0;
scohennm 1:dbfbefd3189f 108 float tempValue;
scohennm 1:dbfbefd3189f 109 int LEDTime = BLINKTIME;
scohennm 1:dbfbefd3189f 110
scohennm 1:dbfbefd3189f 111 // Do once... equivalent to the setup fucntion in the Arduino paradigm
scohennm 1:dbfbefd3189f 112 mag.begin();
scohennm 1:dbfbefd3189f 113 // Setup event timers for LED blink and taking magnetometer data
scohennm 1:dbfbefd3189f 114 LEDTimer.start();
scohennm 1:dbfbefd3189f 115 LEDTimer.reset();
scohennm 1:dbfbefd3189f 116 DATATimer.start();
scohennm 1:dbfbefd3189f 117 DATATimer.reset();
scohennm 1:dbfbefd3189f 118 // Show program name LCD and Serial
scohennm 1:dbfbefd3189f 119 pc.printf(PROGNAME);
scohennm 1:dbfbefd3189f 120 LCDTMess(LPRNAME,MESSTIME);
scohennm 1:dbfbefd3189f 121 // insert call to fibbon
scohennm 1:dbfbefd3189f 122
scohennm 1:dbfbefd3189f 123 fibbo(30);
scohennm 1:dbfbefd3189f 124
scohennm 1:dbfbefd3189f 125 // Do forever... equivalent to the loop fucntion in the Arduino paradigm
scohennm 1:dbfbefd3189f 126 while (true) {
scohennm 1:dbfbefd3189f 127 tempValue = tsiScaling.readPercentage();
scohennm 1:dbfbefd3189f 128 if(tempValue > 0) touchValue = tempValue;
scohennm 1:dbfbefd3189f 129 // read the inverted logic of the left button on the board.
scohennm 1:dbfbefd3189f 130 LButtonState = !LftButton;
scohennm 1:dbfbefd3189f 131 if (LButtonState) { //Change data that is displayed cycle through states
scohennm 1:dbfbefd3189f 132 displayState++;
scohennm 1:dbfbefd3189f 133 displayState = displayState % NUMSTATES; // Roll over if greater than the number of states defined
scohennm 1:dbfbefd3189f 134 switch (displayState) {
scohennm 1:dbfbefd3189f 135 case L_STATE: {
scohennm 1:dbfbefd3189f 136 LCDTMess(LIGHT,MESSTIME);
scohennm 1:dbfbefd3189f 137 break;
scohennm 1:dbfbefd3189f 138 }
scohennm 1:dbfbefd3189f 139 case MAGX_STATE: {
scohennm 1:dbfbefd3189f 140 LCDTMess(MAGX_LBL,MESSTIME);
scohennm 1:dbfbefd3189f 141 break;
scohennm 1:dbfbefd3189f 142 }
scohennm 1:dbfbefd3189f 143 case MAGY_STATE:{
scohennm 1:dbfbefd3189f 144 LCDTMess(MAGY_LBL,MESSTIME);
scohennm 1:dbfbefd3189f 145 break;
scohennm 1:dbfbefd3189f 146 }
scohennm 1:dbfbefd3189f 147 case BOTIX_STATE:{
scohennm 1:dbfbefd3189f 148 LCDTMess(BOTIX_LBL,MESSTIME);
scohennm 1:dbfbefd3189f 149 break;
scohennm 1:dbfbefd3189f 150 }
scohennm 1:dbfbefd3189f 151
scohennm 1:dbfbefd3189f 152 }
scohennm 1:dbfbefd3189f 153 }
scohennm 1:dbfbefd3189f 154 // Manage mag and light data
scohennm 1:dbfbefd3189f 155 if (DATATimer.read_ms() > DATATIME){ //take data at DATATIME intervals
scohennm 1:dbfbefd3189f 156 DATATimer.reset();
scohennm 1:dbfbefd3189f 157 lightValue = 1.0-LightSensor.read();
scohennm 1:dbfbefd3189f 158 mag.getValues(&magX, &magY, &magZ);
scohennm 1:dbfbefd3189f 159 MaxBValue = MaxBotix.read();
scohennm 1:dbfbefd3189f 160
scohennm 1:dbfbefd3189f 161 #ifdef PRINTDBUG
scohennm 1:dbfbefd3189f 162 pc.printf("%f\r\n", lightValue);
scohennm 1:dbfbefd3189f 163 pc.printf("%d\r\n", magX);
scohennm 1:dbfbefd3189f 164 pc.printf("%d\r\n", magY);
scohennm 1:dbfbefd3189f 165 pc.printf("%d\r\n", MaxBotix);
scohennm 1:dbfbefd3189f 166 #endif
scohennm 1:dbfbefd3189f 167
scohennm 1:dbfbefd3189f 168 switch (displayState) {
scohennm 1:dbfbefd3189f 169 case L_STATE: {
scohennm 1:dbfbefd3189f 170 sprintf (lcdData,"%4.3f",lightValue);
scohennm 1:dbfbefd3189f 171 break;
scohennm 1:dbfbefd3189f 172 }
scohennm 1:dbfbefd3189f 173 case MAGX_STATE: {
scohennm 1:dbfbefd3189f 174 magXVal =abs(magX)/ONEORDER;
scohennm 1:dbfbefd3189f 175 nullState = (magXVal < NULLVAL);
scohennm 1:dbfbefd3189f 176 sprintf (lcdData,"%4d",magXVal);
scohennm 1:dbfbefd3189f 177 break;
scohennm 1:dbfbefd3189f 178 }
scohennm 1:dbfbefd3189f 179 case MAGY_STATE: {
scohennm 1:dbfbefd3189f 180 sprintf (lcdData,"%4d",magY);
scohennm 1:dbfbefd3189f 181 break;
scohennm 1:dbfbefd3189f 182 }
scohennm 1:dbfbefd3189f 183 case BOTIX_STATE:{
scohennm 1:dbfbefd3189f 184 sprintf (lcdData,"%4.3f",MaxBValue);
scohennm 1:dbfbefd3189f 185 break;
scohennm 1:dbfbefd3189f 186 }
scohennm 1:dbfbefd3189f 187 }
scohennm 1:dbfbefd3189f 188 LCDMess(lcdData);
scohennm 1:dbfbefd3189f 189 }
scohennm 1:dbfbefd3189f 190 // Manage LED's
scohennm 1:dbfbefd3189f 191 if(LEDTimer.read_ms() > LEDTime) { // Blink LED's for dramatic effect.
scohennm 1:dbfbefd3189f 192 LEDTime = BLINKTIME + (int)(touchValue*BLINKMAX);
scohennm 1:dbfbefd3189f 193 LEDTimer.reset();
scohennm 1:dbfbefd3189f 194 if (nullState){
scohennm 1:dbfbefd3189f 195 Rled =LEDON;
scohennm 1:dbfbefd3189f 196 Gled = LEDON;
scohennm 1:dbfbefd3189f 197 } else {
scohennm 1:dbfbefd3189f 198 ledState = !ledState;
scohennm 1:dbfbefd3189f 199 Rled = ledState;
scohennm 1:dbfbefd3189f 200 Gled = !ledState;
scohennm 1:dbfbefd3189f 201 }
scohennm 1:dbfbefd3189f 202 }
scohennm 1:dbfbefd3189f 203
scohennm 1:dbfbefd3189f 204 }
scohennm 1:dbfbefd3189f 205 }