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.
