Montaje 3: Concurso en la televisión

Requisitos:

  • 1 display de 7 segmentos
  • 1 pulsadores, 1 resistencias de 1Kohmio.
  • 1 zumbador piezoeléctrico

Planteamiento: Has sido el más rápido en pulsar, ahora te toca contestar la pregunta final, pero date prisa, el tiempo se acaba.

Presentación de: Codificación y escritura en un display de 7 segmentos.

El display de 7 segmentos es sólo un conjunto de Leds, pero algunos tienen lógica negativa, como este caso, de modo que están alimentados contínuamente y se activan cuando no les llega señal. Así que para encender un segmento hay que poner la salida a la que está conectado a 0V para que por él circule corriente.

Lo primero que hay que hacer es descubrir si tu display es de éstos. Te darás cuenta enseguida cuando conectes a GND un terminal tras otro y vayas probando con 5V en todos los demás, porque parece que no funciona bien. Entonces inicia el proceso contrario: conectas uno a 5V y pruebas los demás a GND, y así uno tras otro hasta que según vayas cambiando la conexión a GND se vayan encendiendo los distintos segmentos.

El programa presenta una manera de codificar en cadenas qué segmentos están apagados y encendidos para formar una cifra de un dígito. Se ha hecho una elección en la numeración de los segmentos, pero podría ser cualquier otra.

Luego, iteramos sobre las posiciones para recorrer la cadena consultando con un condicional si hay unos o ceros. Como hemos elegido representar los segmentos que deben iluminarse por 1, y la lógica es negativa, enviamos una señal baja al PIN correspondiente al valor de la cadena en cuya posición hay un uno. Con los ceros es a la inversa.

Variantes:

  • Crea procedimientos para letras y escribe palabras o frases.
  • Escribe hola con minúsculas encontrando la conexión del octavo segmento, el punto.
  • Utilízalo para completar alguno de los ejercicios de otros montajes.

Montaje 3: Concurso en la televisión

  • El pistolero

Un flash? señala el comienzo. Tras presionar un pulsador cualquiera (luz interior de un coche?) pasa un tiempo aleatorio hasta que suena un pitido. A partir de la señal, cuando se presiona por primera vez un pulsador, suena su nota asociada y se mantiene encendido su LED mientras se esté presionando. Cuando se suelta, el LED correspondiente parpadea un tiempo. Después, una sucesión de flash? hasta que pulsando cualquier pulsador se vuelve a empezar.

VIDEO DEL MONTAJE 3: El Pistolero

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int zumb=10;
 int cadenaLeds[]={6,7,8,9};              // 4LEDs, 4pulsadores, 4 notas
 int cadenaPuls[]={2,3,4,5};
 int notas[]={1915,1519,1275,1014};
 int tiempo=0;
 int n=0;
 int m=0;
 int ini=0;
 int psrnum=0; 
 void setup (){
   for(n=0;n<4;n++){
     pinMode(cadenaLeds[n],OUTPUT);
     pinMode(cadenaPuls[n],INPUT);
   }
   pinMode(zumb,OUTPUT);
 }
 void flash(){
   for(n=0;n<4;n++){
     digitalWrite(cadenaLeds[n],HIGH);
   }
   delay(200);
   for(n=0;n<4;n++){
     digitalWrite(cadenaLeds[n],LOW);
   }
   delay(200);
 }
 void zumba(){                            //procedimiento que produce un pitido
   digitalWrite(zumb,HIGH);
   delay(500);
   digitalWrite(zumb,LOW);
 }
 void nota(){
   for(m=0;m<=100;m++){      
     digitalWrite(zumb,HIGH);
     delayMicroseconds(notas[n]);
     digitalWrite(zumb,LOW);
     delayMicroseconds(notas[n]);
   }
 }
 void parpadea(){
   for(m=0;m<10;m++){
     digitalWrite(cadenaLeds[n],HIGH);
     delay(200);
     digitalWrite(cadenaLeds[n],LOW);
     delay(200);
   }
 }
 randomize(int data){                     //Función del generador de números pseudoaleatorios
   return ((1664525*data)%1023);
 }
 void loop(){
   flash();
   while(digitalRead(2)==LOW&&digitalRead(3)==LOW&&digitalRead(4)==LOW&&digitalRead(5)==LOW){    //Espera a que se pulse alguno
     ini=ini+1;
     flash(); 
   }
   psrnum= randomize(ini); 
   tiempo=abs(psrnum)%10;
   delay(tiempo*1000);
   zumba();
    while(digitalRead(2)==LOW&&digitalRead(3)==LOW&&digitalRead(4)==LOW&&digitalRead(5)==LOW){    //Espera a que se pulse alguno
   }
   delay(100);
   for(n=0;n<4;n++){
     if(digitalRead(cadenaPuls[n])==HIGH){//Al pulsar, se ilumina el led y suena la nota, 
       digitalWrite(cadenaLeds[n],HIGH);  //ambos están asociados al estar en la misma posición en sus cadenas
       nota();
       while(digitalRead(cadenaPuls[n])==HIGH){
         digitalWrite(cadenaLeds[n],HIGH);
       }
       parpadea();
     }
   }
   ini=0;                                 //reinicia la variable para producir una semilla del nº pseudoaleatorio distinta.
 }

  • Ruleta de la fortuna

Un flash? señala el comienzo. Tras presionar un pulsador cualquiera(Luz interior de un coche?) comienza una sucesión de ruleta luminosa? en número aleatorio para terminar con una variante de la ruleta luminosa aleatoria? de sólo 4 elementos, en la que cada LED lleva asociada una nota y sólo suena la última.

VIDEO DEL MONTAJE 3: Ruleta de la fortuna

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int zumb=10;
 int cadenaLeds[]={6,7,8,9};
 int cadenaPuls[]={2,3,4,5};
 int notas[]={1915, 1700, 1519, 1432, 1275, 1136, 1014};
 int nsecuencia=0;
 int color=0;
 int tiempo=100;
 int n=0;
 int m=0;
 int c=0;
 int ini=0;
 int psrnum=0; 
 void setup (){
   for(n=0;n<4;n++){
     pinMode(cadenaLeds[n],OUTPUT);
   }
   for(n=0;n<4;n++){
     pinMode(cadenaPuls[n],INPUT);
   }
   pinMode(zumb,OUTPUT);
 }
 void flash(){
   for(n=0;n<4;n++){
     digitalWrite(cadenaLeds[n],HIGH);
   }
   delay(200);
   for(n=0;n<4;n++){
     digitalWrite(cadenaLeds[n],LOW);
   }
   delay(200);
 }
 void secuencia(){                             
   for(n=0;n<4;n++){
     digitalWrite(cadenaLeds[n],HIGH);
     delay(tiempo);
     digitalWrite(cadenaLeds[n],LOW);
   }
 }
 void secuencia2(int nleds){            //función que recorre una vez la cadena de LEDs 
   for(n=0;n<nleds;n++){                //y sólo hasta la posición que marque su argumento
     digitalWrite(cadenaLeds[n],HIGH);
     delay(tiempo);
     digitalWrite(cadenaLeds[n],LOW);
   }
 }
 void nota(){
   for(c=0;c<=100;c++){      
     digitalWrite(zumb,HIGH);
     delayMicroseconds(notas[n]);
     digitalWrite(zumb,LOW);
     delayMicroseconds(notas[n]);
   }
 }
 randomize(int data){                   //Función del generador de números pseudoaleatorios
   return ((1664525*data)%1023);
 }
 void loop(){
   flash();
    while(digitalRead(2)==LOW&&digitalRead(3)==LOW&&digitalRead(4)==LOW&&digitalRead(5)==LOW){    //Espera a que se pulse alguno
     ini=ini+1; 
   }
   flash(); 
   psrnum= randomize(ini); 
   nsecuencia=abs(psrnum)%15;           //nº de vueltas completas
   n=abs(psrnum)%7;                     //elije una nota al azar( un nº del 0 al 6)
   color=abs(psrnum)%4;                 // número entre 0 y 3 que marca el final de la última vuelta
   for(m=0;m<nsecuencia;m++){
     secuencia();
   }
   secuencia2(color);                   //última vuelta
   nota();                              //toca la nota con el valor de n que haya salido
    while((digitalRead(2)==LOW)&&(digitalRead(3)==LOW)&&(digitalRead(4)==LOW)&&(digitalRead(5)==LOW)){    //Espera a que se pulse alguno
     digitalWrite(cadenaLeds[color],HIGH);
   }
   delay(1000);
   ini=0;
 }

  • Cuenta atrás

Cuando se presiona un pulsador el display muestra la secuencia inversa de los 10 primeros dígitos. Al llegar al 0 suena brevemente el zumbador y queda listo para empezar otra vez.

VIDEO DEL MONTAJE 3: Cuenta atrás

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int puls=5;
 int zumb=10;
 int cadenasegmentos[]={4,6,7,8,9,11,12};//cadena en la que se guardan los PINes de las  salidas digitales a las que está conectado
 int cero[]={1,1,1,1,0,1,1};             //  cada segmento
 int uno[]={0,0,0,1,0,1,0};              //tenemos un 0 por cada segmento apagado y un 1  por cada uno encendido en el PIN 
 int dos[]={1,0,1,1,1,0,1};              // correspondiente a su posición en la cadena contando en este orden;
 int tres[]={1,0,0,1,1,1,1};             //                1                      
 int cuatro[]={0,1,0,1,1,1,0};           //              -----
 int cinco[]={1,1,0,0,1,1,1};            //            |       |
 int seis[]={0,1,1,0,1,1,1};             //          2 |   5   | 4  
 int siete[]={1,0,0,1,0,1,0};            //              -----
 int ocho[]={1,1,1,1,1,1,1};             //            |       |
 int nueve[]={1,1,0,1,1,1,0};            //          3 |       | 6
 int tiempo=1000;                        //              -----
 int n=0;                                //                7
 void setup(){                        
   for(n=0;n<8;n++){                      
     pinMode(cadenasegmentos[n],OUTPUT);   
   }
   pinMode(puls,INPUT);
   pinMode(zumb,OUTPUT);                                      
 }
 void CERO(){                                 //procedimiento que envía un 0 al display
   for(n=0;n<7;n++){                            
     if (cero[n]==0){                         //si en esa posición hay un 0:
       digitalWrite(cadenasegmentos[n],HIGH); //enviamos 5V al PIN cuyo nº está en esa posición 
     }                                        //y como este display tiene lógica negativa, el segmento se apaga
     else{                                    //si hay un 1:
       digitalWrite(cadenasegmentos[n],LOW);  // enviamos 0V para encenderlo
     }
   }
 }
 void UNO(){
   for(n=0;n<7;n++){
     if (uno[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 }
 void DOS(){
   for(n=0;n<7;n++){
     if (dos[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   } 
 }
 void TRES(){
   for(n=0;n<7;n++){
     if (tres[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 }
 void CUATRO(){
   for(n=0;n<7;n++){
     if (cuatro[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 }
 void CINCO(){
   for(n=0;n<7;n++){
     if (cinco[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 }
 void SEIS(){
   for(n=0;n<7;n++){
     if (seis[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 }
 void SIETE(){
   for(n=0;n<7;n++){
     if (siete[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 }
 void OCHO(){
   for(n=0;n<7;n++){
     if (ocho[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
    }
  }
 }
 void NUEVE(){
   for(n=0;n<7;n++){
     if (nueve[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 }                                         
 void loop(){
   NUEVE();
   delay(tiempo);
   OCHO();
   delay(tiempo);
   SIETE();
   delay(tiempo);
   SEIS();
   delay(tiempo);
   CINCO();
   delay(tiempo);
   CUATRO();
   delay(tiempo);
   TRES();
   delay(tiempo);
   DOS();
   delay(tiempo);
   UNO();
   delay(tiempo);
   CERO();
   delay(tiempo);  
   for(n=0;n<8;n++){
     digitalWrite(cadenasegmentos[n],HIGH);
   }
   digitalWrite(zumb,HIGH);
   delay(1500);
   digitalWrite(zumb,LOW);
   while(digitalRead(puls)==LOW){
   }
 }

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.