Trust time…which usually gives many bitter sweet outputs difficulties

 

Entre Kefy y yo, en nuestro proyecto final, realizamos un reloj digital, en el cual pudiera percibirse la hora actual.

Durante el proceso nos vimos en varias complicaciones, una de ellas y la principal, fue que ninguna de las dos habíamos trabajado antes con Arduino, en seguida fue el hecho de poder programar para que tomará forma de reloj y pudiera ajustarse en el tiempo actual.

Para ello pedimos ayuda a un compañeros de semestre más avanzado de mecatrónica; nos ayudó para configurar el tablero (Keypad) para ajustar las horas, minutos y segundos. Y nos explico que era necesario poner una interrupción en el código para que el error al actualizar la hora a la actual fuera mínimo, así el cambio sería muy rápido.

Gracias a la ayuda, al final conseguimos un reloj funcional!

Aquí dejó el código:)

#include <avr/io.h> // Libreria de entradas y salidas

#include <avr/interrupt.h> // Librería de interrupciones
#include <Keypad.h> // Libreria del teclado matricial
#include <LiquidCrystal.h> // Libreria de la pantalla de cristal liquido

volatile unsigned int H = 0, M = 0, S = 0, Contador = 0; // Definicion de variables
char Tecla;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // Contructor que crea el objeto “lcd”
// Recibe de parametros los pines en los que se
// conectara la pantalla al Arduino
// De izquierda a derecha, son lo pines de la pantalla
// RS, E, D4, D5, D6, D7

const byte Filas = 2; // Filas del teclado matricial
const byte Columnas = 3; // Columnas del teclado matricial
char Teclado[Filas][Columnas] = // Valor almacenado en los botones del teclado
{

{‘1’, ‘2’, ‘3’},
{‘4’, ‘5’, ‘6’}

};
byte FilasPins[Filas] = {6, 5}; // Pines de las filas a los pines del Arduino
byte ColumnasPins[Columnas] =

3, 2}; // Pines de las columnas a los pines del Arduino
// De los pines del teclado de izquierda a derecha:
// Del primer al cuarto pin son las filas, de arriba
// hacia abajo
// Del quuinto al octavo pin son las columnas, de
// izquierda a derecha

Keypad keypad = Keypad(makeKeymap(Teclado), FilasPins, ColumnasPins, Filas, Columnas); // Contructor que
// crea el objeto “keypad” que por medio de la funcion “Keypad”
// le da sus caracteristicas al objeto “keypad”

// Vector de interrupcion por desbordamiento del Timer2, llamada cada 1 milisegundo
ISR(TIMER2_OVF_vect)
{
Contador++; // El contador se incrementa cada interrupcion
if(Contador > 999) // Si el contador es 1000 (un segundo)…
{
S++; // Incrementar la variable de segundos
Contador = 0; // Resetear el conteo
}

TCNT2 = 130; // Resetear el Timer2 a 130
TIFR2 = 0x00; // Desactivar el bit de que la bandera de desbordamiento del
// contador se activo

};

void setup()
{
lcd.begin(16, 2); // Llamar la funcion begin del objeto “lcd”. Recibe de parametros
// las dimensiones del LCD a utilizar
lcd.setCursor(1,0); // Se lleva el cursor a la columna 1 y fila 0
lcd.write(“Reloj Digital”); // Imprimir la palabra “Reloj Digital”

lcd.setCursor(5,1); // Se lleva el cursor a la columna 5 y fila 1
lcd.write(“:”);

lcd.setCursor(8,1); // Se lleva el cursor a la columna 8 y fila 1
lcd.write(“:”);

// Configurar el Timer2 para que tenga desbordamiento cada 1 milisegundo
TCCR2B = 0x00; // Deshabilitar el Timer2 en lo que se configura
TCNT2 = 130; // Resetear el contador a 130
TIFR2 = 0x00; // Limpiar la bandera de la activacion del desbordamiento
TIMSK2 = 0x01; // Habilitar las interrupciones por desbordamiento
TCCR2A = 0x00; // Utilizar el generador de onda normal del Timer2
TCCR2B = 0x05; // Configurar el prescaler del Timer2 a 128

// El Timer2 es un temporizador que corre en el Arduino desde el momento que entra en funcionamiento
// Consiste en un temporizador de 8 bits, lo que permite contar de 0 a 255. El Arduino tiene un
// cristal de cuarzo de 16 MHz que le permite tener una base de tiempo para la manipulacion de
// acciones en el tiempo
// La forma de calcular el tiempo en el que el desbordamiento se dera es tomar los ciclos que le
// quedan al Timer2 para su desbordamiento. Como se coloca de 130, le quedan 125 para alcanzar su tope
// de 255. El registro TCCR2B da el prescaler en potencias de 2, el valor 0x05 = 000001001 le da un
// prescaler de 128.
// El desbordamiento ocurrira en (N ciclos del Timer2)*(Prescaler)/(Frecuencia del cristal)
// Tiempo = (125 ciclos)*(128)/(16MHz) = 1 ms
// La configuracion se siguio de acuerdo en lo recuperado del siguiente link:
// http://arduinomega.blogspot.mx/2011/05/timer2-and-overflow-interrupt-lets-get.html
// Y para mas informacion de los registros se recomienda consultar el datasheet del microcontrolador
// usado en la tarjeta Arduino. Para este proyecto en particular corresponde al microcontrolador de
// la marca Atmel con matricula ATMEGA328P y se puede encontrar su hoja de datos en:
// http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf
}

void loop()
{
// Condiciones de frontera de valores
if (S > 59)
{
M++;
S = 0;
}

if (M > 59)
{
H++;
M = 0;
}

if (H > 23)
{
H = 0;
}

// Por chequeo constante, se asigna el valor de la tecla en el instante a la variable Tecla
Tecla = keypad.getKey();

// Configuracion de la hora
switch(Tecla)
{
case ‘1’: if(H++ >= 23) H = 0; break;
case ‘2’: if(M++ >= 59) M = 0; break;
case ‘3’: if(S++ >= 59) S = 0; break;
case ‘4’: if(H– <= 0) H = 23; break;
case ‘5’: if(M– <= 0) M = 59; break;
case ‘6’: if(S– <= 0) S = 59; break;
default: break;

// En los if’s se incrementa o decrementa el valor primero y luego se valida para el condicional
}

// Area de impresion en la pantalla
// Como el Arduino despliega los numeros a partir de una coordenada y nuestra ahi el valor
// mas significativo (centena, decima, etc) se tiene que jugar con la posicion para tener
// los numeros en su lugar

if (S < 10)
{
lcd.setCursor(9,1);
lcd.write(‘0’);
lcd.setCursor(10,1);
}
else lcd.setCursor(9,1);
lcd.print(S); // Imprimir el valor de los segundos

if (M < 10)
{
lcd.setCursor(6,1);
lcd.write(‘0’);
lcd.setCursor(7,1);
}
else lcd.setCursor(6,1);
lcd.print(M); // Imprimir el valor de los minutos

if (H < 10)
{
lcd.setCursor(3,1);
lcd.write(‘0’);
lcd.setCursor(4,1);
}
else lcd.setCursor(3,1);
lcd.print(H); // Imprimir el valor de las horas
}

 

 

 

 

 

CC BY-SA 4.0 Trust time…which usually gives many bitter sweet outputs difficulties by difna11 is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.