/* TITULO: Cronómetro con display LCD 1602
AUTOR:
MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
- FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
- TWITTER: https://twitter.com/MarianoCampoGa
DESCRIPCIÓN DEL PROGRAMA
Con este programa obtenemos un cronómetro en formato HH:MM:SS, que nos muestra el tiempo en un display
LCD 1602 mediante comunicación I2C. Si presionamos el pulsador_inicio, el conteo se pone a cero. En
cambio, cuando presionamos el pulsador
ESQUEMA DE CONEXION
+-----+
+----[PWR]-------------------| USB |--+
| +-----+ |
| GND/RST2 [ ][ ] |
| MOSI2/SCK2 [ ][ ] A5/SCL[ ] | SCL del módulo I2C conectado al LCD 1602
| 5V/MISO2 [ ][ ] A4/SDA[ ] | SDA del módulo I2C conectado al LCD 1602
| AREF[ ] |
| GND[ ] |
| [ ]N/C SCK/13[ ] |
| [ ]IOREF MISO/12[ ] |
| [ ]RST MOSI/11[ ]~|
| [ ]3V3 +---+ 10[ ]~| PA(I)
| [ ]5v -| A |- 9[ ]~| PA(P)
| [ ]GND -| R |- 8[ ] |
| [ ]GND -| D |- |
| [ ]Vin -| U |- 7[ ] |
| -| I |- 6[ ]~|
| [ ]A0 -| N |- 5[ ]~|
| [ ]A1 -| O |- 4[ ] |
| [ ]A2 +---+ INT1/3[ ]~|
| [ ]A3 INT0/2[ ] |
| [ ]A4/SDA RST SCK MISO TX>1[ ] |
| [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] |
| [ ] [ ] [ ] |
| UNO_R3 GND MOSI 5V ____________/
\_______________________/
NOTAS:
- Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos)
- pulsador_inicio --> Terminales PA(I) y PB(I).
- pulsador_pausa --> Terminales PA(P) y PB(P).
- Conexión PULL-DOWN de los pulsadores.
- PB(I) y PB(P) conectados a VCC.
- PA(I) y PA(P) conectados a GND a través de una R=10K omhs (cada uno con su resistencia por separado).
- La alimentación y la masa del módulo LCM 1602 I2C V1 van directamente conectadas a VCC (+5V) y GND
respectivamente.
*/
// Importar librerías
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Variables para los cálculos internos del cronómetro
int horas = 0;
int minutos = 0;
int segundos = 0;
int decimas = 0;
long milisegundos = 0;
int pulsador_inicio = 10; // pulsador_inicio en PIN digital 10
int pulsador_pausa = 9; // pulsador_pausa en PIN digital 9
void setup()
{
Serial.begin(9600); // Comienzo de la comunicación serie
pinMode(pulsador_inicio, INPUT); // Pin digital 10 como entrada
pinMode(pulsador_pausa, INPUT); // Pin digital 9 como entrada
// Inicializamos el LCD
lcd.begin(16,2);
lcd.backlight();
}
void loop()
{
// Si presionamos el pulsador de inicio se pone todo a cero
if(digitalRead(pulsador_inicio) == HIGH)
{
horas = 0;
minutos = 0;
segundos = 0;
decimas = 0;
lcd.clear();
}
// Si presionamos el pulsador de pausa se congela el tiempo hasta que lo volvamos a presionar
if(digitalRead(pulsador_pausa) == HIGH)
{
delay(200);
while(digitalRead(pulsador_pausa) == LOW);
delay(200);
}
// Se cuentan los milisegundos transcurridos
milisegundos = millis();
// Si el tiempo transcurrido es mayor a una décima de segundo
if(milisegundos % 100 == 0)
{
decimas++;
// Si han pasado 10 décimas de segundo se cuenta un segundo
if(decimas == 10)
{
decimas = 0;
segundos++;
}
// Si han pasado 60 segundos se cuenta un minuto
if(segundos == 60)
{
segundos = 0;
minutos++;
}
// Si han pasado 60 minutos se cuenta una hora
if(minutos == 60)
{
minutos = 0;
horas++;
}
// Mostramos el tiempo a través del LCD
lcd.setCursor(0,0);
if(horas < 10)
{
lcd.print("0");
}
lcd.print(horas);
lcd.print(":");
lcd.setCursor(3,0);
if(minutos < 10)
{
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(6,0);
if(segundos < 10)
{
lcd.print("0");
}
lcd.print(segundos);
lcd.print("(");
lcd.setCursor(9,0);
lcd.print(decimas);
lcd.print(")");
}
}