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

マスタークロック

コンポーネントと消耗品

>
Arduino UNO
× 1
FreetronicsDMDディスプレイ
× 1
RTCモジュール
× 1
瞬間的なプッシュボタン
× 1
オン/オフスイッチ
× 1

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

>
Arduino IDE

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

これは、12メートル離れた場所からでも近くからでも見える素敵な大きな時計が欲しい人のためのプロジェクトです。好きなだけ大きくすることができます。また、イベントハンドラーとして使用できる目覚まし時計が組み込まれています。たとえば、庭の自動給水システムや、行くつもりの毎週の会合、またはリレーに接続できるその他のことを思い出させるために使用できます。 。

必要なもの:

●FreetronicsDMDディスプレイ

●Arduino用のリアルタイムクロックモジュール

●ブザー(オプション–朝目覚めるのに十分な大きさ)

●瞬間的にオンのプッシュボタン

●2つのオン/オフボタン(電源1はオプション)

●ArduinoUNOまたはArduino互換ボード

●Arduinoのプロトシールド(オプション)

●Arduinoの電源

●4〜30アンペアの能力を持つ5VDC安定化電源(高輝度の場合はオプション–通常の操作には必要ありません)

建設:

パート1-電子機器:

ステップ1:ブザー、無音ボタン、アラームセットスイッチをブレッドボードに接続します

ステップ2:各スイッチピンの1つをアースに配線し、ブザーのGNDピンをArduinoのGNDピンに配線します(図を参照)

ステップ3:アラームセットスイッチのもう一方のピンをD2に、無音ピンをD3に、ブザーをD4に配線します

ステップ4:タイプに応じてRTCモジュールをArduinoに接続します(製造データを読み取ります-ほとんどの場合、図に従ってください)

ステップ5:DMDCONをArduinoに接続し、DMDを接続します

ステップ6:DMDを完全に明るくするには、5Vソースを高輝度端子に接続します

ステップ7:これをプロトシールドで行いたい場合は、すべての部品をシールドにはんだ付けし、適切に接続します

パート2–ソフトウェア:

まず、ここから入手できるDMDライブラリをインストールし、ライブラリフォルダにインストールする必要があります。

ソフトウェアは、プロトタイピングコーナーまたはこのページの下部からダウンロードできます。これには、マスタークロックの基本的な操作が含まれています。

RTCモジュールで時刻を設定するには、117行目から124行目を見つけて、これらを現在の時刻に調整します。ここで、行124のコメントを解除し、Arduinoにアップロードします。ここで、124行目をもう一度コメントして、もう一度アップロードします。これが行われない場合、RTCは同じ時間のままになります。

593行目と594行目で、アラームを発生させる日時を設定します。 593行目は、発生させたい曜日です。日は次のように数字に対応します:

1 =日曜日

2 =月曜日

3 =火曜日

4 =水曜日

5 =木曜日

6 =金曜日

7 =土曜日

次に、594行目で、24時間制でアラームが鳴る時刻を設定します。

さらに進む:

ディスプレイの追加:

DMDディスプレイを追加して、時計を大きくすることができます。詳細については、こちらをお読みください。

アラームの追加:

さらにアラームを追加するには、スケッチに次のコード行を追加し、メインループのvoidを呼び出します。

void CheckAlarm-ALARM-NO-(){

<コード> AlarmSet =digitalRead(AlarmSetPin);

Snooze =digitalRead(SnoozePin);

バイト秒、分、時間、dayOfWeek、dayOfMonth、月、年;

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

/ *以下にリストされている日である場合にのみアラームをトリガーします。これは、番号を次のいずれかに変更することで変更できます。

1 =日曜日

2 =月曜日

3 =火曜日

4 =水曜日

5 =木曜日

6 =金曜日

7 =土曜日

<コード> * /

if(dayOfWeek ==2 || dayOfWeek ==3 || dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6){//これはアラームを鳴らすことができる日です

if(hour ==18 &&minutes ==05){//ここに時刻を設定(24時間制)

if(AlarmSet ==LOW){//アラームピンがオンの場合

Snooze =digitalRead(SnoozePin);

while(Snooze ==HIGH)

<コード> {

Snooze =digitalRead(SnoozePin);

//ここで何が起こるかを追加

<コード>}

<コード>}

<コード>}

<コード>}

コード

  • マスタークロックのコード
マスタークロックのコード C / C ++
 / *マスタークロックのスケッチ。作成日26/03/14これは、FreetronicsDMDを表示用の出力として使用するarduinoプログラムです。アラーム機能付きです。曜日、日付、時刻はDMDに印刷されます。アラーム機能ボタンは、アラームセット用のピン2、スヌーズ用のピン3、出力アラーム用のピン4にあります。アラームの時刻と曜日は、行551と552で設定できます。JedHodson2014 * / byte dayOfWeek =4; byte dayOfMonth =1; #include  //SPI.hは、DMDが書き込まれるときに含める必要がありますSPIによる(IDEは別の方法で文句を言う)#include  //#include  //#include "SystemFont5x7.h" #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68int AlarmSetPin =2; int SnoozePin =3; int Alarm =4; int AlarmSet =0; int Snooze =0; //通常の10進数をバイナリコード化されたdecimalbyteに変換しますdecToBcd(byte val){return((val / 10 * 16)+(val%10));} //バイナリコード化された10進数を通常の10進数に変換するbytebcdToDec(byte val){return((val / 16 * 10)+(val%16));} // 1)ds1307 //に日付と時刻を設定します2)時計を開始します// 3)時間モードを24時間時計に設定します//有効な数値を渡していると仮定しますvoid setDateDs1307(byte second、// 0-59byteminute、// 0-59byte hour、// 1-23byte dayOfWeek、// 1〜7バイトのdayOfMonth、// 1-28 / 29/30/31バイトの月、// 1-1 2バイト年)// 0-99 {Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); // 0からビット7は、クロックを開始しますWire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.write(00010000); // 0x10(hex)00010000(binary)を制御レジスタに送信します-方形波をオンにしますWire.endTransmission();} // ds1307から日付と時刻を取得しますvoidgetDateDs1307(byte * second、byte * minutes、byte * hour、 byte * dayOfWeek、byte * dayOfMonth、byte * month、byte * year){//レジスタポインタをリセットしますWire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS、7); //特定のビットは制御ビットであるため、これらのいくつかにはマスクが必要です* second =bcdToDec(Wire.read()&0x7f); *分=bcdToDec(Wire.read()); *時間=bcdToDec(Wire.read()&0x3f); //午前/午後12時間の場合、これを変更する必要があります* dayOfWeek =bcdToDec(Wire.read()); * dayOfMonth =bcdToDec(Wire.read()); *月=bcdToDec(Wire.read()); * year =bcdToDec(Wire.read());} // DMDライブラリをdmdDMDとして起動しますdmd(1,1); void ScanDMD(){dmd.scanDisplayBySPI();} void setup(){byte second、minute 、時間、dayOfWeek、dayOfMonth、月、年; //表示をスキャンして更新するために使用されるTimerOneの割り込み/ CPU使用率を初期化しますTimer1.initialize(5000); // ScanDMDを呼び出すためのマイクロ秒単位の期間。 5000(5ms)より長いものは、ちらつきが見られます。 Timer1.attachInterrupt(ScanDMD); // Timer1割り込みをScanDMDに接続します。ScanDMDはdmd.scanDisplayBySPI()に移動します// RAMに保持されているDMDピクセルをクリア/初期化しますdmd.clearScreen(true); // trueは通常(すべてのピクセルがオフ)、falseは負(すべてのピクセルがオン)dmd.selectFont(System5x7); Wire.begin(); //これらの値を時計を設定したい値に変更します。 //時計を一度だけ設定してから、// setDateDs1307呼び出しを削除したい場合があります。秒=0;分=35;時間=11; // 24時間制を使用します。それ以外の場合、日/日付の計算はオフになりますdayOfWeek =1; dayOfMonth =23;月=3;年=14; //以下のsetDateDs1307呼び出しのコメントを解除して、上記の間隔に時間を設定します。時間を設定した場合は//下の行のコメントを解除する必要があることを忘れないでください。そうしないと、スケッチは設定された時間にのみ留まります。 // setDateDs1307(second、minute、hour、dayOfWeek、dayOfMonth、month、year); pinMode(AlarmSetPin、INPUT_PULLUP); pinMode(SnoozePin、INPUT_PULLUP); pinMode(Alarm、OUTPUT); digitalWrite(Alarm、LOW);} void drawDay()//曜日を表示{byte second、minute、hour、dayOfWeek、dayOfMonth、month、year; getDateDs1307(&second、&minute、&hour、&dayOfWeek、&dayOfMonth、&month、&year); switch(dayOfWeek){ケース1:dmd.drawString(1,0、 "Sun、"、3、GRAPHICS_NORMAL);壊す;ケース2:dmd.drawString(1,0、 "Mon、"、3、GRAPHICS_NORMAL);壊す;ケース3:dmd.drawString(1,0、 "Tue、"、3、GRAPHICS_NORMAL);壊す;ケース4:dmd.drawString(1,0、 "Wed、"、3、GRAPHICS_NORMAL);壊す;ケース5:dmd.drawString(1,0、 "Thu、"、3、GRAPHICS_NORMAL);壊す;ケース6:dmd.drawString(1,0、 "Fri、"、3、GRAPHICS_NORMAL);壊す;ケース7:dmd.drawString(1,0、 "Sat、"、3、GRAPHICS_NORMAL);壊す; }} void drawDate()//数値の日付を表示{byte second、minute、hour、dayOfWeek、dayOfMonth、month、year; getDateDs1307(&second、&minute、&hour、&dayOfWeek、&dayOfMonth、&month、&year); switch(dayOfMonth){ケース1:dmd.drawString(20,0、 "01"、2、GRAPHICS_NORMAL);壊す;ケース2:dmd.drawString(20,0、 "02"、2、GRAPHICS_NORMAL);壊す;ケース3:dmd.drawString(20,0、 "03"、2、GRAPHICS_NORMAL);壊す;ケース4:dmd.drawString(20,0、 "04"、2、GRAPHICS_NORMAL);壊す;ケース5:dmd.drawString(20,0、 "05"、2、GRAPHICS_NORMAL);壊す;ケース6:dmd.drawString(20,0、 "06"、2、GRAPHICS_NORMAL);壊す;ケース7:dmd.drawString(20,0、 "07"、2、GRAPHICS_NORMAL);壊す;ケース8:dmd.drawString(20,0、 "08"、2、GRAPHICS_NORMAL);壊す;ケース9:dmd.drawString(20,0、 "09"、2、GRAPHICS_NORMAL);壊す;ケース10:dmd.drawString(20,0、 "10"、2、GRAPHICS_NORMAL);壊す;ケース11:dmd.drawString(20,0、 "11"、2、GRAPHICS_NORMAL);壊す;ケース12:dmd.drawString(20,0、 "12"、2、GRAPHICS_NORMAL);壊す;ケース13:dmd.drawString(20,0、 "13"、2、GRAPHICS_NORMAL);壊す;ケース14:dmd.drawString(20,0、 "14"、2、GRAPHICS_NORMAL);壊す;ケース15:dmd.drawString(20,0、 "15"、2、GRAPHICS_NORMAL);壊す;ケース16:dmd.drawString(20,0、 "16"、2、GRAPHICS_NORMAL);壊す;ケース17:dmd.drawString(20,0、 "17"、2、GRAPHICS_NORMAL);壊す;ケース18:dmd.drawString(20,0、 "18"、2、GRAPHICS_NORMAL);壊す;ケース19:dmd.drawString(20,0、 "19"、2、GRAPHICS_NORMAL);壊す;ケース20:dmd.drawString(20,0、 "20"、2、GRAPHICS_NORMAL);壊す;ケース21:dmd.drawString(20,0、 "21"、2、GRAPHICS_NORMAL);壊す;ケース22:dmd.drawString(20,0、 "22"、2、GRAPHICS_NORMAL);壊す;ケース23:dmd.drawString(20,0、 "23"、2、GRAPHICS_NORMAL);壊す;ケース24:dmd.drawString(20,0、 "24"、2、GRAPHICS_NORMAL);壊す;ケース25:dmd.drawString(20,0、 "25"、2、GRAPHICS_NORMAL);壊す;ケース26:dmd.drawString(20,0、 "26"、2、GRAPHICS_NORMAL);壊す;ケース27:dmd.drawString(20,0、 "27"、2、GRAPHICS_NORMAL);壊す;ケース28:dmd.drawString(20,0、 "28"、2、GRAPHICS_NORMAL);壊す;ケース29:dmd.drawString(20,0、 "29"、2、GRAPHICS_NORMAL);壊す;ケース30:dmd.drawString(20,0、 "30"、2、GRAPHICS_NORMAL);壊す;ケース31:dmd.drawString(20,0、 "31"、2、GRAPHICS_NORMAL);壊す; }} void drawHour()//時針を描画します{byte second、minute、hour、dayOfWeek、dayOfMonth、month、year; getDateDs1307(&second、&minute、&hour、&dayOfWeek、&dayOfMonth、&month、&year); if(hour> 12)// 24時間のifコマンドを削除します{hour =hour-12; //これは12時間制です} switch(hour){case 1:dmd.drawString(1,8、 "01"、2、GRAPHICS_NORMAL);壊す;ケース2:dmd.drawString(1,8、 "02"、2、GRAPHICS_NORMAL);壊す;ケース3:dmd.drawString(1,8、 "03"、2、GRAPHICS_NORMAL);壊す;ケース4:dmd.drawString(1,8、 "04"、2、GRAPHICS_NORMAL);壊す;ケース5:dmd.drawString(1,8、 "05"、2、GRAPHICS_NORMAL);壊す;ケース6:dmd.drawString(1,8、 "06"、2、GRAPHICS_NORMAL);壊す;ケース7:dmd.drawString(1,8、 "07"、2、GRAPHICS_NORMAL);壊す;ケース8:dmd.drawString(1,8、 "08"、2、GRAPHICS_NORMAL);壊す;ケース9:dmd.drawString(1,8、 "09"、2、GRAPHICS_NORMAL);壊す;ケース10:dmd.drawString(1,8、 "10"、2、GRAPHICS_NORMAL);壊す;ケース11:dmd.drawString(1,8、 "11"、2、GRAPHICS_NORMAL);壊す;ケース12:dmd.drawString(1,8、 "12"、2、GRAPHICS_NORMAL);壊す;ケース13:dmd.drawString(1,8、 "13"、2、GRAPHICS_NORMAL);壊す;ケース14:dmd.drawString(1,8、 "14"、2、GRAPHICS_NORMAL);壊す;ケース15:dmd.drawString(1,8、 "15"、2、GRAPHICS_NORMAL);壊す;ケース16:dmd.drawString(1,8、 "16"、2、GRAPHICS_NORMAL);壊す;ケース17:dmd.drawString(1,8、 "17"、2、GRAPHICS_NORMAL);壊す;ケース18:dmd.drawString(1,8、 "18"、2、GRAPHICS_NORMAL);壊す;ケース19:dmd.drawString(1,8、 "19"、2、GRAPHICS_NORMAL);壊す;ケース20:dmd.drawString(1,8、 "20"、2、GRAPHICS_NORMAL);壊す;ケース21:dmd.drawString(1,8、 "21"、2、GRAPHICS_NORMAL);壊す;ケース22:dmd.drawString(1,8、 "22"、2、GRAPHICS_NORMAL);壊す;ケース23:dmd.drawString(1,8、 "23"、2、GRAPHICS_NORMAL);壊す;ケース24:dmd.drawString(1,8、 "24"、2、GRAPHICS_NORMAL);壊す; }} void drawMinute(){byte second、minute、hour、dayOfWeek、dayOfMonth、month、year; getDateDs1307(&second、&minute、&hour、&dayOfWeek、&dayOfMonth、&month、&year); switch(minute){ケース0:dmd.drawString(20,8、 "00"、2、GRAPHICS_NORMAL);壊す;ケース1:dmd.drawString(20,8、 "01"、2、GRAPHICS_NORMAL);壊す;ケース2:dmd.drawString(20,8、 "02"、2、GRAPHICS_NORMAL);壊す;ケース3:dmd.drawString(20,8、 "03"、2、GRAPHICS_NORMAL);壊す;ケース4:dmd.drawString(20,8、 "04"、2、GRAPHICS_NORMAL);壊す;ケース5:dmd.drawString(20,8、 "05"、2、GRAPHICS_NORMAL);壊す;ケース6:dmd.drawString(20,8、 "06"、2、GRAPHICS_NORMAL);壊す;ケース7:dmd.drawString(20,8、 "07"、2、GRAPHICS_NORMAL);壊す;ケース8:dmd.drawString(20,8、 "08"、2、GRAPHICS_NORMAL);壊す;ケース9:dmd.drawString(20,8、 "09"、2、GRAPHICS_NORMAL);壊す;ケース10:dmd.drawString(20,8、 "10"、2、GRAPHICS_NORMAL);壊す;ケース11:dmd.drawString(20,8、 "11"、2、GRAPHICS_NORMAL);壊す;ケース12:dmd.drawString(20,8、 "12"、2、GRAPHICS_NORMAL);壊す;ケース13:dmd.drawString(20,8、 "13"、2、GRAPHICS_NORMAL);壊す;ケース14:dmd.drawString(20,8、 "14"、2、GRAPHICS_NORMAL);壊す;ケース15:dmd.drawString(20,8、 "15"、2、GRAPHICS_NORMAL);壊す;ケース16:dmd.drawString(20,8、 "16"、2、GRAPHICS_NORMAL);壊す;ケース17:dmd.drawString(20,8、 "17"、2、GRAPHICS_NORMAL);壊す;ケース18:dmd.drawString(20,8、 "18"、2、GRAPHICS_NORMAL);壊す;ケース19:dmd.drawString(20,8、 "19"、2、GRAPHICS_NORMAL);壊す;ケース20:dmd.drawString(20,8、 "20"、2、GRAPHICS_NORMAL);壊す;ケース21:dmd.drawString(20,8、 "21"、2、GRAPHICS_NORMAL);壊す;ケース22:dmd.drawString(20,8、 "22"、2、GRAPHICS_NORMAL);壊す;ケース23:dmd.drawString(20,8、 "23"、2、GRAPHICS_NORMAL);壊す;ケース24:dmd.drawString(20,8、 "24"、2、GRAPHICS_NORMAL);壊す;ケース25:dmd.drawString(20,8、 "25"、2、GRAPHICS_NORMAL);壊す;ケース26:dmd.drawString(20,8、 "26"、2、GRAPHICS_NORMAL);壊す;ケース27:dmd.drawString(20,8、 "27"、2、GRAPHICS_NORMAL);壊す;ケース28:dmd.drawString(20,8、 "28"、2、GRAPHICS_NORMAL);壊す;ケース29:dmd.drawString(20,8、 "29"、2、GRAPHICS_NORMAL);壊す;ケース30:dmd.drawString(20,8、 "30"、2、GRAPHICS_NORMAL);壊す;ケース31:dmd.drawString(20,8、 "31"、2、GRAPHICS_NORMAL);壊す;ケース32:dmd.drawString(20,8、 "32"、2、GRAPHICS_NORMAL);壊す;ケース33:dmd.drawString(20,8、 "33"、2、GRAPHICS_NORMAL);壊す;ケース34:dmd.drawString(20,8、 "34"、2、GRAPHICS_NORMAL);壊す;ケース35:dmd.drawString(20,8、 "35"、2、GRAPHICS_NORMAL);壊す;ケース36:dmd.drawString(20,8、 "36"、2、GRAPHICS_NORMAL);壊す;ケース37:dmd.drawString(20,8、 "37"、2、GRAPHICS_NORMAL);壊す;ケース38:dmd.drawString(20,8、 "38"、2、GRAPHICS_NORMAL);壊す;ケース39:dmd.drawString(20,8、 "39"、2、GRAPHICS_NORMAL);壊す;ケース40:dmd.drawString(20,8、 "40"、2、GRAPHICS_NORMAL);壊す;ケース41:dmd.drawString(20,8、 "41"、2、GRAPHICS_NORMAL);壊す;ケース42:dmd.drawString(20,8、 "42"、2、GRAPHICS_NORMAL);壊す;ケース43:dmd.drawString(20,8、 "43"、2、GRAPHICS_NORMAL);壊す;ケース44:dmd.drawString(20,8、 "44"、2、GRAPHICS_NORMAL);壊す;ケース45:dmd.drawString(20,8、 "45"、2、GRAPHICS_NORMAL);壊す;ケース46:dmd.drawString(20,8、 "46"、2、GRAPHICS_NORMAL);壊す;ケース47:dmd.drawString(20,8、 "47"、2、GRAPHICS_NORMAL);壊す;ケース48:dmd.drawString(20,8、 "48"、2、GRAPHICS_NORMAL);壊す;ケース49:dmd.drawString(20,8、 "49"、2、GRAPHICS_NORMAL);壊す;ケース50:dmd.drawString(20,8、 "50"、2、GRAPHICS_NORMAL);壊す;ケース51:dmd.drawString(20,8、 "51"、2、GRAPHICS_NORMAL);壊す;ケース52:dmd.drawString(20,8、 "52"、2、GRAPHICS_NORMAL);壊す;ケース53:dmd.drawString(20,8、 "53"、2、GRAPHICS_NORMAL);壊す;ケース54:dmd.drawString(20,8、 "54"、2、GRAPHICS_NORMAL);壊す;ケース55:dmd.drawString(20,8、 "55"、2、GRAPHICS_NORMAL);壊す;ケース56:dmd.drawString(20,8、 "56"、2、GRAPHICS_NORMAL);壊す;ケース57:dmd.drawString(20,8、 "57"、2、GRAPHICS_NORMAL);壊す;ケース58:dmd.drawString(20,8、 "58"、2、GRAPHICS_NORMAL);壊す;ケース59:dmd.drawString(20,8、 "59"、2、GRAPHICS_NORMAL);壊す; }} void drawCol(){dmd.drawString(14,8、 ":"、1、GRAPHICS_NORMAL);} void runClock(){drawDay(); drawDate(); drawHour(); drawCol(); drawMinute(); CheckAlarm();} void AlarmSequence(){drawDay(); drawDate(); drawHour(); drawCol(); drawMinute(); digitalWrite(Alarm、HIGH); delay(1000); dmd.clearScreen(true); digitalWrite(Alarm、LOW); delay(1000);} void CheckAlarm(){AlarmSet =digitalRead(AlarmSetPin);スヌーズ=digitalRead(SnoozePin);バイト秒、分、時、dayOfWeek、dayOfMonth、月、年; getDateDs1307(&second、&minute、&hour、&dayOfWeek、&dayOfMonth、&month、&year); / *以下にリストされている日である場合にのみアラームをトリガーします。これは、数値を次のいずれかに変更することで変更できます。1=日曜日2 =月曜日3 =火曜日4 =水曜日5 =木曜日6 =金曜日7 =土曜日* / if(dayOfWeek ==2 || dayOfWeek ==3 | | dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6){//これはアラームを鳴らすことができる日数if(hour ==18 &&minutes ==05){//ここに時間を設定(24時間)時間)if(AlarmSet ==LOW){//アラームピンがオンの場合Snooze =digitalRead(SnoozePin); while(Snooze ==HIGH){Snooze =digitalRead(SnoozePin); AlarmSequence(); }}}}} void loop(){runClock(); } 

回路図


製造プロセス

  1. 鳩時計
  2. Arduinoハメ撮りビジョンクロック
  3. Arduinoを使用したDIYの最もシンプルなIV9Numitron時計
  4. Simple Word Clock(Arduino)
  5. イスラムの祈りの時間とArduino時計
  6. Arduino Spybot
  7. FlickMote
  8. 自家製テレビB-Gone
  9. ArduinoTemp。 3.2ディスプレイを備えたモニターとリアルタイムクロック
  10. ベルリン時計
  11. DS1302RTCを備えたシンプルな目覚まし時計