Laserzsssss

Dependencies:   mbed

Committer:
ADIJake
Date:
Wed Dec 12 22:57:49 2018 +0000
Revision:
1:d076e5ad070b
Parent:
0:0056220d84ea
Child:
2:70e7b1b88824
working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfitzpa2 0:0056220d84ea 1 #include "mbed.h"
mfitzpa2 0:0056220d84ea 2
mfitzpa2 0:0056220d84ea 3 #define TERMINATOR '\n'
mfitzpa2 0:0056220d84ea 4 #define SEPARATOR ','
mfitzpa2 0:0056220d84ea 5 #define OFFSET 200 //mV
mfitzpa2 0:0056220d84ea 6 #define RECEIVER_COUNT 5
mfitzpa2 0:0056220d84ea 7 #define BUTTON_COUNT 4
mfitzpa2 0:0056220d84ea 8
mfitzpa2 0:0056220d84ea 9 // Analog input solar cells corresponding to digital output leds.
mfitzpa2 0:0056220d84ea 10 /*
mfitzpa2 0:0056220d84ea 11 DigitalOut red_leds[5] = {PC_10, PC_12, PA_13, PA_14, PA_15};
mfitzpa2 0:0056220d84ea 12 DigitalOut green_leds[5] = {PB_7, PC_13, PC_14, PC_15, PH_0};
mfitzpa2 0:0056220d84ea 13 DigitalOut blue_leds[5] = {PH_1, PC_2, PC_3, PC_11, PD_2};
mfitzpa2 0:0056220d84ea 14 */
mfitzpa2 0:0056220d84ea 15
ADIJake 1:d076e5ad070b 16 DigitalOut red_leds[] = {PB_9, PB_6, PA_8, PB_5, PC_4};
ADIJake 1:d076e5ad070b 17 DigitalOut green_leds[] = {PA_6, PC_7, PB_10, PB_3, PB_13};
ADIJake 1:d076e5ad070b 18 DigitalOut blue_leds[] = {PA_5, PA_7, PA_9, PB_4, PA_10};
mfitzpa2 0:0056220d84ea 19
mfitzpa2 0:0056220d84ea 20 //DigitalIn buttons[] = {PA_3, PA_2, PA_10, PB_3}; //order: easy, medium, hard, expert
mfitzpa2 0:0056220d84ea 21 DigitalIn buttons[] = {PC_10, PC_12, PA_13, PA_14};
mfitzpa2 0:0056220d84ea 22 bool buttons_state[BUTTON_COUNT];
mfitzpa2 0:0056220d84ea 23 bool buttons_state_prev[BUTTON_COUNT] = {1, 1, 1, 1};
mfitzpa2 0:0056220d84ea 24
mfitzpa2 0:0056220d84ea 25 AnalogIn solarCells[] = {PA_0, PA_1, PA_4, PB_0, PC_1};
mfitzpa2 0:0056220d84ea 26 bool solarCellsState[RECEIVER_COUNT];
mfitzpa2 0:0056220d84ea 27 uint16_t solarCellsThreshold[RECEIVER_COUNT];
mfitzpa2 0:0056220d84ea 28 int active_receivers[RECEIVER_COUNT] = {0, 0, 0, 0, 0};
mfitzpa2 0:0056220d84ea 29 int prev_state[RECEIVER_COUNT] = {0, 0, 0, 0, 0};
mfitzpa2 0:0056220d84ea 30 //float initialValues[RECEIVER_COUNT];
mfitzpa2 0:0056220d84ea 31
mfitzpa2 0:0056220d84ea 32 Serial serial(PA_2, PA_3);
mfitzpa2 0:0056220d84ea 33 //Serial serial(PA_11, PA_12);
mfitzpa2 0:0056220d84ea 34
mfitzpa2 0:0056220d84ea 35 int level_static;
mfitzpa2 0:0056220d84ea 36
mfitzpa2 0:0056220d84ea 37 char pcBuffer[256];
mfitzpa2 0:0056220d84ea 38 uint8_t pcBufferIndex = 0;
mfitzpa2 0:0056220d84ea 39 bool messageReceived = false;
mfitzpa2 0:0056220d84ea 40
mfitzpa2 0:0056220d84ea 41 enum States {
mfitzpa2 0:0056220d84ea 42 IDLE,
mfitzpa2 0:0056220d84ea 43 CALIBRATE,
mfitzpa2 0:0056220d84ea 44 START,
mfitzpa2 0:0056220d84ea 45 RUNNING,
mfitzpa2 0:0056220d84ea 46 STOP,
mfitzpa2 0:0056220d84ea 47 MAX_STATES
mfitzpa2 0:0056220d84ea 48 };
mfitzpa2 0:0056220d84ea 49
ADIJake 1:d076e5ad070b 50 enum States state = CALIBRATE;
ADIJake 1:d076e5ad070b 51 //enum States state = START;
mfitzpa2 0:0056220d84ea 52
mfitzpa2 0:0056220d84ea 53 /*
mfitzpa2 0:0056220d84ea 54 void callback(void) {
mfitzpa2 0:0056220d84ea 55 pcBuffer[pcBufferIndex] = serial.getc();
mfitzpa2 0:0056220d84ea 56
mfitzpa2 0:0056220d84ea 57 if(pcBuffer[pcBufferIndex] == TERMINATOR) {
mfitzpa2 0:0056220d84ea 58 pcBufferIndex = 0;
mfitzpa2 0:0056220d84ea 59 messageReceived = true;
mfitzpa2 0:0056220d84ea 60 }
mfitzpa2 0:0056220d84ea 61 }
mfitzpa2 0:0056220d84ea 62 */
mfitzpa2 0:0056220d84ea 63
mfitzpa2 0:0056220d84ea 64 void EnablePullups(void) {
mfitzpa2 0:0056220d84ea 65 /*
mfitzpa2 0:0056220d84ea 66 for (uint8_t i = 0; i > (sizeof(buttons)); i++) {
mfitzpa2 0:0056220d84ea 67 buttons[i].mode(PullUp);
mfitzpa2 0:0056220d84ea 68 }
mfitzpa2 0:0056220d84ea 69 */
mfitzpa2 0:0056220d84ea 70 //serial.printf("Pullup functions");
mfitzpa2 0:0056220d84ea 71 buttons[0].mode(PullUp);
mfitzpa2 0:0056220d84ea 72 buttons[1].mode(PullUp);
mfitzpa2 0:0056220d84ea 73 buttons[2].mode(PullUp);
mfitzpa2 0:0056220d84ea 74 buttons[3].mode(PullUp);
mfitzpa2 0:0056220d84ea 75
mfitzpa2 0:0056220d84ea 76 }
mfitzpa2 0:0056220d84ea 77
mfitzpa2 0:0056220d84ea 78 int ReadSolarCell(int index) {
mfitzpa2 0:0056220d84ea 79 //check all analog channels and set digital channels appropriately
mfitzpa2 0:0056220d84ea 80 //for(int i = 0; i < sizeof(solarCells); i++) {
mfitzpa2 0:0056220d84ea 81 //find channels current value
mfitzpa2 0:0056220d84ea 82 float meas;
mfitzpa2 0:0056220d84ea 83 meas = solarCells[index].read(); // Converts and read the analog input value (value from 0.0 to 1.0)
mfitzpa2 0:0056220d84ea 84 meas = meas * 3300; // Change the value to be in the 0 to 3300 range
mfitzpa2 0:0056220d84ea 85 //serial.printf("measure %d = %.0f mV\n", index, meas);
mfitzpa2 0:0056220d84ea 86 if (meas > solarCellsThreshold[index]) { // If the value is greater than 2V then switch the LED on
mfitzpa2 0:0056220d84ea 87 return 1;
mfitzpa2 0:0056220d84ea 88 }
mfitzpa2 0:0056220d84ea 89 else {
mfitzpa2 0:0056220d84ea 90 return 0;
mfitzpa2 0:0056220d84ea 91 }
mfitzpa2 0:0056220d84ea 92 //}
mfitzpa2 0:0056220d84ea 93 }
mfitzpa2 0:0056220d84ea 94
ADIJake 1:d076e5ad070b 95 void PuzzleSelector(int level) {
mfitzpa2 0:0056220d84ea 96 level_static = level; //so the level can be accessed in other functions
mfitzpa2 0:0056220d84ea 97
ADIJake 1:d076e5ad070b 98 for (int i = 0; i < RECEIVER_COUNT; i++) {
ADIJake 1:d076e5ad070b 99 active_receivers[i] = 0;
ADIJake 1:d076e5ad070b 100 }
ADIJake 1:d076e5ad070b 101
ADIJake 1:d076e5ad070b 102 if (level == 2) {
mfitzpa2 0:0056220d84ea 103 //myInt1 = rand() % (max_number + 1 - min_number) + min_number; //debug
ADIJake 1:d076e5ad070b 104
ADIJake 1:d076e5ad070b 105 for (int i = 0; i < 1; i++) {
ADIJake 1:d076e5ad070b 106 active_receivers[i] = 1;
ADIJake 1:d076e5ad070b 107 }
ADIJake 1:d076e5ad070b 108 serial.printf("e");
ADIJake 1:d076e5ad070b 109 }
ADIJake 1:d076e5ad070b 110 else if (level == 3) {
ADIJake 1:d076e5ad070b 111 for (int i = 0; i < 2; i++) {
ADIJake 1:d076e5ad070b 112 active_receivers[i] = 1;
ADIJake 1:d076e5ad070b 113 }
ADIJake 1:d076e5ad070b 114 serial.printf("m");
mfitzpa2 0:0056220d84ea 115 }
mfitzpa2 0:0056220d84ea 116 else if (level == 1) {
ADIJake 1:d076e5ad070b 117 for (int i = 0; i < 3; i++) {
ADIJake 1:d076e5ad070b 118 active_receivers[i] = 1;
ADIJake 1:d076e5ad070b 119 }
ADIJake 1:d076e5ad070b 120 serial.printf("h");
mfitzpa2 0:0056220d84ea 121 }
mfitzpa2 0:0056220d84ea 122 else {
ADIJake 1:d076e5ad070b 123 for (int i = 0; i < 5; i++) {
ADIJake 1:d076e5ad070b 124 active_receivers[i] = 1;
ADIJake 1:d076e5ad070b 125 }
ADIJake 1:d076e5ad070b 126 serial.printf("x");
mfitzpa2 0:0056220d84ea 127 }
mfitzpa2 0:0056220d84ea 128
mfitzpa2 0:0056220d84ea 129 //return active_receivers;
mfitzpa2 0:0056220d84ea 130 }
mfitzpa2 0:0056220d84ea 131
ADIJake 1:d076e5ad070b 132 //DigitalOut test(D0);
ADIJake 1:d076e5ad070b 133
mfitzpa2 0:0056220d84ea 134 int main() {
mfitzpa2 0:0056220d84ea 135 EnablePullups();
mfitzpa2 0:0056220d84ea 136
mfitzpa2 0:0056220d84ea 137 bool buttonPressed = false;
mfitzpa2 0:0056220d84ea 138
mfitzpa2 0:0056220d84ea 139 for(uint8_t i = 0; i < RECEIVER_COUNT; i++) {
mfitzpa2 0:0056220d84ea 140 solarCellsState[i] = false;
ADIJake 1:d076e5ad070b 141 solarCellsThreshold[i] = 0;
mfitzpa2 0:0056220d84ea 142 }
mfitzpa2 0:0056220d84ea 143
mfitzpa2 0:0056220d84ea 144 while(true) {
mfitzpa2 0:0056220d84ea 145
ADIJake 1:d076e5ad070b 146 /*while(true) {
ADIJake 1:d076e5ad070b 147 for (uint8_t i = 0; i < 5; i++) {
ADIJake 1:d076e5ad070b 148 red_leds[i] = 1;
ADIJake 1:d076e5ad070b 149 blue_leds[i] = 0;
ADIJake 1:d076e5ad070b 150 green_leds[i] = 0;
ADIJake 1:d076e5ad070b 151 //test = 1;
ADIJake 1:d076e5ad070b 152 }
ADIJake 1:d076e5ad070b 153 }*/
ADIJake 1:d076e5ad070b 154
mfitzpa2 0:0056220d84ea 155 switch(state) {
mfitzpa2 0:0056220d84ea 156 case IDLE: {
ADIJake 1:d076e5ad070b 157 //serial.printf("State = IDLE\n\r");
mfitzpa2 0:0056220d84ea 158 while (buttonPressed == false) {
mfitzpa2 0:0056220d84ea 159 for (uint8_t i = 0; i < BUTTON_COUNT; i++) {
mfitzpa2 0:0056220d84ea 160 //serial.printf("Waiting for button...\n");
mfitzpa2 0:0056220d84ea 161 //while (loopcount < 100) {
mfitzpa2 0:0056220d84ea 162 buttons_state[i] = buttons[i].read();
ADIJake 1:d076e5ad070b 163 //serial.printf("Button %i state is %i\n\r", i, buttons_state[i]);
ADIJake 1:d076e5ad070b 164 wait(0.05);
mfitzpa2 0:0056220d84ea 165 //loopcount = loopcount++;
mfitzpa2 0:0056220d84ea 166 //buttonPressed = true;
mfitzpa2 0:0056220d84ea 167 //}
ADIJake 1:d076e5ad070b 168 if (buttons_state[i] == 0) {
ADIJake 1:d076e5ad070b 169 //serial.printf("Button %i pressed\n\r", i);
mfitzpa2 0:0056220d84ea 170 //call puzzle selector function
mfitzpa2 0:0056220d84ea 171 PuzzleSelector(i);
mfitzpa2 0:0056220d84ea 172 buttonPressed = true;
mfitzpa2 0:0056220d84ea 173 }
mfitzpa2 0:0056220d84ea 174 }
mfitzpa2 0:0056220d84ea 175 }
ADIJake 1:d076e5ad070b 176 buttonPressed = false;
mfitzpa2 0:0056220d84ea 177 state = START;
mfitzpa2 0:0056220d84ea 178 break;
mfitzpa2 0:0056220d84ea 179 }
mfitzpa2 0:0056220d84ea 180
mfitzpa2 0:0056220d84ea 181 case CALIBRATE: {
ADIJake 1:d076e5ad070b 182 //serial.printf("State = CALIBRATE\n\r");
mfitzpa2 0:0056220d84ea 183 //calibrate to ambient light, adding offset to find the thresholds
mfitzpa2 0:0056220d84ea 184 for(int i = 0; i < RECEIVER_COUNT; i++) {
mfitzpa2 0:0056220d84ea 185 //serial.printf("i= %i",i);
mfitzpa2 0:0056220d84ea 186 solarCellsThreshold[i] = (solarCells[i].read() * 3300) + OFFSET;
ADIJake 1:d076e5ad070b 187 //serial.printf("initial %d = %.0f mV\n", i, solarCellsThreshold[i]);
mfitzpa2 0:0056220d84ea 188 }
mfitzpa2 0:0056220d84ea 189
mfitzpa2 0:0056220d84ea 190 state = IDLE;
mfitzpa2 0:0056220d84ea 191
mfitzpa2 0:0056220d84ea 192 break;
mfitzpa2 0:0056220d84ea 193 }
mfitzpa2 0:0056220d84ea 194
mfitzpa2 0:0056220d84ea 195 case START: {
ADIJake 1:d076e5ad070b 196 //serial.printf("State = START\n\r");
mfitzpa2 0:0056220d84ea 197 //serial.printf("%c", TERMINATOR);
mfitzpa2 0:0056220d84ea 198 for (uint8_t i = 0; i < RECEIVER_COUNT; i++) {
mfitzpa2 0:0056220d84ea 199 if (active_receivers[i] == 1) {
mfitzpa2 0:0056220d84ea 200 red_leds[i] = 1;
ADIJake 1:d076e5ad070b 201 blue_leds[i] = 0;
ADIJake 1:d076e5ad070b 202 green_leds[i] = 0;
ADIJake 1:d076e5ad070b 203 }
ADIJake 1:d076e5ad070b 204 else {
ADIJake 1:d076e5ad070b 205 red_leds[i] = 0;
ADIJake 1:d076e5ad070b 206 blue_leds[i] = 0;
ADIJake 1:d076e5ad070b 207 green_leds[i] = 0;
mfitzpa2 0:0056220d84ea 208 }
mfitzpa2 0:0056220d84ea 209 }
mfitzpa2 0:0056220d84ea 210 state = RUNNING;
mfitzpa2 0:0056220d84ea 211 break;
mfitzpa2 0:0056220d84ea 212 }
mfitzpa2 0:0056220d84ea 213
mfitzpa2 0:0056220d84ea 214 case RUNNING: {
ADIJake 1:d076e5ad070b 215 //serial.printf("State = RUNNING\n\r");
mfitzpa2 0:0056220d84ea 216 // Update solarCellsState.
mfitzpa2 0:0056220d84ea 217 for(uint8_t i = 0; i < RECEIVER_COUNT; i++) {
ADIJake 1:d076e5ad070b 218 solarCellsState[i] = 0;
mfitzpa2 0:0056220d84ea 219 }
mfitzpa2 0:0056220d84ea 220
ADIJake 1:d076e5ad070b 221 for(uint8_t i = 0; i < RECEIVER_COUNT; i++) {
ADIJake 1:d076e5ad070b 222 if(active_receivers[i]) {
ADIJake 1:d076e5ad070b 223 //solarCellsState[i] = (solarCells[i].read() >= solarCellsThreshold[i]);
ADIJake 1:d076e5ad070b 224 solarCellsState[i] = ReadSolarCell(i);
ADIJake 1:d076e5ad070b 225 green_leds[i] = solarCellsState[i];
ADIJake 1:d076e5ad070b 226 red_leds[i] = !solarCellsState[i];
ADIJake 1:d076e5ad070b 227 }
mfitzpa2 0:0056220d84ea 228 }
ADIJake 1:d076e5ad070b 229 bool test = 1;
mfitzpa2 0:0056220d84ea 230 for(uint8_t i = 0; i < RECEIVER_COUNT; i++) {
ADIJake 1:d076e5ad070b 231 test &= (active_receivers[i] == solarCellsState[i]);
mfitzpa2 0:0056220d84ea 232 }
ADIJake 1:d076e5ad070b 233 if(test == 1) {
ADIJake 1:d076e5ad070b 234 state = STOP;
mfitzpa2 0:0056220d84ea 235 }
mfitzpa2 0:0056220d84ea 236 break;
mfitzpa2 0:0056220d84ea 237 }
ADIJake 1:d076e5ad070b 238 case STOP: {
mfitzpa2 0:0056220d84ea 239
ADIJake 1:d076e5ad070b 240 serial.printf("z");
mfitzpa2 0:0056220d84ea 241 state = IDLE;
mfitzpa2 0:0056220d84ea 242 break;
mfitzpa2 0:0056220d84ea 243 }
mfitzpa2 0:0056220d84ea 244
mfitzpa2 0:0056220d84ea 245 default: {
mfitzpa2 0:0056220d84ea 246 break;
mfitzpa2 0:0056220d84ea 247 }
ADIJake 1:d076e5ad070b 248 }
mfitzpa2 0:0056220d84ea 249 } //while loop parethesis
mfitzpa2 0:0056220d84ea 250 } //main parenthesis
mfitzpa2 0:0056220d84ea 251