산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

복고풍 아케이드 시계

구성품 및 소모품

Arduino Mega 2560
× 1

필요한 도구 및 기계

3D 프린터(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

소개:레트로 아케이드 시계 - Arduino

터치스크린이 있는 양방향 아케이드 침대 옆 시계를 만들고 원하는 알람 소리를 녹음할 수 있는 애니메이션 아케이드 피규어를 만드세요.

이 프로젝트에는 3D 인쇄 케이스와 선택할 수 있는 4개의 개별 프로그램이 포함되어 있습니다.

1. 아케이드 시계 - DK 마리오, 스페이스 인베이더 및 팩맨 애니메이션

2. Pacman Clock - 시계 기능이 있는 인터랙티브 애니메이션 팩맨 게임

3. DK Clock - 시계 기능이 있는 대화형 애니메이션 DK 게임

4. Tumble Ghost - Flappy Bird를 기반으로 한 애니메이션 팩맨 유령 게임

80년대 아케이드 게임 캐릭터의 향수를 불러일으키는 것을 좋아하는 누구에게나 만들 수 있는 많은 재미와 훌륭한 선물입니다.

1단계:자료 수집

<울>
  • Arduino 보드 - Arduino Mega 2560(항목 1, 2, 3은 하나의 번들 주문으로 구입할 수 있음)
  • <울>
  • 터치스크린 Arduino 실드 - 3.2" 메가 터치 LCD 확장 보드 실드
  • <울>
  • 터치스크린 - 3.2" TFT LCD 디스플레이 + Arduino Mega 2560용 터치스크린
  • <울>
  • 실시간 클록 모듈 - DS3231 RTC
  • <울>
  • 음성 녹음기 모듈 - ISD1820 음성 녹음기
  • <울>
  • 3D 프린터용 PLA 필라멘트
  • <울>
  • 케이스 접착용 2액형 에폭시 수지
  • <울>
  • USB 케이블 2m 길이 USB 충전기(시계용 전원으로 사용)
  • <울>
  • 뜨거운 글루건
  • <울>
  • 케이블 타이 X 3
  • 침대 옆 시계가 다음과 같은 경우에만 필요한 자동 백라이트 디밍 구성 요소(선택 사항):

    <울>
  • 저항 270k 옴
  • <울>
  • 제너 다이오드 3.3v
  • <울>
  • 0.5와트 저항 47옴
  • <울>
  • 광 종속 저항(LDR)
  • 2단계:3D 케이스 인쇄

    Creality Ender 3에서 시계 케이스를 인쇄했습니다. 케이스에 대한 모든 3D 인쇄 파일과 지침은 여기 Thingiverse에서 찾을 수 있습니다.

    3단계:회로 구축

    전체 회로에는 실시간 클럭, Arduino Mega, 사운드 모듈, 터치스크린 및 스크린 쉴드가 포함됩니다.

    1. 실시간 시계

    그림과 같이 아두이노 메가 뒷면에 실시간 시계를 장착합니다. 핫 글루건과 패킹 폼을 사용하여 만지지 않고 움직임을 흡수할 수 있는 쿠션이 있는지 확인했습니다. 제 경우에는 2개의 RTC 다리를 Arduino에 직접 납땜하고 연결선을 사용하여 5v와 GND를 Arduino에 연결했습니다.

    2. 녹음 모듈

    이것들은 정말 시원하고 사용하기 쉽습니다. 위와 비슷한 방식으로 폼과 핫 글루를 사용하여 모듈과 스피커를 Arduino 뒷면에 배치하고 만지지 않도록 주의합니다. 사운드 모듈은 Arduino의 D8에 의해 트리거되므로 제공된 회로도에 따라 이 모듈과 전원 공급 장치를 연결해야 합니다.

    3. 자동 백라이트 조광기(선택 사항)

    침대 옆 시계로 사용하려는 경우 야간에 백라이트를 자동으로 어둡게 하여 수면에 영향을 미치지 않도록 하는 것이 좋습니다. (그렇지 않다면 이 단계를 건너뛸 수 있습니다!) 불행히도 TFT 화면의 백라이트는 +3.3v에 고정 배선되어 있으며 Arduino로 조정할 수 없습니다. 즉, 백라이트 밝기를 제어하려면 연결을 끊고 Arduino의 PWM 핀에 다시 연결해야 합니다. 구성 요소의 핀이나 트랙에 대한 손상을 최소화하면서 이 작업을 수행하고 싶었으므로 다음 접근 방식을 취했습니다. 아래 단계를 주의 깊게 따르십시오.

    (a) 이를 달성하기 위해 LDR(Light Dependent Resistor)이 장치 후면에 위치하여 빛을 감지합니다. 케이스에 2개의 3mm 구멍을 뚫고 LDR 다리를 구멍을 통해 밀어 넣습니다. 캐비닛 내부에 뜨거운 접착제를 사용하여 다리를 제자리에 고정합니다. 케이스 내부에 두 개의 와이어를 납땜하고 회로도에 따라 연결합니다. 회로도에 따라 Arduino의 A7에 270k 옴 저항을 추가합니다.

    (b) TFT Display를 제거하고 단단한 표면에 놓습니다. 핀 19(LED_A)를 식별하고 핀 바닥에서 몇 밀리미터의 플라스틱을 조심스럽게 제거합니다. 위의 그림과 같이 핀을 평평하게 구부려 커넥터에서 멀리 떨어뜨립니다. TFT Sheild가 제대로 꽂힐 수 있고 구부러진 핀이 플러그나 소켓을 막지 않는지 확인하십시오.

    (c) 47 Ohm 레지스터를 핀 위로 구부러진 부분에 납땜하고 저항기의 와이어를 Arduino Mega의 D9에 연결합니다. Arduino D9 핀은 최대 40mA까지 싱크할 수 있으므로 저항은 이를 이보다 작게 제한합니다. 3.3v 제너 다이오드를 동일한 핀(LED_A)에 연결하고 다이어그램에 따라 이것을 접지에 연결합니다. 이것의 목적은 전압을 3.3v로 조절하므로 백라이트를 과전압으로부터 보호하는 것입니다.

    4. TFT 스크린 및 Arduino 쉴드

    3.2' TFT 터치스크린 커넥터를 TFT Arduino Shield에 조심스럽게 밀어 넣습니다. 그런 다음 제공된 그림에 따라 Arduino의 상단에 조심스럽게 연결하십시오. RTC에는 배터리가 있으므로 전원이 제거되어도 정확한 시간이 유지됩니다. 알람 시간은 Arduino의 Eeprom에 저장됩니다. 즉, 정전이 되어도 그대로 유지됩니다.

    4단계:코드 로드

    프로젝트를 컴파일하고 실행하기 전에 다음 파일과 라이브러리를 로드해야 합니다. 코드는 고유하며 내가 빌린 라이브러리, 하드웨어, 일부 사용자 지정 그래픽 및 기타 프로젝트의 기능을 중심으로 구축되었습니다.

    참고:이 프로젝트의 코드 개발은 IDE v1.06을 사용했으며 일부 필수 라이브러리는 날짜가 지정되었습니다. 이는 일부 사람들이 코드를 로드할 때 새로운 IDE 버전 1.6 이상에 문제가 있음을 의미합니다. 따라서 단순성을 위해 IDE v1.06을 사용하고 튜토리얼 4단계 하단의 zip 파일에 올바른 버전 라이브러리 파일을 포함할 것을 권장합니다.

    1. 아두이노 IDE

    저는 이전 버전의 Arduino IDE를 사용하고 있으므로 단순성을 위해 코드를 설치하기 전에 데스크탑 컴퓨터에 Arduino IDE 버전 1.06을 다운로드하는 것이 좋습니다. 여기에서 그의 버전을 얻을 수 있습니다.

    2. 라이브러리

    컴퓨터 코드를 작성하고 물리적 보드에 업로드하는 데 사용되는 컴퓨터에서 실행되는 IDE(통합 개발 환경)에 다운로드하여 추가해야 합니다.

    <울>
  • UTFT.h 및 URtouch.h는 아래 zip 파일에 있습니다.
  • <울>
  • 아래 zip 파일에 있는 Time.h
  • <울>
  • DS1307RTC.h는 아래 zip 파일에 있습니다.
  • <울>
  • Wire.h 및 EEPROM.h는 이미 IDE V1.06에 포함되어 있습니다.
  • UTFT.h 및 URtouch.h에 대한 크레딧은 Rinky-Dink Electronics로 이동합니다. 소스 웹사이트가 다운된 것처럼 보이므로 이 zip 파일을 포함했습니다.

    4. TFT 화면 변형

    TFT 화면과 제조업체의 모호함이 이러한 메모로 이어졌습니다.

    (a) Sainsmart - TFT 장치 뒷면에 Sainsmart라는 상표가 붙은 3.2' TFT 화면을 구입했다면 디스플레이 문제를 해결하기 위해 라이브러리를 수정해야 한다는 것을 알게 될 것입니다. Sainsmart TFT 디스플레이를 이미 구입한 경우 아래에 수정 사항이 있습니다.

    "initlcd.h" 파일을 편집하고

    에서 다음 줄을 수정합니다.

    LCD_Write_COM_DATA(0x01, 0x2B3F);

    LCD_Write_COM_DATA(0x01, 0x3B3F);

    IDE를 다시 시작한 다음 Arduino에 코드를 다시 로드해야 합니다.

    (b.) TFT 컨트롤러 칩셋 - 3.2" TFT 화면을 구입한 사람들은 "SSD1289" 또는 "ILI9341" 두 가지 칩셋 중 하나를 가질 수도 있다는 것을 알 수 있습니다. 짜증나는 점은 온라인에서 차이점을 구별하기가 쉽지 않다는 것입니다. 좋은 소식은 코드를 로드한 후 빈 화면이 나타나면 아마도 ILI9341 컨트롤러 때문일 것입니다.

    수정하려면 코드를 다음과 같이 변경해야 합니다. 코드를 수정하고 다음 코드 줄을 수정하십시오.

    에서

    UTFT myGLCD(SSD1289, 38, 39, 40, 41); // 매개변수는 디스플레이/쉴드 모델에 맞게 조정되어야 합니다.

    UTFT myGLCD(ILI9341_16, 38, 39, 40, 41); // 매개변수는 디스플레이/쉴드 모델에 맞게 조정되어야 합니다.

    이제 Arduino에 코드를 다시 로드해 보십시오.

    (c.) 반전된 터치 스크린 컨트롤

    일부 제조사에서는 Y축 터치스크린 버튼이 뒤집혔다고 보고했습니다. 이에 대한 수정 사항은 두 줄의 코드가 터치 스크린 읽기를 뒤집기 위해 변경되는 위치에서 확인되었습니다.

    찾기:"yT =myTouch.getY();" "yT =240 - myTouch.getY();"

    로 변경합니다.

    두 번 검색하는 것을 잊지 마십시오. 첫 번째 인스턴스는 시계 모드에서 팩맨을 제어하기 위한 것이고 두 번째 인스턴스는 설정 메뉴에서입니다.

    5. 그래픽 파일

    Arduino에 로드하기 시작할 때 Arduino 코드와 동일한 하위 디렉토리에 있어야 하는 비트맵 파일 그룹이 아래에 포함되어 있습니다. 따라서 아래 파일을 다운로드하고 IDE를 사용하여 로드하십시오.

    6. 시계 설정

    코드가 성공적으로 로드되면 화면 중앙을 누르면 설정 화면이 나타납니다. 메뉴를 사용하여 시간과 알람을 24시간 형식으로 설정합니다. SAVE 버튼을 눌러 설정을 저장합니다. RTC에는 배터리가 있으므로 전원이 제거되어도 정확한 시간이 유지됩니다. 알람 시간은 EEPROM에 저장되어 정전이 발생하더라도 유지됩니다.

    7. 알람 테스트

    Sound 모듈은 알람을 제공하는 데 사용됩니다. ISD1820은 Arduino D8 핀으로 제어됩니다. ISD1820의 녹음 버튼을 동시에 누르면서 마이크에 사운드를 재생하여 사운드를 쉽게 추가할 수 있습니다. 제 경우에는 다른 기기를 통해 재생되는 오디오 파일에서 팩맨 소개 음악을 녹음했습니다. 소리가 녹음되면 스피커를 통해 소리를 재생해야 하는 PLAY-E 버튼을 눌러 녹음을 테스트할 수 있습니다. 설정 메뉴를 사용하여 시계 시간과 알람 시간을 몇 분 간격으로 설정합니다. 알람을 "설정"하고 "저장" 메뉴 버튼을 눌러야 합니다. 기본 화면으로 돌아가면 시간이 되면 알람이 울려야 합니다. 알람을 끄려면 터치스크린 패널의 중앙을 눌러 설정 화면을 표시할 수 있습니다.

    8. 터치스크린 보정

    일부 제조업체는 설정 화면의 버튼이 TFT 터치 컨트롤과 정렬되지 않는 것을 발견했습니다. 이러한 경우 터치스크린을 보정해야 합니다. 이것은 URtouch 라이브러리에 제공된 터치스크린 보정 코드와 지침을 사용하여 쉽게 수행할 수 있습니다. 이 문제가 관찰되면 다음 지침을 따르십시오.

    9. 선택할 수 있는 4가지 프로그램

    1. 아케이드 시계 - DK Mario, Space Invaders &Pacman animation2. Pacman Clock - 시계 기능이 있는 대화형 애니메이션 Pacman/Ms Pacman 게임

    3. DK 시계 - 시계 기능이 있는 대화형 애니메이션 DK 게임

    4. Tumble Ghost - 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

    5단계:종합하기

    1. 외부 전원 추가

    마지막 단계는 외부 전원을 추가하는 것입니다. 드릴 비트를 사용하여 캐비닛 뒷면에 구멍을 추가합니다. USB 케이블을 후면 패널에 끼운 다음 회로도에 따라 USB 케이블 VCC, GND, D+ 및 D- 와이어를 Arduino USB 커넥터 베이스에 연결합니다. 이것은 두 가지 장점이 있습니다. 첫째, Arduino 메가 보드에 대한 USB 입력에는 과전류 보호 기능이 있고, 둘째, USB 케이블을 사용하여 상자를 분해하지 않고도 코드 변경 사항을 업로드할 수 있습니다. 전면 및 후면 패널을 조립할 때 케이블 장력으로부터 보호하기 위해 전원 케이블 절연체를 Arduino 후면에 핫 글루로 붙입니다. Arduino 연결에서 6-8cm 떨어진 전원 케이블의 케이스 내부에 있는 케이블 주위에 케이블 타이를 단단히 묶어 케이블에 코드 그립을 추가합니다. 케이블 타이는 USB 케이블을 케이스 내부에 맞대어 잡아당길 때 조인트에 장력이 가해지지 않도록 해야 합니다.

    2. 케이스에 전자 제품 장착

    컷아웃의 중앙에 화면을 정렬해야 하는 4개의 구멍 가이드가 있는 전면 패널 상단에 회로를 배치합니다. 전면 패널 화면을 볼 수 있도록 회로의 전원을 켜고 화면 이미지가 올바른 위치에 있는지 확인한 다음 핫 글루로 제자리에 붙입니다. 결과는 컷아웃 구멍의 중앙에 있는 정사각형 스크린으로 꼭 맞는 것입니다.

    3. 최종 회의

    전면 패널을 후면 패널로 부드럽게 밀고 USB 전원 코드를 부드럽게 당겨 후면 패널의 느슨함을 채웁니다. 코드 그립은 여기에서 유용하며 배선 손상을 방지해야 합니다. USB 충전기에 연결하기만 하면 됩니다.

    즐기시기 바랍니다!

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 레트로 아케이드 시계
  • 레트로 아케이드 시계C/C++
    Arduino IDE
    /* 레트로 아케이드 시계 - TechKiwigadgets V1 - 첫 번째 프로덕션 릴리스*/ #include  #include #include #include  #include  #include  // time_t로 시간을 반환하는 기본 DS1307 라이브러리 // 알람 변수boolean alarmstatus =false; // false가 off이고 true가 onboolean인 플래그 soundalarm =false; // 알람을 시작해야 함을 나타내는 플래그입니다.int alarmhour =0; // 알람 설정 시간int alarmminute =0; // 알람 설정 분bytebyte; // hourbyte의 바이트 변수 amin; //minintactr의 바이트 변수 =300; // 알람이 울릴 때 화면이 터치될 때까지 사운드 카드를 재설정하는 데 사용되는 카운터입니다.int act =0;int p =0; // 애니메이션 위치 E.G Pacman 그래픽 플래그 0 =닫힘, 1 =중간 열림, 2 =넓게 열림, 3 =중간 열림int m =0; // 애니메이션 위치 mario 3 positions// 그래픽 X,Y 좌표// myGLCD.drawBitmap (30, 14, 40, 40, rd_ghost); // 닫힘 Ghostint ghostX =15;int ghostY =14;int ghostD =0; // 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =위쪽 // myGLCD.drawBitmap(140, 14, 40, 40, MarioR3); // 닫힘 Ghostint MarioX =141;int MarioY =14;int MarioD =0; // 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =위쪽 // myGLCD.drawBitmap(240, 14, 40, 40, Monkey2); // 닫힌 Ghostint MonkeyX =261;int MonkeyY =14;int MonkeyD =0; // 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =위쪽 // myGLCD.drawBitmap(30, 180, 40, 40, pacman); // 닫힘 Ghostint pacmanX =15;int pacmanY =185;int pacmanD =2; // 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =위쪽// myGLCD.drawBitmap (140, 180, 40, 40, Alien); // 닫힘 Ghostint AlienX =141;int AlienY =185;int AlienD =2; // 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =위쪽// myGLCD.drawBitmap (240, 180, 40, 40, Cannon); // 닫힌 고스트 int CannonX =270;int CannonY =185;int CannonD =2; // 방향 d ==0 =오른쪽, 1 =아래로, 2 =왼쪽, 3 =위로 // RTC 시간 값을 초기화합니다. const int DS1307 =0x68; // DS1307의 주소는 데이터 시트 참조// 디스플레이 조광기 Variablesint dimscreen =255; // 이 변수는 255가 최대 밝기인 화면 밝기를 구동하는 데 사용됩니다.int LDR =100; // Analog 7에서 직접 측정한 LDR 변수//====객체 생성UTFT myGLCD(SSD1289,38,39,40,41); //매개변수는 디스플레이/실드 모델에 맞게 조정되어야 합니다.URTouch myTouch( 6, 5, 4, 3, 2);//====Fontsextern 정의 uint8_t SmallFont[];extern uint8_t BigFont[];extern uint8_t SevenSegNumFont[]; extern uint8_t SevenSeg_XXXL_Num[];// bitmapsextern 정의 unsigned int Alien1[0x640]; // Alien 1 graphicextern unsigned int Alien2[0x640]; // Alien 2 graphicextern unsigned int Cannon[0x640]; // 스페이스 인베이더 cannonextern unsigned int MarioL1[0x310]; // M 왼쪽 1extern unsigned int MarioL2[0x310]; // 고스트 비트맵 직선 앞extern unsigned int MarioL3[0x310]; // 고스트 비트맵 직선 전방extern unsigned int MarioR1[0x310]; // 고스트 비트맵 직선 전방extern unsigned int MarioR2[0x310]; // 고스트 비트맵 직선 전진extern unsigned int MarioR3[0x310]; // 고스트 비트맵 직선 전방extern unsigned int MarioStop[0x310]; // 고스트 비트맵 직선 전방extern unsigned int MarioU1[0x310]; // 고스트 비트맵 직선 전방extern unsigned int MarioU2[0x310]; // 고스트 비트맵 직선 전방extern unsigned int MarioU3[0x310]; // 고스트 비트맵 직선 전방extern unsigned int MarioU4[0x310]; // 고스트 비트맵 직선형 extern unsigned int rd_ghost[784]; // 고스트 비트맵 직선형 extern unsigned int ru_ghost[784]; // 고스트 비트맵 직선형 extern unsigned int rl_ghost[784]; // 고스트 비트맵 직선형 extern unsigned int rr_ghost[784]; // 고스트 비트맵 직선형 extern unsigned int r_o_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int r_m_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int l_o_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int l_m_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int u_m_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int u_o_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int d_m_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int d_o_pacman[784]; // 고스트 비트맵 직선형 extern unsigned int c_pacman[784]; // 고스트 비트맵 직선 전방extern unsigned int Monkey2[0x640]; // 고스트 비트맵 직선형 extern unsigned int Monkey3[0x640]; // 고스트 비트맵 직선// 터치 스크린 좌표boolean screenPressed =false;int xT,yT;int userT =4; // 화면에서 방향 터치를 나타내는 플래그 부울 setupscreen =false; // 설정 화면에 액세스하는 데 사용 // 알람 설정 변수boolean xsetup =false; // 기존 설정 모드인지 판별하기 위한 플래그 // 움직임을 느리게 하기 위한 애니메이션 지연 downint dly =0; // 원래 30// 시간 새로 고침 카운터 int rfcvalue =300; // 변경 사항을 확인할 때까지 이 긴 시간을 기다립니다.int rfc =1;// 변경된 숫자만 새로 고칠 수 있도록 이전 시간에 대한 전역 변수를 선언합니다. // 일관된 시간 위치 지정을 보장하기 위해 독립적으로 그려야 하는 4개의 숫자가 있습니다. 정수 c1 =20; // 10시간 숫자 int c2 =20; // 1 시간 숫자 int c3 =20; // 십분 숫자 int c4 =20; // 1분 digitvoid setup() {//RTC 초기화 Serial.begin(9600); // 동안 (! 직렬); // Arduino 직렬 모니터가 열릴 때까지 대기합니다. delay(200); setSyncProvider(RTC.get); // RTC에서 시간을 가져오는 함수 setSyncInterval(60); // 60초(1분)마다 시간 동기화 if(timeStatus()!=timeSet){ Serial.println("Unable to sync with the RTC"); RTC.set(1408278800); // RTC를 2014년 8월 25일 오전 9시로 설정 setTime(1408278800); } else{ Serial.println("RTC가 시스템 시간을 설정했습니다."); }// ISD1820 보드에서 소리를 재생하기 위한 알람 활성화 핀 설정 pinMode(8, OUTPUT); // 사운드를 토글하는 데 사용되는 D8 digitalWrite(8,LOW); // 소리를 끄려면 low로 설정 // 표시 시작 myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_LOW); 그리기 화면(); // 게임 시작 UpdateDisp(); // 시계로 값 업데이트 }void loop() {// Pacman 그래픽 플래그 증가 0 =닫힘, 1 =중간 열림, 2 =넓게 열림p=p+1; if(p==4){ p=0; // 카운터를 닫힘으로 재설정}// Pacman 그래픽 플래그 증분 0 =닫힘, 1 =중간 열림, 2 =와이드 열림m=m+1; if(m==3){ m=0; // Reset counter to closed}// Set Screen Brightness// 주변 조명을 확인하고 LED 밝기를 조정하여 Ambient 약 500 dark is under 100LDR =analogRead(A7);/* LDR의 테스트 값 범위 myGLCD.setColor(237, 28, 36); myGLCD.setBackColor(0, 0, 0); myGLCD.printNumI(LDR,250,60);*/if (LDR>=121){ dimscreen =255; } if (LDR <=120) { dimscreen =45; } analogWrite(9, 희미한 화면); // 밝기 조절 0은 어둡고, 주변 공간은 약 25, 70은 직사광선입니다. // RTC에서 현재 날짜와 시간을 읽고 boardrfc++를 재설정합니다. if (rfc>=rfcvalue) { // 사이클 및 인쇄 시간을 계산합니다. UpdateDisp(); // 값을 시계로 업데이트한 다음 ... dly =18; // 리셋 지연 rfc =0; }//===알람이 울릴 필요가 있는지 확인 if (alarmstatus ==true){ if ( (alarmhour ==hour()) &&(alarmminute ==minute())) { // 알람 soundalarm =true; } }//===알람 소리 시작 - 10초 동안 소리가 나면 20초 후에 다시 시작됩니다. markif ((alarmstatus ==true)&&(soundalarm==true)){ // 카운터를 설정하고 다시 시작하기 위한 조치를 취합니다. 화면이 터치되지 않은 경우 사운드 if (act ==0) { // D8을 토글하여 알람을 설정합니다. 녹음된 사운드는 LOW에서 HIGH로의 전환에 의해 트리거됩니다. digitalWrite(8,HIGH); // 높게 설정 digitalWrite(8,LOW); // 낮게 설정 UpdateDisp(); // 시계로 값 업데이트 } act =act +1; if (act ==actr) { // D8을 토글하여 알람을 설정합니다. 녹음된 사운드는 LOW에서 HIGH로의 전환에 의해 트리거됩니다. digitalWrite(8,HIGH); // 높게 설정 digitalWrite(8,LOW); // 낮은 행동을 설정 =0; // 20초마다 카운터 리셋 } }// 터치 스크린에 대한 사용자 입력 확인// UserT가 방향 0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =위쪽, 4 =터치 입력 없음 설정 myTouch.read(); if (myTouch.dataAvailable() &&!screenPressed) { xT =myTouch.getX(); yT =myTouch.getY(); // ********************************** // ******* 설정 모드 진입 ** ******* // ********************************** if (((xT>=120) &&(xT<=200) &&(yT>=105) &&(yT<=140)) &&(soundalarm !=true)) { // 알람이 울리지 않으면 설정 루틴 호출 xsetup =true; // 플래그 전환 clocksetup(); // 시계 설정 루틴 호출 UpdateDisp(); // 값을 시계로 업데이트 } else // 알람이 울리는 동안 화면 중앙을 터치하면 사운드를 끄고 알람이 설정되지 않도록 재설정 if (((xT>=120) &&(xT<=200) &&(yT> =105) &&(yT<=140)) &&((경보 상태 ==참) &&(사운드 경보 ==참))) { 경보 상태 =거짓; 사운드 알람 =거짓; 디지털 쓰기(8,LOW); // 낮게 설정 } screenPressed =true; } // 화면을 잡고 있는 것을 허용하지 않습니다. else if ( !myTouch.dataAvailable() &&screenPressed){ ​​screenPressed =false; }drawghost(고스트X, 고스트Y, 고스트D, p); // 위치 증가 및 이미지 그리기// 고스트 방향 //// 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =upif(ghostD ==0){ // 오른쪽 // 카운터 증가 및 테스트 결과 고스트X =고스트X + 3; if (고스트X ==270){ myGLCD.fillRect(고스트X-3, 고스트Y, 고스트X, 고스트Y+28); // 위치를 변경하기 전에 그래픽의 흔적을 지웁니다. ghostD =1; // 아래로 방향 변경 } } else if(ghostD ==1) { // 아래로 // 카운터 및 테스트 결과 증가 ghostY =ghostY + 3; if (고스트Y ==185){ myGLCD.fillRect(고스트X+3, 고스트Y-3, 고스트X+36, 고스트Y); // 위치를 변경하기 전에 그래픽의 흔적을 지웁니다. ghostD =2; // 아래로 방향 변경 } } else if(ghostD ==2) { // 왼쪽 // 카운터 및 테스트 결과를 증가시킵니다. ghostX =ghostX - 3; if (고스트X ==12){ myGLCD.fillRect(고스트X+28, 고스트Y, 고스트X+31, 고스트Y+28); // 새 위치를 인쇄하기 전에 그래픽 흔적을 지웁니다. ghostD =3; // 아래로 방향 변경 } } else if(ghostD ==3) { // Up // 카운터 및 테스트 결과 증가 ghostY =ghostY - 3; if (고스트Y ==14){ myGLCD.fillRect(고스트X, 고스트Y+29, 고스트X+28, 고스트Y+28); // 새 위치를 인쇄하기 전에 그래픽 흔적을 지웁니다. ghostD =0; // 아래로 방향 변경 }}drawMonkey(MonkeyX, MonkeyY, MonkeyD, p); // 위치 증가 및 이미지 그리기// 원숭이 방향 //// 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =upif(MonkeyD ==0){ // 오른쪽 // 카운터 증가 및 테스트 결과 MonkeyX =MonkeyX + 3; if (MonkeyX ==270){ myGLCD.fillRect(MonkeyX-3, MonkeyY, MonkeyX, MonkeyY+40); // 방향을 바꾸기 전에 그래픽의 흔적을 지웁니다. MonkeyD =1; // 아래로 방향 변경 } } else if(MonkeyD ==1) { // 아래로 // 카운터 증가 및 테스트 결과 MonkeyY =MonkeyY + 3; if (MonkeyY ==185){ myGLCD.fillRect(MonkeyX+3, MonkeyY-3, MonkeyX+38, MonkeyY); // 새 위치를 인쇄하기 전에 그래픽 흔적 지우기 MonkeyD =2; // 아래로 방향 변경 } } else if(MonkeyD ==2) { // 왼쪽 // 카운터 증가 및 테스트 결과 MonkeyX =MonkeyX - 3; if (MonkeyX ==12){ myGLCD.fillRect(MonkeyX+41, MonkeyY+1, MonkeyX+40, MonkeyY+38); // 새 positi MonkeyD =3을 인쇄하기 전에 그래픽의 흔적을 지웁니다. // 아래로 방향 변경 } } else if(MonkeyD ==3) { // 위로 // 카운터 증가 및 테스트 결과 MonkeyY =MonkeyY - 3; if (MonkeyY ==14){ myGLCD.fillRect(MonkeyX, MonkeyY+38, MonkeyX+40, MonkeyY+43); // 새 위치를 인쇄하기 전에 그래픽 흔적 지우기 MonkeyD =0; // 아래로 방향 변경 }}drawCannon(CannonX, CannonY, CannonD, p); // 위치 증가 및 이미지 그리기// 대포 방향 //// 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =upif(CannonD ==0){ // 오른쪽 // 증가 카운터 및 테스트 결과 CannonX =CannonX + 3; if (CannonX ==270){ myGLCD.fillRect(CannonX-3, CannonY+3, CannonX, CannonY+36); // 방향을 바꾸기 전에 그래픽에서 흔적을 지웁니다. CannonD =1; // 아래로 방향 변경 } } else if(CannonD ==1) { // Down // 카운터 및 테스트 결과 증가 CannonY =CannonY + 3; if (CannonY ==185){ CannonD =2; // 아래로 방향 변경 } } else if(CannonD ==2) { // 왼쪽 // 카운터 및 테스트 결과 증가 CannonX =CannonX - 3; if (CannonX ==12){ myGLCD.fillRect(CannonX+41, CannonY+3, CannonX+40, CannonY+36); // 새 위치를 인쇄하기 전에 그래픽의 흔적을 지웁니다. CannonD =3; // 아래로 방향 변경 } } else if(CannonD ==3) { // Up // 카운터 및 테스트 결과 증가 CannonY =CannonY - 3; if (CannonY ==14){ CannonD =0; // 아래로 방향 변경 }}drawpacman(pacmanX, pacmanY, pacmanD, p); // 위치 증가 및 이미지 그리기// pacman 방향 //// 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =upif(pacmanD ==0){ // 오른쪽 // 카운터 증가 및 테스트 결과 pacmanX =pacmanX + 3; if (pacmanX ==270){ myGLCD.fillRect(pacmanX-3, pacmanY+3, pacmanX, pacmanY+36); // 방향을 바꾸기 전에 그래픽에서 흔적을 지웁니다. pacmanD =1; // 아래로 방향 변경 } } else if(pacmanD ==1) { // 아래로 // 카운터 증가 및 테스트 결과 pacmanY =pacmanY + 3; if (pacmanY ==185){ myGLCD.fillRect(pacmanX+3, pacmanY-3, pacmanX+36, pacmanY); // 위치를 변경하기 전에 그래픽의 흔적 지우기 pacmanD =2; // 아래로 방향 변경 } } else if(pacmanD ==2) { // 왼쪽 // 카운터 및 테스트 결과 증가 pacmanX =pacmanX - 3; if (pacmanX ==12){ myGLCD.fillRect(pacmanX+28, pacmanY, pacmanX+31, pacmanY+28); // 인쇄하기 전에 그래픽 흔적 지우기 new positi pacmanD =3; // 아래로 방향 변경 } } else if(pacmanD ==3) { // 위로 // 카운터 및 테스트 결과 증가 pacmanY =pacmanY - 3; if (pacmanY ==14){ myGLCD.fillRect(pacmanX, pacmanY+29, pacmanX+28, pacmanY+28); // 새 위치를 인쇄하기 전에 그래픽 흔적 지우기 pacmanD =0; // 아래로 방향 변경 }}drawAlien(AlienX, AlienY, AlienD, p); // 위치 증가 및 이미지 그리기// Alien 방향 //// 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =upif(AlienD ==0){ // 오른쪽 // 카운터 증가 및 테스트 결과 AlienX =AlienX + 3; if (AlienX ==270){ myGLCD.fillRect(AlienX-3, AlienY+3, AlienX, AlienY+36); // 방향을 변경하기 전에 그래픽의 흔적을 지웁니다. AlienD =1; // 아래로 방향 변경 } } else if(AlienD ==1) { // 아래로 // 카운터 및 테스트 결과 증가 AlienY =AlienY + 3; if (AlienY ==185){ AlienD =2; // 아래로 방향 변경 } } else if(AlienD ==2) { // 왼쪽 // 카운터 및 테스트 결과 증가 AlienX =AlienX - 3; if (AlienX ==12){ myGLCD.fillRect(AlienX+41, AlienY+3, AlienX+40, AlienY+36); // 새 위치를 인쇄하기 전에 그래픽 흔적 지우기 AlienD =3; // 아래로 방향 변경 } } else if(AlienD ==3) { // 위로 // 카운터 및 테스트 결과 증가 AlienY =AlienY - 3; if (AlienY ==14){ AlienD =0; // 아래로 방향 변경 }}drawMario(MarioX, MarioY, MarioD, p); // 위치 증가 및 이미지 그리기// Mario 방향 //// 방향 d ==0 =오른쪽, 1 =아래쪽, 2 =왼쪽, 3 =upif(MarioD ==0){ // 오른쪽 // 카운터 증가 및 테스트 결과 MarioX =MarioX + 3; if (MarioX ==270){ myGLCD.fillRect(MarioX-3, MarioY+3, MarioX, MarioY+36); // 방향을 바꾸기 전에 그래픽에서 흔적을 지웁니다. MarioD =1; // 아래로 방향 변경 } } else if(MarioD ==1) { // 아래로 // 카운터 및 테스트 결과 증가 MarioY =MarioY + 3; if (MarioY ==185){ myGLCD.fillRect(MarioX+3, MarioY-3, MarioX+36, MarioY); // 새 위치를 인쇄하기 전에 그래픽 흔적 지우기 MarioD =2; // 아래로 방향 변경 } } else if(MarioD ==2) { // 왼쪽 // 카운터 및 테스트 결과 증가 MarioX =MarioX - 3; if (마리오X ==12){ 마리오D =3; // 아래로 방향 변경 } } else if(MarioD ==3) { // Up // 카운터 및 테스트 결과 증가 MarioY =MarioY - 3; if (MarioY ==14){ myGLCD.fillRect(MarioX, MarioY+30, MarioX+28, MarioY+28); // 새 위치를 인쇄하기 전에 그래픽 흔적 지우기 MarioD =0; // 아래로 방향 변경 }}delay(dly); }// *********************************************** ************************************************** ***********// =====디지털 시계 업데이트// *************************** ************************************************** ******************************* void UpdateDisp(){ // 시간 영역 지우기 myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0);// myGLCD.fillRect(60, 80, 262, 166); 정수 h; // 24시간 형식의 시간 값 int e; // 분 형식의 분 값 int pm =0; // PM 또는 AM인지 판별하는 플래그 // 시간의 일관된 위치 지정을 보장하기 위해 독립적으로 그려야 하는 4자리 숫자가 있습니다. int d1; // 십 시간 숫자 int d2; // 1시간 숫자 int d3; // 십분 숫자 int d4; // 1분 숫자 h =hour(); // 24시간 RT 시계 값 e =분();/* TESTh =12;e =8;*/// timeif ((h>=10) &&(h <=12)) { / / 오전 시간 10,11,12 d1 =1; // 십 시간 숫자 계산 d2 =h - 10; // 1의 시간 숫자 0,1,2 계산 } else if ( (h>=22) &&(h <=24)) { // PM 시간 10,11,12 d1 =1; // calculate Tens hour digit 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); } } }

    맞춤형 부품 및 인클로저

    싱기버스
    https://www.thingiverse.com/thing:3017701CAD file on thingiverse.com

    회로도


    제조공정

    1. LED 시퀀서
    2. 뻐꾸기 시계
    3. Arduino 관점 시계
    4. Verilog 클록 생성기
    5. 단순 워드 클럭(Arduino)
    6. TeleBall Retro 휴대용 ​​게임기
    7. 마스터 시계
    8. Ingegno 레트로 게임 콘솔
    9. 이탈리아어 단어 시계
    10. 무한 거울 시계