Introducció a la robòtica en trenta-una classes/Desè dia: concurs de reflexes

Salta a la navegació Salta a la cerca

Concurs de reflexes.

ConcursReflexes.png

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.