工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

レトロなアーケード時計

コンポーネントと消耗品

>
Arduino Mega 2560
× 1

必要なツールとマシン

>
3Dプリンター(汎用)

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

イントロ:レトロアーケード時計-Arduino

タッチスクリーンを備えたインタラクティブなアーケードベッドサイドクロックと、アラーム用に選択したサウンドを録音できるアニメーション化されたアーケードフィギュアを作成します。

このプロジェクトには、3D印刷されたケースと、選択可能な4つの個別のプログラムが含まれています

1.アーケード時計-DKマリオ、スペースインベーダー、パックマンアニメーション

2.パックマン時計-時計機能を備えたインタラクティブなアニメーションパックマンゲーム

3.DKクロック-時計機能を備えたインタラクティブなアニメーションDKゲーム

4.タンブルゴースト-ゆるい鳥をベースにしたパックマンのアニメーションゴーストゲーム

構築するのがとても楽しく、80年代のアーケードゲームのキャラクターの懐かしさを追体験するのが好きな人には素晴らしい贈り物です。

ステップ1:資料を収集する

<図>
  • Arduinoボード-ArduinoMega 2560(アイテム1、2、3は1つのバンドル注文として購入できます)
  • タッチスクリーンArduinoシールド-3.2 "メガタッチLCD拡張ボードシールド
  • タッチスクリーン-3.2 "TFTLCDディスプレイ+ Arduino Mega2560用タッチスクリーン
  • リアルタイムクロックモジュール-DS3231RTC
  • ボイスレコーダーモジュール-ISD1820ボイスレコーダー
  • 3Dプリンター用のPLAフィラメント
  • ケースを接着するための2液型エポキシ樹脂
  • USBケーブル長さ2mのUSB充電器(時計の電源に使用)
  • ホットグルーガン
  • ケーブルタイX3

オプションの自動バックライト調光コンポーネントは、ベッドサイドクロックの場合にのみ必要です:

  • 抵抗270kオーム
  • ツェナーダイオード3.3v
  • 0.5ワット抵抗47オーム
  • 光依存抵抗(LDR)

ステップ2:3Dケースを印刷する

Creality Ender 3で時計ケースを印刷しました。3D印刷ファイルとケースの説明はすべて、Thingiverseにあります。

ステップ3:回路を構築する

<図>

回路全体には、リアルタイムクロック、Arduino Mega、サウンドモジュール、タッチスクリーン、スクリーンシールドが含まれています。

1。リアルタイムクロック

<図>

提供された写真のように、ArduinoMegaの背面にリアルタイムクロックを取り付けます。ホットグルーガンとパッキングフォームを使用して、それらが接触していないことと、動きを吸収するためのクッションがあることを確認しました。私の場合、RTCレッグの2つをArduinoに直接はんだ付けし、フックアップワイヤーを使用して5vとGNDをArduinoに接続しました。

<図>

2。録音モジュール

これらは本当にクールで使いやすいです。上記と同様の方法で、フォームとホットグルーを使用して、モジュールとスピーカーをArduinoの背面に配置し、接触しないように注意して配置します。サウンドモジュールはArduinoのD8によってトリガーされるため、これと電源は、提供されている回路図に従って接続する必要があります。

3。自動バックライト調光器(オプション)

<図>

ベッドサイドクロックとして使用する場合は、睡眠に影響を与えないように、夜間にバックライトを自動的に暗くすることをお勧めします。 (そうでない場合は、この手順をスキップできます!)残念ながら、TFT画面のバックライトは+ 3.3vに配線されており、Arduinoで調整することはできません。これは、バックライトの明るさを制御するために、それを切断してArduinoのPWMピンに再接続する必要があることを意味します。コンポーネントのピンやトラックへの損傷を最小限に抑えてこれを実行したかったので、次のアプローチを採用しました。以下の手順に注意深く従ってください

(a)これを実現するために、光依存抵抗器(LDR)がユニットの背面に配置され、光を検出します。ケースに3mmの穴を2つ開け、LDRレッグを穴に押し込みます。キャビネットの内側にホットグルーを使用して、脚を所定の位置に保持します。ケースの内側に2本のワイヤーをはんだ付けし、回路図のように接続します。回路図に従って、ArduinoのA7に270kオームの抵抗を追加します。

<図>

(b)TFTディスプレイを取り外し、しっかりした面に置きます。ピン19(LED_A)を特定し、ピンの基部にあるプラスチックを数ミリメートル慎重に取り除きます。上の写真のように、ピンを平らに曲げてコネクタから離します。 TFTシールドがぴったりと差し込めること、および曲がったピンがプラグまたはソケットを妨げないことを確認します。

(c)47オームのレジスターをピンの曲がりくねった部分にはんだ付けし、抵抗器からArduinoMegaのD9にワイヤーを接続します。 Arduino D9ピンは最大40mAをシンクできるため、抵抗はこれをこれ未満に制限します。図のように、3.3vツェナーダイオードを同じピン(LED_A)に接続し、これをアースに接続します。これの目的は、バックライトが電圧を3.3vに調整するため、バックライトを過電圧から保護することです。

4。 TFTスクリーンとArduinoシールド

3.2フィートTFTタッチスクリーンコネクタをTFTArduinoシールドに慎重に押し込みます。次に、提供された写真のように、Arduinoの上部に慎重に接続します。 RTCにはバッテリーが搭載されているため、電源が切断されても正しい時刻が保持されます。目覚まし時計はArduinoのEepromに保存されているため、停電が発生しても目覚まし時計は保持されます。

ステップ4:コードをロードする

プロジェクトをコンパイルして実行する前に、次のファイルとライブラリをロードする必要があります。コードはユニークで、ライブラリ、ハードウェア、いくつかのカスタムグラフィックス、および私が借りた他のプロジェクトの機能を中心に構築されています。

注意:このプロジェクトのコードの開発にはIDE v1.06が使用されており、必要なライブラリの一部は古くなっています。これは、コードをロードするときに、新しいIDEバージョン1.6以降で問題が発生している人がいることを意味します。したがって、簡単にするために、IDE v1.06を使用し、チュートリアルのステップ4の下部にあるzipファイルに正しいバージョンのライブラリファイルを含めることをお勧めします。

1。 Arduino IDE

以前のバージョンのArduinoIDEを使用していたため、簡単にするために、コードをインストールする前に、デスクトップマシンにArduinoIDEバージョン1.06をダウンロードすることをお勧めします。ここから彼のバージョンを入手できます。

2。ライブラリ

これらをダウンロードして、コンピューター上で実行されるIDE(統合開発環境)に追加し、コンピューターコードを記述して物理ボードにアップロードするために使用する必要があります。

  • 以下のzipファイルにあるUTFT.hとURtouch.h
  • 以下のzipファイルにあるTime.h
  • DS1307RTC.hは以下のzipファイルにあります
  • Wire.hとEEPROM.hはすでにIDEV1.06に含まれています

UTFT.hとURtouch.hのクレジットはRinky-DinkElectronicsにあります。ソースWebサイトがダウンしているように見えるので、これらの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スクリーンを購入した人は、2つの異なるチップセット「SSD1289」または「ILI9341」のいずれかを持っている可能性があることに気付くかもしれません。修正は簡単です。コードをロードした後に空白の画面が表示される場合は、ILI9341コントローラーが原因である可能性があります。

修正するには、コードに次の変更を加える必要があります。コードを編集し、次のコード行を変更します

から

UTFT myGLCD(SSD1289、38、39、40、41); //パラメータはディスプレイ/ Schieldモデルに合わせて調整する必要があります

UTFT myGLCD(ILI9341_16、38、39、40、41); //パラメータはディスプレイ/ Schieldモデルに合わせて調整する必要があります

次に、コードをArduinoにリロードしてみてください。

(c。) 反転タッチスクリーンコントロール

一部のメーカーは、Y軸のタッチスクリーンボタンが逆になっていると報告しています。これに対する修正は、タッチスクリーンの読み取りを反転するために変更する2行のコードで特定されました。

「yT =myTouch.getY();」を検索します。次のように変更します: "yT =240 --myTouch.getY();"

2回検索することを忘れないでください。最初のインスタンスは、クロックモードでpacmanを制御するためのもので、2番目のインスタンスはセットアップメニューで使用するためのものです。

5。グラフィックファイル

Arduinoへのロードを開始するときにArduinoコードと同じサブディレクトリに配置する必要がある、以下に含めたビットマップファイルのグループがあります。したがって、以下のファイルをダウンロードし、IDEを使用してロードします。

6。時計を設定する

コードが正常に読み込まれたら、画面の中央を押すと、セットアップ画面が表示されます。メニューを使用して、時刻とアラームを24時間形式で設定します。 SAVEボタンを押して設定を保存します。 RTCにはバッテリーが搭載されているため、電源が切断されても正しい時刻が保持されます。アラーム時間はEEPROMに保存されます。つまり、パワーカットが発生した場合でもアラーム時間は保持されます。

7。アラームのテスト

サウンドモジュールは、アラームを提供するために使用されます。 ISD1820はArduinoD8ピンによって制御されます。 ISD1820の録音ボタンを同時に押しながらマイクに音を再生することで、簡単に音を追加できます。私の場合、別のデバイスで再生されたオーディオファイルからオリジナルのパックマン紹介音楽を録音しました。サウンドが録音されたら、スピーカーからサウンドを再生するPLAY-Eボタンを押すことで録音をテストできます。セットアップメニューを使用して、時計の時刻とアラームの時刻を数分間隔で設定します。必ずアラームを「設定」し、「保存」メニューボタンを押してください。メイン画面に戻ると、時間が発生したときにアラームが鳴るはずです。アラームをオフにするには、タッチスクリーンパネルの中央を押してセットアップ画面を表示します。

8。タッチスクリーンキャリブレーション

一部のメーカーは、セットアップ画面のボタンがTFTタッチコントロールと整列していないことを発見しました。このような場合、タッチスクリーンのキャリブレーションが必要です。これは、URtouchライブラリで提供されているタッチスクリーンキャリブレーションコードと手順を使用して簡単に実行できます。この問題が発生した場合は、次の手順に従ってください。

9。選択できる4つの異なるプログラム

1.アーケード時計-DKマリオ、スペースインベーダー&パックマンアニメーション2。パックマン時計-時計機能を備えたインタラクティブなアニメーションのパックマン/ミズパックマンゲーム

3.DKクロック-時計機能を備えたインタラクティブなアニメーションDKゲーム

4.タンブルゴースト-ゆるい鳥に基づくアニメーションパックマンゴーストゲーム

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-ワイヤをArduinoUSBコネクタのベースに接続します。これには2つの利点があります。1つはArduinoメガボードへのUSB入力が過電流保護を備えていること、もう1つはUSBケーブルを使用してボックスを分解せずにコード変更をアップロードできることです。電源ケーブルの絶縁体をArduinoの背面に熱​​接着して、前面パネルと背面パネルを組み立てるときにケーブルの張力から保護します。 Arduino接続から6〜8 cmの電源ケーブルのケースの内側にあるケーブルの周りにケーブルタイをしっかりと配置して、ケーブルにコードグリップを追加します。 USBケーブルをケースの内側に突き合わせて引っ張るときは、ケーブルタイでジョイントに張力がかからないようにする必要があります。

2。ケースへの電子機器の取り付け

画面を切り欠きの中央に揃える4つの穴ガイドを使用して、回路をフロントパネルの上部に配置します。フロントパネルの画面が見えるように回路の電源を入れ、画面の画像が正しい位置にあることを確認してから、ホットグルーで所定の位置に接着します。結果は、切り欠き穴の中央にある正方形のスクリーンにぴったりとフィットします。

3。最終組み立て

フロントパネルをバックパネルにそっと押し込み、USB電源コードをそっと引っ張ってバックパネルのたるみを取ります。コードグリップはここで役立ち、配線の損傷を防ぐ必要があります。 USB充電器に接続すれば、準備完了です。

楽しんでいただければ幸いです!

<図>

<図>

<図>

コード

  • レトロアーケード時計
レトロアーケード時計 C / C ++
Arduino IDE
 / *レトロアーケードクロック-TechKiwigadgetsV1-最初の製品リリース* /#include  #include  #include  #include  #include  #include  //時間をtime_tとして返す基本的なDS1307ライブラリ// Alarm Variablesboolean alarmstatus =false; // falseがオフで、trueがオンブールのsoundalarm =falseであるフラグ。 //アラームを開始する必要があることを示すフラグintalarmhour =0; //アラーム設定の時間intalarmminute =0; //アラーム設定の1時間あたりの分数; // hourbyteaminのバイト変数; // minuteintactrのバイト変数=300; //アラームが鳴ったとき、これは画面がタッチされるまでサウンドカードをリセットするために使用されるカウンターですint act =0; int p =0; //アニメーション位置E.GPacmanグラフィックフラグ0 =クローズ、1 =ミディアムオープン、2 =ワイドオープン、3 =ミディアムオープンintm =0; //アニメーション位置マリオ3位置//グラフィックスX、Y座標// myGLCD.drawBitmap(30、14、40、40、rd_ghost); //閉じたGhostintghostX =15; int ghostY =14; int ghostD =0; //方向d ==0 =右、1 =下、2 =左、3 =上//myGLCD.drawBitmap(140、14、40、40、MarioR3); //閉じたGhostintMarioX =141; int MarioY =14; int MarioD =0; //方向d ==0 =右、1 =下、2 =左、3 =上//myGLCD.drawBitmap(240、14、40、40、Monkey2); //閉じたGhostintMonkeyX =261; int MonkeyY =14; int MonkeyD =0; //方向d ==0 =右、1 =下、2 =左、3 =上//myGLCD.drawBitmap(30、180、40、40、pacman); //閉じたGhostintpacmanX =15; int pacmanY =185; int pacmanD =2; //方向d ==0 =右、1 =下、2 =左、3 =上//myGLCD.drawBitmap(140、180、40、40、Alien); //閉じたGhostintAlienX =141; int AlienY =185; int AlienD =2; //方向d ==0 =右、1 =下、2 =左、3 =上//myGLCD.drawBitmap(240、180、40、40、キャノン); //クローズドゴーストintCannonX =270; int CannonY =185; int CannonD =2; //方向d ==0 =右、1 =下、2 =左、3 =上// RTC時間値を初期化します:const int DS1307 =0x68; // DS1307のアドレスはデータシートを参照//ディマー変数を表示intdimscreen =255; //この変数は、画面の明るさを駆動するために使用されます。ここで、255は最大明るさです。intLDR=100; //アナログ7から直接測定されたLDR変数// ====オブジェクトの作成UTFTmyGLCD(SSD1289,38,39,40,41); //パラメータはディスプレイ/ Schieldモデルに合わせて調整する必要がありますURTouchmyTouch(6、5、4、3、2); // ====Fontsextern uint8_t SmallFont []; extern uint8_t BigFont []; extern uint8_t SevenSegNumFont [];の定義extern uint8_t SevenSeg_XXXL_Num []; //ビットマップを定義しますsexternunsigned int Alien1 [0x640]; //エイリアン1graphicextern unsigned int Alien2 [0x640]; //エイリアン2graphicextern unsigned int Cannon [0x640]; //スペースインベーダーcannonexternunsigned int MarioL1 [0x310]; // M左1externunsigned int MarioL2 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioL3 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioR1 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioR2 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioR3 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioStop [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioU1 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioU2 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioU3 [0x310]; // Ghost Bitmap Straight forwardextern unsigned int MarioU4 [0x310]; //ゴーストビットマップStraightaheadextern unsigned int rd_ghost [784]; // Ghost Bitmap Straight forwardextern unsigned int ru_ghost [784]; // Ghost Bitmap Straight forwardextern unsigned int rl_ghost [784]; //ゴーストビットマップStraightaheadextern unsigned int rr_ghost [784]; //ゴーストビットマップStraightaheadextern unsigned int r_o_pacman [784]; //ゴーストビットマップStraightaheadextern unsigned int r_m_pacman [784]; //ゴーストビットマップStraightaheadextern unsigned int l_o_pacman [784]; //ゴーストビットマップStraightaheadextern unsigned int l_m_pacman [784]; //ゴーストビットマップStraightaheadextern unsigned int u_m_pacman [784]; //ゴーストビットマップStraightaheadextern unsigned int u_o_pacman [784]; //ゴーストビットマップStraightaheadextern unsigned int d_m_pacman [784]; //ゴーストビットマップStraightaheadextern unsigned int d_o_pacman [784]; // Ghost Bitmap Straight forwardextern unsigned int c_pacman [784]; // Ghost Bitmap Straight forwardextern unsigned int Monkey2 [0x640]; // Ghost Bitmap Straight forwardextern unsigned int Monkey3 [0x640]; //ゴーストビットマップストレートアヘッド//タッチスクリーン座標booleanscreenPressed =false; int xT、yT; int userT =4; // screenbooleanセットアップ画面での方向性タッチを示すフラグ=false; //セットアップ画面へのアクセスに使用//アラームセットアップ変数booleanxsetup =false; //既存のセットアップモードかどうかを判断するためのフラグ//動きを遅くするためのアニメーション遅延downintdly =0; //元々30 // Time Refresh counter int rfcvalue =300; //この長いuntiulチェック時間をchangesintrfc =1で待機します; //変更された桁のみのrefeshを有効にするために、前回のグローバル変数を宣言します//時間の一貫した配置を確保するために独立して描画する必要がある4桁がありますint c1 =20; // 10時間桁intc2 =20; // 1時間桁intc3 =20; // 10分の整数intc4 =20; // 1分digitvoidsetup(){// RTC Serial.begin(9600);を初期化します。 // while(!Serial); // 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:00 amに設定しますsetTime(1408278800); } else {Serial.println( "RTCがシステム時刻を設定しました"); } // ISD1820ボードのサウンドを再生するためのアラームイネーブルピンの設定pinMode(8、OUTPUT); //サウンドを切り替えるために使用されるD8digitalWrite(8、LOW); //低に設定してサウンドをオフにします//表示を開始しますmyGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_LOW); drawscreen(); //ゲームを開始しますUpdateDisp(); //値をクロックに更新} void loop(){// Pacmanグラフィックフラグをインクリメント0 =クローズ、1 =ミディアムオープン、2 =ワイドオープンp =p + 1; if(p ==4){p =0; //カウンターを閉じた状態にリセットします} //パックマングラフィックフラグをインクリメントします0 =閉じた、1 =中程度の開いた、2 =広い開いた状態=m + 1; if(m ==3){m =0; //カウンターを閉じた状態にリセットします} //画面の明るさを設定します//周囲光を確認し、周囲光に合わせてLEDの明るさを調整します28、36); myGLCD.setBackColor(0、0、0); myGLCD.printNumI(LDR、250,60); * / if(LDR> =121){dimscreen =255; } if(LDR <=120){dimscreen =45; } analogWrite(9、dimscreen); //明るさを制御します0は暗く、周囲の部屋は約25で、70は直射日光です// RTCから現在の日付と時刻を読み取り、boardrfc ++をリセットします。 if(rfc> =rfcvalue){//サイクルと出力時間をカウントするUpdateDisp(); //値をクロックに更新してから... dly =18; //遅延をリセットrfc =0; } // ===アラームを鳴らす必要があるかどうかを確認if(alarmstatus ==true){if((alarmhour ==hour())&&(alarmminute ==minutes())){//アラームを鳴らす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(); // Clock Setup Routine UpdateDisp();を呼び出します//値を時計に更新} else //アラームが鳴っているときに画面の中央に触れた場合は、サウンドをオフにして、アラームを設定しないようにリセットしますif(((xT> =120)&&(xT <=200)&&(yT> =105)&&(yT <=140))&&((alarmstatus ==true)&&(soundalarm ==true))){alarmstatus =false; soundalarm =false; digitalWrite(8、LOW); //低く設定} screenPressed =true; } //画面を保持することはできません/それ以外の場合はタップする必要がありますif(!myTouch.dataAvailable()&&screenPressed){screenPressed =false; } drawghost(ghostX、ghostY、ghostD、p); //位置をインクリメントして画像を描画//ゴースト方向////方向d ==0 =右、1 =下、2 =左、3 =upif(ghostD ==0){//右//カウンターをインクリメントしてテスト結果ghostX =ghostX + 3; if(ghostX ==270){myGLCD.fillRect(ghostX-3、ghostY、ghostX、ghostY + 28); //位置を変更する前にグラフィックからトレイルをクリアしますghostD =1; //方向を下に変更します}} else if(ghostD ==1){//下に//カウンターとテスト結果をインクリメントしますghostY =ghostY + 3; if(ghostY ==185){myGLCD.fillRect(ghostX + 3、ghostY-3、ghostX + 36、ghostY); //位置を変更する前にグラフィックからトレイルをクリアしますghostD =2; //方向を下に変更します}} else if(ghostD ==2){//左//カウンターとテスト結果をインクリメントしますghostX =ghostX --3; if(ghostX ==12){myGLCD.fillRect(ghostX + 28、ghostY、ghostX + 31、ghostY + 28); //新しい位置を印刷する前にグラフィックの軌跡をクリアしますghostD =3; //方向を下に変更します}} else if(ghostD ==3){//上に//カウンターとテスト結果をインクリメントしますghostY =ghostY --3; if(ghostY ==14){myGLCD.fillRect(ghostX、ghostY + 29、ghostX + 28、ghostY + 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); //新しい位置を印刷する前にグラフィックの軌跡をクリア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){//下に//カウンターとテスト結果をインクリメントします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){//上//カウンターとテスト結果をインクリメント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); //新しい位置を印刷する前にグラフィックの軌跡をクリアします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); //位置をインクリメントして画像を描画//エ​​イリアンの方向////方向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); //位置をインクリメントして画像を描画//マリオの方向////方向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(MarioX ==12){MarioD =3; //方向を下に変更}} else if(MarioD ==3){//上//カウンターとテスト結果をインクリメント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); int h; // 24時間形式の時間値inte; //分の形式の分の値intpm =0; // PMまたはAMのどちらであるかを判別するためのフラグ//時間の一貫した配置を保証するために独立して描画する必要がある4桁の数字intd1; // 10時間桁intd2; // 1時間桁intd3; // 10分の整数intd4; // Ones minute digit h =hour(); // 24 hour RT clock value e =minute();/* TESTh =12;e =8;*/// Calculate hour digit values for timeif ((h>=10) &&(h <=12)) { // AM hours 10,11,12 d1 =1; // calculate Tens hour digit d2 =h - 10; // calculate Ones hour digit 0,1,2 } else if ( (h>=22) &&(h <=24)) { // PM hours 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 flag 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. Simple Word Clock(Arduino)
  6. TeleBallレトロハンドヘルドゲームコンソール
  7. マスタークロック
  8. Ingegno Retro Games Console
  9. イタリア語の単語時計
  10. ベルリン時計
  11. インフィニティミラークロック