Reloj de Berlín
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 13 | ||||
| × | 11 | ||||
| × | 1 |
Acerca de este proyecto
Primero que nada ...
Esta es una copia / pegado de un tutorial que escribí en el sitio web de Instructables. Todavía necesito averiguar cómo voy de un sitio a otro. Entonces, tal vez esto no sea tan hábil como debería ser ... Pero, comience con un reloj no tan diario.
Introducción:Reloj de Berlín
El Reloj de Berlín, BerlinUhr o Mengenlehreuhr, fue probablemente el primer reloj digital.
Ha estado allí desde 1975 ...
Puede encontrar mucha información aquí:https://en.wikipedia.org/wiki/Mengenlehreuhr
¿Cómo se hace, cómo se marca la hora?
En resumen, hay cuatro filas de luces. La fila superior da las horas x 5, la siguiente las "horas individuales" de 1 a 4. La tercera fila nos da los "minutos x5", la fila inferior los minutos.
En la imagen que se muestra, (en realidad, una lámpara está rota ...) el tiempo es:2x5 horas más 3 horas + 6x5 minutos + 2 minutos.
Entonces son las 13:32. Bien, supongo que los europeos estamos más acostumbrados a decir la hora en 24 horas. formato, también lo hace el reloj.
La luz más grande en la parte superior parpadea cada segundo.
Pensé que este reloj podría ser divertido de hacer en Arduino.
Paso 1:algunos productos electrónicos
¿Qué necesitamos para este proyecto?
En primer lugar, (por supuesto), nuestro Arduino.
Utilizo uno de mis Uno que está en todas partes cerca de mi computadora.
Dado que hablamos de un reloj, podríamos usar un RTC. Usé uno barato con un DS 1307.
Para la "pantalla", necesitamos algunos LED. Usé 13 amarillos, 5 mm y 11 rojos. (De hecho, usé RGB para los rojos, ya que no tenía suficientes rojos por ahí ...)
Una placa de pruebas, una placa de impresión con solo agujeros e "islas de soldadura". Acabo de utilizar una parte del llamado "formato de tarjeta Euro".
2 resistencias que utilicé. Uno de 220Ohms (el LED de segundos) y otro de 68K.
Y un IC adicional:MAX7219.
El MAX es un controlador de pantalla LED de 8 dígitos. Muchos de nosotros lo conocemos porque también se usa en matrices LED.
Para facilitarlo, también utilicé la biblioteca Arduino "LedControl". Si aún no lo tiene, puede descargarlo desde aquí:
https://github.com/wayoda/LedControl
Paso 2:Configurarlo.
Puede encontrar una muy buena hoja de datos para ese MAX 7219 en este lugar:
https://www.sparkfun.com/datasheets/Components/Gen ...
COM-09622-MAX7219-MAX7221.pdfNo entraré más en esa hoja de datos, pero vale la pena usarla, es una especie de CI "divertido".
Un salto al Arduino.
En ese esquema se ve una construcción muy simple:uso SDA y SCL para usar el reloj (ruptura A 1307), y cuatro salidas más:DataIn, Clock y Chipselect que van al MAX 7219, y OUT 13 que usamos para nuestro LED parpadeante de "segundos".
La mayoría de las cosas suceden en el Arduino:lee el reloj, lo convierte a los diferentes tipos de salida y luego envía los datos al 7219.
Cuando lea el código, verá que solo uso mi propio idioma, el holandés, para eso. Por ejemplo:el int "vijfuren" que utilizo es la variable que cuenta "Cinco horas", lo mismo para "vijfminuten" y "vijfminuten1":dan la salida "Cinco minutos".
En el boceto también utilizo el año, el mes, el día del mes y el día de la semana, en este boceto en particular no los necesito, pero tal vez más adelante, podría agregarle un calendario.
En el diseño de Fritzing (c), el IC no está cableado:lo hice por facilidad, ya que tiene muchas salidas.
Resumamos:
los pines 4 y 9 están conectados a GND,
19 es VCC
18, ISet, se conecta a VCC con una resistencia:ésta limita la corriente que va a las salidas. Primero, probé con una resistencia de 20K, pero después de 10 minutos más o menos, todo se oscureció ... Ahora, con una resistencia de 68K, el reloj sigue funcionando (después de más de 24 horas). Pero hay una diferencia entre el brillo de los rojos y los amarillos, creo que se debe al hecho de que los rojos son en realidad Leds RGB. Tengo que arreglar eso ...
el pin 1 es DataIn, éste viene del Arduino, pin 12
el pin 12 es Load, procedente del pin 10 de Arduino
el pin 13 es Clk, procedente de Arduino 11.
Hasta ahora para las entradas del 7219.
Echando un vistazo a los resultados:
El 7219 tiene la posibilidad de alimentar 8 pantallas de 7 segundos.
Estas salidas, DIG 0 a DIG 4, se utilizan aquí para controlar las "líneas" de los LED:dado que la línea de "cinco minutos" tiene 11 LED, utilizo DIG 1 y DIG 2 para controlarlos.
Las otras salidas:segmentos A a G y DP (de una pantalla normal de 7 segmentos).
En este caso (con LedControl), les envío palabras binarias (en forma de byte, como B01010100).
Y ahí cometí un error. Alguna lógica me dijo que SEG A sería el MSB, B el segundo bit más significativo, y así sucesivamente, hasta DP, que pensé que sería el bit menos significativo (LSB). Incorrecto ... Por una razón u otra, los creadores del IC pensaron que DP sería el MSB. No puedo ver la lógica de eso ...
Eso me hizo cambiar mi codificación, ya que ya soldé los LED's ...
Paso 3:los LED
En este esquema, verá cómo los LED están conectados entre sí. Solo dibujé los tres primeros, los demás siguen el mismo camino.
El LED de segundos está conectado directamente al Pin 13.
La imagen muestra "cómo funciona". Son las 17:47 en punto ...
Ok, la fila inferior no está tan clara, está en una placa de pruebas. Espero que me crean que realmente funciona. (¡lo hace!).
Oh, un paso más por venir ...
Paso 4:Paso "último", el Código.
#include #include const int DS1307 =0x68; // A5 =SCL, A4 =SDA const char * days [] ={"Sunday", "Monday" , "Martes", "miércoles", "jueves", "viernes", "sábado"}; const char * months [] ={"enero", "febrero", "marzo", "abril", "mayo", "Junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"}; segundo byte =0; byte minuto =0; byte hora =0; byte día de la semana =0; byte mes día =0; byte mes =0; byte año =0; byte lastMinute =0; byte lastSecond =0; int Led =13; byte nul =B0000000; byte een =B01000000; byte twee =B01100000; byte drie =B01110000; byte vier =B01111000; byte vijf =B01111100; byte zes =B01111110; byte zeven =B01111111; byte acht =B11111111; byte negen =B01000000; byte tien =B01100000; byte elf =B01110000; Int a =0; int b =0; int c =0; int vijfMinTwee =0; int uitgang =LOW; / * El pin 12 está conectado al DataIn El pin 11 está conectado al CLK El pin 10 está conectado a LOAD * / LedControl lc =LedControl (12, 11, 10, 1); tiempo de retardo largo sin firmar =100; configuración vacía () {Wire.begin (); Serial.begin (9600); pinMode (Led, SALIDA); lc.shutdown (0, falso); / * Establece el brillo en valores medios * / lc.setIntensity (0, 8); / * y borra la pantalla * / lc.clearDisplay (0);} void loop () {readTime (); digitalWrite (Led, uitgang); if (second! =lastSecond) {if (uitgang ==LOW) uitgang =HIGH; else uitgang =BAJO; escritura digital (Led, uitgang); lastSecond =segundo; } if (minuto! =lastMinute) {printTime (); lastMinute =minuto;}} byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16));} void printTime () {búfer de caracteres [3]; long minuten =minuto; long uren =hora; int vijfmin =minuten / 5; int eenminuut =minuten - (vijfmin * 5); int vijfuren =uren / 5; int eenuren =uren - (vijfuren * 5); a =vijfmin; digitaal (); vijfmin =b; vijfMinTwee =c; a =eenminuut; digitaal (); eenminuut =b; a =vijfuren; digitaal (); vijfuren =b; a =eenuren; digitaal (); eenuren =b; lc.setRow (0, 4, vijfuren); lc.setRow (0, 3, eenuren); lc.setRow (0, 1, vijfmin); lc.setRow (0, 2, vijfMinTwee); lc.setRow (0, 0, eenminuut);} void readTime () {Wire.beginTransmission (DS1307); Wire.write (byte (0)); Wire.endTransmission (); Wire.requestFrom (DS1307, 7); segundo =bcdToDec (Wire.read ()); minuto =bcdToDec (Wire.read ()); hora =bcdToDec (Wire.read ()); día de la semana =bcdToDec (Wire.read ()); mes día =bcdToDec (Wire.read ()); mes =bcdToDec (Wire.read ()); año =bcdToDec (Wire.read ()); } void digitaal () {switch (a) {case 0:b =nul; c =nulo; descanso; caso 1:b =een; c =nulo; descanso; caso 2:b =twee; c =nulo; descanso; caso 3:b =drie; c =nulo; descanso; caso 4:b =vier; c =nulo; romper; caso 5:b =vijf; c =nulo; descanso; caso 6:b =zes; c =nulo; descanso; caso 7:b =zeven; c =nulo; descanso; caso 8:b =acht; c =nulo; descanso; caso 9:b =acht; c =negen; descanso; caso 10:b =acht; c =tien; descanso; caso 11:b =acht; c =elfo; descanso; }}
Bastante sencillo, creo.
Otro beneficio de este boceto:ahora aprende a contar en holandés ... De 0 a 11 ...;-)
¡Espero que disfrutes esto!
Marc
Código
Github
https://github.com/wayoda/LedControlhttps://github.com/wayoda/LedControlProceso de manufactura