Embed Fibonacci calculation in existing program KL46Z
Dependencies: MAG3110 SLCD TSI mbed
Fork of magsensor_46_v2 by
fiboo.cpp@1:dbfbefd3189f, 2014-10-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |