Contador e cronómetro
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, … Na páxina “alerón cronómetro” podes ver como se conecta e monta nun alerón co display incorporado.
Para programalo con mBlock para mBot debes conectalo aos pins 11 e 12, pero co IDE de Arduino podes usar outros pins, por exemplo CLK no pin 2 e DIO no pin 3, como imos facer aquí.
Probando
Imos facer un programa sinxelo para ver que todo funciona correctamente.
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 3 // Pins aos que está conectado o display #define DIO 2 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(); while(analogRead(A7)>100); // agardamos mentres non se pulse o botón } // Bucle void loop() { crono.display(Digits); // Amosa os díxitos do array }
Ao premer no pulsador deberían aparecer os números 0, 1, 2 e 3 no display. Se é así todo está correcto. Se non revisa as conexións.
Contador
Agora imos visualizar no display o número de veces que prememos no pulsador. Comeza o programa do mesmo xeito que antes e no inicio do sketch creamos unha variable “conta” int conta = 0; para almacenar o número de veces que prememos 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:
- 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
void loop() { if ( analogRead(A7)<100 ) { // Cando o pulsador está premido while(analogRead(A7)<100); // Agarda mentres o pulsador esta premido conta++; //Incrementa o contador calculaDixitos(conta); // visualizamos o valor no display } }
Prácticas co contador:
- Conta latas: No programa de ir por unha liña e ir rodeando ou apartando latas vai facendo a conta das que atopa.
- Límite de latas: No programa anterior fai que cando atope 3 latas pare e emita unha melodía.
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 <TM1637.h> /**** Declaración de variables **/ // medición do tempo int tempoActual; // A medida do tempo cando a miramos int tempoAnterior; int estadoCrono=0; // Variable para a visualización do cronómetro // Display 4 díxitos #define CLK 3 // Pins aos que está conectado o display #define DIO 2 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.
void loop() { tempoActual= millis()/1000; // É o tempo actual en s transcorrido desde o inicio. if (analogRead(A7)<100 && estadoCrono==0) { while(analogRead(A7)<100); 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 (analogRead(A7)<100 && estadoCrono==1){ // Paramos a visualización do cronómetro while(analogRead(A7)<100); estadoCrono=0; } }
Prácticas co cronómetro:
- Décimas de segundo: No programa anterior 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.
- Carreira de velocidade: No programa de ir por unha liña pon unha lata na meta para que o robot pare cando a atope. Nese momento o display debe amosar o tempo que tardou en chegar.
Neste vídeo podes ver o cronómetro funcionando. O sensor ultrasónico está situado nun lateral co soporte do resolve-labirintos.
Xa teño un alerón-cronómetro. A documentación estará en breve en https://t.co/z7bMZdES2v pic.twitter.com/8Ga7k6D8mc
— mClon (@mClonRobot) 19 de febreiro de 2019