Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Relógio Retro Arcade

Componentes e suprimentos

Arduino Mega 2560
× 1

Ferramentas e máquinas necessárias

Impressora 3D (genérica)

Aplicativos e serviços online

Arduino IDE

Sobre este projeto







Introdução:Retro Arcade Clock - Arduino


Construa um relógio de cabeceira interativo de arcada, com uma tela sensível ao toque e figuras de arcade animadas que você pode gravar um som de sua escolha para o alarme.

O projeto inclui uma caixa impressa em 3D e quatro programas separados para escolher

1. Arcade Clock - animação DK Mario, Space Invaders e Pac-Man

2. Pacman Clock - jogo de Pac-Man animado e interativo com funções de relógio

3. DK Clock - Jogo DK animado interativo com funções de relógio

4. Tumble Ghost - Jogo animado de fantasmas de Pac-Man baseado em Flappy Bird

Muita diversão para construir e um grande presente para quem gosta de reviver a nostalgia dos personagens de jogos de arcade dos anos 80.





Etapa 1:reúna os materiais

  • Placa Arduino - Arduino Mega 2560 (itens 1, 2 e 3 podem ser adquiridos como um pedido agrupado)
  • Touchscreen Arduino Shield - escudo da placa de expansão Mega Touch LCD de 3,2 "
  • Tela sensível ao toque - Visor LCD TFT de 3,2 "+ tela sensível ao toque para Arduino Mega 2560
  • Módulo de relógio em tempo real - DS3231 RTC
  • Módulo gravador de voz - gravador de voz ISD1820
  • Filamento PLA para impressora 3D
  • Resina epóxi de duas partes para colar a caixa
  • Cabo USB Carregador USB de 2 m de comprimento (usado para a fonte de alimentação do relógio)
  • Pistola de cola quente
  • Abraçadeiras X 3

Componentes opcionais de escurecimento de luz de fundo automático necessários apenas se um relógio de cabeceira:
  • Resistor 270k ohm
  • diodo Zener 3.3v
  • resistor de 0,5 watt 47 ohm
  • resistor dependente de luz (LDR)

Eu imprimi a caixa do relógio em um Creality Ender 3. Todos os arquivos de impressão 3D e instruções para a caixa podem ser encontrados aqui no Thingiverse.





Etapa 3:construir o circuito


O circuito geral contém um relógio em tempo real, Arduino Mega, módulo de som, tela sensível ao toque e um escudo de tela.

1 Relógio em tempo real

Monte o relógio em tempo real na parte de trás do Arduino Mega como na imagem fornecida. Usei uma pistola de cola quente e espuma de embalagem para garantir que eles não se tocassem e que houvesse algum amortecimento para absorver o movimento. No meu caso, soldei 2 das pernas do RTC diretamente no Arduino e usei o fio de conexão para conectar 5v e GND ao Arduino.

2. Módulo de gravação de som

Eles são muito legais e fáceis de usar. De maneira semelhante à anterior, use espuma e cola quente para posicionar o módulo e o alto-falante na parte de trás do Arduino, tomando cuidado para garantir que eles fiquem isolados do toque. O módulo de som é acionado por D8 no Arduino, portanto, este e a fonte de alimentação precisam ser conectados de acordo com o diagrama de circuito fornecido.

3. Dimmer de luz de fundo automático (opcional)

Se você pretende usar como relógio de cabeceira, provavelmente vai querer diminuir a luz de fundo automaticamente à noite para que não afete seu sono. (Do contrário, você pode pular esta etapa!) Infelizmente, a luz de fundo na tela TFT é conectada a + 3.3v e não pode ser ajustada com o Arduino. Isso significa que temos que desconectá-lo e reconectar a um pino PWM no Arduino para controlar o brilho da luz de fundo. Eu queria fazer isso com o mínimo de danos aos pinos ou trilhas dos componentes, então usei a abordagem a seguir. Siga as etapas abaixo com cuidado

(a) Para conseguir isso, um resistor dependente de luz (LDR) é posicionado na parte traseira da unidade para detectar a luz. Faça dois orifícios de 3 mm na caixa e empurre as pernas do LDR através dos orifícios. Use cola quente no interior do gabinete para segurar as pernas no lugar. Solde dois fios no interior da caixa e conecte-os de acordo com o diagrama do circuito. Adicione um resistor de 270k Ohm ao A7 do Arduino de acordo com o diagrama de circuito.

(b) Remova o visor TFT e coloque-o sobre uma superfície firme. Identifique o pino 19 (LED_A) e remova cuidadosamente alguns milímetros do plástico na base do pino. Dobre o pino na horizontal e longe do conector, conforme a imagem acima. Verifique se o TFT Sheild pode se conectar confortavelmente e se o pino torto não obstrui o plugue ou soquete.

(c) Solde um registrador de 47 Ohm ao dobrado sobre o pino e conecte um fio do resistor ao D9 do Arduino Mega. O pino do Arduino D9 pode afundar até 40mA, então o resistor limita isso a menos do que isso. Conecte um diodo Zener 3,3 V ao mesmo pino (LED_A) e conecte-o à terra conforme o diagrama. O objetivo disso é proteger a luz de fundo de sobretensão, pois ela regulará a tensão para 3,3 V.

4. Tela TFT e Arduino Shield

Empurre cuidadosamente os conectores de tela de toque TFT de 3,2 'no TFT Arduino Shield. Em seguida, conecte-se cuidadosamente à parte superior do Arduino de acordo com a imagem fornecida. O RTC tem uma bateria, portanto, manterá a hora correta mesmo se a alimentação for removida. A hora do alarme é armazenada em Eeprom no Arduino, o que significa que será mantida se houver um corte de energia.





Etapa 4:carregue o código


O projeto exigirá que os seguintes arquivos e bibliotecas sejam carregados antes de ser compilado e executado. O código é único e construído em torno da capacidade das bibliotecas, o hardware, alguns gráficos personalizados e outros projetos dos quais peguei emprestado.

Observação:o desenvolvimento do código para este projeto usou IDE v1.06 e algumas das bibliotecas necessárias estão desatualizadas. Isso significa que algumas pessoas estão tendo problemas com o novo IDE versão 1.6 e superior ao carregar o código. Portanto, no interesse da simplicidade, recomendo que as pessoas usem o IDE v1.06 e incluam os arquivos de biblioteca da versão correta em arquivos zip na parte inferior da etapa 4 do tutorial.

1 Arduino IDE

Tenho usado uma versão anterior do Arduino IDE, portanto, para manter a simplicidade, recomendo que você baixe o Arduino IDE versão 1.06 em sua máquina desktop antes de instalar o código. Você pode obter a versão dele aqui.

2. Bibliotecas

Eles precisam ser baixados e adicionados ao IDE (Integrated Development Environment) que roda em seu computador, usado para escrever e fazer upload de código de computador para a placa física.
  • UTFT.h e URtouch.h localizados no arquivo zip abaixo
  • Time.h localizado no arquivo zip abaixo
  • DS1307RTC.h localizado no arquivo zip abaixo
  • Wire.h e EEPROM.h já estão incluídos no IDE V1.06

Os créditos de UTFT.he URtouch.h vão para Rinky-Dink Electronics. Incluí esses arquivos zip porque parece que o site de origem está fora do ar.

4. Variações da tela TFT

A indefinição de telas e fabricantes TFT levou a essas notas.

(a) Sainsmart - Se você comprou uma tela TFT de 3,2 'com a marca Sainsmart na parte traseira do dispositivo TFT, você terá que modificar as bibliotecas para resolver os problemas de exibição. Se você comprou um monitor Sainsmart TFT, há uma correção abaixo

Edite o arquivo "initlcd.h" e modifique a seguinte linha de

LCD_Write_COM_DATA (0x01, 0x2B3F);

para

LCD_Write_COM_DATA (0x01, 0x3B3F);

Você precisará reiniciar o IDE e recarregar o código no Arduino.

(b.) Chipset do controlador TFT - As pessoas que compraram uma tela TFT de 3,2 "podem descobrir que também podem ter um dos dois chipsets diferentes" SSD1289 "ou" ILI9341 "O irritante é que não é fácil distinguir a diferença online. A boa notícia é que é fácil de consertar.Se você obtiver uma tela em branco após carregar o código, provavelmente é porque é um controlador ILI9341.

Para corrigir, você precisa fazer as seguintes alterações no código. Edite o código e modifique a seguinte linha de código

a partir de

UTFT myGLCD (SSD1289, 38, 39, 40, 41); // Os parâmetros devem ser ajustados ao seu modelo Display / Schield

para

UTFT myGLCD (ILI9341_16, 38, 39, 40, 41); // Os parâmetros devem ser ajustados ao seu modelo Display / Schield

Agora tente recarregar o código no Arduino.

(c.) Controles da tela de toque invertida

Alguns fabricantes relataram que os botões da tela de toque do eixo Y foram invertidos. Uma correção para isso foi identificada quando duas linhas de código eram alteradas para inverter a leitura da tela de toque.

Faça uma busca para:"yT =myTouch.getY ();" Altere-o para:"yT =240 - myTouch.getY ();"

Não se esqueça de pesquisar duas vezes, a primeira é para controlar o pacman no modo relógio, a segunda é para o menu de configuração.



5. Arquivos gráficos

Há um grupo de arquivos bitmap que incluí abaixo que precisam estar no mesmo subdiretório que o código do Arduino quando você começa a carregar no Arduino. Portanto, baixe os arquivos abaixo e use o IDE para carregar.

6. Configure o relógio

Assim que o código for carregado com sucesso, pressione o centro da tela e a tela de configuração aparecerá. Use o menu para definir a hora e o alarme no formato de 24 horas. Pressione o botão SAVE para armazenar a configuração. O RTC tem uma bateria, portanto, manterá a hora correta mesmo se a alimentação for removida. A hora do alarme é armazenada na EEPROM, o que significa que será retida se houver um corte de energia.

7. Testando o Alarme

O módulo de som é usado para fornecer o alarme. O ISD1820 é controlado pelo pino Arduino D8. O som pode ser adicionado facilmente reproduzindo o som no microfone enquanto pressiona simultaneamente o botão de gravação no ISD1820. No meu caso, gravei a música de introdução do Pac-Man original de um arquivo de áudio reproduzido em outro dispositivo. Assim que o som for gravado, a gravação pode ser testada pressionando o botão PLAY-E, que deve reproduzir o som pelo alto-falante. Use o menu de configuração para definir a hora do relógio e a hora do alarme com alguns minutos de intervalo. Certifique-se de "CONFIGURAR" o alarme e aperte os botões de menu "SALVAR". De volta à tela principal, o Alarme deve soar quando chegar a hora. Para desligar o alarme, pressione o centro do painel da tela de toque, resultando na tela de configuração.

8. Calibração da tela de toque

Alguns fabricantes descobriram que os botões na tela de configuração não se alinham com os controles de toque TFT. Nestes casos, a tela sensível ao toque precisa ser calibrada. Isso pode ser feito facilmente usando o código de calibração da tela de toque e as instruções fornecidas na biblioteca URtouch. Siga estas instruções se você observar esse problema.

9. Quatro programas diferentes para escolher

1. Arcade Clock - DK Mario, Space Invaders &Pacman animation2. Pacman Clock - jogo animado interativo de Pacman / Ms Pacman com funções de relógio

3. DK Clock - Jogo DK animado interativo com funções de relógio

4. Tumble Ghost - Jogo animado do Pacman Ghost baseado no 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





Etapa 5:juntando tudo


1 Adicionando energia externa

A etapa final é adicionar a alimentação externa. Usando uma broca, faça um orifício na parte de trás do gabinete. Passe o cabo USB pelo painel traseiro e, em seguida, conecte os fios VCC, GND, D + e D- do cabo USB à base do conector USB do Arduino de acordo com o diagrama de circuito. Isso tem duas vantagens. Em primeiro lugar, a entrada USB para Arduino Mega Boards tem proteção contra sobrecorrente e, em segundo lugar, você pode usar o cabo USB para fazer o upload das alterações de código sem ter que desmontar a caixa. Cole o isolamento do cabo de alimentação na parte traseira do Arduino para fornecer proteção contra a tensão do cabo ao montar os painéis frontal e traseiro. Adicione um prendedor de cabo ao cabo, colocando uma braçadeira de cabo firmemente em torno do cabo no interior do gabinete no cabo de alimentação de 6 a 8 cm da conexão do Arduino. A braçadeira de cabos deve evitar tensão nas juntas quando o cabo USB é puxado contra a parte interna do gabinete.

2. Montagem da eletrônica na caixa

Coloque o circuito no topo do painel frontal com as quatro guias de orifícios que devem alinhar a tela centralmente no recorte. Ligue o circuito para que você possa ver a tela do painel frontal, verifique se a imagem da tela está na posição correta e cole no lugar com cola quente. O resultado é um ajuste confortável com uma tela quadrada que é centralizada no orifício recortado.

3. Montagem Final

Empurre suavemente o painel frontal no painel traseiro e puxando cuidadosamente o cabo de alimentação USB para eliminar a folga no painel traseiro. O cabo do cabo é útil aqui e deve proteger qualquer dano à fiação. Conecte o carregador USB e pronto.

Espero que você goste!






Código

  • Relógio Retro Arcade
Relógio Retro Arcade C / C ++
Arduino IDE
 / * Retro Arcade Clock - TechKiwigadgets V1 - Primeira versão de produção * / #include  #include  #include  #include  #include  #include  // uma biblioteca DS1307 básica que retorna o tempo como um time_t // Alarm Variablesboolean alarmstatus =false; // sinaliza onde false está desativado e true é onboolean soundalarm =false; // Sinalizador para indicar que o alarme precisa ser iniciadoint alarmhour =0; // hora de configuração do alarmeint alarmminute =0; // Minuto de configuração do alarmebyte ahour; // Variável de byte para hourbyte amin; // Variável de byte para minutoint actr =300; // Quando o alarme soa, este é um contador usado para reiniciar a placa de som até que a tela toque em int act =0; int p =0; // Posição da animação E.G Pacman Graphic Flag 0 =Fechado, 1 =Médio aberto, 2 =Totalmente aberto, 3 =Médio abertoint m =0; // Posição da animação mario 3 postions // Coordenadas X, Y dos gráficos // myGLCD.drawBitmap (30, 14, 40, 40, rd_ghost); // Ghostint ghostX =15; int ghostY =14; int ghostD =0; // direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cima // meuGLCD.drawBitmap (140, 14, 40, 40, MarioR3); // Fechado Ghostint MarioX =141; int MarioY =14; int MarioD =0; // direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cima // meuGLCD.drawBitmap (240, 14, 40, 40, Monkey2); // Fechado Ghostint MonkeyX =261; int MonkeyY =14; int MonkeyD =0; // direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cima // meuGLCD.drawBitmap (30, 180, 40, 40, pacman); // Ghostint fechado pacmanX =15; int pacmanY =185; int pacmanD =2; // direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cima // meuGLCD.drawBitmap (140, 180, 40, 40, Alien); // Fechado Ghostint AlienX =141; int AlienY =185; int AlienD =2; // direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cima // meuGLCD.drawBitmap (240, 180, 40, 40, Canhão); // Fantasma fechado int CannonX =270; int CannonY =185; int CannonD =2; // direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cima // Inicializa os valores de tempo RTC:const int DS1307 =0x68; // Endereço de DS1307 ver planilhas de dados // Display Dimmer Variablesint dimscreen =255; // Esta variável é usada para direcionar o brilho da tela onde 255 é o brilho máximoint LDR =100; // Variável LDR medida diretamente do Analog 7 // ====Criando ObjetosUTFT myGLCD (SSD1289,38,39,40,41); // Os parâmetros devem ser ajustados ao seu Display / Schield modelURTouch myTouch (6, 5, 4, 3, 2); // ====Definindo 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]; // Ghost Bitmap Straight aheadextern unsigned int MarioL3 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioR1 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioR2 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioR3 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioStop [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioU1 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioU2 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioU3 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int MarioU4 [0x310]; // Ghost Bitmap Straight aheadextern unsigned int rd_ghost [784]; // Bitmap Ghost Straight aheadextern unsigned int ru_ghost [784]; // Bitmap Ghost Straight aheadextern unsigned int rl_ghost [784]; // Bitmap Ghost Straight aheadextern unsigned int rr_ghost [784]; // Ghost Bitmap Straight aheadextern unsigned int r_o_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int r_m_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int l_o_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int l_m_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int u_m_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int u_o_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int d_m_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int d_o_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int c_pacman [784]; // Ghost Bitmap Straight aheadextern unsigned int Monkey2 [0x640]; // Ghost Bitmap Straight aheadextern unsigned int Monkey3 [0x640]; // Bitmap fantasma em linha reta // Coordenadas da tela de toque boolean screenPressed =false; int xT, yT; int userT =4; // sinaliza para indicar o toque direcional na telaboolean setupscreen =false; // usado para acessar a tela de configuração // Variáveis ​​de configuração de alarmeboolean xsetup =false; // Sinalize para determinar se o modo de configuração existente // Atraso de animação para diminuir o movimento downint dly =0; // Originalmente 30 // Contador de atualização de tempo int rfcvalue =300; // espere este longo tempo de verificação até as alteraçõesint rfc =1; // Declare variáveis ​​globais para o tempo anterior, para permitir a atualização de apenas dígitos que mudaram // Há quatro dígitos que precisam ser desenhados independentemente para garantir um posicionamento consistente de tempo int c1 =20; // Dígito de dezenas de horas int c2 =20; // Um ​​dígito das horas int c3 =20; // Dígito de dez minutos int c4 =20; // Ones minuto digitvoid setup () {// Inicializar RTC Serial.begin (9600); // while (! Serial); // espera até que o Arduino Serial Monitor abra delay (200); setSyncProvider (RTC.get); // a função para obter a hora do RTC setSyncInterval (60); // sincroniza a hora a cada 60 segundos (1 minuto) if (timeStatus ()! =timeSet) {Serial.println ("Não é possível sincronizar com o RTC"); RTC.set (1408278800); // definir o RTC para 25 de agosto de 2014 9h setTime (1408278800); } else {Serial.println ("RTC definiu a hora do sistema"); } // Configurar o pino de ativação do alarme para reproduzir o som na placa ISD1820 pinMode (8, OUTPUT); // D8 usado para alternar o som digitalWrite (8, LOW); // Defina como baixo para desligar o som // Iniciar a exibição myGLCD.InitLCD (); myGLCD.clrScr (); myTouch.InitTouch (); myTouch.setPrecision (PREC_LOW); drawscreen (); // Inicia o jogo UpdateDisp (); // atualiza o valor para o relógio} void loop () {// incrementa o Pacman Graphic Flag 0 =Fechado, 1 =Aberto médio, 2 =Aberto amplop =p + 1; se (p ==4) {p =0; // Reinicia o contador para fechado} // incrementa o Pacman Graphic Flag 0 =Fechado, 1 =Aberto médio, 2 =Aberto amplo =m + 1; se (m ==3) {m =0; // Redefina o contador para fechado} // Definir o brilho da tela // Verifique a luz ambiente e ajuste o brilho do LED para se adequar ao ambiente, aproximadamente 500 escuro está abaixo de 100LDR =analogRead (A7); / * Faixa de valor de teste de LDR myGLCD.setColor (237, 28, 36); myGLCD.setBackColor (0, 0, 0); myGLCD.printNumI (LDR, 250,60); * / if (LDR> =121) {dimscreen =255; } se (LDR <=120) {dimscreen =45; } analogWrite (9, tela escura); // Controla o brilho 0 é escuro, a sala ambiente é de aproximadamente 25 e 70 é a luz solar direta // Leia a data e hora atuais do RTC e redefina o boardrfc ++; if (rfc> =rfcvalue) {// contar ciclos e tempo de impressão UpdateDisp (); // atualiza o valor para o relógio então ... dly =18; // reinicializa o atraso rfc =0; } // ===Verifique se o alarme precisa ser soado if (alarmstatus ==true) {if ((alarmhour ==hour ()) &&(alarmminute ==minuto ())) {// Soar o alarme soundalarm =true; }} // ===Iniciar o som do alarme - o som dura 10 segundos e depois reiniciará aos 20 segundos markif ((alarmstatus ==true) &&(soundalarm ==true)) {// Ative um contador e tome medidas para reiniciar som se a tela não for tocada if (act ==0) {// Desative o alarme alternando D8, som gravado acionado pela transição LOW para HIGH digitalWrite (8, HIGH); // Definir alto digitalWrite (8, LOW); // Definir UpdateDisp () baixo; // atualiza o valor para o relógio} act =act +1; if (act ==actr) {// Desativa o alarme alternando D8, som gravado acionado pela transição LOW para HIGH digitalWrite (8, HIGH); // Definir alto digitalWrite (8, LOW); // Definir low act =0; // Reinicialize o contador a cada 20 segundos}} // Verifique se a entrada do usuário na tela de toque // UserT define a direção 0 =direita, 1 =baixo, 2 =esquerda, 3 =cima, 4 =sem entrada de toque myTouch.read (); if (myTouch.dataAvailable () &&! screenPressed) {xT =myTouch.getX (); yT =myTouch.getY (); // ********************************** // ******* Entrar no modo de configuração ** ******* // *********************************** if (((xT> =) 120) &&(xT <=200) &&(yT> =105) &&(yT <=140)) &&(soundalarm! =True)) {// Chamar rotina de configuração se o alarme não soar xsetup =true; // Alternar sinalizador clocksetup (); // Chama a rotina de configuração do relógio UpdateDisp (); // atualiza o valor para o relógio} else // Se o centro da tela for tocado enquanto o alarme soa, então desligue o som e redefina o alarme para não definido if (((xT> =120) &&(xT <=200) &&(yT> =105) &&(yT <=140)) &&((alarmstatus ==true) &&(soundalarm ==true))) {alarmstatus =false; alarme sonoro =falso; digitalWrite (8, BAIXO); // Definir baixo} screenPressed =true; } // Não permite segurar a tela / você deve tocar nela senão if (! MyTouch.dataAvailable () &&screenPressed) {screenPressed =false; } drawghost (ghostX, ghostY, ghostD, p); // Incrementa a posição e desenha a imagem // direção fantasma //// direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cimaif (fantasmaD ==0) {// Direita // Incrementa o contador e teste resultados ghostX =ghostX + 3; if (ghostX ==270) {myGLCD.fillRect (ghostX-3, ghostY, ghostX, ghostY + 28); // Limpa o gráfico de fuga antes de mudar a posição ghostD =1; // Muda a direção para baixo}} else if (ghostD ==1) {// Down // Incrementa o contador e os resultados do teste ghostY =ghostY + 3; if (fantasmaY ==185) {meuGLCD.fillRect (fantasmaX + 3, fantasmaY-3, fantasmaX + 36, fantasmaY); // Limpa o gráfico de fuga antes de mudar a posição ghostD =2; // Muda a direção para baixo}} else if (ghostD ==2) {// Left // Incrementa o contador e os resultados do teste ghostX =ghostX - 3; if (ghostX ==12) {myGLCD.fillRect (ghostX + 28, ghostY, ghostX + 31, ghostY + 28); // Limpe o gráfico final antes de imprimir new positi ghostD =3; // Muda a direção para baixo}} else if (ghostD ==3) {// Up // Incrementa o contador e os resultados do teste ghostY =ghostY - 3; if (fantasmaY ==14) {meuGLCD.fillRect (fantasmaX, fantasmaY + 29, fantasmaX + 28, fantasmaY + 28); // Limpa o gráfico final antes de imprimir a nova posição ghostD =0; // Muda a direção para baixo}} drawMonkey (MonkeyX, MonkeyY, MonkeyD, p); // Incrementa a posição e desenha a imagem // Direção do macaco //// direção d ==0 =direita, 1 =para baixo, 2 =esquerda, 3 =cimaif (MonkeyD ==0) {// Direita // Incrementa o contador e teste resultados MonkeyX =MonkeyX + 3; if (MonkeyX ==270) {myGLCD.fillRect (MonkeyX-3, MonkeyY, MonkeyX, MonkeyY + 40); // Limpar gráfico de trilha antes de mudar de direção MonkeyD =1; // Muda a direção para baixo}} else if (MonkeyD ==1) {// Down // Incrementa o contador e os resultados do teste MonkeyY =MonkeyY + 3; if (MonkeyY ==185) {myGLCD.fillRect (MonkeyX + 3, MonkeyY-3, MonkeyX + 38, MonkeyY); // Limpa o gráfico de fuga antes de imprimir a nova posição MonkeyD =2; // Alterar a direção para baixo}} else if (MonkeyD ==2) {// Left // Incrementar o contador e testar os resultados MonkeyX =MonkeyX - 3; if (MonkeyX ==12) {myGLCD.fillRect (MonkeyX + 41, MonkeyY + 1, MonkeyX + 40, MonkeyY + 38); // Limpe o rastro do gráfico antes de imprimir o novo positi MonkeyD =3; // Muda a direção para baixo}} else if (MonkeyD ==3) {// Up // Incrementa o contador e os resultados do teste MonkeyY =MonkeyY - 3; if (MonkeyY ==14) {myGLCD.fillRect (MonkeyX, MonkeyY + 38, MonkeyX + 40, MonkeyY + 43); // Limpa o gráfico de fuga antes de imprimir a nova posição MonkeyD =0; // Muda a direção para baixo}} drawCannon (CannonX, CannonY, CannonD, p); // Incrementa a posição e desenha a imagem // Direção do canhão //// direção d ==0 =direita, 1 =baixo, 2 =esquerda, 3 =cimaif (CannonD ==0) {// Direita // Incrementa o contador e teste resultados CannonX =CannonX + 3; if (CannonX ==270) {myGLCD.fillRect (CannonX-3, CannonY + 3, CannonX, CannonY + 36); // Limpa o gráfico de trilha antes de mudar a direção CannonD =1; // Muda a direção para baixo}} else if (CannonD ==1) {// Down // Incrementa o contador e os resultados do teste CannonY =CannonY + 3; if (CannonY ==185) {CannonD =2; // Alterar a direção para baixo}} else if (CannonD ==2) {// Left // Incrementar o contador e os resultados do teste CannonX =CannonX - 3; if (CannonX ==12) {myGLCD.fillRect (CannonX + 41, CannonY + 3, CannonX + 40, CannonY + 36); // Limpe o gráfico final antes de imprimir a nova posição CannonD =3; // Muda a direção para baixo}} else if (CannonD ==3) {// Up // Incrementa o contador e os resultados do teste CannonY =CannonY - 3; if (CannonY ==14) {CannonD =0; // Alterar direção para baixo}} drawpacman (pacmanX, pacmanY, pacmanD, p); // Incrementa a posição e desenha a imagem // pacman Direction //// direction d ==0 =right, 1 =down, 2 =left, 3 =upif (pacmanD ==0) {// Right // Increment Counter and test resultados pacmanX =pacmanX + 3; if (pacmanX ==270) {myGLCD.fillRect (pacmanX-3, pacmanY + 3, pacmanX, pacmanY + 36); // Limpar gráfico de trilha antes de mudar de direção pacmanD =1; // Alterar a direção para baixo}} else if (pacmanD ==1) {// Down // Incrementar o contador e os resultados do teste pacmanY =pacmanY + 3; if (pacmanY ==185) {myGLCD.fillRect (pacmanX + 3, pacmanY-3, pacmanX + 36, pacmanY); // Limpa o gráfico de fuga antes de mudar a posição pacmanD =2; // Alterar a direção para baixo}} else if (pacmanD ==2) {// Left // Incrementar o contador e os resultados do teste pacmanX =pacmanX - 3; if (pacmanX ==12) {myGLCD.fillRect (pacmanX + 28, pacmanY, pacmanX + 31, pacmanY + 28); // Limpe o gráfico final antes de imprimir new positi pacmanD =3; // Alterar a direção para baixo}} else if (pacmanD ==3) {// Up // Incrementar o contador e os resultados do teste pacmanY =pacmanY - 3; if (pacmanY ==14) {myGLCD.fillRect (pacmanX, pacmanY + 29, pacmanX + 28, pacmanY + 28); // Limpa o gráfico final antes de imprimir a nova posição pacmanD =0; // Muda a direção para baixo}} drawAlien (AlienX, AlienY, AlienD, p); // Incrementa a posição e desenha a imagem // Direção do estrangeiro //// direção d ==0 =direita, 1 =para baixo, 2 =esquerda, 3 =para cima (AlienD ==0) {// Direita // Contador de incremento e teste resultados AlienX =AlienX + 3; if (AlienX ==270) {myGLCD.fillRect (AlienX-3, AlienY + 3, AlienX, AlienY + 36); // Limpa o gráfico de fuga antes de mudar de direção AlienD =1; // Muda a direção para baixo}} else if (AlienD ==1) {// Down // Incrementa o contador e os resultados do teste AlienY =AlienY + 3; if (AlienY ==185) {AlienD =2; // Muda a direção para baixo}} else if (AlienD ==2) {// Left // Incrementa o contador e os resultados do teste AlienX =AlienX - 3; if (AlienX ==12) {myGLCD.fillRect (AlienX + 41, AlienY + 3, AlienX + 40, AlienY + 36); // Limpa o rastro do gráfico antes de imprimir a nova posição AlienD =3; // Muda a direção para baixo}} else if (AlienD ==3) {// Up // Incrementa o contador e os resultados do teste AlienY =AlienY - 3; if (AlienY ==14) {AlienD =0; // Muda a direção para baixo}} drawMario (MarioX, MarioY, MarioD, p); // Incrementa a posição e desenha a imagem // Direção do Mario //// direção d ==0 =direita, 1 =para baixo, 2 =esquerda, 3 =para cimaif (MarioD ==0) {// Direita // Incrementa o contador e teste resultados MarioX =MarioX + 3; if (MarioX ==270) {myGLCD.fillRect (MarioX-3, MarioY + 3, MarioX, MarioY + 36); // Limpar gráfico de trilha antes de mudar de direção MarioD =1; // Muda a direção para baixo}} else if (MarioD ==1) {// Down // Incrementa o contador e os resultados do teste MarioY =MarioY + 3; if (MarioY ==185) {myGLCD.fillRect (MarioX + 3, MarioY-3, MarioX + 36, MarioY); // Limpa o gráfico final antes de imprimir a nova posição MarioD =2; // Muda a direção para baixo}} else if (MarioD ==2) {// Left // Incrementa o contador e os resultados do teste MarioX =MarioX - 3; if (MarioX ==12) {MarioD =3; // Muda a direção para baixo}} else if (MarioD ==3) {// Up // Incrementa o contador e os resultados do teste MarioY =MarioY - 3; if (MarioY ==14) {myGLCD.fillRect (MarioX, MarioY + 30, MarioX + 28, MarioY + 28); // Limpa o gráfico final antes de imprimir a nova posição MarioD =0; // Alterar direção para baixo}} delay (dly); } // *********************************************** *************************************************** *********** // =====Atualizar relógio digital // *************************** *************************************************** ******************************** void UpdateDisp () {// Limpa a área de tempo myGLCD.setColor (0, 0, 0); myGLCD.setBackColor (0, 0, 0); // myGLCD.fillRect (60, 80, 262, 166); int h; // Valor da hora no formato de 24 horas int e; // Valor dos minutos no formato dos minutos int pm =0; // Sinalizar para determinar se PM ou AM // Existem quatro dígitos que precisam ser desenhados independentemente para garantir um posicionamento consistente de tempo int d1; // Dígito de dezenas de horas int d2; // Um ​​dígito da hora int d3; // Dígito de dez minutos int d4; // Um ​​dígito dos minutos h =hora (); // Valor do relógio RT de 24 horas e =minuto (); / * TESTh =12; e =8; * /// Calcular os valores dos dígitos das horas para timeif ((h> =10) &&(h <=12)) {/ / AM horas 10,11,12 d1 =1; // calcula o dígito das dezenas de horas d2 =h - 10; // calcula o dígito da hora de Ones 0,1,2} else if ((h> =22) &&(h <=24)) {// PM horas 10,11,12 d1 =1; // calcula o dígito das dezenas de horas d2 =h - 22; // calcula o dígito da hora de Ones 0,1,2} else if ((h <=9) &&(h> =1)) {// horas da manhã abaixo de dez d1 =0; // calcula o dígito das dezenas de horas d2 =h; // calcula o dígito da hora de Ones 0,1,2} else if ((h> =13) &&(h <=21)) {// horas PM abaixo de 10 d1 =0; // calcula o dígito das dezenas de horas 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); }}} 

Peças personalizadas e gabinetes

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

Esquemas


Processo de manufatura

  1. Sequenciador de LED
  2. Relógio de cuco
  3. Relógio de visão pov do Arduino
  4. Gerador de Relógio Verilog
  5. Simple Word Clock (Arduino)
  6. Console de jogo portátil TeleBall Retro
  7. Relógio mestre
  8. Ingegno Retro Games Console
  9. Word Clock italiano
  10. Relógio espelho infinito