/*
led1 sur D11
led2 sur D10
led3 sur D9
led4 sur D8
BP_top sur D7
BP1 sur A3
BP2 sur A2
BP3 sur A1
BP4 sur A0
*/
byte niveau = 1;
byte leds[] = {0, 1, 2, 4, 8};
byte pointeur_led = 0;
boolean memoStart = false;
boolean perdu =false;
byte memoPINC = 0;
byte memoPORTB = 0;
byte choix_led = 0;
byte memo_led = choix_led;
unsigned long deb = millis();
unsigned long temps = 0;
unsigned long temps_max = 1500;
unsigned long temps_while = 0;
void setup() {
Serial.begin(115200);
DDRB = 0b00001111;//EEEESSSS pour les 4 leds
PORTB = 0b00001111;//bit 0,1,2,3 à 1 pour leds éteintes
DDRC = 0b00000000;//xxxxEEEE pour les 4 BP
PORTC = 0b00001111;//bit 0,1,2,3 en pullup
DDRD & 0b01111111;//Exxxxxxx pour le BP start/stop
PORTD = 0b10000000;// bit 7 en pullup
while (PIND >= 128) {
comptage_binaire(); //tant que BP start/stop n'est pas actionné
chenillard();
}
PORTB=0;
memoStart = true;//le BP start/stop à vu un appui
decompte();// lance le décompte pour le départ
Serial.print(F("niveau ")); Serial.println(niveau);
}
void loop()
{
if (PIND <= 127) {
memoStart = !memoStart;
niveau++;
}
if (!memoStart) {
chenillard();
}
if (memoStart) {
for (int f = 0; f <= niveau; f++)
{
if (((niveau % 3) == 0) && ((f) == niveau)) {
temps_max *= 0.8;
}
PORTB = 0; delay(100); //force l'extinction de la derniere led allumée
while ((~PINC & 0b00001111) != 0) {
; //attente des 4 BP au repos
}
choix_led = random(1, 5);
pointeur_led = choix_led;
memoPINC = (~PINC & 0b00001111);
PORTB = leds[pointeur_led];
memoPORTB = PORTB;
deb = millis(); temps_while = millis() - deb; temps = 0;
while (temps_while < temps_max)
{ memoPINC = (~PINC & 0b00001111);
if (memoPINC == memoPORTB)
{
temps = (millis() - deb);
Serial.print("ok ");
break;
}
temps_while = millis() - deb;
}
if (f == niveau)
{
f = 0;
niveau++;
}
if (temps >= temps_max)
{
memoStart = false;perdu=true;
Serial.print(F("temps est dépassé ")); Serial.print(temps);
Serial.print(F(" vous avez perdu au niveau ")); Serial.print(niveau);
Serial.print (" à la "); Serial.print(f+1); Serial.println(" ème led");
}
else
{
if ((memoPORTB) != (memoPINC))
{
memoStart = false;perdu=true;
Serial.print(F("mauvaise touche ")); Serial.print(temps);
Serial.print(F(" vous avez perdu au niveau ")); Serial.print(niveau);
Serial.print (" à la "); Serial.print(f+1); Serial.println(" ème led");
}
else
{perdu=false;
Serial.print("temps = ");
Serial.print(temps); Serial.print('\t');
Serial.print(F("temps max = ")); Serial.print(temps_max); Serial.print('\t');
Serial.print(" ");
Serial.print ("niveau = "); Serial.print(niveau); Serial.print('\t');
Serial.print (" à la "); Serial.print(f+1); Serial.println(" ème led");
}
}
PORTB = 0; PINC = 0;memoPORTB = 0;memoPINC = 0;delay(100);
if(perdu)
{
while(PIND >= 128)
{chenillard();memoStart = false;niveau=1;perdu=false;}
}
}
}
}
//***********************************************************
void chenillard() {
for (byte f = 1; f <= 4; f++) {
if (PIND < 128) {
break;
}
PORTB = leds[f]; delay(250);
}
for (byte f = 4; f >= 1; f--) {
if (PIND < 128) {
break;
}
PORTB = leds[f]; delay(250);
}
}
void comptage_binaire() {
for (byte f = 0; f < 16; f++)
{
PORTB = f; delay(250);
if (PIND < 128) {
break;
}
}
}
void decompte() {
Serial.print(F("le jeu va demarrer dans "));
for (byte f = 5; f >= 1; f--) {
Serial.print(f); Serial.print(F(","));
delay(1000);
}
Serial.println (F(" GO"));
}