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 arcade retro

Componentes y suministros

Arduino Mega 2560
× 1

Herramientas y máquinas necesarias

Impresora 3D (genérica)

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Introducción:Reloj Arcade Retro - Arduino

Construye un reloj de cabecera de arcade interactivo, con una pantalla táctil y figuras de arcade animadas que puedes grabar el sonido de tu elección para la alarma.

El proyecto incluye una carcasa impresa en 3D y cuatro programas separados para elegir

1. Reloj Arcade - DK Mario, Space Invaders y animación Pac-Man

2. Pacman Clock:juego interactivo de Pac-Man animado con funciones de reloj

3. DK Clock:juego DK animado interactivo con funciones de reloj

4. Tumble Ghost:juego de fantasmas de Pac-Man animado basado en Flappy Bird

Muy divertido de construir y un gran regalo para cualquiera a quien le guste revivir la nostalgia de los personajes de los juegos de arcade de los 80.

Paso 1:reúna los materiales

  • Placa Arduino - Arduino Mega 2560 (los elementos 1, 2 y 3 se pueden comprar como un solo pedido)
  • Arduino Shield con pantalla táctil:protector de placa de expansión LCD Mega Touch de 3,2 "
  • Pantalla táctil:pantalla LCD TFT de 3,2 "+ pantalla táctil para Arduino Mega 2560
  • Módulo de reloj en tiempo real:DS3231 RTC
  • Módulo de grabadora de voz:grabadora de voz ISD1820
  • Filamento PLA para impresora 3D
  • Resina epoxi de dos componentes para pegar la carcasa
  • Cable USB Cargador USB de 2 m de longitud (utilizado para la fuente de alimentación del reloj)
  • Pistola de pegamento caliente
  • Bridas para cables X 3

Los componentes opcionales de atenuación automática de la luz de fondo solo se requieren si un reloj de cabecera:

  • Resistencia de 270 k ohmios
  • Diodo Zener 3.3v
  • Resistencia de 0.5 vatios 47 ohmios
  • Resistencia dependiente de la luz (LDR)

Imprimí la caja del reloj en una Creality Ender 3. Todos los archivos de impresión 3D y las instrucciones para la caja se pueden encontrar aquí en Thingiverse.

Paso 3:construye el circuito

El circuito general contiene un reloj en tiempo real, Arduino Mega, módulo de sonido, pantalla táctil y un protector de pantalla.

1. Reloj en tiempo real

Monte el reloj en tiempo real en la parte posterior del Arduino Mega como se muestra en la imagen proporcionada. Usé una pistola de pegamento caliente y espuma de embalaje para asegurarme de que no se tocaran y que hubiera algo de amortiguación para absorber el movimiento. En mi caso, soldé 2 de las patas del RTC directamente al Arduino y usé un cable de conexión para conectar 5v y GND al Arduino.

2. Módulo de grabación de sonido

Son realmente geniales y fáciles de usar. De manera similar a la anterior, use espuma y pegamento caliente para colocar el módulo y el altavoz en la parte posterior del Arduino, asegurándose de que estén aislados para que no se toquen. El módulo de sonido es activado por D8 en el Arduino, por lo que esto y la fuente de alimentación deben conectarse según el diagrama de circuito provisto.

3. Atenuador automático de luz de fondo (opcional)

Si tiene la intención de usarlo como reloj de cabecera, es probable que desee atenuar automáticamente la luz de fondo por la noche para que no afecte su sueño. (¡Si no es así, puede omitir este paso!) Desafortunadamente, la luz de fondo en la pantalla TFT está cableada en + 3.3v y no se puede ajustar con el Arduino. Esto significa que tenemos que desconectarlo y volver a conectarlo a un pin PWM en el Arduino para controlar el brillo de la luz de fondo. Quería hacer esto con un daño mínimo a los pines o pistas de los componentes, así que tomé el siguiente enfoque. Siga los pasos a continuación cuidadosamente

(a) Para lograr esto, se coloca una resistencia dependiente de la luz (LDR) en la parte posterior de la unidad para detectar la luz. Taladre dos orificios de 3 mm en la carcasa y empuje las patas del LDR a través de los orificios. Use pegamento caliente en el interior del gabinete para mantener las patas en su lugar. Suelde dos cables en el interior de la carcasa y conéctelos según el diagrama del circuito. Agregue una resistencia de 270k ohmios a A7 del Arduino según el diagrama del circuito.

(b) Retire la pantalla TFT y colóquela sobre una superficie firme. Identifique el pin 19 (LED_A) y retire con cuidado algunos milímetros de plástico en la base del pin. Doble el pin plano y alejándolo del conector como se muestra en la imagen de arriba. Verifique que el TFT Sheild pueda enchufarse cómodamente y que la clavija doblada no obstruya el enchufe o el enchufe.

(c) Suelde un registro de 47 ohmios al pin doblado y conecte un cable de la resistencia a D9 del Arduino Mega. El pin Arduino D9 puede hundirse hasta 40 mA, por lo que la resistencia limita esto a menos que esto. Conecte un diodo Zener de 3.3v al mismo pin (LED_A) y conéctelo a tierra como se indica en el diagrama. El propósito de esto es proteger la luz de fondo de la sobretensión, ya que regulará la tensión a 3.3v.

4. Pantalla TFT y escudo Arduino

Empuje con cuidado los conectores de la pantalla táctil TFT de 3.2 'en el TFT Arduino Shield. Luego, conéctelo con cuidado a la parte superior del Arduino según la imagen proporcionada. El RTC tiene una batería, por lo que conservará la hora correcta incluso si se ha desconectado la energía. La hora de la alarma se almacena en Eeprom en el Arduino, lo que significa que se mantendrá si hay un corte de energía.

Paso 4:carga el código

El proyecto requerirá que se carguen los siguientes archivos y bibliotecas antes de compilarse y ejecutarse. El código es único y se basa en la capacidad de las bibliotecas, el hardware, algunos gráficos personalizados y otros proyectos de los que he tomado prestado.

Nota:El desarrollo del código para este proyecto ha utilizado IDE v1.06 y algunas de las bibliotecas necesarias están fechadas. Esto significa que algunas personas tienen problemas con el nuevo IDE versión 1.6 y superior al cargar el código. Por lo tanto, en aras de la simplicidad, recomiendo que las personas usen IDE v1.06 y hayan incluido los archivos de la biblioteca de la versión correcta en archivos zip en la parte inferior del paso 4 del tutorial.

1. IDE de Arduino

He estado usando una versión anterior del IDE de Arduino, por lo tanto, en aras de la simplicidad, le recomiendo que descargue la versión 1.06 del IDE de Arduino en su máquina de escritorio antes de instalar el código. Puede obtener su versión desde aquí.

2. Bibliotecas

Estos deben descargarse y agregarse al IDE (entorno de desarrollo integrado) que se ejecuta en su computadora, que se utiliza para escribir y cargar el código de la computadora en la placa física.

  • UTFT.hy URtouch.h ubicados en el archivo zip a continuación
  • Time.h ubicado en el archivo zip a continuación
  • DS1307RTC.h ubicado en el archivo zip a continuación
  • Wire.hy EEPROM.h ya están incluidos en IDE V1.06

El crédito para UTFT.hy URtouch.h es para Rinky-Dink Electronics. He incluido estos archivos zip ya que parece que el sitio web de origen no funciona.

4. Variaciones de la pantalla TFT

Las vaguedades de las pantallas TFT y los fabricantes han llevado a estas notas.

(a) Sainsmart:si compró una pantalla TFT de 3.2 'con la marca Sainsmart en la parte posterior del dispositivo TFT, habrá descubierto que tienen que modificar las bibliotecas para resolver problemas de visualización. Si ya ha comprado una pantalla TFT Sainsmart, hay una solución a continuación

Edite el archivo "initlcd.h" y modifique la siguiente línea de

LCD_Write_COM_DATA (0x01, 0x2B3F);

a

LCD_Write_COM_DATA (0x01, 0x3B3F);

Deberá reiniciar el IDE y luego volver a cargar el código en Arduino.

(b.) Conjunto de chips de controlador TFT:las personas que han comprado una pantalla TFT de 3,2 "pueden encontrar que también pueden tener uno de dos conjuntos de chips diferentes" SSD1289 "o" ILI9341 ". Lo molesto es que no es fácil distinguir la diferencia en línea. La buena noticia es que es fácil de arreglar. Si aparece una pantalla en blanco después de cargar el código, probablemente sea porque es un controlador ILI9341.

Para solucionarlo, debe realizar los siguientes cambios en el código. Edite el código y modifique la siguiente línea de código

de

UTFT myGLCD (SSD1289, 38, 39, 40, 41); // Los parámetros deben ajustarse a su modelo Display / Schield

a

UTFT myGLCD (ILI9341_16, 38, 39, 40, 41); // Los parámetros deben ajustarse a su modelo Display / Schield

Ahora intente volver a cargar el código en Arduino.

(c.) Controles de pantalla táctil invertidos

Algunos fabricantes han informado que los botones de la pantalla táctil del eje Y se han invertido. Se identificó una solución para esto donde dos líneas de código para cambiar para voltear la lectura de la pantalla táctil.

Haga una búsqueda para:"yT =myTouch.getY ();" Cámbielo a:"yT =240 - myTouch.getY ();"

No olvide buscar dos veces, la primera instancia es para controlar pacman en modo reloj, la segunda es para en el menú de configuración.

5. Archivos de gráficos

Hay un grupo de archivos de mapa de bits que he incluido a continuación que deben ubicarse en el mismo subdirectorio que el código Arduino cuando comience a cargar en Arduino. Por lo tanto, descargue los archivos a continuación y use el IDE para cargar.

6. Configurar el reloj

Una vez que el código se haya cargado correctamente, presione el centro de la pantalla y esto debería abrir la pantalla de configuración. Utilice el menú para configurar la hora y la alarma en formato de 24 horas. Presione el botón GUARDAR para almacenar la configuración. El RTC tiene una batería, por lo que conservará la hora correcta incluso si se ha desconectado la energía. La hora de la alarma se almacena en EEPROM, lo que significa que se mantendrá si hay un corte de energía.

7. Prueba de la alarma

El módulo de sonido se utiliza para proporcionar la alarma. El ISD1820 está controlado por el pin Arduino D8. El sonido se puede agregar fácilmente reproduciendo sonido en el micrófono mientras presiona simultáneamente el botón de grabación en el ISD1820. En mi caso, grabé la música de introducción original de Pac-Man desde un archivo de audio reproducido a través de otro dispositivo. Una vez que se graba el sonido, la grabación se puede probar presionando el botón PLAY-E, que debería reproducir el sonido a través del altavoz. Utilice el menú de configuración para configurar la hora del reloj y la hora de la alarma con unos minutos de diferencia. Asegúrese de "AJUSTAR" la alarma y presione los botones del menú "GUARDAR". Una vez de regreso a la pantalla principal, la alarma debería sonar cuando llegue el momento. Se puede apagar la alarma presionando el centro del panel de pantalla táctil que da como resultado la pantalla de configuración.

8. Calibración de la pantalla táctil

Algunos fabricantes han descubierto que los botones de la pantalla de configuración no se alinean con los controles táctiles TFT. En estos casos, la pantalla táctil necesita calibración. Esto se puede hacer fácilmente usando el código de calibración de la pantalla táctil y las instrucciones provistas en la biblioteca URtouch. Siga estas instrucciones si observa este problema.

9. Cuatro programas diferentes para elegir

1. Reloj Arcade - DK Mario, Space Invaders y Pacman animation2. Pacman Clock:juego interactivo de Pacman animado / Ms Pacman con funciones de reloj

3. DK Clock:juego DK animado interactivo con funciones de reloj

4. Tumble Ghost:juego animado de Pacman Ghost basado en Flappy Bird

1.% 2BRetroArcadeClockTechKiwigadgetsV1.zip 2.% 2BRetro_Pacman_Clock_V10.zip 3.% 2BRetro_DK_Clock_V3.zip 4.% 2BTumble_Ghost_V10.zip DS1307RTC.zip Time.zip URTouch.zip UTFT.zip

Paso 5:componiendo todo

1. Adición de energía externa

El último paso es agregar la energía externa. Con una broca, agregue un agujero en la parte posterior del gabinete. Pase el cable USB a través del panel posterior y luego conecte los cables VCC, GND, D + y D- del cable USB a la base del conector USB Arduino según el diagrama del circuito. Esto tiene dos ventajas, en primer lugar, la entrada USB a Arduino Mega Boards tiene protección contra sobrecorriente y, en segundo lugar, puede usar el cable USB para cargar cambios de código sin tener que desmontar la caja. Pegue en caliente el aislamiento del cable de alimentación a la parte posterior del Arduino para protegerlo de la tensión del cable al ensamblar los paneles frontal y posterior. Agregue un agarre de cable al cable colocando una abrazadera de cable firmemente alrededor del cable en el interior de la carcasa en el cable de alimentación a 6-8 cm de la conexión Arduino. La brida para cables debe evitar la tensión en las uniones cuando se tira del cable USB tocándolo contra el interior de la carcasa.

2. Montaje de la electrónica en el estuche

Coloque el circuito en la parte superior del panel frontal con las cuatro guías de orificios que deben alinear la pantalla en el centro del corte. Encienda el circuito para que pueda ver la pantalla del panel frontal, verifique que la imagen de la pantalla esté en la posición correcta y luego péguela en su lugar con pegamento caliente. El resultado es un ajuste perfecto con una pantalla cuadrada que se centra en el orificio recortado.

3. Montaje final

Empuje suavemente el panel frontal hacia el panel posterior y tire suavemente del cable de alimentación USB para tensar el panel posterior. El agarre del cable es útil aquí y debería proteger cualquier daño al cableado. Conéctelo al cargador USB y listo.

¡Espero que lo disfrutes!

Código

  • Reloj arcade retro
Reloj arcade retro C / C ++
Arduino IDE
 / * Retro Arcade Clock - TechKiwigadgets V1 - Primera versión de producción * / #include  #include  #include  #include  #include  #include  // una biblioteca DS1307 básica que devuelve la hora como time_t // Variables de alarma boolean alarmstatus =false; // marca donde false está desactivado y true es on boolean soundalarm =false; // Bandera para indicar que la alarma debe iniciarse en alarmhour =0; // hora de ajuste de la alarma en el minuto de alarma =0; // Minuto de ajuste de alarma byte ahour; // Variable de bytes para hourbyte amin; // Variable de bytes para minuteint actr =300; // Cuando suena la alarma, este es un contador que se usa para reiniciar la tarjeta de sonido hasta que la pantalla se toca int act =0; int p =0; // Posición de la animación E.G Bandera gráfica de Pacman 0 =Cerrado, 1 =Medio abierto, 2 =Totalmente abierto, 3 =Medio abiertoint m =0; // Posición de animación mario 3 posiciones // Gráficos X, coordenadas Y // myGLCD.drawBitmap (30, 14, 40, 40, rd_ghost); // Cerrado Ghostint ghostX =15; int ghostY =14; int ghostD =0; // dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arriba // myGLCD.drawBitmap (140, 14, 40, 40, MarioR3); // Cerrado Ghostint MarioX =141; int MarioY =14; int MarioD =0; // dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arriba // myGLCD.drawBitmap (240, 14, 40, 40, Monkey2); // Cerrado Ghostint MonkeyX =261; int MonkeyY =14; int MonkeyD =0; // dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arriba // myGLCD.drawBitmap (30, 180, 40, 40, pacman); // Cerrado Ghostint pacmanX =15; int pacmanY =185; int pacmanD =2; // dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arriba // myGLCD.drawBitmap (140, 180, 40, 40, Alien); // Cerrado Ghostint AlienX =141; int AlienY =185; int AlienD =2; // dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arriba // myGLCD.drawBitmap (240, 180, 40, 40, Cannon); // Fantasma cerrado int CannonX =270; int CannonY =185; int CannonD =2; // dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arriba // Inicializa valores de tiempo RTC:const int DS1307 =0x68; // Dirección de DS1307 ver hojas de datos // Mostrar Variables de atenuadorint dimscreen =255; // Esta variable se utiliza para controlar el brillo de la pantalla donde 255 es el brillo máximoint LDR =100; // Variable LDR medida directamente desde Analog 7 // ====Creando ObjetosUTFT myGLCD (SSD1289,38,39,40,41); // Los parámetros deben ajustarse a su Display / Schield modelURTouch myTouch (6, 5, 4, 3, 2); // ====Definición de Fontsextern uint8_t SmallFont []; extern uint8_t BigFont []; extern uint8_t SevenSegNumFont []; extern uint8_t SevenSeg_XXXL_Num []; // Definir bitmapsextern unsigned int Alien1 [0x640]; // Alien 1 graphicextern unsigned int Alien2 [0x640]; // Alien 2 graphicextern unsigned int Cannon [0x640]; // Space invaders cannonextern unsigned int MarioL1 [0x310]; // M Left 1extern unsigned int MarioL2 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioL3 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioR1 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioR2 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioR3 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioStop [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioU1 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioU2 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioU3 [0x310]; // Mapa de bits fantasma Straight aheadextern unsigned int MarioU4 [0x310]; // Mapa de bits fantasma Recto aheadextern unsigned int rd_ghost [784]; // Mapa de bits fantasma Recto aheadextern unsigned int ru_ghost [784]; // Mapa de bits fantasma Recto aheadextern unsigned int rl_ghost [784]; // Mapa de bits fantasma Recto aheadextern unsigned int rr_ghost [784]; // Mapa de bits fantasma Recto aheadextern unsigned int r_o_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int r_m_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int l_o_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int l_m_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int u_m_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int u_o_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int d_m_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int d_o_pacman [784]; // Mapa de bits fantasma Recto aheadextern unsigned int c_pacman [784]; // Mapa de bits fantasma Straight aheadextern unsigned int Monkey2 [0x640]; // Mapa de bits fantasma Straight aheadextern unsigned int Monkey3 [0x640]; // Mapa de bits fantasma en línea recta // Coordenadas de la pantalla táctil boolean screenPressed =false; int xT, yT; int userT =4; // marca para indicar el toque direccional en la pantalla boolean setupscreen =false; // se utiliza para acceder a la pantalla de configuración // Variables de configuración de alarma boolean xsetup =false; // Marca para determinar si el modo de configuración existente // Retraso de la animación para ralentizar el movimiento hacia abajoint dly =0; // Originalmente 30 // Contador de actualización de tiempo int rfcvalue =300; // Espere este largo tiempo de verificación hasta que se produzcan cambios .int rfc =1; // Declare las variables globales para el tiempo anterior, para permitir la actualización de solo los dígitos que han cambiado // Hay cuatro dígitos que deben dibujarse de forma independiente para garantizar un posicionamiento coherente del tiempo int c1 =20; // Dígito de diez horas int c2 =20; // Un dígito de la hora int c3 =20; // Dígito de diez minutos int c4 =20; // Configuración de digitvoid de un minuto () {// Inicializar RTC Serial.begin (9600); // mientras (! Serial); // esperar hasta que Arduino Serial Monitor abra delay (200); setSyncProvider (RTC.get); // la función para obtener la hora del RTC setSyncInterval (60); // sincroniza la hora cada 60 segundos (1 minuto) if (timeStatus ()! =timeSet) {Serial.println ("No se puede sincronizar con el RTC"); RTC.set (1408278800); // establece el RTC en el 25 de agosto de 2014 a las 9:00 am setTime (1408278800); } else {Serial.println ("RTC ha establecido la hora del sistema"); } // Configurar pin de activación de alarma para reproducir sonido en el pinMode de la placa ISD1820 (8, SALIDA); // D8 utilizado para alternar el sonido digitalWrite (8, LOW); // Establecer en bajo para apagar el sonido // Iniciar visualización myGLCD.InitLCD (); myGLCD.clrScr (); myTouch.InitTouch (); myTouch.setPrecision (PREC_LOW); drawcreen (); // Iniciar el juego UpdateDisp (); // actualizar el valor al reloj} void loop () {// incrementar el indicador gráfico de Pacman 0 =cerrado, 1 =medio abierto, 2 =amplio p =p + 1; si (p ==4) {p =0; // Restablecer contador a cerrado} // Incrementar el indicador gráfico Pacman 0 =Cerrado, 1 =Abierto medio, 2 =Abierto ampliom =m + 1; si (m ==3) {m =0; // Restablecer el contador a cerrado} // Establecer el brillo de la pantalla // Verificar la luz ambiental y ajustar el brillo del LED para que se adapte al ambiente Aproximadamente 500 oscuridad es inferior a 100 LDR =analogRead (A7); / * Rango de valor de prueba de LDR myGLCD.setColor (237, 28, 36); myGLCD.setBackColor (0, 0, 0); myGLCD.printNumI (LDR, 250,60); * / if (LDR> =121) {dimscreen =255; } si (LDR <=120) {dimscreen =45; } analogWrite (9, pantalla atenuada); // Controla el brillo 0 es oscuro, la habitación ambiental es aproximadamente 25 y 70 es luz solar directa // Lea la fecha y hora actuales del RTC y reinicie boardrfc ++; if (rfc> =rfcvalue) {// contar ciclos y tiempo de impresión UpdateDisp (); // actualiza el valor al reloj y luego ... dly =18; // retardo de reinicio rfc =0; } // ===Compruebe si es necesario que suene la alarma if (alarmstatus ==true) {if ((alarmhour ==hour ()) &&(alarmminute ==minuto ())) {// Suena la alarma soundalarm =true; }} // ===Iniciar sonido de alarma:el sonido se paga durante 10 segundos y luego se reinicia a los 20 segundos si ((alarmstatus ==true) &&(soundalarm ==true)) {// Activa un contador y toma medidas para reiniciar sonido si no se toca la pantalla if (act ==0) {// Activa la alarma alternando D8, sonido grabado activado por la transición de BAJO a ALTO digitalWrite (8, HIGH); // Establecer alta digitalWrite (8, LOW); // Establecer bajo UpdateDisp (); // actualiza el valor al reloj} act =act +1; if (act ==actr) {// Activa la alarma alternando D8, sonido grabado activado por la transición de BAJO a ALTO digitalWrite (8, HIGH); // Establecer alta digitalWrite (8, LOW); // Establecer bajo act =0; // Restablecer el contador con saltos cada 20 segundos}} // Verificar si la entrada del usuario a la pantalla táctil // UserT establece la dirección 0 =derecha, 1 =abajo, 2 =izquierda, 3 =arriba, 4 =sin entrada táctil myTouch.read (); if (myTouch.dataAvailable () &&! screenPressed) {xT =myTouch.getX (); yT =myTouch.getY (); // ********************************** // ******* Entrar en el modo de configuración ** ******* // ********************************* if (((xT> =120) &&(xT <=200) &&(yT> =105) &&(yT <=140)) &&(soundalarm! =True)) {// Llame a la rutina de configuración si la alarma no suena xsetup =true; // Cambiar bandera clocksetup (); // Llamar a la rutina de configuración del reloj UpdateDisp (); // actualizar el valor al reloj} else // Si se toca el centro de la pantalla mientras suena la alarma, apague el sonido y reinicie la alarma para que no se establezca si (((xT> =120) &&(xT <=200) &&(yT> =105) &&(yT <=140)) &&((estado de alarma ==verdadero) &&(alarma de sonido ==verdadero))) {estado de alarma =falso; alarma de sonido =falso; digitalWrite (8, BAJO); // Establecer bajo} screenPressed =true; } // No permite sostener la pantalla / debe tocarla si no (! MyTouch.dataAvailable () &&screenPressed) {screenPressed =false; } dibujar fantasma (fantasmaX, fantasmaY, fantasmaD, p); // Incrementar la posición y dibujar la imagen // Dirección fantasma //// Dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arribaif (ghostD ==0) {// Derecha // Incrementar contador y prueba resultados ghostX =ghostX + 3; if (fantasmaX ==270) {myGLCD.fillRect (fantasmaX-3, fantasmaY, fantasmaX, fantasmaY + 28); // Limpiar el gráfico de rastro antes de cambiar de posición ghostD =1; // Cambiar de dirección hacia abajo}} else if (ghostD ==1) {// Abajo // Incrementar el contador y los resultados de la prueba ghostY =ghostY + 3; if (fantasmaY ==185) {myGLCD.fillRect (fantasmaX + 3, fantasmaY-3, fantasmaX + 36, fantasmaY); // Limpiar el gráfico de rastro antes de cambiar de posición ghostD =2; // Cambiar de dirección hacia abajo}} else if (ghostD ==2) {// Izquierda // Incrementar el contador y los resultados de la prueba ghostX =ghostX - 3; if (fantasmaX ==12) {myGLCD.fillRect (fantasmaX + 28, fantasmaY, fantasmaX + 31, fantasmaY + 28); // Limpiar el gráfico de rastro antes de imprimir una nueva posición ghostD =3; // Cambiar de dirección hacia abajo}} else if (ghostD ==3) {// Up // Incrementar el contador y los resultados de la prueba ghostY =ghostY - 3; if (fantasmaY ==14) {myGLCD.fillRect (fantasmaX, fantasmaY + 29, fantasmaX + 28, fantasmaY + 28); // Limpiar el gráfico de rastro antes de imprimir la nueva posición ghostD =0; // Cambiar de dirección hacia abajo}} drawMonkey (MonkeyX, MonkeyY, MonkeyD, p); // Incrementa la posición y dibuja la imagen // Monkey Direction //// direction d ==0 =right, 1 =down, 2 =left, 3 =upif (MonkeyD ==0) {// Right // Incrementa el contador y prueba resultados MonkeyX =MonkeyX + 3; si (MonkeyX ==270) {myGLCD.fillRect (MonkeyX-3, MonkeyY, MonkeyX, MonkeyY + 40); // Limpiar el gráfico de rastro antes de cambiar de dirección MonkeyD =1; // Cambiar de dirección hacia abajo}} else if (MonkeyD ==1) {// Abajo // Incrementar el contador y los resultados de la prueba MonkeyY =MonkeyY + 3; if (MonkeyY ==185) {myGLCD.fillRect (MonkeyX + 3, MonkeyY-3, MonkeyX + 38, MonkeyY); // Limpiar el gráfico de rastro antes de imprimir la nueva posición MonkeyD =2; // Cambiar de dirección hacia abajo}} else if (MonkeyD ==2) {// Izquierda // Incrementar el contador y los resultados de la prueba MonkeyX =MonkeyX - 3; si (MonkeyX ==12) {myGLCD.fillRect (MonkeyX + 41, MonkeyY + 1, MonkeyX + 40, MonkeyY + 38); // Limpiar el gráfico de rastro antes de imprimir una nueva posición MonkeyD =3; // Cambiar de dirección hacia abajo}} else if (MonkeyD ==3) {// Up // Incrementar el contador y los resultados de la prueba MonkeyY =MonkeyY - 3; if (MonkeyY ==14) {myGLCD.fillRect (MonkeyX, MonkeyY + 38, MonkeyX + 40, MonkeyY + 43); // Limpiar el gráfico de rastro antes de imprimir la nueva posición MonkeyD =0; // Cambiar de dirección hacia abajo}} drawCannon (CannonX, CannonY, CannonD, p); // Incrementa la posición y dibuja la imagen // Dirección del cañón //// dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arribaif (CannonD ==0) {// Derecha // Incrementa el contador y prueba resultados CannonX =CannonX + 3; if (CannonX ==270) {myGLCD.fillRect (CannonX-3, CannonY + 3, CannonX, CannonY + 36); // Limpiar el gráfico del rastro antes de cambiar de dirección CannonD =1; // Cambiar de dirección hacia abajo}} else if (CannonD ==1) {// Abajo // Incrementar el contador y los resultados de la prueba CannonY =CannonY + 3; si (CannonY ==185) {CannonD =2; // Cambiar de dirección hacia abajo}} else if (CannonD ==2) {// Izquierda // Incrementar el contador y los resultados de la prueba CannonX =CannonX - 3; if (CannonX ==12) {myGLCD.fillRect (CannonX + 41, CannonY + 3, CannonX + 40, CannonY + 36); // Limpiar el gráfico de rastro antes de imprimir una nueva posición CannonD =3; // Cambiar de dirección hacia abajo}} else if (CannonD ==3) {// Up // Incrementar el contador y los resultados de la prueba CannonY =CannonY - 3; si (CannonY ==14) {CannonD =0; // Cambiar de dirección hacia abajo}} drawpacman (pacmanX, pacmanY, pacmanD, p); // Incrementa la posición y dibuja la imagen // Pacman Direction //// direction d ==0 =right, 1 =down, 2 =left, 3 =upif (pacmanD ==0) {// Right // Incrementa el contador y prueba resultados pacmanX =pacmanX + 3; if (pacmanX ==270) {myGLCD.fillRect (pacmanX-3, pacmanY + 3, pacmanX, pacmanY + 36); // Limpiar el gráfico de rastro antes de cambiar de dirección pacmanD =1; // Cambiar de dirección hacia abajo}} else if (pacmanD ==1) {// Abajo // Incrementar el contador y los resultados de la prueba pacmanY =pacmanY + 3; if (pacmanY ==185) {myGLCD.fillRect (pacmanX + 3, pacmanY-3, pacmanX + 36, pacmanY); // Limpiar el gráfico de rastro antes de cambiar de posición pacmanD =2; // Cambiar de dirección hacia abajo}} else if (pacmanD ==2) {// Izquierda // Incrementar el contador y los resultados de la prueba pacmanX =pacmanX - 3; if (pacmanX ==12) {myGLCD.fillRect (pacmanX + 28, pacmanY, pacmanX + 31, pacmanY + 28); // Limpiar el gráfico de rastro antes de imprimir un nuevo positi pacmanD =3; // Cambiar de dirección hacia abajo}} else if (pacmanD ==3) {// Arriba // Incrementar el contador y los resultados de la prueba pacmanY =pacmanY - 3; if (pacmanY ==14) {myGLCD.fillRect (pacmanX, pacmanY + 29, pacmanX + 28, pacmanY + 28); // Limpiar el gráfico de rastro antes de imprimir la nueva posición pacmanD =0; // Cambiar de dirección hacia abajo}} drawAlien (AlienX, AlienY, AlienD, p); // Incrementa la posición y dibuja la imagen // Dirección alienígena //// dirección d ==0 =derecha, 1 =abajo, 2 =izquierda, 3 =arribaif (AlienD ==0) {// Derecha // Incrementa el contador y prueba resultados AlienX =AlienX + 3; si (AlienX ==270) {myGLCD.fillRect (AlienX-3, AlienY + 3, AlienX, AlienY + 36); // Limpiar el gráfico de rastro antes de cambiar de dirección AlienD =1; // Cambiar de dirección hacia abajo}} else if (AlienD ==1) {// Abajo // Incrementar el contador y los resultados de la prueba AlienY =AlienY + 3; si (AlienY ==185) {AlienD =2; // Cambiar de dirección hacia abajo}} else if (AlienD ==2) {// Izquierda // Incrementar el contador y los resultados de la prueba AlienX =AlienX - 3; si (AlienX ==12) {myGLCD.fillRect (AlienX + 41, AlienY + 3, AlienX + 40, AlienY + 36); // Limpiar el gráfico de rastro antes de imprimir una nueva posición AlienD =3; // Cambiar de dirección hacia abajo}} else if (AlienD ==3) {// Arriba // Incrementar el contador y los resultados de la prueba AlienY =AlienY - 3; si (AlienY ==14) {AlienD =0; // Cambiar de dirección hacia abajo}} drawMario (MarioX, MarioY, MarioD, p); // Incrementar la posición y dibujar la imagen // Mario Direction //// direction d ==0 =right, 1 =down, 2 =left, 3 =upif (MarioD ==0) {// Right // Increment Counter and test resultados MarioX =MarioX + 3; si (MarioX ==270) {myGLCD.fillRect (MarioX-3, MarioY + 3, MarioX, MarioY + 36); // Limpiar el gráfico del rastro antes de cambiar de dirección MarioD =1; // Cambiar de dirección hacia abajo}} else if (MarioD ==1) {// Abajo // Incrementar el contador y los resultados de la prueba MarioY =MarioY + 3; si (MarioY ==185) {myGLCD.fillRect (MarioX + 3, MarioY-3, MarioX + 36, MarioY); // Limpiar el gráfico de rastro antes de imprimir la nueva posición MarioD =2; // Cambiar de dirección hacia abajo}} else if (MarioD ==2) {// Izquierda // Incrementar el contador y los resultados de la prueba MarioX =MarioX - 3; si (MarioX ==12) {MarioD =3; // Cambiar de dirección hacia abajo}} else if (MarioD ==3) {// Arriba // Incrementar el contador y los resultados de la prueba MarioY =MarioY - 3; si (MarioY ==14) {myGLCD.fillRect (MarioX, MarioY + 30, MarioX + 28, MarioY + 28); // Limpiar el gráfico de rastro antes de imprimir la nueva posición MarioD =0; // Cambiar de dirección hacia abajo}} delay (dly); } // ********************************************* *********************************************** *********** // =====Actualizar reloj digital // ************************** *********************************************** ******************************* void UpdateDisp () {// Limpiar el área de tiempo myGLCD.setColor (0, 0, 0); myGLCD.setBackColor (0, 0, 0); // myGLCD.fillRect (60, 80, 262, 166); int h; // Valor de la hora en formato de 24 horas int e; // Valor de minuto en formato de minutos int pm =0; // Marca para determinar si es PM o AM // Hay cuatro dígitos que deben dibujarse de forma independiente para asegurar un posicionamiento coherente del tiempo int d1; // Dígito de diez horas int d2; // Un dígito de la hora int d3; // Dígito de diez minutos int d4; // Un dígito de minuto h =hora (); // Valor del reloj RT de 24 horas e =minuto (); / * TESTh =12; e =8; * /// Calcular los valores de los dígitos de la hora para timeif ((h> =10) &&(h <=12)) {/ / AM horas 10,11,12 d1 =1; // calcular el dígito de las decenas de horas d2 =h - 10; // calcular un dígito de la hora 0,1,2} else if ((h> =22) &&(h <=24)) {// PM horas 10,11,12 d1 =1; // calcular el dígito de las decenas de horas d2 =h - 22; // calculate Ones hour digit 0,1,2 } else if ((h <=9)&&(h>=1)) { // AM hours below ten d1 =0; // calculate Tens hour digit d2 =h; // calculate Ones hour digit 0,1,2 } else if ( (h>=13) &&(h <=21)) { // PM hours below 10 d1 =0; // calculate Tens hour digit d2 =h - 12; // calculate Ones hour digit 0,1,2 } else { // If hour is 0 d1 =1; // calculate Tens hour digit d2 =2; // calculate Ones hour digit 0,1,2 } // Calculate minute digit values for timeif ((e>=10)) { d3 =e/10; // calculate Tens minute digit 1,2,3,4,5 d4 =e - (d3*10); // calculate Ones minute digit 0,1,2 } else { // e is less than 10 d3 =0; d4 =e; } if (h>=12){ // Set // h =h-12; // Work out value pm =1; // Set PM flag} // *************************************************************************// Print each digit if it has changed to reduce screen impact/flicker// Set digit font colour to white myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SevenSeg_XXXL_Num); // First Digitif(((d1 !=c1)||(xsetup ==true))&&(d1 !=0)){ // Do not print zero in first digit position myGLCD.printNumI(d1,10,70); // Printing thisnumber impacts LFH walls so redraw impacted area // ---------------- Clear lines on Outside wall myGLCD.setColor(0,0,0); myGLCD.drawRoundRect(1, 238, 318, 1); }//If prevous time 12:59 or 00:59 and change in time then blank First Digitif((c1 ==1) &&(c2 ==2) &&(c3 ==5) &&(c4 ==9) &&(d2 !=c2) ){ // Clear the previouis First Digit and redraw wall myGLCD.setColor(0,0,0); myGLCD.fillRect(50, 70, 70, 165);}if((c1 ==0) &&(c2 ==0) &&(c3 ==5) &&(c4 ==9) &&(d2 !=c2) ){ // Clear the previouis First Digit and redraw wall myGLCD.setColor(0,0,0); myGLCD.fillRect(50, 70, 70, 165);} myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SevenSeg_XXXL_Num); // Second Digitif((d2 !=c2)||(xsetup ==true)){ myGLCD.printNumI(d2,70,70); // Print 0}// Third Digitif((d3 !=c3)||(xsetup ==true)){ myGLCD.printNumI(d3,143,70); // Was 145 }// Fourth Digitif((d4 !=c4)||(xsetup ==true)){ myGLCD.printNumI(d4,204,70); // Was 205 }if (xsetup ==true){ xsetup =false; // Reset Flag now leaving setup mode } // Print PM or AM // myGLCD.setColor(1, 73, 240); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(BigFont); if (pm ==0) { myGLCD.print("AM", 270, 147); } else { myGLCD.print("PM", 270, 147); }// ----------- Alarm Set on LHS lower pillarif (alarmstatus ==true) { // Print AS on fron screenleft hand side myGLCD.print("AS", 7, 147); } // Round dots myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.fillCircle(137, 105, 5); myGLCD.fillCircle(137, 135, 5);//--------------------- copy exising time digits to global variables so that these can be used to test which digits change in futurec1 =d1;c2 =d2;c3 =d3;c4 =d4;}// =====initiateGame - Custom Functionvoid drawscreen() { // Setup Clock Background //Draw Background lines myGLCD.setColor(1, 73, 240);// myGLCD.setColor(229, 14, 122);// myGLCD.setColor(255, 0, 131); // ---------------- Outside wall myGLCD.drawRoundRect(0, 239, 319, 0); myGLCD.drawRoundRect(2, 237, 317, 2); myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rd_ghost); // Closed Ghost myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); // Closed Ghost myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); // Closed Ghost myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); // Closed Ghost myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); // Closed Ghost } // ********************************** // ******* Enter Setup Mode ********* // ********************************** // Use up down arrows to change time and alrm settings void clocksetup(){ int timehour =hour();int timeminute =minute();// Read Alarm Set Time from Eeprom // read a byte from the current address of the EEPROM ahour =EEPROM.read(100); alarmhour =(int)ahour; if (alarmhour>24 ) { alarmhour =0; } amin =EEPROM.read(101); alarmminute =(int)amin; if (alarmminute>60 ) { alarmminute =0; }boolean savetimealarm =false; // If save button pushed save the time and alarm // Setup Screen myGLCD.clrScr();// ---------------- Outside wall myGLCD.setColor(255, 255, 0); myGLCD.setBackColor(0, 0, 0); myGLCD.drawRoundRect(0, 239, 319, 0); myGLCD.drawRoundRect(2, 237, 317, 2); //Reset screenpressed flagscreenPressed =false;// Read in current clock time and Alarm time // Setup buttons myGLCD.setFont(BigFont); // Time Set buttons myGLCD.print("+ +", 135, 38); myGLCD.print("- -", 135, 82); myGLCD.drawRoundRect(132, 35, 152, 55); // time hour + myGLCD.drawRoundRect(180, 35, 200, 55); // time minute + myGLCD.drawRoundRect(132, 80, 152, 100); // time hour - myGLCD.drawRoundRect(180, 80, 200, 100); // time minute - // Alarm Set buttons myGLCD.print("+ +", 135, 138); myGLCD.print("- -", 135, 182); myGLCD.drawRoundRect(132, 135, 152, 155); // alarm hour + myGLCD.drawRoundRect(180, 135, 200, 155); // alarm minute + myGLCD.drawRoundRect(132, 180, 152, 200); // alarm hour - myGLCD.drawRoundRect(180, 180, 200, 200); // alarm minute - myGLCD.print("SAVE", 13, 213); myGLCD.print("EXIT", 245, 213); myGLCD.drawRoundRect(10, 210, 80, 230); myGLCD.drawRoundRect(243, 210, 310, 230); // Get your Ghost on myGLCD.drawBitmap (50, 20, 28, 28, rd_ghost); // Closed Ghost myGLCD.drawBitmap (240, 100, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (240, 20, 40, 40, Alien1); // Closed Ghost // Begin Loop herewhile (xsetup ==true){ if (alarmstatus ==true){ // flag where false is off and true is on myGLCD.print("SET", 220, 160); } else { myGLCD.print("OFF", 220, 160); } myGLCD.drawRoundRect(218, 157, 268, 177);// Draw Sound Button myGLCD.print("TEST", 50, 110); // Triggers alarm sound myGLCD.drawRoundRect(48, 108, 116, 128); // Display Current Time myGLCD.print("Time", 40, 60); // myGLCD.printNumI(timehour, 130, 60); if(timehour>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(timehour, 130, 60); // If>=10 just print minute } else { myGLCD.print("0", 130, 60); myGLCD.printNumI(timehour, 146, 60); } myGLCD.print(":", 160, 60); if(timeminute>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(timeminute, 175, 60); // If>=10 just print minute } else { myGLCD.print("0", 175, 60); myGLCD.printNumI(timeminute, 193, 60); } //Display Current Alarm Setting myGLCD.print("Alarm", 40, 160); // myGLCD.printNumI(alarmhour, 130, 160); if(alarmhour>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(alarmhour, 130, 160); // If>=10 just print minute } else { myGLCD.print("0", 130, 160); myGLCD.printNumI(alarmhour, 146, 160); } myGLCD.print(":", 160, 160); if(alarmminute>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(alarmminute, 175, 160); // If>=10 just print minute } else { myGLCD.print("0", 175, 160); myGLCD.printNumI(alarmminute, 193, 160); } // Read input to determine if buttons pressed myTouch.read(); if (myTouch.dataAvailable()) { xT =myTouch.getX(); yT =myTouch.getY(); // Capture input command from user if ((xT>=230) &&(xT<=319) &&(yT>=200) &&(yT<=239)) { // (243, 210, 310, 230) Exit Button xsetup =false; // Exit setupmode } else if ((xT>=0) &&(xT<=90) &&(yT>=200) &&(yT<=239)) { // (243, 210, 310, 230) Save Alarm and Time Button savetimealarm =true; // Exit and save time and alarm xsetup =false; // Exit setupmode } else if ((xT>=130) &&(xT<=154) &&(yT>=32) &&(yT<=57)) { // Time Hour + (132, 35, 152, 55) timehour =timehour + 1; // Increment Hour if (timehour ==24) { // reset hour to 0 hours if 24 timehour =0; } } else if ((xT>=130) &&(xT<=154) &&(yT>=78) &&(yT<=102)) { // (132, 80, 152, 100); // time hour - timehour =timehour - 1; // Increment Hour if (timehour ==-1) { // reset hour to 23 hours if <0 timehour =23; } } else if ((xT>=178) &&(xT<=202) &&(yT>=32) &&(yT<=57)) { // Time Minute + (180, 35, 200, 55) timeminute =timeminute + 1; // Increment Hour if (timeminute ==60) { // reset minute to 0 minutes if 60 timeminute =0; } } else if ((xT>=178) &&(xT<=202) &&(yT>=78) &&(yT<=102)) { // (180, 80, 200, 100); // time minute - timeminute =timeminute - 1; // Increment Hour if (timeminute ==-1) { // reset minute to 0 minutes if 60 timeminute =59; } } else if ((xT>=130) &&(xT<=154) &&(yT>=133) &&(yT<=157)) { // (132, 135, 152, 155); // alarm hour + alarmhour =alarmhour + 1; // Increment Hour if (alarmhour ==24) { // reset hour to 0 hours if 24 alarmhour =0; } } else if ((xT>=130) &&(xT<=154) &&(yT>=178) &&(yT<=202)) { // (132, 180, 152, 200); // alarm hour - alarmhour =alarmhour - 1; // Increment Hour if (alarmhour ==-1) { // reset hour to 23 hours if <0 alarmhour =23; } } else if ((xT>=178) &&(xT<=202) &&(yT>=133) &&(yT<=157)) { // (180, 135, 200, 155); // alarm minute + alarmminute =alarmminute + 1; // Increment Hour if (alarmminute ==60) { // reset minute to 0 minutes if 60 alarmminute =0; } } else if ((xT>=178) &&(xT<=202) &&(yT>=178) &&(yT<=202)) { // (180, 180, 200, 200); // alarm minute - alarmminute =alarmminute - 1; // Increment Hour if (alarmminute ==-1) { // reset minute to 0 minutes if 60 alarmminute =59; } } else if ((xT>=216) &&(xT<=270) &&(yT>=155) &&(yT<=179)) { // (218, 157, 268, 177); // alarm set button pushed if (alarmstatus ==true) { alarmstatus =false; // Turn off Alarm } else { alarmstatus =true; // Turn on Alarm } } else if ((xT>=46) &&(xT<=118) &&(yT>=106) &&(yT<=130)) { // ((48, 108, 116, 128); // alarm test button pushed // Set off alarm by toggling D8, recorded sound triggered by LOW to HIGH transition digitalWrite(8,HIGH); // Set high digitalWrite(8,LOW); // Set low } // Should mean changes should scroll if held down delay(250); } } if ( savetimealarm ==true) { // The following codes transmits the data to the RTC Wire.beginTransmission(DS1307); Wire.write(byte(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(timeminute)); Wire.write(decToBcd(timehour)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(byte(0)); Wire.endTransmission(); // Ends transmission of data // Write the Alarm Time to EEPROM so it can be stored when powered off //alarmhour =(int)ahour; ahour =(byte)alarmhour; amin =(byte)alarmminute; EEPROM.write(100, ahour); EEPROM.write(101, amin); // Now time and alarm data saved reset fla g savetimealarm =false;} //* Clear Screen myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); myGLCD.fillRect(0,239,319,0); xsetup =true; // Set Flag now leaving setup mode in order to draw Clock Digits setSyncProvider(RTC.get); // the function to get the time from the RTC setSyncInterval(60); // sync the time every 60 seconds (1 minutes) drawscreen(); // Initiate the screen UpdateDisp(); // update value to clock } // =================Decimal to BCD converterbyte decToBcd(byte val) { return ((val/10*16) + (val%10));} /* myGLCD.drawBitmap (ghostX, ghostY, 28, 28, ghost); // Closed Ghost myGLCD.drawBitmap (MarioX, MarioY, 40, 40, Mario); // Closed Ghost myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey); // Closed Ghost myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien); // Closed Ghost myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); // Closed Ghost *///**********************************************************************************************************//======Draws the rd_ghost - bitmapvoid drawghost(int x, int y, int d, int p) { // Draws the ghost - bitmap // knotting direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y, x, y+28); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rr_ghost); } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rd_ghost); } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rl_ghost); // draw image } else if ( d ==3){ // Up myGLCD.fillRect(x, y+29, x+28, y+28); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, ru_ghost); }}//**********************************************************************************************************//======Draws the Mario - bitmapvoid drawMario(int x, int y, int d, int p) { // Draws the Mario - bitmap // Mario direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR2); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL3); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL2); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL3); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+30, x+28, y+28); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } }// myGLCD.drawBitmap (MarioX, MarioY, 40, 40, MarioR3); }//**********************************************************************************************************//======Draws the Cannon - bitmapvoid drawCannon(int x, int y, int d, int p) { // Draws the Cannon - bitmap // Cannon direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y+3, x+40, y+36); // Clear trail off graphic before printing new positi // draw image } else if ( d ==3){ // Up myGLCD.fillRect(x, y+41, x+40, y+40); // Clear trail off graphic before printing new position // draw image } myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); }//**********************************************************************************************************//======Draws the Monkey - bitmapvoid drawMonkey(int x, int y, int d, int p) { // Draws the Monkey - bitmap // Monkey direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y, x, y+40); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==1) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==2) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); }else { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } } else if ( d ==1){ // Down myGLCD.fillRect(x, y-3, x+40, y); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y, x+40, y+40); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==1) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==2) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); }else { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+43, x+40, y+40); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } }//**********************************************************************************************************//======Draws the pacman - bitmapvoid drawpacman(int x, int y, int d, int p) { // Draws the pacman - bitmap // pacman direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_m_pacman); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_m_pacman); } } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_m_pacman); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+29, x+28, y+28); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_m_pacman); } }// myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); }//**********************************************************************************************************//======Draws the Alien - bitmapvoid drawAlien(int x, int y, int d, int p) { // Draws the Alien - bitmap // Alien direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y+3, x+40, y+36); // Clear trail off graphic before printing new positi // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+41, x+40, y+40); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); }}} 

Piezas y carcasas personalizadas

Thingiverse
https://www.thingiverse.com/thing:3017701CAD file on thingiverse.com

Esquemas


Proceso de manufactura

  1. Secuenciador LED
  2. Reloj de cuco
  3. Reloj de visión pov de Arduino
  4. Generador de reloj Verilog
  5. Reloj de palabras simple (Arduino)
  6. Consola de juegos portátil TeleBall
  7. Reloj maestro
  8. Consola de juegos retro Ingegno
  9. Reloj Word en italiano
  10. Reloj de Berlín
  11. Reloj espejo infinito