Tabla de contenido:

Reloj de texto con desplazamiento de Arduino: 3 pasos
Reloj de texto con desplazamiento de Arduino: 3 pasos

Video: Reloj de texto con desplazamiento de Arduino: 3 pasos

Video: Reloj de texto con desplazamiento de Arduino: 3 pasos
Video: Arduino desde cero en Español - Capítulo 38 - Reloj de Tiempo Real (RTC) DS3231 bus I2C 2024, Noviembre
Anonim
Reloj de texto con desplazamiento de Arduino
Reloj de texto con desplazamiento de Arduino

El propósito de este proyecto es construir un reloj de texto desplazable que muestre la hora a medida que se habla (por ejemplo, "es medianoche").

Este es un proyecto rápido: le brindamos lo suficiente para comenzar con el hardware y el boceto, y luego puede llevarlo más lejos para satisfacer sus necesidades.

Paso 1: hardware

Hardware
Hardware

Necesitará tres elementos principales:

  • una placa compatible con Arduino Uno
  • un circuito o módulo de reloj en tiempo real que utiliza un IC DS1307 o DS3231
  • y una pantalla LED monocromática estilo P10

Es posible que desee una fuente de alimentación externa, pero llegaremos a eso más adelante.

La primera etapa es adaptarse a su reloj de tiempo real. Haga clic aquí para ver el tutorial si necesita ayuda con eso.

A estas alturas, espero que esté pensando "¿cómo se fija la hora?".

Hay dos respuestas a esa pregunta. Si está utilizando el DS3231, simplemente configúrelo en el boceto (ver más abajo) ya que la precisión es muy buena, solo necesita cargar el boceto con la nueva hora dos veces al año para cubrir el horario de verano.

De lo contrario, agregue una interfaz de usuario simple: un par de botones podrían hacerlo. Finalmente, solo necesita colocar el hardware en la parte posterior del DMD. Hay un amplio margen para satisfacer sus propias necesidades, una solución simple podría ser alinear la placa de control para que pueda acceder a la toma USB con facilidad, y luego pegarla con un poco de Sugru.

Con respecto a la alimentación del reloj, puede ejecutar UNA pantalla LED desde Arduino y funciona con un buen brillo para uso en interiores. Si desea que el DMD funcione a pleno brillo de quema de retina, debe usar una fuente de alimentación de CC de 5 V 4 A separada. Si está usando dos DMD, eso pasa a 8A, y así sucesivamente. Simplemente conecte la alimentación externa a los terminales de un DMD (conecte el segundo o más DMD a estos terminales).

Si no le apetece cortar el extremo del cable de la fuente de alimentación, utilice un enchufe de CC.

Paso 2: el boceto de Arduino

Deberá instalar las siguientes dos bibliotecas de Arduino: TimerOne y DMD. Luego sube el boceto:

// para RTC # incluya "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // el DS1307 RTC es 0x68

// para pantalla LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // podría tener más de un DMD en un fila #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // utilizado para contener la oración final para mostrar en DMD

void ScanDMD () // requerido para DMD

{dmd.scanDisplayBySPI (); }

configuración vacía ()

{// para DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (verdadero);

// para RTC

Wire.begin (); // activa el byte del bus I2C segundo, minuto, hora, día de la semana, día del mes, mes, año; // cambia las variables y quita el comentario de setDateDs1307 para establecer la hora // luego vuelve a comentar la función y sube el boceto de nuevo second = 0; minuto = 13; hora = 23; dayOfWeek = 4; dayOfMonth = 19; mes = 5; año = 13; // setDateDs1307 (segundo, minuto, hora, dayOfWeek, dayOfMonth, mes, año); }

// funciones habituales de RTC

// Convertir números decimales normales en bytes decimales codificados en binario decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); }

// Convertir decimal codificado en binario a números decimales normales

byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); }

void setDateDs1307 (segundo byte, // 0-59

byte minuto, // 0-59 byte hora, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28 / 29 / byte mes, // 1-12 byte año) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (segundo)); // 0 al bit 7 inicia el reloj Wire.write (decToBcd (minuto)); Wire.write (decToBcd (hora)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mes)); Wire.write (decToBcd (año)); Wire.write (00010000); // envía 0x10 (hexadecimal) 00010000 (binario) al registro de control - activa la onda cuadrada Wire.endTransmission (); }

// Obtiene la fecha y la hora del ds1307

void getDateDs1307 (byte * segundo, byte * minuto, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mes, byte * año) {// Restablecer el puntero de registro Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Algunos de estos necesitan máscaras porque ciertos bits son bits de control

* segundo = bcdToDec (Wire.read () & 0x7f); * minuto = bcdToDec (Wire.read ()); * hora = bcdToDec (Wire.read () & 0x3f); // Necesito cambiar esto si 12 horas am / pm * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * mes = bcdToDec (Wire.read ()); * año = bcdToDec (Wire.read ()); }

vacío drawText (String oldString)

{dmd.clearScreen (verdadero); dmd.selectFont (Arial_Black_16); char newString [256]; int sLength = oldString.length (); oldString.toCharArray (newString, sLength + 1); dmd.drawMarquee (nuevaString, sLength, (32 * DISPLAYS_ACROSS) -1, 0); inicio largo = milis (); temporizador largo = inicio; temporizador largo2 = inicio; booleano ret = falso; while (! ret) {if ((temporizador + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); temporizador = milis (); }}}

void createTextTime (int hh, int mm)

// esto combina todos los datos de tiempo en texto como una oración {finalString = ""; // borrar la oración para casos especiales (abajo) finalString = finalString + "It's";

// ahora agrega la hora

if (hh == 1 || hh == 13) {finalString = finalString + "uno"; } if (hh == 2 || hh == 14) {finalString = finalString + "dos"; } if (hh == 3 || hh == 15) {finalString = finalString + "tres"; } if (hh == 4 || hh == 16) {finalString = finalString + "cuatro"; } if (hh == 5 || hh == 17) {finalString = finalString + "cinco"; } if (hh == 6 || hh == 18) {finalString = finalString + "seis"; } if (hh == 7 || hh == 19) {finalString = finalString + "siete"; } if (hh == 8 || hh == 20) {finalString = finalString + "ocho"; } if (hh == 9 || hh == 21) {finalString = finalString + "nueve"; } if (hh == 10 || hh == 22) {finalString = finalString + "diez"; } if (hh == 11 || hh == 23) {finalString = finalString + "once"; }

// ahora agregue los minutos

switch (mm) {caso 1: finalString = finalString + "oh uno"; rotura; caso 2: finalString = finalString + "oh dos"; rotura; caso 3: finalString = finalString + "oh tres"; rotura; caso 4: finalString = finalString + "oh cuatro"; rotura; caso 5: finalString = finalString + "oh cinco"; rotura; caso 6: finalString = finalString + "oh seis"; rotura; caso 7: finalString = finalString + "oh siete"; rotura; caso 8: finalString = finalString + "oh ocho"; rotura; caso 9: finalString = finalString + "oh nueve"; rotura; caso 10: finalString = finalString + "diez"; rotura; caso 11: finalString = finalString + "once"; rotura; caso 12: finalString = finalString + "doce"; rotura; caso 13: finalString = finalString + "trece"; rotura; caso 14: finalString = finalString + "catorce"; rotura; caso 15: finalString = finalString + "quince"; rotura; caso 16: finalString = finalString + "dieciséis"; rotura; caso 17: finalString = finalString + "diecisiete"; rotura; caso 18: finalString = finalString + "dieciocho"; rotura; caso 19: finalString = finalString + "diecinueve"; rotura; caso 20: finalString = finalString + "veinte"; rotura; caso 21: finalString = finalString + "veintiuno"; rotura; caso 22: finalString = finalString + "veintidós"; rotura; caso 23: finalString = finalString + "veintitrés"; rotura; caso 24: finalString = finalString + "veinticuatro"; rotura; caso 25: finalString = finalString + "veinticinco"; rotura; caso 26: finalString = finalString + "veintiséis"; rotura; caso 27: finalString = finalString + "veintisiete"; rotura; caso 28: finalString = finalString + "veintiocho"; rotura; caso 29: finalString = finalString + "veintinueve"; rotura; caso 30: finalString = finalString + "treinta"; rotura; caso 31: finalString = finalString + "treinta y uno"; rotura; caso 32: finalString = finalString + "treinta y dos"; rotura; caso 33: finalString = finalString + "treinta y tres"; rotura; caso 34: finalString = finalString + "treinta y cuatro"; rotura; caso 35: finalString = finalString + "treinta y cinco"; rotura; caso 36: finalString = finalString + "treinta y seis"; rotura; caso 37: finalString = finalString + "treinta y siete"; rotura; caso 38: finalString = finalString + "treinta y ocho"; rotura; caso 39: finalString = finalString + "treinta y nueve"; rotura; caso 40: finalString = finalString + "cuarenta"; rotura; caso 41: finalString = finalString + "cuarenta y uno"; rotura; caso 42: finalString = finalString + "cuarenta y dos"; rotura; caso 43: finalString = finalString + "cuarenta y tres"; rotura; caso 44: finalString = finalString + "cuarenta y cuatro"; rotura; caso 45: finalString = finalString + "cuarenta y cinco"; rotura; caso 46: finalString = finalString + "cuarenta y seis"; rotura; caso 47: finalString = finalString + "cuarenta y siete"; rotura; caso 48: finalString = finalString + "cuarenta y ocho"; rotura; caso 49: finalString = finalString + "cuarenta y nueve"; rotura; caso 50: finalString = finalString + "cincuenta"; rotura; caso 51: finalString = finalString + "cincuenta y uno"; rotura; caso 52: finalString = finalString + "cincuenta y dos"; rotura; caso 53: finalString = finalString + "cincuenta y tres"; rotura; caso 54: finalString = finalString + "cincuenta y cuatro"; rotura; caso 55: finalString = finalString + "cincuenta y cinco"; rotura; caso 56: finalString = finalString + "cincuenta y seis"; rotura; caso 57: finalString = finalString + "cincuenta y siete"; rotura; caso 58: finalString = finalString + "cincuenta y ocho"; rotura; caso 59: finalString = finalString + "cincuenta y nueve"; rotura; }

// mediodía?

if (hh == 12 && mm == 0) {finalString = finalString + "mediodía"; } // ¿medianoche? if (hh == 00 && mm == 0) {finalString = finalString + "medianoche"; }

}

bucle vacío ()

{// obtiene la hora del byte RTC segundo, minuto, hora, día de la semana, día del mes, mes, año; getDateDs1307 (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

// convierte el tiempo en una cadena de frases

createTextTime (hora, minuto);

// ahora envía el texto al DMD

dibujarTexto (cadena final); }

El boceto tiene las funciones habituales para configurar y recuperar la hora de los circuitos integrados de reloj en tiempo real DS1307 / 3232 y, como es habitual con todos nuestros relojes, puede ingresar la información de la hora en las variables en void setup (), luego descomentar setDateDs1307 (), cargue el boceto, vuelva a comentar setDateDs1307, luego cargue el boceto una vez más. Repita ese proceso para restablecer la hora si no agregó ninguna interfaz de usuario basada en hardware.

Paso 3:

Una vez que se recupera el tiempo en void loop (), se pasa a la función createTextTime (). Esta función crea la cadena de texto para mostrar comenzando con "Es", y luego determina qué palabras seguir dependiendo de la hora actual. Finalmente, la función drawText () convierte la cadena que contiene el texto para mostrar en una variable de carácter que se puede pasar al DMD.

Recomendado: