El meu toc personal al projecte ha estat fer el comptador marxa enrera com si fos l'activador d'una bomba. Si premem el botó abans que el comptador arrivi a 0 s'encen un LED verd: hem desactivat la bomba i hem salvat la ciutat. Però si no premem el botó a temps, s'encen un LED vermell que indica que la bomba ha explotat.
... Però, desactivem o no la bomba, després d'un temps aleatori, el compte enrera torna a començar, aquest cop més ràpid ...
El codi del programa:
/*Desactivador de bomba amb display de 7 segments*/
int pins[]={2,3,4,5,6,7,8,11}; // array amb els pins als que està connectat cada segment int i=0; // comptador per als bucles for int leds= 8; // núm de pins utilitzats a l'array int time= 1200; // temps de visualització de cada número int PinBoto= 9; // botó de desactivació de la bomba int bomba= 13; // Led vermell, indica explosió de la bomba int desactived= 12; // Led verd, indica bomba desactivada int explosion= random(3000); // temps aleatori, durada de l'encesa del Led vermell (bomba) void setup() // especifiquem si els pins digitals són entrades o sortides { for(i=0; i < leds; i=i + 1) {pinMode(pins[i],OUTPUT);} pinMode(bomba,OUTPUT); pinMode(desactived,OUTPUT); pinMode(PinBoto,INPUT); } void loop() { time= time-200; // temps durant el que es mostra cada número // cada cop que es reinicia el loop el temps és més curt (pugem de nivell) if (time<1) // si s'acaba el temps (arribem al final del joc) ... { digitalWrite(desactived,HIGH); //s'encenen els dos Leds digitalWrite(bomba,HIGH); encen(); // s'encenen tots els segments del visualitzador } else // si no ... {nueve();} // executa el número 9 per començar el compte enrera } // ........................................................................... void encen() { for (i=0; i <leds;i=i+1) {digitalWrite(pins[i],LOW);} // encen tots els segments del display ... digitalWrite(pins[7],HIGH); // ... menys el punt, que no l'utilitzem mai } void zero() //número zero { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[0],HIGH); // apaga els segments que calgui per visualitzar el número delay(time); // durant el temps que correspongui explotar(); // executa la funció que fa explotar la bomba } void uno() //numero uno { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[0],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[1],HIGH); digitalWrite(pins[2],HIGH); digitalWrite(pins[4],HIGH); digitalWrite(pins[5],HIGH); delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {zero();} // ... mostra el número anterior } void dos()//numero dos { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[1],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[6],HIGH); delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {uno();} // ... mostra el número anterior } void tres()//numero tres { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[1],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[4],HIGH); delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {dos();} // ... mostra el número anterior } void cuatro()//numero quatre { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[2],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[4],HIGH); digitalWrite(pins[5],HIGH); delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {tres();} // ... mostra el número anterior } void cinco()//numero cinc { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[3],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[4],HIGH); delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {cuatro();} // ... mostra el número anterior } void seis()//numero sis { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[2],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[3],HIGH), delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {cinco();} // ... mostra el número anterior } void siete()//numero set { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[0],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[1],HIGH); digitalWrite(pins[4],HIGH); digitalWrite(pins[5],HIGH); delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {seis();} // ... mostra el número anterior } void ocho()//numero vuit { encen(); // executa la funció encen per encendre tots els segments delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {siete();} // ... mostra el número anterior } void nueve()//numero nou { encen(); // executa la funció encen per encendre tots els segments digitalWrite(pins[4],HIGH); // apaga els segments que calgui per visualitzar el número digitalWrite(pins[5],HIGH); delay(time); // durant el temps que correspongui if(digitalRead(PinBoto)==HIGH) // si premem el botó ... {desactivar();} // ... executa la funció que desactiva la bomba else // si no ... {ocho();} // ... mostra el número anterior } void explotar() // explota la bomba { for (i=0; i <leds;i=i+1) // apaga tots els segments del display {digitalWrite(pins[i],HIGH);} digitalWrite(bomba,HIGH); // encén el Led vermell (bomba) ... delay(explosion); // ... durant el temps especificat (aleatori) digitalWrite(bomba,LOW); // apaga el Led } void desactivar()//desactiva bomba { for (i=0; i <leds;i=i+1) // apaga tots els segments del display {digitalWrite(pins[i],HIGH);} digitalWrite(desactived,HIGH); // encén el Led verd (bomba desactivada) ... delay(explosion); // ... durant el temps especificat (aleatori) digitalWrite(desactived,LOW); // apaga el Led }
Un altre exemple de comptador marxa enrera;
ResponEliminahttp://www.hobbytronics.co.uk/arduino-countdown-timer