lunes, 1 de agosto de 2022

El display II. Funciones. (IDE Arduino)

En esta entrada vamos a utilizar las denominadas variables con índice, que van a servirnos para acceder con facilidad a los códigos 7 segmentos de las cifras numéricas. Veámoslo en el siguiente programa:

/*
* displayNumero0-9.ino * Va mostrando en el display (dígito más a la derecha) los * números del 0 al 9 a intervalos de 1 segundo. * Hemos hecho una especie de tabla con los códigos de 7 segmentos * de las diez cifras (del 0 al 9). Para acceder a estos códigos sólo * tenemos que indicar el nombre de la tabla y el orden del elemento * que queremos obtener entre los corchetes, empezando por 0. */                    //codigo7seg[], variable con índice para                    //guardar una tabla con los códigos de todas                    //las cifras decimales.                    //abcdefgp recordar que cero es encendido byte codigo7seg[] = {B00000011,     //código 7 segmentos del 0                     B10011111,     //código 7 segmentos del 1                     B00100101,     //código 7 segmentos del 2                       B00001101,     //código 7 segmentos del 3                     B10011001,     //código 7 segmentos del 4                     B01001001,     //código 7 segmentos del 5                     B01000001,     //código 7 segmentos del 6                     B00011111,     //código 7 segmentos del 7                     B00000001,     //código 7 segmentos del 8                     B00001001};    //código 7 segmentos del 9                                    //codigo7seg[0] sería 00000011                                    //codigo7seg[1] sería 10011111                                    //y así sucesivamente... int numero = 0;                       void setup (){  pinMode(4,OUTPUT);  pinMode(7,OUTPUT);  pinMode(8,OUTPUT); } void loop(){  digitalWrite(4,LOW);  shiftOut(8, 7, LSBFIRST, codigo7seg[numero]);  shiftOut(8, 7, LSBFIRST, B00010000);  digitalWrite(4,HIGH);  numero++;                            //incrementamos numero  if(numero == 10){                    //si llegamos a 10    numero = 0;                        //empezamos de nuevo en cero  }  delay(1000); }

En una entrada anterior hicimos un programa que mostraba la lectura del potenciómetro a través del Monitor Serie, ahora lo haremos con el display. Nosotros desconocemos cual es la lectura y, por tanto, no podemos enviar cuatro dígitos concretos al display; el programa tiene que ser capaz de separar en sus cuatro cifras (millar, centena, decena y unidades) el valor obtenido del potenciómetro. En el siguiente ejemplo se muestra como se puede hacer esa descomposición:

numero = 8547

                        millar = numero : 1000
                        millar =   8547 : 1000 = 8

                      centena = (numero - millar*1000) : 100
                      centena = (  8547   -    8*1000)    : 100
                      centena =           547                    : 100 = 5

                decena = (numero - millar*1000 - centena*100) : 10
                decena = (   8547  -     8000       -       500       ) : 10
                decena =                      47                                 : 10 = 4

             unidades = numero - millar*1000 - centena*100 - decena*10
             unidades =   8547   -     8000       -        500       -       40      = 7


El programa sería el siguiente:                          

/*
 * displayPotenciometro.ino
 * Visualizamos en el display los valores del potenciometro.
 * Una vez leido el numero hay que descomponenlo en sus cifras,
 * millar, centena, decena y unidad.
 */

byte codigo7seg[] = {B00000011,     //0
                     B10011111,     //1
                     B00100101,     //2  
                     B00001101,     //3
                     B10011001,     //4
                     B01001001,     //5
                     B01000001,     //6
                     B00011111,     //7
                     B00000001,     //8
                     B00001001};    //9
                      
int valorPot;              
int millar;
int centena;
int decena;
int unidad;

void setup (){
  pinMode(4,OUTPUT);    //pines display
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(A0, INPUT);   //pin potenciómetro
}

void loop(){
  valorPot = analogRead(A0);
  millar = valorPot/1000;
  centena = (valorPot - millar*1000)/100;
  decena = (valorPot - millar*1000 - centena*100)/10;
  unidad = valorPot - millar*1000 - centena*100 - decena*10;
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[unidad]);
  shiftOut(8, 7, LSBFIRST, B00010000);
  digitalWrite(4,HIGH);
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[decena]);
  shiftOut(8, 7, LSBFIRST, B00100000);
  digitalWrite(4,HIGH);
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[centena]);
  shiftOut(8, 7, LSBFIRST, B01000000);
  digitalWrite(4,HIGH);
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[millar]);
  shiftOut(8, 7, LSBFIRST, B10000000);
  digitalWrite(4,HIGH);
}

Vamos a modificar el programa anterior para incluir una especie de "instrucción propia" (función) que sirva para visualizar cualquier numero en el display, esta función la podríamos incluir también en otros programas.

/*
 * displayFuncion.ino
 * El programa muestra en el display las lecturas del
 * potenciómetro.
 * En este caso, vamos a crea una función denominada display7Seg
 * para poder visualizar cualquier número, bastará con escribir
 * el nombre de la función y, entre paréntesis, el número a mostrar.
 * Por ejemplo: display7Seg(1582);
 */
                    
byte codigo7seg[] = {B00000011, B10011111, B00100101, B00001101, B10011001, 
B01001001, B01000001, B00011111, B00000001, B00001001};
int valorPot;                            //para guardar el valor del potenciómetro
//las variables millar, centena, decena
//y unidad están declaradas en la función void setup (){  pinMode(4,OUTPUT); //pines display  pinMode(7,OUTPUT);  pinMode(8,OUTPUT);  pinMode(A0, INPUT); //pin potenciómetro } void loop(){  valorPot = analogRead(A0);             //leemos el potenciómetro  display7Seg(valorPot);                 //lo mostramos en el display }
                                         //Nuestra función
void display7Seg(int numero){
  int millar = numero/1000;                         
  int centena = (numero - millar*1000)/100;              
  int decena = (numero - millar*1000 - centena*100)/10;  
  int unidad = numero - millar*1000 - centena*100 - decena*10;  
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[unidad]);
  shiftOut(8, 7, LSBFIRST, B00010000);
  digitalWrite(4,HIGH);
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[decena]);
  shiftOut(8, 7, LSBFIRST, B00100000);
  digitalWrite(4,HIGH);
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[centena]);
  shiftOut(8, 7, LSBFIRST, B01000000);
  digitalWrite(4,HIGH);
  digitalWrite(4,LOW);
  shiftOut(8, 7, LSBFIRST, codigo7seg[millar]);
  shiftOut(8, 7, LSBFIRST, B10000000);
  digitalWrite(4,HIGH);
}

Ejercicios propuestos:

1.- Realizar un programa en el que el display muestre, inicialmente, el número "0000" y, mientras mantengamos presionado  el pulsador "S1", cambie el cero de las centenas por un uno. Utilizar la función display7Seg y crear la variable numero con el valor 0. Tener en cuenta que para hacer aparecer un 1 en la cifra de las centenas bastaría con sumar 100 y para quitarlo con restar dicha cantidad.

2.- Ahora queremos que si presionamos S1 aparezca un 1 en la cifra de las centenas, si presionamos S2 veamos un 1 en las decenas y si presionamos S3 aparezca un 1 en la cifra de las unidades.

3.- Vamos a hacer una especie de "marcador deportivo". Con el pulsador S1 incrementamos el valor de los dos dígitos situados más a la izquierda, con S2 incrementamos el de los dos dígitos de la derecha. Si se llega a 20 se vuelve a empezar desde cero.