Introducció a la robòtica en trenta-una classes/Desè dia: concurs de reflexes
Concurs de reflexes.
Avui, aprofitant que teníem muntat el led tricolor, hem afegit dos botons, un de blau i un de vermell, i hem programat un concurs de reflexes.
Tan bon punt premem el reset de la placa, el led s’encén en verd. Està encès un temps variable entre 3 i 7 segons. Quan s’apaga, el primer que prem el botó, guanya. Per a saber qui ha guanyat, el led queda encès del color del botó que s’ha premut primer.
També hem previst que algun jugador impacient, o amb ganes de fer trampes, premi el botó abans que el led s’apagui. Si algú ho fa, quedarà encès el color de l’altre jugador, i per tant, perdrà.
A continuació, el programa:
void setup() {
pinMode(9,OUTPUT); // pin del color vermell
pinMode(10,OUTPUT); // pin del color verd
pinMode(11,OUTPUT); // pin del color blau
}
void loop() {
digitalWrite(10,1); // encenem el color verd
int retard=3000+random(4000); // calculem el retard
while(retard>0){ // mentre el comptador de retard sigui major de zero
if(digitalRead(7)){digitalWrite(11,1);} // si es prem el vermell, encenem el
blau
if(digitalRead(8)){digitalWrite(9,1);} // si es prem el blau, encenem el vermell
retard=retard-1; // descomptem una unitat del comptador de retard
delay(1); // esperem un milisegon
}
digitalWrite(10,0); // quan ha passat el temps, aturem el verd
while(digitalRead(7)==0 && digitalRead(8)==0){} // mentre ni el blau ni elvermell es premin, esperem
if(digitalRead(7) && digitalRead(11)==0){digitalWrite(9,1);} // si hi ha el
vermell premut, i el led blau apagat, guanya el vermell
if(digitalRead(8) && digitalRead(9)==0){digitalWrite(11,1);} // si hi ha el blau
premut, i el led vermell apagat, guanya el blau
while(1){} // esperem que premin el reset per a una nova partida
}
coses noves que hem après:
random(4000), genera un número aleatori entre 0 i 4000.
quan ha passat el temps, per a donar guanyador un jugador, a part de veure si ha premut
el seu pulsador, també hem de veure que no estigués ja encès el led del jugador contrari.
Aquesta comprovació la fem amb digitalRead(11), o digitalRead(9). Sí, efectivament, tot i
haver configurat aquests pins com a sortida, encara els podem llegir com si fossin una
entrada, i, per tant, saber si estan a 0 o a 1.