RTCモジュールを使用したArduinoデジタル時計

問題を排除するために楽器を試してください





この投稿では、RTCまたはリアルタイムクロックモジュールを使用してデジタル時計を作成します。 「RTC」モジュールとは何か、Arduinoとのインターフェース方法とその機能を理解します。

沿って:



RTCモジュールは、現在の時刻を正確に追跡する回路です。バッテリーバックアップシステムを内蔵しているため、マイクロコントローラーやマイクロプロセッサーと通信して現在の時刻を表示し、停電時の時間を維持するためのバックアップ回路として機能します。

RTCは、時間がガジェットの重要な機能であるすべての電子機器で見つけることができます。



たとえば、私たちのコンピューターやラップトップは、電源がオフになったり、バッテリーが取り外されたりした後でも、その時間を維持します。どのコンピュータのマザーボードにも、RTC回路に電力を供給するCMOSバッテリーがあります。

このプロジェクトで使用するのと同様の種類の回路。

RTCモジュールは、あらゆるEコマースサイトや地元の電子プロジェクトショップで見つけることができる安価なデバイスです。

典型的なRTCモジュールDS1307の図:

ほとんどのRTCモジュールには、購入時にバッテリー(CR2032)が付属しています。サイズやモデルが異なりますが、上記の図は同じではない場合があります。ただし、モデル番号がDS1307であることを確認してください。この投稿で書かれたコードはDS1307とのみ互換性があります。

これで、RTCについて何か知っています。それでは、デジタル時計の設計に移りましょう。このプロジェクトを進める前に、次のリンクからライブラリをダウンロードして、IDEにインストールする必要があります。

•DS1307RTC.h

リンク:github.com/PaulStoffregen/DS1307RTC

•TimeLib.h

リンク:github.com/PaulStoffregen/Time

最新バージョンを使用している場合、他の2つのライブラリはArduinoIDEにプリインストールされているはずです。

•LiquidCrystal.h

•Wire.h

回路:

arduinoとLCDディスプレイ間の回路接続は標準であり、他のLCDベースのプロジェクトでも同様の接続を見つけることができます。唯一の追加コンポーネントはRTCです。

プロトタイプ中のワイヤの混雑を減らすために、RTCをarduinoのアナログピンに直接挿入することができます。 SCl、SDA、Vcc、およびGNDをオスヘッダーピンではんだ付けし、プロトタイプに示すようにA2〜A5ピンに挿入します。

著者のプロトタイプ:

ArduinoにRTCを正しく挿入する方法:

RTCのピン位置が異なり、上記のように複製できない場合は、いつでもワイヤを使用して接続できます。これでハードウェアのセットアップが完了しました。プロジェクトのソフトウェア部分に移りましょう。

時間を設定する方法:

RTCモジュールがプログラムされると、arduinoから取り外されても時間を維持します。バッテリーは少なくとも数年は持ちます。

次のプログラムがRTCで時間を設定する時間を調整するボタンはありません。コードのコンパイル中に、時刻がコンピューターの時刻と自動的に同期されるため、プログラムをアップロードする前に、コンピューターが正しい時刻に設定されていることを確認してください。
この「SetTime」コードをアップロードして、RTCが接続された時間を設定します。

#include  #include  #include  int P=A3 //Assign power pins for RTC int N=A2 const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } 

このコードがアップロードされたら、シリアルモニターを開くと、時刻が設定されたことを示す成功メッセージがポップアップ表示されます。

これは、RTCとarduinoの間の接続が正しく、時間が設定されていることを意味します。

次に、LCDに時刻を表示するための次のコードをアップロードします。

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  LiquidCrystal lcd(12, 11, 5, 4, 3, 2) int P=A3 int N=A2 void setup() { lcd.begin(16,2) pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) } void loop() { tmElements_t tm lcd.clear() if (RTC.read(tm)) { if(tm.Hour>=12) { lcd.setCursor(14,0) lcd.print('PM') } if(tm.Hour<12) { lcd.setCursor(14,0) lcd.print('AM') } lcd.setCursor(0,0) lcd.print('TIME:') if(tm.Hour>12) //24Hrs to 12 Hrs conversion// { if(tm.Hour==13) lcd.print('01') if(tm.Hour==14) lcd.print('02') if(tm.Hour==15) lcd.print('03') if(tm.Hour==16) lcd.print('04') if(tm.Hour==17) lcd.print('05') if(tm.Hour==18) lcd.print('06') if(tm.Hour==19) lcd.print('07') if(tm.Hour==20) lcd.print('08') if(tm.Hour==21) lcd.print('09') if(tm.Hour==22) lcd.print('10') if(tm.Hour==23) lcd.print('11') } else { lcd.print(tm.Hour) } lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0,1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0,0) lcd.print('RTC stopped!!!') lcd.setCursor(0,1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0,0) lcd.print('Read error!') lcd.setCursor(0,1) lcd.print('Check circuitry!') } delay(500) } delay(500) } //------------Program Developed by R.Girish-------// 

これが完了すると、時間と日付がLCDに表示されて実行されていることがわかります。

注意: 「SetTime」コードは、DS1307RTCのサンプルコードから変更され、RTCモジュールの配線接続が最適化されています。元のコードをアップロードしても、時間が設定されません。

Arduinoを使用したデジタル目覚まし時計

上記では、RTCモジュールを使用して基本的なArduinoクロックを構築する方法を学びました。次のセクションでは、Arduinoを使用してこれをデジタル目覚まし時計回路にアップグレードする方法を調査します。

目覚まし時計を必要としない人もいれば、自然に目覚める人もいれば、目覚まし時計が数回鳴った後に目覚める人もいれば、スヌーズボタンを何度も押して大学に行ったり、遅くまで仕事をしたりする人もいます。いくつかの言い訳。

提案された楽しい小さな目覚まし時計プロジェクトは、朝の目覚めの間の怠惰の問題に直面するかもしれません。ほとんどの目覚まし時計には、スヌーズボタンと、ユーザーが応答しなかった場合のアラームのカットオフ時間が事前に決定されています。

この目覚まし時計は、怠惰なボタン(スヌーズボタン)がないように設計されており、ユーザーがボタンを押すまでアラームはオフになりません。

この時計は、時刻を12時間形式で、日付をDD / MM / YYYY形式で表示できます。

日時は16x 2LCDディスプレイに表示されます。 RTCまたはリアルタイムクロックタイムモジュールは、時刻の追跡を処理し、長時間の停電後でも正しい時刻を保持できます。

機能について簡単に説明する5つのボタンが用意されています。プロジェクトArduinoの頭脳は、任意のモデルを選択できます。コンパクトなサイズであるため、Arduino prominiまたはArduinonanoをお勧めします。

それでは、回路図について詳しく見ていきましょう。

上記は、Arduinoが接続を表示し、10Kポテンショメータを回転させてディスプレイのコントラストを調整するための回路図です。

以下は回路の残りの部分です:

この回路は、9V500mAウォールアダプターに電力を供給できます。

5つのボタンの機能:

S1-これはアラームを停止するために使用されます(リセットボタンでもあります)。
S2-アラームの設定に使用します。 S2を長押しすると、アラーム設定メニューが表示されます。
S3-時間をインクリメントするために使用されます。
S4 –分をインクリメントするために使用されます。
S5 –アラームステータスを切り替えるために使用されます。右下隅のLCDディスプレイに「*」が存在する場合はアラームがオンになり、「*」が存在しない場合はアラーム統計がオフになります。

アラームの設定方法の詳細については、記事の下部で説明しています。

以下のライブラリファイルをダウンロードします。

リンク1:github.com/PaulStoffregen/DS1307RTC
Link2:github.com/PaulStoffregen/Time

ここで、RTCモジュールに時間を設定する必要があります。時間はPCからRTCモジュールに同期されます。

以下のコードをアップロードして時間を設定し、シリアルモニターを開きます。

//------------------------------------------------// #include  #include  #include  const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } //----------------------------------------// 

これで、RTCに時間を正常に設定できました
次に、次のメインコードをアップロードする必要があります。

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  #include  const int rs = 7 const int en = 6 const int d4 = 5 const int d5 = 4 const int d6 = 3 const int d7 = 2 const int buzzer = 8 boolean alarm = false boolean outloop = true const int setAlarm = A0 const int Hrs = A1 const int Min = A2 const int ok = A3 const int HrsADD = 0 const int MinADD = 1 const int ALsave = 2 int HrsVal = 0 int MinVal = 0 int H = 0 int M = 0 int S = 0 int i = 0 int j = 0 int k = 0 LiquidCrystal lcd(rs, en, d4, d5, d6, d7) void setup() { Serial.begin(9600) lcd.begin(16, 2) pinMode(buzzer, OUTPUT) pinMode(setAlarm, INPUT) pinMode(Hrs, INPUT) pinMode(Min, INPUT) pinMode(ok, INPUT) digitalWrite(setAlarm, HIGH) digitalWrite(Hrs, HIGH) digitalWrite(Min, HIGH) digitalWrite(ok, HIGH) } void loop() { tmElements_t tm lcd.clear() if (EEPROM.read(ALsave) == false) { lcd.setCursor(15, 1) lcd.print('') } if (EEPROM.read(ALsave) == true) { lcd.setCursor(15, 1) lcd.print(F('*')) } if (RTC.read(tm)) { if (tm.Hour >= 12) { lcd.setCursor(14, 0) lcd.print('PM') } if (tm.Hour < 12) { lcd.setCursor(14, 0) lcd.print('AM') } lcd.setCursor(0, 0) lcd.print('TIME:') H = tm.Hour if (tm.Hour > 12) { if (tm.Hour == 13) { lcd.print('01') } if (tm.Hour == 14) { lcd.print('02') } if (tm.Hour == 15) { lcd.print('03') } if (tm.Hour == 16) { lcd.print('04') } if (tm.Hour == 17) { lcd.print('05') } if (tm.Hour == 18) { lcd.print('06') } if (tm.Hour == 19) { lcd.print('07') } if (tm.Hour == 20) { lcd.print('08') } if (tm.Hour == 21) { lcd.print('09') } if (tm.Hour == 22) { lcd.print('10') } if (tm.Hour == 23) { lcd.print('11') } } else { lcd.print(tm.Hour) } M = tm.Minute S = tm.Second lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0, 1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0, 0) lcd.print('RTC stopped!!!') lcd.setCursor(0, 1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0, 0) lcd.print('Read error!') lcd.setCursor(0, 1) lcd.print('Check circuitry!') } } if (digitalRead(setAlarm) == LOW) { setALARM() } if (H == EEPROM.read(HrsADD) && M == EEPROM.read(MinADD) && S == 0) { if (EEPROM.read(ALsave) == true) { sound() } } if (digitalRead(ok) == LOW) { if (EEPROM.read(ALsave) == true) { EEPROM.write(ALsave, 0) alarm = false delay(1000) return } if (EEPROM.read(ALsave) == false) { EEPROM.write(ALsave, 1) alarm = true delay(1000) return } } delay(1000) } void setALARM() { HrsVal = EEPROM.read(HrsADD) MinVal = EEPROM.read(MinADD) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(' Min:')) lcd.print(EEPROM.read(MinADD)) delay(600) while (outloop) { if (HrsVal > 23) { HrsVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (MinVal > 59) { MinVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (digitalRead(Hrs) == LOW) { HrsVal = HrsVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(Min) == LOW) { MinVal = MinVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(setAlarm) == LOW) { EEPROM.write(HrsADD, HrsVal) EEPROM.write(MinADD, MinVal) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('Alarm is Set for')) lcd.setCursor(0, 1) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(':')) lcd.print(EEPROM.read(MinADD)) lcd.print(F(' Hrs')) delay(1000) outloop = false } } outloop = true } void sound() { lcd.clear() lcd.setCursor(0, 0) lcd.print('Wakey Wakey !!!') lcd.setCursor(0, 1) lcd.print('Its Time now.....') for (j = 0 j < 10 j++) { for (i = 0 i < 2  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(400) } for (k = 0 k < 10 k++) { for (i = 0 i < 4  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(250) } while (true) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } } //------------Program Developed by R.Girish-------// 

上記のコードをアップロードした後、ディスプレイに正しい日時が表示されていることを確認する必要があります。

それでは、アラームを設定する方法を見てみましょう。
•アラームメニューが表示されるまでS2を長押しします。
•S3とS4を押して、それぞれ時間と分を調整します。
•希望の時間を設定したら、もう一度S2を押します。 「アラームはxx:xx時間に設定されています」と表示されます。
•アラームがオンの場合、ディスプレイに「*」記号が表示されます。アラームがオフの場合、「*」記号は表示されません。
•S5を0.5秒間押すと、アラームのオン/オフを切り替えることができます。 「*」が消える(再び戻る)まで長押ししないでください。0.5秒長押しするだけでアラームステータスを切り替えることができます。

重要な注意点:

時計にアラームを設定する際の最も一般的な間違いは、意図せずにAM / PMを切り替えることです。これにより、希望の時間にアラームが鳴りません。

この問題に対処するために、提案されている目覚まし時計の設定は24時間形式で設計されています。

LCDに表示される時間はAM / PM形式で12時間ですが、このプロジェクトでアラームを設定する場合は、0〜23時間の24時間形式で設定する必要があります。

例:午後9時にアラームを設定する場合は、21時間0分を設定する必要があります。の場合、午前5時:5時間0分など。

著者のプロトタイプ:

このプロジェクトは好きですか?このプロジェクトについて質問がありましたら、コメントでお気軽にご連絡ください。すぐに返信が届く場合があります。

ビデオクリップ:




前:コンバインハーベスター穀物タンク用のビーコンレベルインジケーター回路 次へ:3つの高出力SG3525純粋な正弦波インバータ回路