Tabla de contenido:
Video: Reloj de texto con desplazamiento de Arduino: 3 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:42
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
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:
Visualización de texto con desplazamiento (guía de la A a la Z): 25 pasos (con imágenes)
Visualización de texto en desplazamiento (Guía de la A a la Z): En este video / instructivo, lo guiaré con instrucciones paso a paso sobre cómo hacer que la visualización de texto en desplazamiento con Arduino. No explicaré cómo hacer código para Arduino, le mostraré cómo usar el código existente. Qué y dónde necesitas co
Ventilador ESP8266 POV con reloj y actualización de texto de página web: 8 pasos (con imágenes)
Ventilador ESP8266 POV con reloj y actualización de texto de página web: se trata de un ventilador de velocidad variable, POV (persistencia de la visión) que muestra la hora de forma intermitente y dos mensajes de texto que se pueden actualizar `` sobre la marcha ''. también es un servidor web de una sola página que te permite cambiar los dos mensajes de texto
Programación de un Arduino usando otro Arduino para mostrar un texto de desplazamiento sin una biblioteca: 5 pasos
Programación de un Arduino usando otro Arduino para mostrar un texto de desplazamiento sin una biblioteca: Sony Spresense o Arduino Uno no son tan costosos y no requieren mucha energía. Sin embargo, si su proyecto tiene limitaciones de energía, espacio o incluso presupuesto, es posible que desee considerar el uso de Arduino Pro Mini. A diferencia de Arduino Pro Micro, Arduino Pro Mi
Reloj de red ESP8266 sin ningún RTC - Reloj Nodemcu NTP Sin RTC - PROYECTO RELOJ DE INTERNET: 4 Pasos
Reloj de red ESP8266 sin ningún RTC | Reloj Nodemcu NTP Sin RTC | PROYECTO DE RELOJ DE INTERNET: En el proyecto se realizará un proyecto de reloj sin RTC, se tomará tiempo de Internet usando wifi y lo mostrará en la pantalla st7735
El molesto eliminador de clics de la rueda de desplazamiento (desplazamiento suave): 5 pasos
El molesto eliminador de clics de la rueda de desplazamiento (desplazamiento suave): ¿te molesta el sonido de la rueda de desplazamiento? Bueno, ¡aquí está tu oportunidad de sacar ese clic de ese pergamino! si rompes tu mouse, no es mi culpa. Estoy haciendo este mod con un mouse logitech. no estoy seguro de que funcione en otro mouse b