/* * Exit Rum 2 * (c) Tomas 'Harvie' Mudrunka 2018 */ //Nastaveni bomby #define DISARM_CODE "73138477" #define TIME_COUNTDOWN 600 //#define TIME_COUNTDOWN 15 //Prirazeni pinu #define PIN_CABLE_CHECK 2 #define PIN_KEY_CLK 3 //IRQ! #define PIN_KEY_DATA 4 #define PIN_LED_G 5 #define PIN_LED_B 6 #define PIN_LED_R 7 #define PIN_COIL_LO 10 #define PIN_COIL_HI 11 #define ADDR_DISPLAY 0x70 ////////////////////////////////////////////////////////////////// #include //#include // Enable this line if using Arduino Uno, Mega, etc. #include #include "Adafruit_LEDBackpack.h" PS2Keyboard keyboard; Adafruit_7segment display = Adafruit_7segment(); #define cnt_sec(s) (s%60) #define cnt_min(s) (s/60) #define cnt_dec(s) (cnt_min(s)*100+cnt_sec(s)) void setup() { //Pripravime periferie Serial.begin(9600); keyboard.begin(PIN_KEY_DATA, PIN_KEY_CLK); display.begin(ADDR_DISPLAY); pinMode(PIN_LED_R, OUTPUT); pinMode(PIN_LED_G, OUTPUT); pinMode(PIN_LED_B, OUTPUT); pinMode(PIN_COIL_LO, OUTPUT); pinMode(PIN_COIL_HI, OUTPUT); pinMode(PIN_CABLE_CHECK, INPUT_PULLUP); } int test_disarmed(int reset) { static int guessed = 0, disarmed = 0; if (reset) { guessed = 0; disarmed = 0; } //Cteme klavesnici while (keyboard.available()) { char c = keyboard.read(); if (c == PS2_ENTER) { Serial.println(); } else { Serial.print(c); } if (c == DISARM_CODE[guessed]) { guessed++; Serial.println("\nGOT!"); } else { guessed = 0; Serial.println("\nFAIL!"); } if (DISARM_CODE[guessed] == 0) { disarmed = 1; Serial.println("\nDISARMED!"); } } return disarmed; } void loop() { //Vynulujem periferie digitalWrite(PIN_COIL_LO, LOW); digitalWrite(PIN_COIL_HI, LOW); analogWrite(PIN_LED_R, 0); analogWrite(PIN_LED_G, 0); analogWrite(PIN_LED_B, 0); display.clear(); display.setBrightness(15); display.writeDisplay(); while (keyboard.available()) keyboard.read(); test_disarmed(1); //Pockame na pripojeni kabelu display.print(0xCAB1, HEX); display.writeDisplay(); while (digitalRead(PIN_CABLE_CHECK)) delay(100); //Pockame na odpojeni kabelu display.clear(); display.writeDisplay(); while (!digitalRead(PIN_CABLE_CHECK)) delay(100); //Odpocitavame for (int cnt = TIME_COUNTDOWN; cnt >= 0 && !test_disarmed(0); cnt--) { display.print(cnt_dec(cnt), DEC); display.drawColon((cnt + 1) % 2); display.writeDisplay(); analogWrite(PIN_LED_R, random(0, 3)); analogWrite(PIN_LED_G, random(0, 3)); analogWrite(PIN_LED_B, random(0, 3)); //Tikani / pipani tone(PIN_COIL_LO, 1000, 50); delay(60); digitalWrite(PIN_COIL_LO, HIGH); delay(40); digitalWrite(PIN_COIL_LO, LOW); delay(900); } while (!test_disarmed(0)) { //Bomba vybouchla int i; analogWrite(PIN_LED_R, random(0, 255)); analogWrite(PIN_LED_G, random(0, 0)); analogWrite(PIN_LED_B, random(0, 255)); for (i = 0; i < 10; i++) display.writeDigitRaw(i, random(0, 255)); display.setBrightness(random(0, 15)); display.writeDisplay(); digitalWrite(PIN_COIL_HI, HIGH); delay(20); digitalWrite(PIN_COIL_HI, LOW); int rnd = random(30, 100); tone(PIN_COIL_LO, random(100, 8000), rnd); delay(rnd); } //Bomba byla deaktivovana tone(PIN_COIL_LO, 3000, 500); delay(500); tone(PIN_COIL_LO, 5000, 500); analogWrite(PIN_LED_R, 0); analogWrite(PIN_LED_G, 0); analogWrite(PIN_LED_B, 0); display.print(0xDEFD, HEX); display.writeDisplay(); delay(1000); //Pockame na zmenu kabelu char s = digitalRead(PIN_CABLE_CHECK); while (digitalRead(PIN_CABLE_CHECK) == s) delay(100); }