Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Reloj maestro

Componentes y suministros

Arduino UNO
× 1
Pantalla DMD de Freetronics
× 1
Módulo RTC
× 1
Botón pulsador momentáneo
× 1
Interruptor de encendido / apagado
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Acerca de

Este es un proyecto para cualquiera que quiera un reloj grande y agradable que se pueda ver desde 12 metros de distancia o de cerca. Puedes hacerlo tan grande como quieras. También incorpora un reloj despertador incorporado que se puede usar como controlador de eventos, por ejemplo, para un sistema de riego automático para un jardín o para recordarle acerca de esa reunión semanal a la que debe ir, o cualquier otra cosa que pueda conectar a un relé. .

Necesitará:

● Pantalla DMD Freetronics

● Módulo de reloj en tiempo real para Arduino

● Timbre (opcional:algo lo suficientemente fuerte como para despertarte por la mañana)

● Botón pulsador momentáneo

● 2x botones de encendido y apagado (el encendido es opcional)

● Placa compatible con Arduino UNO o Arduino

● Proto-shield para Arduino (opcional)

● Fuente de alimentación para Arduino

● Una fuente de alimentación regulada de 5 VCC con capacidad de 4 a 30 amperios (opcional para alto brillo, no necesaria para el funcionamiento normal)

Construcción:

Parte 1 - Electrónica:

Paso 1:Conecte el timbre, el botón de silencio y el interruptor de ajuste de alarma a la placa de pruebas

Paso 2:Conecte uno de los pines de cada interruptor a tierra y el pin GND del zumbador al pin GND en el Arduino (como se muestra en el diagrama)

Paso 3:Conecte el otro pin del interruptor de alarma a D2, el pin de silencio a D3 y el zumbador a D4

Paso 4:Conecte su módulo RTC al Arduino según su tipo (lea los datos de fabricación; siga el diagrama en la mayoría de los casos)

Paso 5:Conecte DMDCON a Arduino y conecte DMD

Paso 6:Para obtener el brillo total de DMD, conecte una fuente de 5 V a los terminales de alto brillo

Paso 7:Si desea hacer esto en un proto shield, suelde todas las partes al escudo y conéctelo apropiadamente

Parte 2 - Software:

Primero debe instalar la biblioteca DMD disponible desde aquí e instalarla en su carpeta de bibliotecas.

El software se puede descargar desde Prototyping Corner o en la parte inferior de esta página. Contiene las operaciones básicas del reloj maestro.

Para configurar la hora en el módulo RTC, busque las líneas 117 a 124 y ajústelas a la hora actual. Ahora elimine el comentario de la línea 124 y cárguela en Arduino. Ahora comente la línea 124 nuevamente y cárguela nuevamente. Si no se hace esto, el RTC permanecerá igual.

En las líneas 593 y 594, configura la hora y los días en que desea que se active la alarma. La línea 593 es el día de la semana en que desea que ocurra. Los días corresponden a los números de la siguiente manera:

1 =domingo

2 =Lunes

3 =martes

4 =miércoles

5 =jueves

6 =viernes

7 =sábado

Luego, en la línea 594, configure la hora en que suena la alarma en formato de 24 horas.

Yendo más lejos:

Agregar más pantallas:

Puede agregar más pantallas DMD para agrandar el reloj. Lea esto para obtener más información.

Agregar más alarmas:

Para agregar más alarma, agregue las siguientes líneas de código al boceto y llame al vacío en el bucle principal:

void CheckAlarm-ALARM-NO- () {

AlarmSet =digitalRead (AlarmSetPin);

Snooze =digitalRead (SnoozePin);

byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mes, año;

getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

/ * Solo activa la alarma si es uno de los días enumerados a continuación. Esto se puede cambiar cambiando los números a cualquiera de los siguientes:

1 =domingo

2 =lunes

3 =martes

4 =miércoles

5 =jueves

6 =viernes

7 =sábado

* /

if (dayOfWeek ==2 || dayOfWeek ==3 || dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6) {// Estos son los días PERMITIDOS para que suene la alarma

if (hour ==18 &&minute ==05) {// Establezca la hora aquí (en 24 horas)

if (AlarmSet ==LOW) {// Si el pin de alarma está activado

Snooze =digitalRead (SnoozePin);

while (Posponer ==ALTO)

{

Snooze =digitalRead (SnoozePin);

// Agrega lo que sucede aquí

}

}

}

}

Código

  • Código para reloj maestro
Código para el reloj maestro C / C ++
 / * Boceto del reloj maestro. Creado el 26/03/14 Este es un programa arduino que utiliza Freetronics DMD como salida para visualización. Contiene una función de alarma. El día, la fecha y la hora están impresos en el DMD. El botón de función de alarma está en los pines 2 para el ajuste de alarma, 3 para repetición y 4 para la alarma de salida. La hora de la alarma y los días de la semana se pueden configurar en las líneas 551 y 552. Jed Hodson 2014 * / byte dayOfWeek =4; byte dayOfMonth =1; #include  //SPI.h debe incluirse como DMD está escrito por SPI (el IDE se queja de lo contrario) #include  // # include  // # incluye "SystemFont5x7.h" #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68int AlarmSetPin =2; int SnoozePin =3; int Alarm =4; int AlarmSet =0; int Snooze =0; // Convertir números decimales normales a decimalbyte codificado 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));} // 1) Establece la fecha y hora en el ds1307 // 2) Inicia el reloj // 3) Establece el modo de hora en un reloj de 24 horas // Asume que está pasando números válidosvoid setDateDs1307 (byte segundo, // 0-59byte minuto, // 0-59byte hora, // 1-23byte dayOfWeek, // 1-7byte dayOfMonth, // 1-28 / 29/30 / 31byte mes, // 1-12byte año) // 0-99 {Wire.beginTransmission (DS1307_I2C_AD VESTIR); 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 (hex) 00010000 (binario) al registro de control - activa la onda cuadrada Wire.endTransmission ();} // Obtiene la fecha y la hora del ds1307void 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 * second =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 ()); * year =bcdToDec (Wire.read ());} // Inicie la biblioteca DMD como dmdDMD dmd (1,1); void ScanDMD () {dmd.scanDisplayBySPI ();} void setup () {byte segundo, minuto , hora, día de la semana, día del mes, mes, año; // inicializa el uso de CPU / interrupción de TimerOne utilizado para escanear y actualizar la pantalla Timer1.initialize (5000); // período en microsegundos para llamar a ScanDMD. Cualquier valor superior a 5000 (5 ms) y puede ver parpadeo. Timer1.attachInterrupt (ScanDMD); // adjuntar la interrupción Timer1 a ScanDMD que va a dmd.scanDisplayBySPI () // borrar / iniciar los píxeles DMD que se encuentran en la RAM dmd.clearScreen (true); // verdadero es normal (todos los píxeles desactivados), falso es negativo (todos los píxeles activados) dmd.selectFont (System5x7); Wire.begin (); // Cambie estos valores a los que desea configurar en su reloj. // Probablemente solo desee configurar su reloj una vez y luego eliminar // la llamada setDateDs1307. segundo =0; minuto =35; hora =11; // use el horario de 24 horas, de lo contrario los cálculos de día / fecha estarán desactivados dayOfWeek =1; dayOfMonth =23; mes =3; año =14; // Descomente la llamada setDateDs1307 a continuación para establecer el tiempo en los intervalos anteriores. Recuerde que si establece el tiempo // necesita descomentar la línea de abajo nuevamente, de lo contrario el boceto solo permanecerá en el tiempo establecido. // setDateDs1307 (segundo, minuto, hora, dayOfWeek, dayOfMonth, mes, año); pinMode (AlarmSetPin, INPUT_PULLUP); pinMode (SnoozePin, INPUT_PULLUP); pinMode (alarma, SALIDA); digitalWrite (Alarm, LOW);} void drawDay () // muestra el día de la semana {byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mes, año; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch (dayOfWeek) {caso 1:dmd.drawString (1,0, "Sol", 3, GRAPHICS_NORMAL); descanso; caso 2:dmd.drawString (1,0, "Mon,", 3, GRAPHICS_NORMAL); descanso; caso 3:dmd.drawString (1,0, "Mar", 3, GRAPHICS_NORMAL); descanso; caso 4:dmd.drawString (1,0, "Mié", 3, GRAPHICS_NORMAL); descanso; caso 5:dmd.drawString (1,0, "Jue", 3, GRAPHICS_NORMAL); descanso; caso 6:dmd.drawString (1,0, "Vie", 3, GRAPHICS_NORMAL); descanso; caso 7:dmd.drawString (1,0, "Sat,", 3, GRAPHICS_NORMAL); descanso; }} void drawDate () // muestra la fecha numérica {byte segundo, minuto, hora, día de la semana, día del mes, mes, año; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch (dayOfMonth) {caso 1:dmd.drawString (20,0, "01", 2, GRAPHICS_NORMAL); descanso; caso 2:dmd.drawString (20,0, "02", 2, GRAPHICS_NORMAL); descanso; caso 3:dmd.drawString (20,0, "03", 2, GRAPHICS_NORMAL); descanso; caso 4:dmd.drawString (20,0, "04", 2, GRAPHICS_NORMAL); descanso; caso 5:dmd.drawString (20,0, "05", 2, GRAPHICS_NORMAL); descanso; caso 6:dmd.drawString (20,0, "06", 2, GRAPHICS_NORMAL); descanso; caso 7:dmd.drawString (20,0, "07", 2, GRAPHICS_NORMAL); descanso; caso 8:dmd.drawString (20,0, "08", 2, GRAPHICS_NORMAL); descanso; caso 9:dmd.drawString (20,0, "09", 2, GRAPHICS_NORMAL); descanso; caso 10:dmd.drawString (20,0, "10", 2, GRAPHICS_NORMAL); descanso; caso 11:dmd.drawString (20,0, "11", 2, GRAPHICS_NORMAL); descanso; caso 12:dmd.drawString (20,0, "12", 2, GRAPHICS_NORMAL); descanso; caso 13:dmd.drawString (20,0, "13", 2, GRAPHICS_NORMAL); descanso; caso 14:dmd.drawString (20,0, "14", 2, GRAPHICS_NORMAL); descanso; caso 15:dmd.drawString (20,0, "15", 2, GRAPHICS_NORMAL); descanso; caso 16:dmd.drawString (20,0, "16", 2, GRAPHICS_NORMAL); descanso; caso 17:dmd.drawString (20,0, "17", 2, GRAPHICS_NORMAL); descanso; caso 18:dmd.drawString (20,0, "18", 2, GRAPHICS_NORMAL); descanso; caso 19:dmd.drawString (20,0, "19", 2, GRAPHICS_NORMAL); descanso; caso 20:dmd.drawString (20,0, "20", 2, GRAPHICS_NORMAL); descanso; caso 21:dmd.drawString (20,0, "21", 2, GRAPHICS_NORMAL); descanso; caso 22:dmd.drawString (20,0, "22", 2, GRAPHICS_NORMAL); descanso; caso 23:dmd.drawString (20,0, "23", 2, GRAPHICS_NORMAL); descanso; caso 24:dmd.drawString (20,0, "24", 2, GRAPHICS_NORMAL); descanso; caso 25:dmd.drawString (20,0, "25", 2, GRAPHICS_NORMAL); descanso; caso 26:dmd.drawString (20,0, "26", 2, GRAPHICS_NORMAL); descanso; caso 27:dmd.drawString (20,0, "27", 2, GRAPHICS_NORMAL); descanso; caso 28:dmd.drawString (20,0, "28", 2, GRAPHICS_NORMAL); descanso; caso 29:dmd.drawString (20,0, "29", 2, GRAPHICS_NORMAL); descanso; caso 30:dmd.drawString (20,0, "30", 2, GRAPHICS_NORMAL); descanso; caso 31:dmd.drawString (20,0, "31", 2, GRAPHICS_NORMAL); descanso; }} void drawHour () // dibuja la manecilla de la hora {byte segundo, minuto, hora, día de la semana, día del mes, mes, año; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); if (hora> 12) // Elimina este comando if durante 24 horas {hora =hora-12; // Este es un reloj de 12 horas} interruptor (hora) {caso 1:dmd.drawString (1,8, "01", 2, GRAPHICS_NORMAL); descanso; caso 2:dmd.drawString (1,8, "02", 2, GRAPHICS_NORMAL); descanso; caso 3:dmd.drawString (1,8, "03", 2, GRAPHICS_NORMAL); descanso; caso 4:dmd.drawString (1,8, "04", 2, GRAPHICS_NORMAL); descanso; caso 5:dmd.drawString (1,8, "05", 2, GRAPHICS_NORMAL); descanso; caso 6:dmd.drawString (1,8, "06", 2, GRAPHICS_NORMAL); descanso; caso 7:dmd.drawString (1,8, "07", 2, GRAPHICS_NORMAL); descanso; caso 8:dmd.drawString (1,8, "08", 2, GRAPHICS_NORMAL); descanso; caso 9:dmd.drawString (1,8, "09", 2, GRAPHICS_NORMAL); descanso; caso 10:dmd.drawString (1,8, "10", 2, GRAPHICS_NORMAL); descanso; caso 11:dmd.drawString (1,8, "11", 2, GRAPHICS_NORMAL); descanso; caso 12:dmd.drawString (1,8, "12", 2, GRAPHICS_NORMAL); descanso; caso 13:dmd.drawString (1,8, "13", 2, GRAPHICS_NORMAL); descanso; caso 14:dmd.drawString (1,8, "14", 2, GRAPHICS_NORMAL); descanso; caso 15:dmd.drawString (1,8, "15", 2, GRAPHICS_NORMAL); descanso; caso 16:dmd.drawString (1,8, "16", 2, GRAPHICS_NORMAL); descanso; caso 17:dmd.drawString (1,8, "17", 2, GRAPHICS_NORMAL); descanso; caso 18:dmd.drawString (1,8, "18", 2, GRAPHICS_NORMAL); descanso; caso 19:dmd.drawString (1,8, "19", 2, GRAPHICS_NORMAL); descanso; caso 20:dmd.drawString (1,8, "20", 2, GRAPHICS_NORMAL); descanso; caso 21:dmd.drawString (1,8, "21", 2, GRAPHICS_NORMAL); descanso; caso 22:dmd.drawString (1,8, "22", 2, GRAPHICS_NORMAL); descanso; caso 23:dmd.drawString (1,8, "23", 2, GRAPHICS_NORMAL); descanso; caso 24:dmd.drawString (1,8, "24", 2, GRAPHICS_NORMAL); descanso; }} void drawMinute () {byte segundo, minuto, hora, día de la semana, día del mes, mes, año; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); cambiar (minuto) {caso 0:dmd.drawString (20,8, "00", 2, GRAPHICS_NORMAL); descanso; caso 1:dmd.drawString (20,8, "01", 2, GRAPHICS_NORMAL); descanso; caso 2:dmd.drawString (20,8, "02", 2, GRAPHICS_NORMAL); descanso; caso 3:dmd.drawString (20,8, "03", 2, GRAPHICS_NORMAL); descanso; caso 4:dmd.drawString (20,8, "04", 2, GRAPHICS_NORMAL); descanso; caso 5:dmd.drawString (20,8, "05", 2, GRAPHICS_NORMAL); descanso; caso 6:dmd.drawString (20,8, "06", 2, GRAPHICS_NORMAL); descanso; caso 7:dmd.drawString (20,8, "07", 2, GRAPHICS_NORMAL); descanso; caso 8:dmd.drawString (20,8, "08", 2, GRAPHICS_NORMAL); descanso; caso 9:dmd.drawString (20,8, "09", 2, GRAPHICS_NORMAL); descanso; caso 10:dmd.drawString (20,8, "10", 2, GRAPHICS_NORMAL); descanso; caso 11:dmd.drawString (20,8, "11", 2, GRAPHICS_NORMAL); descanso; caso 12:dmd.drawString (20,8, "12", 2, GRAPHICS_NORMAL); descanso; caso 13:dmd.drawString (20,8, "13", 2, GRAPHICS_NORMAL); descanso; caso 14:dmd.drawString (20,8, "14", 2, GRAPHICS_NORMAL); descanso; caso 15:dmd.drawString (20,8, "15", 2, GRAPHICS_NORMAL); descanso; caso 16:dmd.drawString (20,8, "16", 2, GRAPHICS_NORMAL); descanso; caso 17:dmd.drawString (20,8, "17", 2, GRAPHICS_NORMAL); descanso; caso 18:dmd.drawString (20,8, "18", 2, GRAPHICS_NORMAL); descanso; caso 19:dmd.drawString (20,8, "19", 2, GRAPHICS_NORMAL); descanso; caso 20:dmd.drawString (20,8, "20", 2, GRAPHICS_NORMAL); descanso; caso 21:dmd.drawString (20,8, "21", 2, GRAPHICS_NORMAL); descanso; caso 22:dmd.drawString (20,8, "22", 2, GRAPHICS_NORMAL); descanso; caso 23:dmd.drawString (20,8, "23", 2, GRAPHICS_NORMAL); descanso; caso 24:dmd.drawString (20,8, "24", 2, GRAPHICS_NORMAL); descanso; caso 25:dmd.drawString (20,8, "25", 2, GRAPHICS_NORMAL); descanso; caso 26:dmd.drawString (20,8, "26", 2, GRAPHICS_NORMAL); descanso; caso 27:dmd.drawString (20,8, "27", 2, GRAPHICS_NORMAL); descanso; caso 28:dmd.drawString (20,8, "28", 2, GRAPHICS_NORMAL); descanso; caso 29:dmd.drawString (20,8, "29", 2, GRAPHICS_NORMAL); descanso; caso 30:dmd.drawString (20,8, "30", 2, GRAPHICS_NORMAL); descanso; caso 31:dmd.drawString (20,8, "31", 2, GRAPHICS_NORMAL); descanso; caso 32:dmd.drawString (20,8, "32", 2, GRAPHICS_NORMAL); descanso; caso 33:dmd.drawString (20,8, "33", 2, GRAPHICS_NORMAL); descanso; caso 34:dmd.drawString (20,8, "34", 2, GRAPHICS_NORMAL); descanso; caso 35:dmd.drawString (20,8, "35", 2, GRAPHICS_NORMAL); descanso; caso 36:dmd.drawString (20,8, "36", 2, GRAPHICS_NORMAL); descanso; caso 37:dmd.drawString (20,8, "37", 2, GRAPHICS_NORMAL); descanso; caso 38:dmd.drawString (20,8, "38", 2, GRAPHICS_NORMAL); descanso; caso 39:dmd.drawString (20,8, "39", 2, GRAPHICS_NORMAL); descanso; caso 40:dmd.drawString (20,8, "40", 2, GRAPHICS_NORMAL); descanso; caso 41:dmd.drawString (20,8, "41", 2, GRAPHICS_NORMAL); descanso; caso 42:dmd.drawString (20,8, "42", 2, GRAPHICS_NORMAL); descanso; caso 43:dmd.drawString (20,8, "43", 2, GRAPHICS_NORMAL); descanso; caso 44:dmd.drawString (20,8, "44", 2, GRAPHICS_NORMAL); descanso; caso 45:dmd.drawString (20,8, "45", 2, GRAPHICS_NORMAL); descanso; caso 46:dmd.drawString (20,8, "46", 2, GRAPHICS_NORMAL); descanso; caso 47:dmd.drawString (20,8, "47", 2, GRAPHICS_NORMAL); descanso; caso 48:dmd.drawString (20,8, "48", 2, GRAPHICS_NORMAL); descanso; caso 49:dmd.drawString (20,8, "49", 2, GRAPHICS_NORMAL); descanso; caso 50:dmd.drawString (20,8, "50", 2, GRAPHICS_NORMAL); descanso; caso 51:dmd.drawString (20,8, "51", 2, GRAPHICS_NORMAL); descanso; caso 52:dmd.drawString (20,8, "52", 2, GRAPHICS_NORMAL); descanso; caso 53:dmd.drawString (20,8, "53", 2, GRAPHICS_NORMAL); descanso; caso 54:dmd.drawString (20,8, "54", 2, GRAPHICS_NORMAL); descanso; caso 55:dmd.drawString (20,8, "55", 2, GRAPHICS_NORMAL); descanso; caso 56:dmd.drawString (20,8, "56", 2, GRAPHICS_NORMAL); descanso; caso 57:dmd.drawString (20,8, "57", 2, GRAPHICS_NORMAL); descanso; caso 58:dmd.drawString (20,8, "58", 2, GRAPHICS_NORMAL); descanso; caso 59:dmd.drawString (20,8, "59", 2, GRAPHICS_NORMAL); descanso; }} void drawCol () {dmd.drawString (14,8, ":", 1, GRAPHICS_NORMAL);} void runClock () {drawDay (); fecha del sorteo(); dibujarHora (); dibujarCol (); dibujarMinuto (); CheckAlarm ();} void AlarmSequence () {drawDay (); fecha del sorteo(); dibujarHora (); dibujarCol (); dibujarMinuto (); digitalWrite (alarma, ALTA); retraso (1000); dmd.clearScreen (verdadero); digitalWrite (alarma, BAJA); delay (1000);} void CheckAlarm () {AlarmSet =digitalRead (AlarmSetPin); Snooze =digitalRead (SnoozePin); byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mes, año; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); / * Solo activa la alarma si es uno de los días enumerados a continuación. Esto se puede cambiar cambiando los números a cualquiera de los siguientes:1 =Domingo 2 =Lunes 3 =Martes 4 =Miércoles 5 =Jueves 6 =Viernes 7 =Sábado * / if (dayOfWeek ==2 || dayOfWeek ==3 | | dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6) {// Estos son los días PERMITIDOS para que suene la alarma si (hora ==18 &&minuto ==05) {// Establezca la hora aquí (en 24 horas Time) if (AlarmSet ==LOW) {// Si el pin de alarma está en Snooze =digitalRead (SnoozePin); while (Snooze ==HIGH) {Snooze =digitalRead (SnoozePin); AlarmSequence (); }}}}} bucle vacío () {ejecutarClock (); } 

Esquemas


Proceso de manufactura

  1. Reloj de cuco
  2. Reloj de visión pov de Arduino
  3. El reloj IV9 Numitron más simple de bricolaje con Arduino
  4. Reloj de palabras simple (Arduino)
  5. Reloj Arduino con tiempos de oración islámicos
  6. Arduino Spybot
  7. FlickMote
  8. Televisión casera B-Gone
  9. Arduino Temp. Monitor y reloj en tiempo real con pantalla 3.2
  10. Reloj de Berlín
  11. Reloj despertador simple con DS1302 RTC