Arduino で作るイスラム教礼拝時刻付きリアルタイムクロック
必要な部品と材料
| 部品名 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Nokia 5110 LCD ディスプレイ(84×48 ピクセル、モノクロ) | 1 |
| DS1307 RTC モジュール(Seeed Pi RTC 等) | 1 |
必要な工具と機器
- ブレッドボード(400ピン)
- ジャンパーワイヤー(オス-オス、40本、75mm)
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
グレゴリオ暦の日付と毎日の礼拝時刻(サラート)を表示するリアルタイムクロックを Arduino UNO、DS1307 RTC、Nokia 5110 LCD で構築します。
主要コンポーネントの解説
Arduino UNO
ATmega328P ベースのオープンソースマイコンボード。14 本のデジタル I/O(うち 6 本は PWM 出力可能)、6 本のアナログ入力、16 MHz セラミック振動子、32 KB フラッシュメモリ、2 KB SRAM、1 KB EEPROM を備えます。
DS1307 RTC
低消費電力のフル BCD(2進化十進数)クロック/カレンダー。秒、分、時、曜日、日、月、年を管理し、月末日の自動調整(閏年対応含む)機能を持ちます。24時間/12時間(AM/PM)形式両対応。内蔵電源検出回路により、電源断時に自動的にバッテリー駆動へ切り替わります。
主なピン機能:
- VCC, GND: 電源供給
- SCL: シリアルクロック入力(I²C 同期用)
- SDA: シリアルデータ入出力(オープンドレイン、外部プルアップ抵抗必要)
- SQW/OUT: 方形波出力(1Hz, 4kHz, 8kHz, 32kHz)
- X1, X2: 32.768kHz 水晶発振子接続
Nokia 5110 LCD
84×48 ピクセルのモノクロ液晶。バックライト付きでテキスト、グラフィック、画像表示が可能。PCD8544 コントローラー(Nokia 3310 と同一)を搭載し、SPI 類似のシリアルバスで通信します。
ピン配置:
- VCC, GND: 電源
- RST: リセット(アクティブロー)
- CE: チップイネーブル(アクティブロー)
- D/C: データ/コマンド切替(HIGH=データ、LOW=コマンド)
- DIN: シリアルデータ入力
- CLK: クロック入力
- BL: バックライト制御(PWM ピン接続で輝度調整可能)
プログラムのカスタマイズ方法
コードの 161 行目をお住まいの地域に合わせて書き換えます:
calcPrayerTimes(year, month, dayOfMonth, 経度, 緯度, タイムゾーン,
ファジル薄明角, イシャ薄明角,
fajr, sunRise, zuhr, asr, maghrib, isha);
必要なパラメータ:
- 対象地の経度・緯度・タイムゾーン
- ファジル(朝の礼拝)とイシャ(夜の礼拝)の薄明角(国や計算方法により異なる)
座標は IslamicFinder 等で検索可能です。例えばカイロの場合:
- 経度: 30.2、緯度: 30.0、タイムゾーン: +2
- ファジル薄明角: -19.5、イシャ薄明角: -17.5
この場合、161 行目は以下のようになります:
calcPrayerTimes(year, month, dayOfMonth, 30.2, 30, 2, -19.5, -17.5,
fajr, sunRise, zuhr, asr, maghrib, isha);
プログラムの動作原理
年/月/日/経度/緯度/タイムゾーン/薄明角を入力として受け取り、6つの礼拝時刻(ファジル、日の出、ズフル、アスル、マグリブ、イシャ)を double 型で返却します。内部ではラジアン⇔度変換、0〜360°/0〜24h 正規化などの補助関数を使用。double 値は doubleToHrMin() 関数で時・分に分解して表示します。
礼拝時刻計算アルゴリズムは Mahmoud Adly Ezzat 氏によるものです(詳細ブログ)。
コード
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
#define DS1307_I2C_ADDRESS 0x68
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
double fajr, sunRise, zuhr, asr, maghrib, isha;
byte decToBcd(byte val) { return (val / 10 * 16) + (val % 10); }
byte bcdToDec(byte val) { return (val / 16 * 10) + (val % 16); }
void getDateDs1307() {
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
second = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read() & 0x3f);
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
}
void printTime() {
getDateDs1307();
calcPrayerTimes(year, month, dayOfMonth, 39.8, 21.4, 3, -18.5, -19,
fajr, sunRise, zuhr, asr, maghrib, isha);
display.clearDisplay();
display.setCursor(0, 16);
display.print(Day[dayOfWeek]);
display.print(": ");
display.print(dayOfMonth); display.print("/");
display.print(month); display.print("/20"); display.println(year);
display.setCursor(18, 26);
display.print(hour); display.print(":");
display.print(minute); display.print(":"); display.println(second);
display.display();
delay(1000);
int h, m;
doubleToHrMin(fajr, h, m);
display.clearDisplay(); display.setCursor(1, 1);
display.print("Fajr "); display.print(h); display.print(":"); display.println(m);
// 以下、Zuhr, Asr, Maghrib, Isha も同様に表示...
delay(5000);
}
// 礼拝時刻計算関数群(degToRad, radToDeg, moreLess360, moreLess24,
// doubleToHrMin, calcPrayerTimes)はオリジナルコードを参照
回路図
Arduino UNO、DS1307、Nokia 5110 LCD の接続図。I²C(RTC)と SPI(LCD)でそれぞれ通信します。
製造プロセス
- Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
- Arduinoで作るレトロNumitron管時計:シンプル、信頼性高く、省エネ
- DIY Arduinoワードクロック – 文字で時刻を表示する洗練されたリアルタイムクロック
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- Arduino Dueと3.2インチTFTで作る温度監視付きリアルタイムクロック
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduino UNOで1.17インチTFT LCDに画像を表示する方法
- Arduino UNOとATtiny85で作る携帯型POV(残像)ディスプレイ
- DS1302 RTCとArduino UNOで作る信頼性の高い目覚まし時計
- Arduino Unoで25kHz 4ピンPWMファンを制御 – 製作・コード・テスト