![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
xszdx
Dependencies: mbed TCS3472_I2C MCP23017 VL6180 DebounceIn WattBob_TextLCD
Diff: main_copy.cpp
- Revision:
- 0:171d347f33f7
- Child:
- 1:ad7134c4e365
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main_copy.cpp Tue Mar 03 17:42:15 2020 +0000 @@ -0,0 +1,188 @@ +#include "mbed.h" +#include "DebounceIn.h" +#include "stdint.h" +#include "MCP23017.h" +#include "WattBob_TextLCD.h" +#include "VL6180.h" + +//Hyperterminal configuration +//9600 bauds, 8-bit data, no parity +//VL6180X defines + +#define IDENTIFICATIONMODEL_ID 0x0000 + +Serial PC(USBTX, USBRX); +VL6180 TOF_sensor(p28, p27); +DigitalOut myled(LED1); + +#define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) +#define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) + +MCP23017 *par_port; +WattBob_TextLCD *lcd; + + +DigitalOut myled1 (p12); DigitalOut myled2 (p13); +DigitalOut myled3 (p14); DigitalOut myled4 (p15); + +DebounceIn pb1(p8); DebounceIn pb2(p9); +DebounceIn pb3(p10); DebounceIn pb4(p11); + +int old_pb1 = 0, old_pb2 = 0, old_pb3 = 0, old_pb4 = 0; +int new_pb1, new_pb2, new_pb3, new_pb4; + +int i = 0, j, row, led; +int order[10][4]; +int levelreset, tries, level = 1; +float delay; uint8_t dist; + +/*int order[4][4] = {1,2,3,4, +4,3,2,1, +3,2,1,4, +2,1,3,4};*/ + +void level1(); +void reset(); +void light(int,int); + +int Dist() +{ + lcd->cls(); lcd->locate(0,0); + dist = TOF_sensor.getDistance(); + lcd->printf("Dist=%d", dist); + wait(0.5); + return dist; +} + +// SPST Pushbutton count demo using internal PullUp function +// no external PullUp resistor needed +// Pushbutton from P8 to GND. +// Demonstrates need for debounce - will not count more than once per button hit +// This ocuurs on all switches due to mechanical contact bounce + + +int main() +{ + // Use internal pullup for pushbutton + pb1.mode(PullUp); + pb2.mode(PullUp); + pb3.mode(PullUp); + pb4.mode(PullUp); + // Delay for initial pullup to take effect + wait(.001); + TOF_sensor.VL6180_Init(); + par_port = new MCP23017(p9, p10, 0x40); + par_port->config(0x0F00, 0x0F00, 0x0F00); // configure MCP23017 chip on WattBob + lcd = new WattBob_TextLCD(par_port); + BACK_LIGHT_ON(par_port); + //char c = PC.getc(); + //if (c == 'o') + while(1) + { + while(Dist() < 250) + while(level <= 4) + { + if (level == 0) break; + for (row=0; row<10; row++) + for (j=0; j<4; j++) + { order [row][j] = (rand()% 4) + 1;} + row = rand()%4; + tries = 0; + level1(); + } + } +} + + + +void level1() +{ + while(Dist() < 250) + { + levelreset = 0; + for (j=0; j<4; j++) + { led = order[row][j]; light(led,1); } //switches on the respective LEDs according to the order + + while(Dist() < 250) + { + new_pb1 = pb1; new_pb2 = pb2; + new_pb3 = pb3; new_pb4 = pb4; + + if( ((new_pb1 == 0) && (old_pb1 == 1)) || ((new_pb2 == 0) && (old_pb2 == 1)) || ((new_pb3 == 0) && (old_pb3 == 1)) || ((new_pb4 == 0) && (old_pb4 == 1)) ) + { + switch(order[row][i]) + { + case 1: + { + if((new_pb1 == 0) && (old_pb1 == 1)) + { light(1,0); i++;} + else {reset(); levelreset = 1; tries++;} + } break; + case 2: + { + if((new_pb2 == 0) && (old_pb2 == 1)) + { light(2,0); i++;} + else {reset(); levelreset = 1; tries++;} + } break; + case 3: + { + if((new_pb3 == 0) && (old_pb3 == 1)) + { light(3,0); i++;} + else {reset(); levelreset = 1; tries++;} + } break; + case 4: + { + if((new_pb4 == 0) && (old_pb4 == 1)) + { light(4,0); i++;} + else {reset(); levelreset = 1; tries++;} + } break; + } + if (levelreset == 1) + { + if (tries > 3) {reset(); level = 0; return;} + else break; + } + else if (levelreset == 0) + if(i >= 4){level++; reset(); return;} + } + old_pb1 = new_pb1; old_pb2 = new_pb2; + old_pb3 = new_pb3; old_pb4 = new_pb4; + } + } +} + + + +void reset() //function to turn off LEDs and reset order +{ + myled1 = 0; myled2 = 0; myled3 = 0; myled4 = 0; + i = 0; wait(1); return; +} + +void light(int n, int m) //to turn on LEDs +{ + if (m == 0) //for answer + { + //turns LED on for 1 second + if(n == 1) {myled1 = 1; wait(1); myled1 = 0;} + else if(n == 2) {myled2 = 1; wait(1); myled2 = 0;} + else if(n == 3) {myled3 = 1; wait(1); myled3 = 0;} + else if(n == 4) {myled4 = 1; wait(1); myled4 = 0;} + } + + else if (m == 1) //for demo + { + //sets delay based on level number + if(level == 1) delay = 1; + else if (level == 2) delay = 0.75; + else if (level == 3) delay = 0.50; + else if (level == 4) delay = 0.25; + + //turns LED on for delay seconds before turning off + if(n == 1) {myled1 = 1; wait(delay); myled1 = 0; wait(0.2);} + else if(n == 2) {myled2 = 1; wait(delay); myled2 = 0; wait(0.2);} + else if(n == 3) {myled3 = 1; wait(delay); myled3 = 0; wait(0.2);} + else if(n == 4) {myled4 = 1; wait(delay); myled4 = 0; wait(0.2);} + } + return; +} \ No newline at end of file