El proyecto “Reloj y Termómetro Digital Arduino” utiliza un microcontrolador Arduino junto con un registro de desplazamiento 74HC595 para controlar un display de 7 segmentos que muestra la hora en tiempo real y la temperatura (opcional, si se incluye un sensor). Este sistema es ideal para aprender sobre programación de microcontroladores, manejo de displays y aplicaciones prácticas de relojes digitales.
Objetivos del Proyecto
- Crear un reloj digital funcional utilizando Arduino.
- Mostrar los valores de horas, minutos y segundos en un display de 7 segmentos.
- Implementar un termómetro (opcional, con un sensor como DHT11 o LM35).
- Dominar el uso del registro de desplazamiento 74HC595 para minimizar los pines requeridos.
Componentes Necesarios
- Microcontrolador Arduino Uno/Nano.
- Registro de desplazamiento 74HC595.
- Displays de 7 segmentos (seis unidades para hh:mm:ss).
- Resistencias (para limitar corriente en los LEDs).
- Cables de conexión y protoboard.
- (Opcional) Sensor de temperatura DHT11 o LM35.
Funcionamiento Básico
- Reloj digital: El código utiliza el método micros() para contar el tiempo transcurrido y actualizar los valores de horas, minutos y segundos.
- Control del display: Los números se despliegan mediante el registro 74HC595, que permite enviar datos binarios secuencialmente y controlar múltiples LEDs con pocos pines del Arduino.
- Interfaz visual: Cada dígito del reloj se representa en un segmento del display, lo que permite una lectura clara y sencilla.
Aplicación del Código
//Pin connected to ST_CP of 74HC595
int latchPin = 12;
//Pin connected to SH_CP of 74HC595
int clockPin = 8;
////Pin connected to DS of 74HC595
int dataPin = 11;
unsigned long currentmicros = 0;
unsigned long nextmicros = 0;
unsigned long interval = 10000; // adjusted for my board
byte tens_hours = 0;
byte ones_hours = 9;
byte tens_minutes = 3;
byte ones_minutes = 5;
byte tens_seconds = 0;
byte ones_seconds = 0;
byte tenths = 0;
byte hundredths= 0;
byte prior_seconds = 0;
int dataArray[11] = {64, 121, 36, 48, 25, 18, 2, 120, 0, 16, 255};
void setup() {
// put your setup code here, to run once:
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
nextmicros = micros();
}
void loop() {
// put your main code here, to run repeatedly:
generateTime();
//displayTime();
blinkTime(3);
}
void displayTime(){
digitalWrite(latchPin, LOW);
// shift out the bits:
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[tens_hours]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[ones_hours]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[tens_minutes]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[ones_minutes]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[tens_seconds]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[ones_seconds]);
//take the latch pin high so the LEDs will light up:
digitalWrite(latchPin, HIGH);
// pause before next value:
}
void generateTime(){
currentmicros = micros(); // read the time.
if ((currentmicros – nextmicros) >= interval) // 10 milliseconds have gone by
{
hundredths = hundredths +1;
if (hundredths == 10){
hundredths = 0;
tenths = tenths +1;
}
if (tenths == 10){
tenths = 0;
ones_seconds = ones_seconds +1;
}
if (ones_seconds == 10){
ones_seconds = 0;
tens_seconds = tens_seconds +1;
}
if (tens_seconds == 6){
tens_seconds = 0;
ones_minutes = ones_minutes +1;
}
if (ones_minutes == 10){
ones_minutes = 0;
tens_minutes = tens_minutes +1;
}
if (tens_minutes == 6){
tens_minutes = 0;
ones_hours = ones_hours +1;
}
if (ones_hours == 10){
ones_hours = 0;
tens_hours = tens_hours +1;
}
if ((tens_hours == 2) && (ones_hours == 4)){
ones_hours = 0;
tens_hours = 0;
delay(1000);
}
nextmicros = nextmicros + interval; // update for the next comparison
} // end time interval check
}
void blinkTime(int position){
// shift out the bits:
int _second_one = ones_seconds, _second_two = tens_seconds, _minute_one = ones_minutes, _minute_two = tens_minutes,
_hour_one = ones_hours, _hour_two = tens_hours;
switch(position){
case 1:
_hour_two = 10;
break;
case 2:
_hour_one = 10;
break;
case 3:
_minute_two = 10;
break;
case 4:
_minute_one = 10;
break;
case 5:
_second_two = 10;
break;
case 6:
_second_one = 10;
break;
}
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[_hour_two]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[_hour_one]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[_minute_two]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[_minute_one]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[_second_two]);
shiftOut(dataPin, clockPin, MSBFIRST, dataArray[_second_one]);
//take the latch pin high so the LEDs will light up:
digitalWrite(latchPin, HIGH);
// pause before next value:
}
El código proporcionado:
- Define los pines de conexión para el 74HC595 y establece el control de los displays.
- Calcula los valores del tiempo en centésimas, segundos, minutos y horas.
- Implementa una función de parpadeo para resaltar valores específicos, ideal para funciones de configuración.
Ampliaciones Futuras
- Termómetro: Agregar un sensor como DHT11 para medir y mostrar temperatura.
- Alarma: Integrar un buzzer para alertas configurables.
- Diseño compacto: Crear una PCB para encapsular todos los componentes.
Encontrá en nuestra web todo lo que buscás para tus proyectos, desde componentes hasta kits completos. ¡Conseguí lo necesario para transformar tus ideas en realidad!
No te pierdas nuestras próximas notas, donde vamos a presentar otros proyectos Arduino innovadores. ¡Seguí nuestras publicaciones y descubrí nuevas ideas cada semana!
Hasta la próxima.
