commit
224a10fd88
@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.ccls-cache
|
||||
lib
|
||||
include
|
||||
test
|
@ -0,0 +1,15 @@
|
||||
;PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:uno]
|
||||
platform = atmelavr
|
||||
board = uno
|
||||
framework = arduino
|
||||
|
@ -0,0 +1,268 @@
|
||||
/*
|
||||
LEDs: 3 - 12
|
||||
Punkte: Register
|
||||
|
||||
(Buttons)
|
||||
Player 1: A0, 1-4 in Reg
|
||||
Player 2: A1, 5-7,15 in Reg
|
||||
*/
|
||||
#include "Arduino.h"
|
||||
#define LMAX 13
|
||||
#define LMIN 3
|
||||
#define LMID 8
|
||||
|
||||
typedef enum direction { up = 1, down = -1 } dir;
|
||||
|
||||
typedef struct p {
|
||||
int id;
|
||||
int binarynum;
|
||||
int punkte;
|
||||
int pressed;
|
||||
} player;
|
||||
|
||||
player p1, p2;
|
||||
int speed = 10;
|
||||
// Pin connected to ST_CP of 74HC595
|
||||
int latchPin = 18;
|
||||
// Pin connected to SH_CP of 74HC595
|
||||
int clockPin = 17;
|
||||
////Pin connected to DS of 74HC595
|
||||
int dataPin = 16;
|
||||
|
||||
void gameLoop();
|
||||
int pressLoop(player *p);
|
||||
void ledActive(int l, dir d);
|
||||
void ledOn(int l);
|
||||
void ledOff(int l);
|
||||
void anticheat(int l);
|
||||
void release(int l, dir d);
|
||||
void setPoints(int p);
|
||||
void gameEnd(player *p);
|
||||
void endAnimation();
|
||||
void startupAnimation();
|
||||
void resetPlayer();
|
||||
|
||||
void setup() {
|
||||
// Serial.begin(9600);
|
||||
|
||||
// init pins
|
||||
for (int i = 3; i <= LMAX; ++i) {
|
||||
pinMode(i, OUTPUT);
|
||||
}
|
||||
|
||||
pinMode(14, INPUT);
|
||||
pinMode(15, INPUT);
|
||||
|
||||
pinMode(latchPin, OUTPUT);
|
||||
pinMode(clockPin, OUTPUT);
|
||||
pinMode(dataPin, OUTPUT);
|
||||
|
||||
resetPlayer();
|
||||
|
||||
randomSeed(analogRead(6));
|
||||
startupAnimation();
|
||||
}
|
||||
|
||||
// int a = 0;
|
||||
// void test() {
|
||||
// if (digitalRead(p1.id)) {
|
||||
// ledOn(8);
|
||||
// }
|
||||
// delay(25);
|
||||
// ledOff(8);
|
||||
// if (digitalRead(p2.id) && a == 0) {
|
||||
// a = 1;
|
||||
// digitalWrite(latchPin, LOW);
|
||||
// shiftOut(dataPin, clockPin, MSBFIRST, 16);
|
||||
// digitalWrite(latchPin, HIGH);
|
||||
// delay(300);
|
||||
// }
|
||||
// if (digitalRead(p2.id) && a == 1) {
|
||||
// a = 0;
|
||||
// digitalWrite(latchPin, LOW);
|
||||
// shiftOut(dataPin, clockPin, MSBFIRST, 0);
|
||||
// digitalWrite(latchPin, HIGH);
|
||||
// delay(200);
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
void loop() {
|
||||
setPoints(0);
|
||||
gameLoop();
|
||||
}
|
||||
|
||||
// Setzt Status des Playerbuttons
|
||||
void anticheat(int l) {
|
||||
if (digitalRead(p1.id) && l != LMAX) {
|
||||
p1.pressed = 1;
|
||||
}
|
||||
if (digitalRead(p2.id) && l != LMIN) {
|
||||
p2.pressed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void release(int l, dir d) {
|
||||
if (l == LMAX - 1 && d == down)
|
||||
p1.pressed = 0;
|
||||
if (l == LMIN + 1 && d == up)
|
||||
p2.pressed = 0;
|
||||
}
|
||||
|
||||
void ledOn(int l) { digitalWrite(l, HIGH); }
|
||||
|
||||
void ledOff(int l) { digitalWrite(l, LOW); }
|
||||
|
||||
void ledActive(int l, dir d) {
|
||||
// Rand speed in der Mitte
|
||||
if (l == LMID) {
|
||||
speed = random(30, 120);
|
||||
// speed = 800;
|
||||
}
|
||||
|
||||
if (d == up) {
|
||||
ledOff(l - 1);
|
||||
} else {
|
||||
ledOff(l + 1);
|
||||
}
|
||||
ledOn(l);
|
||||
|
||||
// Abfrage was zu tun ist (warten oder Knopf checken)
|
||||
if (l == LMIN) {
|
||||
if (pressLoop(&p2)) {
|
||||
p2.binarynum >>= 1;
|
||||
p2.punkte += p2.binarynum;
|
||||
setPoints(p1.punkte + p2.punkte);
|
||||
}
|
||||
} else if (l == LMAX) {
|
||||
if (pressLoop(&p1)) {
|
||||
p1.binarynum >>= 1;
|
||||
p1.punkte += p1.binarynum;
|
||||
setPoints(p1.punkte + p2.punkte);
|
||||
}
|
||||
} else {
|
||||
delay(speed);
|
||||
anticheat(l);
|
||||
release(l, d);
|
||||
}
|
||||
}
|
||||
// ret 1 wenn in zeit gedrückt, 0 sonst
|
||||
int pressLoop(player *p) {
|
||||
// Falls gecheated wurde, aussetzen
|
||||
if (p->pressed) {
|
||||
delay(speed);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Abfrageloop
|
||||
for (int i = 0; i < speed; ++i) {
|
||||
if (digitalRead(p->id)) {
|
||||
return 1;
|
||||
}
|
||||
delay(1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gameLoop() {
|
||||
int led = LMID;
|
||||
dir d = (random(0,11) < 5) ? up : down;
|
||||
// dir d = up;
|
||||
|
||||
while (true) {
|
||||
// Richtung bei erreichen von letzter LED wechseln
|
||||
if (led == LMAX && d == up) {
|
||||
d = down;
|
||||
} else if (led == LMIN && d == down) {
|
||||
d = up;
|
||||
}
|
||||
// Je nach Richtung inc oder dec
|
||||
led = (d == up) ? led + 1 : led - 1;
|
||||
// LED aktivieren und buttons checken
|
||||
ledActive(led, d);
|
||||
// GAME OVER
|
||||
if (p1.punkte == 15) {
|
||||
gameEnd(&p1);
|
||||
return;
|
||||
}
|
||||
if (p2.punkte == 240) {
|
||||
gameEnd(&p2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setPoints(int p) {
|
||||
digitalWrite(latchPin, LOW);
|
||||
// shift out the bits:
|
||||
// 1, 2, 4, 8, 16, 32, 64, 128
|
||||
shiftOut(dataPin, clockPin, MSBFIRST, p);
|
||||
// take the latch pin high so the LEDs will light up:
|
||||
digitalWrite(latchPin, HIGH);
|
||||
}
|
||||
|
||||
void resetPlayer() {
|
||||
// Player 1 Init
|
||||
p1.id = 15; // Analog 1
|
||||
p1.binarynum = 16;
|
||||
p1.punkte = 0;
|
||||
p1.pressed = 0;
|
||||
|
||||
// Player 2 Init
|
||||
p2.id = 14; // Analog 0
|
||||
p2.binarynum = 256;
|
||||
p2.punkte = 0;
|
||||
p2.pressed = 0;
|
||||
}
|
||||
|
||||
void gameEnd(player *p) {
|
||||
for (int i = 0; i < 5; ++i) {
|
||||
digitalWrite(latchPin, LOW);
|
||||
shiftOut(dataPin, clockPin, MSBFIRST, 0);
|
||||
digitalWrite(latchPin, HIGH);
|
||||
delay(80);
|
||||
digitalWrite(latchPin, LOW);
|
||||
shiftOut(dataPin, clockPin, MSBFIRST, p->punkte);
|
||||
digitalWrite(latchPin, HIGH);
|
||||
delay(80);
|
||||
}
|
||||
endAnimation();
|
||||
|
||||
digitalWrite(latchPin, LOW);
|
||||
shiftOut(dataPin, clockPin, MSBFIRST, 0);
|
||||
digitalWrite(latchPin, HIGH);
|
||||
delay(80);
|
||||
|
||||
resetPlayer();
|
||||
}
|
||||
|
||||
void endAnimation() {
|
||||
int speed = 25;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
ledOn(LMID + i);
|
||||
ledOn(LMID - i);
|
||||
delay(speed);
|
||||
ledOff(LMID + i);
|
||||
ledOff(LMID - i);
|
||||
}
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
ledOn(LMIN + i);
|
||||
ledOn(LMAX - i);
|
||||
delay(speed);
|
||||
ledOff(LMIN + i);
|
||||
ledOff(LMAX - i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void startupAnimation() {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
for (int i = 1; i < 200; i *= 2) {
|
||||
digitalWrite(latchPin, LOW);
|
||||
shiftOut(dataPin, clockPin, MSBFIRST, i);
|
||||
digitalWrite(latchPin, HIGH);
|
||||
delay(100);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue