Download der Dateien zum LTS-Projekts MINT bei Brückmann Elektronik:

./data/pages/downloads/


LTS_LED_Roulette.ino
LTS_Timer.ino
arduino-mcp23017-2.0.4.zip

#include <Wire.h>
#include <MCP23017.h>

#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);
}