Bonjour,, et pour cause, il faut le balloter dans tous les sens. Je me suis inspiré des labyrinthes à bille avec des trous et un ancien article d'électronique-pratique. Il faut toucher les plots verts qui s'allument au hasard à chaque coup réussi en évitant les plots rouges qui remettent le score à 0!... Le jeu est temporisé (via un vieux vu-mètre), mais chaque coup réussi gagne 10 sec. Encore une fois grâce à l'Arduino qui permet d'enregistrer le meilleur score. Une piste conductrice mise à la masse (alu ménager dans mon cas) et plots isolés ("Tubtara"M8 avec 1 led dedans), 4 plots rouges aux angles rendent déjà le jeu assez difficile. J'ai choisi des nixies (qui nécessitent env. 180V), mais il est aussi possible d'utiliser de 7-segents classiques.
Le programme:
// bille !!!conflits entre tone & analogWrite p. 3 & 11!!!
#include <EEPROM.h>
//init variables
unsigned long tm; //gestion temps anim.
unsigned long tm1; //gestion temps jeu
unsigned long inv; //gestion tempo invalid.
byte tps = 0;
byte niy = 0;
byte rnd = 0;
byte uni;
byte diz;
byte nix = 0;
byte rec;
byte bsc = 0; //basc. pts/rec
boolean st = 0; //en attente
byte tmp;
void setup()
{
//init ports
DDRD = 1; //sorties
PORTD = 0; //nixies
pinMode(A0, OUTPUT); // ) A led's pc0
pinMode(A1, OUTPUT); // ) B led's pc1
pinMode(A2, OUTPUT); // ) C led's pc2
pinMode(A3, OUTPUT); // ) D led's pc3
pinMode(A4, INPUT_PULLUP); // entr�e cpt pc4
pinMode(A5, INPUT); // entr�e raz pc5
pinMode(11, OUTPUT); // galva pb2
pinMode(12, OUTPUT); // son pb3
pinMode(13, INPUT_PULLUP); // b.p. start pb4
pinMode(8, OUTPUT); // recopie bit 0 nix
pinMode(9, OUTPUT); // " bit 1 nix
pinMode(10, INPUT_PULLUP); // r.a.z. rec.
analogWrite(11,128); //galva tps � mi-ech.
//tone(12,440,200);
digitalWrite(12,HIGH);//bip test (buzzer actif)
delay(200);
digitalWrite(12,LOW);
//Serial.begin(9600);
if (digitalRead(10) == 0) {EEPROM.put(0,nix);}
EEPROM.get(0,rec); //lect. record
}
void loop()
{
if (st == 0) //en attente?
{
if ((millis() - tm) > 200) //tous les 1/5 sec.
{
if (bsc > 10){bsc = 0;}
bsc ++;
if (bsc == 1) //aff. pts
{
niy = nix;
aff();
analogWrite(11,0);
}
if (bsc == 6) //aff. rec
{
nix = rec;
aff();
nix = niy;
analogWrite(11,255);
}
rnd = random(15);
PORTC = rnd; //led's al�at.
if (digitalRead(13) == 0)
{
st = 1; //d�marrage
tps = 255;
}
tm = millis(); //m.�.j. tempo.
//Serial.println(nix,HEX);
//Serial.println(rec,HEX);
}
}
else
{
if (tps > 254) //rst cpt
{
uni = 0;
diz = 0;
nix = 0;
aff();
}
if ((millis() - tm1) > 250) //tous les 1/4 sec.
{
if (tps > 0)
{
tps --;
analogWrite (11,tps);//d�compte galva.
}
tm1 = millis();
}
if (digitalRead(A5) == 1) //plot faute
{
uni = 0;
diz = 0;
nix = 0;
aff();
for(bsc = 0;bsc < 21;bsc++) //trr...
{
digitalWrite(12,HIGH);
delay(10);
digitalWrite(12,LOW);
delay(10);
}
}
if (digitalRead(A4) == 0)//bon plot
{
uni ++;
if (uni > 9)
{
uni = 0;
diz ++;
}
nix = uni + ( 16 * diz);
aff();
if (tps < 250)
{tps = tps + 4;} // + 1 sec.
digitalWrite(12,HIGH); //bip
delay(200);
digitalWrite(12,LOW);
rnd = random(15);
PORTC = rnd; //led's al�at.
}
if (tps < 1)
{st = 0; //fin partie
if (nix > rec) //rec. battu?
{EEPROM.put(0,nix);
rec = nix;
for(bsc = 0;bsc < 11;bsc++)
{
PORTC = bsc;
digitalWrite(12,HIGH);
delay(50);
digitalWrite(12,LOW);
delay(50);
}
}
else
{
digitalWrite(12,HIGH);
delay(500);
digitalWrite(12,LOW);
}
}
}
}
void aff()
{
PORTD = nix;
digitalWrite(8,LOW);
digitalWrite(9,LOW);
tmp = nix & 1;
if (tmp != false) digitalWrite(8,HIGH);
tmp = nix & 2;
if (tmp != false) digitalWrite(9,HIGH);
}
Le programme:
// bille !!!conflits entre tone & analogWrite p. 3 & 11!!!
#include <EEPROM.h>
//init variables
unsigned long tm; //gestion temps anim.
unsigned long tm1; //gestion temps jeu
unsigned long inv; //gestion tempo invalid.
byte tps = 0;
byte niy = 0;
byte rnd = 0;
byte uni;
byte diz;
byte nix = 0;
byte rec;
byte bsc = 0; //basc. pts/rec
boolean st = 0; //en attente
byte tmp;
void setup()
{
//init ports
DDRD = 1; //sorties
PORTD = 0; //nixies
pinMode(A0, OUTPUT); // ) A led's pc0
pinMode(A1, OUTPUT); // ) B led's pc1
pinMode(A2, OUTPUT); // ) C led's pc2
pinMode(A3, OUTPUT); // ) D led's pc3
pinMode(A4, INPUT_PULLUP); // entr�e cpt pc4
pinMode(A5, INPUT); // entr�e raz pc5
pinMode(11, OUTPUT); // galva pb2
pinMode(12, OUTPUT); // son pb3
pinMode(13, INPUT_PULLUP); // b.p. start pb4
pinMode(8, OUTPUT); // recopie bit 0 nix
pinMode(9, OUTPUT); // " bit 1 nix
pinMode(10, INPUT_PULLUP); // r.a.z. rec.
analogWrite(11,128); //galva tps � mi-ech.
//tone(12,440,200);
digitalWrite(12,HIGH);//bip test (buzzer actif)
delay(200);
digitalWrite(12,LOW);
//Serial.begin(9600);
if (digitalRead(10) == 0) {EEPROM.put(0,nix);}
EEPROM.get(0,rec); //lect. record
}
void loop()
{
if (st == 0) //en attente?
{
if ((millis() - tm) > 200) //tous les 1/5 sec.
{
if (bsc > 10){bsc = 0;}
bsc ++;
if (bsc == 1) //aff. pts
{
niy = nix;
aff();
analogWrite(11,0);
}
if (bsc == 6) //aff. rec
{
nix = rec;
aff();
nix = niy;
analogWrite(11,255);
}
rnd = random(15);
PORTC = rnd; //led's al�at.
if (digitalRead(13) == 0)
{
st = 1; //d�marrage
tps = 255;
}
tm = millis(); //m.�.j. tempo.
//Serial.println(nix,HEX);
//Serial.println(rec,HEX);
}
}
else
{
if (tps > 254) //rst cpt
{
uni = 0;
diz = 0;
nix = 0;
aff();
}
if ((millis() - tm1) > 250) //tous les 1/4 sec.
{
if (tps > 0)
{
tps --;
analogWrite (11,tps);//d�compte galva.
}
tm1 = millis();
}
if (digitalRead(A5) == 1) //plot faute
{
uni = 0;
diz = 0;
nix = 0;
aff();
for(bsc = 0;bsc < 21;bsc++) //trr...
{
digitalWrite(12,HIGH);
delay(10);
digitalWrite(12,LOW);
delay(10);
}
}
if (digitalRead(A4) == 0)//bon plot
{
uni ++;
if (uni > 9)
{
uni = 0;
diz ++;
}
nix = uni + ( 16 * diz);
aff();
if (tps < 250)
{tps = tps + 4;} // + 1 sec.
digitalWrite(12,HIGH); //bip
delay(200);
digitalWrite(12,LOW);
rnd = random(15);
PORTC = rnd; //led's al�at.
}
if (tps < 1)
{st = 0; //fin partie
if (nix > rec) //rec. battu?
{EEPROM.put(0,nix);
rec = nix;
for(bsc = 0;bsc < 11;bsc++)
{
PORTC = bsc;
digitalWrite(12,HIGH);
delay(50);
digitalWrite(12,LOW);
delay(50);
}
}
else
{
digitalWrite(12,HIGH);
delay(500);
digitalWrite(12,LOW);
}
}
}
}
void aff()
{
PORTD = nix;
digitalWrite(8,LOW);
digitalWrite(9,LOW);
tmp = nix & 1;
if (tmp != false) digitalWrite(8,HIGH);
tmp = nix & 2;
if (tmp != false) digitalWrite(9,HIGH);
}