Rube Goldberg machine
Dependencies: 4DGL-uLCD-SE mbed PinDetect
main.cpp@6:8ec8b00d6d7c, 2016-09-25 (annotated)
- Committer:
- nhardy6
- Date:
- Sun Sep 25 12:46:54 2016 +0000
- Revision:
- 6:8ec8b00d6d7c
- Parent:
- 5:8ff6c76ead80
finale
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nhardy6 | 0:26331a8bcec1 | 1 | #include "mbed.h" |
nhardy6 | 1:5315c3a587a0 | 2 | #include "PinDetect.h" |
nhardy6 | 0:26331a8bcec1 | 3 | #include "uLCD_4DGL.h" |
nhardy6 | 0:26331a8bcec1 | 4 | |
nhardy6 | 0:26331a8bcec1 | 5 | Timer t; //timer to generate number |
nhardy6 | 0:26331a8bcec1 | 6 | |
nhardy6 | 5:8ff6c76ead80 | 7 | PinDetect begin(p8); //start of it all |
mvaca3 | 2:2bb8f06b7924 | 8 | bool volatile stop = 0; |
nhardy6 | 0:26331a8bcec1 | 9 | int num; |
nhardy6 | 5:8ff6c76ead80 | 10 | int smallFinale; |
nhardy6 | 6:8ec8b00d6d7c | 11 | int inc = 1; |
nhardy6 | 0:26331a8bcec1 | 12 | |
nhardy6 | 0:26331a8bcec1 | 13 | DigitalOut d1(p21); //display number in binary |
nhardy6 | 0:26331a8bcec1 | 14 | DigitalOut d2(p22); |
nhardy6 | 0:26331a8bcec1 | 15 | DigitalOut d3(p23); |
nhardy6 | 0:26331a8bcec1 | 16 | |
nhardy6 | 0:26331a8bcec1 | 17 | uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin; |
nhardy6 | 0:26331a8bcec1 | 18 | |
nhardy6 | 5:8ff6c76ead80 | 19 | AnalogIn finish(p15); |
nhardy6 | 5:8ff6c76ead80 | 20 | |
nhardy6 | 5:8ff6c76ead80 | 21 | DigitalOut latch(p26); |
nhardy6 | 5:8ff6c76ead80 | 22 | DigitalOut enable(p27); |
nhardy6 | 5:8ff6c76ead80 | 23 | SPI spi(p5, p6, p7); |
nhardy6 | 5:8ff6c76ead80 | 24 | |
nhardy6 | 6:8ec8b00d6d7c | 25 | int red=0; //for shiftbrite |
nhardy6 | 5:8ff6c76ead80 | 26 | int green=0; |
nhardy6 | 5:8ff6c76ead80 | 27 | int blue=0; |
nhardy6 | 5:8ff6c76ead80 | 28 | |
nhardy6 | 6:8ec8b00d6d7c | 29 | void show() { |
nhardy6 | 6:8ec8b00d6d7c | 30 | uLCD.cls(); |
nhardy6 | 6:8ec8b00d6d7c | 31 | uLCD.locate(0,0); |
nhardy6 | 6:8ec8b00d6d7c | 32 | uLCD.text_width(2); |
nhardy6 | 6:8ec8b00d6d7c | 33 | uLCD.text_height(2); |
nhardy6 | 6:8ec8b00d6d7c | 34 | uLCD.printf("GRINDING GEARS...\n\n"); |
nhardy6 | 6:8ec8b00d6d7c | 35 | wait(0.5); |
nhardy6 | 6:8ec8b00d6d7c | 36 | uLCD.printf("STAR \nSEARCHING..."); |
nhardy6 | 6:8ec8b00d6d7c | 37 | wait(1); |
nhardy6 | 6:8ec8b00d6d7c | 38 | } |
nhardy6 | 6:8ec8b00d6d7c | 39 | |
nhardy6 | 5:8ff6c76ead80 | 40 | void RGB_LED(int red, int green, int blue) |
nhardy6 | 5:8ff6c76ead80 | 41 | { |
nhardy6 | 5:8ff6c76ead80 | 42 | unsigned int low_color=0; |
nhardy6 | 5:8ff6c76ead80 | 43 | unsigned int high_color=0; |
nhardy6 | 5:8ff6c76ead80 | 44 | high_color=(blue<<4)|((red&0x3C0)>>6); |
nhardy6 | 5:8ff6c76ead80 | 45 | low_color=(((red&0x3F)<<10)|(green)); |
nhardy6 | 5:8ff6c76ead80 | 46 | spi.write(high_color); |
nhardy6 | 5:8ff6c76ead80 | 47 | spi.write(low_color); |
nhardy6 | 5:8ff6c76ead80 | 48 | latch=1; |
nhardy6 | 5:8ff6c76ead80 | 49 | latch=0; |
nhardy6 | 5:8ff6c76ead80 | 50 | } |
nhardy6 | 5:8ff6c76ead80 | 51 | |
nhardy6 | 0:26331a8bcec1 | 52 | void start() //make random numbers and fast lights until flip value |
nhardy6 | 0:26331a8bcec1 | 53 | { |
nhardy6 | 5:8ff6c76ead80 | 54 | while(!stop) { |
nhardy6 | 0:26331a8bcec1 | 55 | d1 = !d1; |
nhardy6 | 0:26331a8bcec1 | 56 | d2 = !d2; |
nhardy6 | 0:26331a8bcec1 | 57 | d3 = !d3; |
nhardy6 | 0:26331a8bcec1 | 58 | num = t.read_us()%8; |
nhardy6 | 0:26331a8bcec1 | 59 | wait(0.2); |
nhardy6 | 0:26331a8bcec1 | 60 | } |
nhardy6 | 0:26331a8bcec1 | 61 | } |
nhardy6 | 0:26331a8bcec1 | 62 | |
mvaca3 | 2:2bb8f06b7924 | 63 | void stopper(void) //flip the value |
nhardy6 | 0:26331a8bcec1 | 64 | { |
nhardy6 | 0:26331a8bcec1 | 65 | stop = 1; |
nhardy6 | 0:26331a8bcec1 | 66 | } |
nhardy6 | 0:26331a8bcec1 | 67 | |
nhardy6 | 0:26331a8bcec1 | 68 | void lights() |
nhardy6 | 0:26331a8bcec1 | 69 | { |
nhardy6 | 5:8ff6c76ead80 | 70 | if (num > 3) { |
nhardy6 | 4:c38d2a1fb99d | 71 | d3 = 1; |
nhardy6 | 6:8ec8b00d6d7c | 72 | } else { |
nhardy6 | 6:8ec8b00d6d7c | 73 | d3 = 0; |
nhardy6 | 0:26331a8bcec1 | 74 | } |
nhardy6 | 5:8ff6c76ead80 | 75 | if (num == 2 || num == 3 || num == 6 || num == 7) { |
nhardy6 | 0:26331a8bcec1 | 76 | d2 = 1; |
nhardy6 | 6:8ec8b00d6d7c | 77 | } else { |
nhardy6 | 6:8ec8b00d6d7c | 78 | d2 = 0; |
nhardy6 | 0:26331a8bcec1 | 79 | } |
nhardy6 | 5:8ff6c76ead80 | 80 | if ((num % 2) == 1) { |
nhardy6 | 4:c38d2a1fb99d | 81 | d1 = 1; |
nhardy6 | 6:8ec8b00d6d7c | 82 | } else { |
nhardy6 | 6:8ec8b00d6d7c | 83 | d1 = 0; |
nhardy6 | 0:26331a8bcec1 | 84 | } |
nhardy6 | 0:26331a8bcec1 | 85 | } |
nhardy6 | 0:26331a8bcec1 | 86 | |
nhardy6 | 5:8ff6c76ead80 | 87 | void bigFinale(int a, int b) |
nhardy6 | 5:8ff6c76ead80 | 88 | { |
nhardy6 | 5:8ff6c76ead80 | 89 | red = a; |
nhardy6 | 5:8ff6c76ead80 | 90 | green = b; |
nhardy6 | 6:8ec8b00d6d7c | 91 | blue = 0; |
nhardy6 | 6:8ec8b00d6d7c | 92 | while (true) { |
nhardy6 | 6:8ec8b00d6d7c | 93 | RGB_LED(red, green, blue); |
nhardy6 | 6:8ec8b00d6d7c | 94 | blue = blue + inc; |
nhardy6 | 6:8ec8b00d6d7c | 95 | if (blue == 0 || blue == 256) { |
nhardy6 | 6:8ec8b00d6d7c | 96 | inc = -inc; |
nhardy6 | 6:8ec8b00d6d7c | 97 | } |
nhardy6 | 6:8ec8b00d6d7c | 98 | wait(0.01); |
nhardy6 | 6:8ec8b00d6d7c | 99 | } |
nhardy6 | 5:8ff6c76ead80 | 100 | } |
nhardy6 | 5:8ff6c76ead80 | 101 | |
nhardy6 | 0:26331a8bcec1 | 102 | int main() |
nhardy6 | 0:26331a8bcec1 | 103 | { |
nhardy6 | 0:26331a8bcec1 | 104 | t.start(); //start timer |
nhardy6 | 0:26331a8bcec1 | 105 | uLCD.cls(); //prepare screen |
nhardy6 | 5:8ff6c76ead80 | 106 | wait(0.1); |
nhardy6 | 5:8ff6c76ead80 | 107 | spi.format(16,0); //setup spi |
nhardy6 | 5:8ff6c76ead80 | 108 | spi.frequency(500000); |
nhardy6 | 5:8ff6c76ead80 | 109 | enable=0; |
nhardy6 | 5:8ff6c76ead80 | 110 | latch=0; |
nhardy6 | 5:8ff6c76ead80 | 111 | wait(2); |
mvaca3 | 3:f108df5ad90b | 112 | uLCD.locate(0,0); |
mvaca3 | 3:f108df5ad90b | 113 | uLCD.color(WHITE); |
nhardy6 | 5:8ff6c76ead80 | 114 | begin.mode(PullUp); //attach pushbutton |
nhardy6 | 4:c38d2a1fb99d | 115 | wait(.01); //setup delay |
nhardy6 | 1:5315c3a587a0 | 116 | begin.attach_deasserted(&stopper); |
mvaca3 | 2:2bb8f06b7924 | 117 | begin.setSampleFrequency(); |
nhardy6 | 6:8ec8b00d6d7c | 118 | uLCD.text_width(3); |
nhardy6 | 6:8ec8b00d6d7c | 119 | uLCD.text_height(3); |
nhardy6 | 6:8ec8b00d6d7c | 120 | uLCD.printf(" FIRE\n WHEN\n READY"); |
nhardy6 | 0:26331a8bcec1 | 121 | start(); //begin the choosing |
nhardy6 | 0:26331a8bcec1 | 122 | lights(); //light lights according to generated number |
nhardy6 | 6:8ec8b00d6d7c | 123 | show(); |
nhardy6 | 6:8ec8b00d6d7c | 124 | uLCD.cls(); |
nhardy6 | 6:8ec8b00d6d7c | 125 | uLCD.locate(0,0); |
nhardy6 | 6:8ec8b00d6d7c | 126 | uLCD.printf("You got the number"); |
nhardy6 | 6:8ec8b00d6d7c | 127 | uLCD.text_width(5); |
nhardy6 | 6:8ec8b00d6d7c | 128 | uLCD.text_height(5); |
nhardy6 | 6:8ec8b00d6d7c | 129 | uLCD.locate(1,1); |
nhardy6 | 6:8ec8b00d6d7c | 130 | uLCD.printf("%2D",num); |
nhardy6 | 6:8ec8b00d6d7c | 131 | uLCD.text_width(1); |
nhardy6 | 6:8ec8b00d6d7c | 132 | uLCD.text_height(1); |
nhardy6 | 6:8ec8b00d6d7c | 133 | uLCD.locate(0,13); |
nhardy6 | 6:8ec8b00d6d7c | 134 | uLCD.printf("The lights knew\n this would happen"); |
nhardy6 | 6:8ec8b00d6d7c | 135 | wait(4); |
nhardy6 | 6:8ec8b00d6d7c | 136 | |
nhardy6 | 6:8ec8b00d6d7c | 137 | smallFinale = 256*finish.read(); |
nhardy6 | 6:8ec8b00d6d7c | 138 | uLCD.cls(); |
nhardy6 | 6:8ec8b00d6d7c | 139 | uLCD.text_width(3); |
nhardy6 | 6:8ec8b00d6d7c | 140 | uLCD.text_height(3); |
nhardy6 | 6:8ec8b00d6d7c | 141 | uLCD.locate(0,0); |
nhardy6 | 6:8ec8b00d6d7c | 142 | uLCD.printf(" YOUR\nSTATS:"); |
nhardy6 | 6:8ec8b00d6d7c | 143 | uLCD.text_width(2); |
nhardy6 | 6:8ec8b00d6d7c | 144 | uLCD.text_height(2); |
nhardy6 | 6:8ec8b00d6d7c | 145 | uLCD.locate(1,5); |
nhardy6 | 6:8ec8b00d6d7c | 146 | uLCD.color(RED); |
nhardy6 | 6:8ec8b00d6d7c | 147 | uLCD.printf("\t%2D",num*256/7); |
nhardy6 | 6:8ec8b00d6d7c | 148 | uLCD.color(GREEN); |
nhardy6 | 6:8ec8b00d6d7c | 149 | uLCD.printf("\t %2D",smallFinale); |
nhardy6 | 6:8ec8b00d6d7c | 150 | bigFinale(num*256/7,smallFinale); //output branch numbers to light |
nhardy6 | 0:26331a8bcec1 | 151 | } |