Download der Dateien zum LTS-Projekts MINT bei Brückmann Elektronik:
#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);
}