Das Spielprinzip ist klar. Es gibt eine Frage und wer zuerst auf seinen Buzzer drückt, dessen Farbe leuchtet, egal wie oft der andere auch noch drückt. So muss bei Spielen nicht lange diskutiert werden, wer sich zuerst gemeldet hat, sondern die Farbe die leuchtet, der Spieler war schneller.
Durch die umlaufenden Neopixel (bzw.: einer dieser Chips, WS2812B WS2811 WS2813 WS2815) sieht das ganze auch noch sehr gut aus.
Durch die Spannungsversorgung mit USB Kabel und 5 Volt, kann das Spiel auch über eine Powerbank versorgt werden.
Für die LED und die Buzzer werden keine Wiederstände benötigt, da die LED über PWM und die Buzzer über die internen PullUp Wiederstände angeschlossen sind.
Da ich sehr viel GND Potenzial habe, ist dafür eine Wago Klemme direkt auf das Holz geklebt.
Die Grobhandtaster waren rel. günstig von Ali. bin mal gespannt wie lange die halten. Dafür gefallen mir die Füße aus getrocknetem Haselnuss extrem gut.
Hier noch der Arduino Code für das Spiel:
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strip_pin11 = Adafruit_NeoPixel(60,11, NEO_GRB + NEO_KHZ800);
bool richtung = true;
byte zustand = 0;
int led1 = 9;
int led2 = 50;
int timer = 0;
long ZeitVariable = 0L;
int led = 59;
void Unterprogramm2();
void Unterprogramm1();
void setup() {
strip_pin11.begin();
strip_pin11.show();
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
analogWrite(5 , 0);
analogWrite(6 , 0);
richtung = true;
zustand = 0;
led1 = 9;
led2 = 50;
timer = 0;
Unterprogramm2();
}
void loop() {
ZeitVariable = millis();
while(ZeitVariable + 50L >= millis()) {
if (!( digitalRead(2) )) {
analogWrite(6 , 70);
zustand = 1;
led = 59;
for (int i = 0; i < 60; i++) {
strip_pin11.setPixelColor(led,30 ,0 ,0 );
strip_pin11.show();
led = ( led - 1 );
delay( 20 );
}
while ( ( zustand == 1 ) ) {
Unterprogramm1();
}
Unterprogramm2();
}
if (!( digitalRead(3) )) {
analogWrite(5 , 70);
zustand = 2;
led = 0;
for (int i = 0; i < 60; i++) {
strip_pin11.setPixelColor(led,0 ,0 ,30 );
strip_pin11.show();
led = ( led + 1 );
delay( 20 );
}
while ( ( zustand == 2 ) ) {
Unterprogramm1();
}
Unterprogramm2();
}
analogWrite(5 , 0);
analogWrite(6 , 0);
}
if (( zustand == 0 )) {
if (( led1 <= 8 )) {
richtung = true;
}
if (( led1 >= 30 )) {
richtung = false;
}
if (( richtung == true )) {
strip_pin11.setPixelColor(led1,30 ,0 ,0 );
strip_pin11.show();
led1 = ( led1 + 1 );
strip_pin11.setPixelColor(led2,0 ,0 ,30 );
strip_pin11.show();
led2 = ( led2 - 1 );
}
if (( richtung == false )) {
strip_pin11.setPixelColor(led1,0 ,0 ,30 );
strip_pin11.show();
led1 = ( led1 - 1 );
strip_pin11.setPixelColor(led2,30 ,0 ,0 );
strip_pin11.show();
led2 = ( led2 + 1 );
}
}
}
//Funktionsbeschreibung
void Unterprogramm2() {
led = 0;
for (int i = 0; i < 9; i++) {
strip_pin11.setPixelColor(led,0 ,0 ,30 );
strip_pin11.show();
led = ( led + 1 );
}
led = 51;
for (int i = 0; i < 9; i++) {
strip_pin11.setPixelColor(led,30 ,0 ,0 );
strip_pin11.show();
led = ( led + 1 );
}
}
//Funktionsbeschreibung
void Unterprogramm1() {
led = 0;
if (( !( digitalRead(2) ) && !( digitalRead(3) ) )) {
while ( ( !( digitalRead(2) ) && !( digitalRead(3) ) ) ) {
delay( 10 );
timer = ( timer + 1 );
if (( timer > 100 )) {
zustand = 0;
for (int i = 0; i < 60; i++) {
strip_pin11.setPixelColor(led,0 ,30 ,0 );
strip_pin11.show();
led = ( led + 1 );
}
}
}
}
timer = 0;
led2 = 50;
led1 = 9;
delay( 700 );
}