28 d’oct. 2014

FINAL COUNTDOWN

Per practicar amb entrades i sortides digitals hem fet un cronòmetre amb un display de 7 segments, que es reinicia quan premem un botó.
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 bombavoid 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 anteriorvoid 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
}


1 comentari: