digitaltube

Descrición

Nesta sección imos programar un display 7 segmentos de 4 díxitos. Pódenos servir para visualizar o valor dunha variable, contar obxectos detectados, cronometrar, …

Trátase dun módulo co controlador TM1637 de precio asequible e funcionamento moi sinxelo.

Montaxe

O 4-Digit LED display tube ten catro pins:

  • CLK: conectado ao pin 12.
  • DIO: pin 11.
  • GND
  • VCC a 5V.

Tamén imos necesitar un pulsador e unha resistencia de 10k, que conectaremos no pin 2

Configuración

O primeiro que debemos facer é incluír a librería Grove 4-Digit Display  (Vai a Sketch -> Incluír biblioteca -> Xestionar bibliotecas – > busca “Grove 4-Digit Display” -> Instalar). Despois engádea ao programa.

// Librería

#include <TM1637.h>

// Declaración de variables

#define CLK 12    // Pins aos que está conectado o display
#define DIO 11

TM1637  crono(CLK,DIO);         // Poñémoslle o nome "crono" ao noso display
int8_t  Digits[] = {0,1,2,3} ;  // Array de 4 díxitos que queremos amosar

// Configuración

void setup() {
  
  crono.set();    // Inicializamos
  crono.init();

}

// Bucle

void loop() {

  crono.display(Digits);  // Amosa os díxitos do array

}

Ao cargar o programa deberían aparecer os números 0, 1, 2 e 3 no display. Se é así todo está correcto. Se non revisa as conexións.

Prácticas

1. Contador

Imos visualizar no display o número de veces que prememos nun pulsador.

Comeza o programa do mesmo xeito que antes e no inicio do sketch engade unha variable “conta” int conta = 0;  para almacenar o número de veces que prememos no pulsador.

// Librería

#include 

// Declaración de variables

int pulsador=2; 
int conta = 0; // Variable para gardar o número de pulsos

#define CLK 12    // Pins aos que está conectado o display
#define DIO 11

TM1637  crono(CLK,DIO);         // Poñémoslle o nome "crono" ao noso display
int8_t  Digits[] = {0,0,0,0} ;  // Array de díxitos que queremos amosar no inicio

// Configuración

void setup() {
  
  crono.set();    // Inicializamos
  crono.init();

  while(digitalRead(pulsador)==0);  // agardamos a premer no pulsador

}

Despois escribimos unha función capaz de separar un número nos seus catro díxitos usando os operadores % e /. O operador % devolve o resto da división e o operador / fai a división enteira.

void calculaDixitos(int numero){
  
  Digits[3] = numero%10;
  Digits[2] = (numero%100)/10;
  Digits[1] = (numero%1000)/100;
  Digits[0] = numero/1000;

  crono.display(Digits);
  
}

Por exemplo, para o número 125, as operacións separan os números que se deben mostrar en cada díxito 0-1-2-5

  • 125%10=5
  • 125%100=25; 25/10=2
  • 125%1000=125; 125/100=1
  • 125/1000=0

Agora imos ir contando cada vez que prememos no pulsador e amosando os datos no display. Podes consultar a sección “contador mellorado” para ver como se fai a detección de pulsos.

void loop() {
  
  if ( digitalRead(pulsador) == 1 ) {
    while(digitalRead(pulsador)==1);  // Agarda mentres o pulsador esta premido
    delay(20);                        // Agardamos 0,02s para evitar o efecto rebote 
    conta++;                          //Incrementa o contador 
    calculaDixitos(conta);           // visualizamos o valor no display
  }

}

2. Cronometrar

Neste exemplo imos iniciar o cronómetro cando premamos o pulsador, e paralo cando volvamos pulsalo.

No inicio debemos crear unhas variables que nos permitan contar o tempo (tempoActual e tempoAnterior) e unha variable que nos indique se o cronómetro está activado ou o reiniciamos (estadoCrono)

Como imos contar o tempo, no setup imos activar os puntos que nos separen os minutos dos segundos (crono.point(POINT_ON); )

// Librería

#include 

/**** Declaración de variables **/

int pulsador=2; 

// medición do tempo

int tempoActual;        // A medida do tempo cando a miramos
int tempoAnterior;      // O tempo anterior que observamos
int estadoCrono=0;      // Variable para a visualización do cronómetro

// Display 4 díxitos

#define CLK 12    // Pins aos que está conectado o display
#define DIO 11

TM1637  crono(CLK,DIO);         // Poñémoslle o nome "crono" ao noso display
int8_t  Digits[] = {0,0,0,0} ;  // Array de 4 díxitos que queremos amosar

/** Configuración **/
 
void setup() {  
  crono.set();    // Inicializamos
  crono.init() ;
  crono.point(POINT_ON); // Acende os puntos
}

Despois da función de calculaDixitos engadimos unha nova función de pasar de número a tempo calculando minutos e segundos

/** Funcións **/

// Función para clacular díxitos

void calculaDixitos(int numero){
  Digits[3] = numero%10;
  Digits[2] = (numero%100)/10;
  Digits[1] = (numero%1000)/100;
  Digits[0] = numero/1000;
  crono.display(Digits);
}

// Función para pasar de número a tempo en min e s

void calculaTempo(int n){
  int segundos = n % 60  ;
  int minutos =  n / 60  ;
  int t = minutos * 100 + segundos ;
  calculaDixitos(t) ;
}

E agora no loop cando prememos no pulsador, se o cronómetro está desactivado iniciámolo e amosamos o valor do tempo, e se o cronómetro está activado ao premer no pulsador parámolo.

// Bucle 

void loop() { 

  tempoActual= millis()/1000;    // É o tempo actual en s transcorrido desde o inicio. 
       
  if (digitalRead(pulsador) == 1 && estadoCrono==0) { 
    while(digitalRead(pulsador) == 1);  
    tempoAnterior= tempoActual;  // Iniciamos o cronómetro
    estadoCrono=1;
  }

  if (estadoCrono == 1){         // Mostra o cronómetro cando está activado
    int datoCrono = tempoActual-tempoAnterior;
    calculaTempo(datoCrono);
  }

  if (digitalRead(pulsador) == 1 && estadoCrono==1){  // Paramos a visualización do cronómetro
    while(digitalRead(pulsador) == 1);  
    estadoCrono=0; 
  }

}

Propostas

  • Contador con límite: No programa anterior fai que cando o contador chegue a 10 non podamos sumar máis pulsacións.
  • Décimas de segundo: No programa do cronómetro estamos contando segundos, pero nunha carreira imos necesitar máis precisión. Modifícao para que amose décimas de segundo.
  • Ultrasón: Modifica o programa anterior para que o cronómetro arranque cando prememos no pulsador e pare cando o sensor ultrasónico atope un obxecto a menos de 10 cm.