Download der Dateien zum LTS-Projekts MINT bei Brückmann Elektronik: {{FileSharing}} #include #include #define BUTTON1 4 #define BUTTON2 5 #define BUTTON3 6 #define BUZZER 2 #define MAX_LEDS 24 #define SPEED 50 #define RAND_MIN 3 #define RAND_MAX 10 MCP23017 controller1 = MCP23017(0x20); MCP23017 controller2 = MCP23017(0x21); MCP23017 controller3 = MCP23017(0x22); void setPinAll(byte state) { if (state == 0) { controller1.writeRegister(MCP23017Register::GPIO_A, 0x00); controller2.writeRegister(MCP23017Register::GPIO_A, 0x00); controller3.writeRegister(MCP23017Register::GPIO_A, 0x00); } else if (state == 1) { controller1.writeRegister(MCP23017Register::GPIO_A, 0xFF); controller2.writeRegister(MCP23017Register::GPIO_A, 0xFF); controller3.writeRegister(MCP23017Register::GPIO_A, 0xFF); } } void setPinState(int led, byte state) { if (led > MAX_LEDS) { Serial.println("WARN: LED " + String(led) + "(max. " + String(MAX_LEDS) + ") overflow. Set to " + String(led - MAX_LEDS)); led = led - MAX_LEDS; } switch (led) { case 1: controller1.digitalWrite(0, state); break; case 2: controller1.digitalWrite(1, state); break; case 3: controller1.digitalWrite(2, state); break; case 4: controller1.digitalWrite(3, state); break; case 5: controller1.digitalWrite(4, state); break; case 6: controller1.digitalWrite(5, state); break; case 7: controller1.digitalWrite(6, state); break; case 8: controller1.digitalWrite(7, state); break; case 9: controller2.digitalWrite(0, state); break; case 10: controller2.digitalWrite(1, state); break; case 11: controller2.digitalWrite(2, state); break; case 12: controller2.digitalWrite(3, state); break; case 13: controller2.digitalWrite(4, state); break; case 14: controller2.digitalWrite(5, state); break; case 15: controller2.digitalWrite(6, state); break; case 16: controller2.digitalWrite(7, state); break; case 17: controller3.digitalWrite(0, state); break; case 18: controller3.digitalWrite(1, state); break; case 19: controller3.digitalWrite(2, state); break; case 20: controller3.digitalWrite(3, state); break; case 21: controller3.digitalWrite(4, state); break; case 22: controller3.digitalWrite(5, state); break; case 23: controller3.digitalWrite(6, state); break; case 24: controller3.digitalWrite(7, state); break; } } void runSample(byte sample) { switch (sample) { case 1: for (int i = 1; i <= MAX_LEDS; i++) { setPinState(i, 1); delay(SPEED); } for (int i = 1; i <= MAX_LEDS; i++) { setPinState(i, 0); delay(SPEED); } break; case 2: for (int i = 1; i <= MAX_LEDS; i++) { setPinState(i, 1); delay(SPEED); setPinState(i, 0); } break; case 3: for (int i = 1; i <= MAX_LEDS; i++) { setPinState(i, 1); if (i > 12) { setPinState(i - 12, 1); delay(SPEED); setPinState(i - 12, 0); } else if (i < 12) { setPinState(i + 12, 1); delay(SPEED); setPinState(i + 12, 0); } delay(SPEED); setPinState(i, 0); } break; } } void setup() { Wire.begin(); Serial.begin(19200); Serial.println("Version 1.0\nProgram: Roulette"); Serial.println("Init: Set random seed: " + String(analogRead(0))); randomSeed(analogRead(0)); Serial.println("Init: Controller 1"); controller1.init(); controller1.portMode(MCP23017Port::A, 0); controller1.writeRegister(MCP23017Register::GPIO_A, 0x00); Serial.println("Init: Controller 2"); controller2.init(); controller2.portMode(MCP23017Port::A, 0); controller2.writeRegister(MCP23017Register::GPIO_A, 0x00); Serial.println("Init: Controller 3"); controller3.init(); controller3.portMode(MCP23017Port::A, 0); controller3.writeRegister(MCP23017Register::GPIO_A, 0x00); delay(100); } void loop() { // Test Sample Mode if (digitalRead(BUTTON1) == HIGH && digitalRead(BUTTON2) == LOW && digitalRead(BUTTON3) == HIGH) { Serial.println("MODE: TEST"); tone(BUZZER, 200); setPinAll(1); delay(150); noTone(BUZZER); tone(BUZZER, 300); delay(150); noTone(BUZZER); setPinAll(0); while (true) { // BUTTON 1 if (digitalRead(BUTTON1) == HIGH && digitalRead(BUTTON2) == LOW && digitalRead(BUTTON3) == LOW) { tone(BUZZER, 400); runSample(1); noTone(BUZZER); return; } // BUTTON 2 else if (digitalRead(BUTTON1) == LOW && digitalRead(BUTTON2) == HIGH && digitalRead(BUTTON3) == LOW) { tone(BUZZER, 800); runSample(2); noTone(BUZZER); return; } // BUTTON 3 else if (digitalRead(BUTTON1) == LOW && digitalRead(BUTTON2) == LOW && digitalRead(BUTTON3) == HIGH) { tone(BUZZER, 1200); runSample(3); noTone(BUZZER); return; } delay(100); } } //Game Mode else if (digitalRead(BUTTON1) == HIGH && digitalRead(BUTTON2) == LOW && digitalRead(BUTTON3) == LOW) { int randomOffset = 0; Serial.println("MODE: GAME"); tone(BUZZER, 300); setPinAll(1); delay(750); setPinAll(0); noTone(BUZZER); delay(100); // Game Basis auf Sample 2 while (true) { for (int i = 1; i <= MAX_LEDS; i++) { setPinState(i, 1); // BUTTON 2 To Stop if (digitalRead(BUTTON1) == LOW && digitalRead(BUTTON2) == HIGH && digitalRead(BUTTON3) == LOW) { randomOffset = random(RAND_MIN, RAND_MAX); } delay(SPEED); setPinState(i, 0); if (randomOffset != 0) { Serial.println(randomOffset); for (int a = 0; a <= randomOffset; a++) { setPinState(i + a, 1); delay(SPEED * 10); setPinState(i + a, 0); } setPinState(i + randomOffset, 1); tone(BUZZER, 250); delay(1000); noTone(BUZZER); setPinState(i + randomOffset, 0); return; } } } } delay(100); }