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

イスラムの祈りの時間とArduino時計

コンポーネントと消耗品

>
Arduino UNO
× 1
Nokia 5510 display
× 1
Seeed Pi RTC(DS1307)
× 1

必要なツールとマシン

>
プレミアムオス/オスジャンパー線、40 x 3 "(75mm )
ブレッドボード、400ピン

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

>
Arduino IDE

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

これは、グレゴリオ暦の日付と毎日の祈りの時間を表示する機能を備えたリアルタイムクロックです。この単純な回路では、Arduino UNO(または任意のArduinoボード)、RTC DS1307、およびNOKIA 5110LCDを使用する必要があります。

ここでパーツを購入できます(アフィリエイトリンク):

  • Arduino UNO
  • DS1307
  • NOKIA 5110 LCD

材料

Arduino UNO

Arduino Unoは、ATmega328Pマイクロコントローラーをベースにしたオープンソースのマイクロコントローラーボードです。このボードには、さまざまなセンサー、アクチュエーター、拡張ボード、その他の回路に接続できるアナログおよびデジタルGPIO(汎用入力/出力)のセットが装備されています。

ArduinoUNOには次のものがあります:

  • 14個のデジタル入力/出力ピン(そのうち6個はPWM出力として使用できます)
  • 6つのアナログ入力
  • 16MHzセラミック共振子
  • 32 KBフラッシュメモリ(ブートローダーで使用される0.5 KB)
  • 2 KB SRAM
  • 1 KB EEPROM
  • DC電源ジャックとUSBポート

DS1307

DS1307シリアルリアルタイムクロック(RTC)は、低電力の完全な2進化10進数(BCD)クロック/カレンダーです。

時計/カレンダーは、秒、分、時間、日、日付、月、および年の情報を提供します。うるう年の修正を含め、31日未満の月の月末日は自動的に調整されます。

DS1307は、AM / PMインジケータを備えた24時間形式または12時間形式のいずれかで動作します。停電を検出し、自動的にバッテリー電源に切り替えるパワーセンス回路が組み込まれています。

DS1307のピン機能

  • VCC、GND: これらのピンでデバイスにDC電源が供給されます。
  • SCL(シリアルクロック入力): シリアルインターフェースでのデータ移動を同期するために使用されます。
  • SDA(シリアルデータ入力/出力): SDAは、2線式シリアルインターフェースの入力/出力ピンです。 SDAピンはオープンドレインであり、外部プルアップ抵抗が必要です。
  • SQW / OUT(方形波/出力ドライバー): 有効にすると、SQWEビットが1に設定され、SQW / OUTピンは4つの方形波周波数(1Hz、4kHz、8kHz、32kHz)のいずれかを出力します。 SQW / OUTピンはオープンドレインであり、外部プルアップ抵抗が必要です。 VccまたはVbatのいずれかを適用して動作します。
  • X1、X2: 標準の32.768kHz水晶振動子の接続。内部発振器回路は、12.5pFの指定された負荷容量を持つ水晶で動作するように設計されています

NOKIA 5110 LCD

Nokia 5110LCDは84 * 48ピクセルのモノクロ画面で、バックライトが付いており、テキスト、グラフィックス、または画像の描画に使用できます。 LCDはPCD8544コントローラー(Nokia 3310 LCDで使用されているものと同じ)を使用します。このコントローラーは、SPIと同様のシリアルバスインターフェイスを介してマイクロコントローラーに接続します。

Nokia 5110LCDピン配列

  • VCC、GND: これらのピンでデバイスにDC電源が供給されます。
  • RST: 表示をリセットします。アクティブなローピンです。このピンをArduinoリセットに接続して、画面を自動的にリセットすることもできます。
  • CE (チップ有効化): アクティブなLowピンの場合、同じSPIバスを共有する多くの接続されたデバイスの1つを選択するのに役立ちます。
  • D / C(データ/コマンド): データを受信して​​いるか表示しているかをディスプレイに通知します。 HIGH信号はデータ用で、LOW信号はコマンド用です。
  • DIN: これはSPIインターフェースのシリアルデータピンであり、マイクロコントローラーからLCDにデータを送信します。
  • CLK(クロック): LCDとマイクロコントローラは、SPI通信のため、動作するために共通のクロックを必要とします。このピンはそれを作るのに役立ちます。
  • BL(バックライト): ディスプレイのバックライトを制御します。ポテンショメータを追加するか、PWM対応のArduinoピン(ピン番号3、5、6、9、10、11)に接続することで、明るさを制御できます。

プログラムを編集する方法は?

コードの161行目を適応させる必要があります:

  calcPrayerTimes(year、month、dayOfMonth、41.3、20.6、3、-18.5、-19、fajr、sunRise、zuhr、asr、maghrib、isha);  

必要なパラメータは次のとおりです。

  • 目的の場所の経度/緯度/タイムゾーン。
  • Fajr Twilight / Esha Twilightは、国によって計算が異なります。
<図>

また、IslamicFinder Webサイトにアクセスして都市を検索することにより、プログラムが祈りの時間を計算するために必要な緯度や経度などの都市の地理座標を取得することもできます。

<図>

上の画像でわかるように、カイロの街を検索した後、いくつかの情報に加えて祈りの時間が表示されました。私たちにとって重要なのは、緯度、経度、イシャ角、ファジル角です。プログラムでこれらの数値を都市に合わせて変更します。

プログラムはどのように機能しますか?

この関数は、年/月/日/経度/緯度/ TimeZone / FajrTwilight / IshaTwilightのデータに加えて、二重変数(Fajr / SunRise / Zuhr / Asr / Maghrib / Isha)への6つの参照を取得します。これらの6つの変数は、データを返す変数です。いくつかの数値変換に役立つ関数もいくつかあります(たとえば、ラジアンから度へ、またはその逆)。

したがって、カイロを例にとると:

  • 経度:30.2
  • 緯度:30
  • タイムゾーン:+2
  • Fajr Twilight:-19.5
  • エシャトワイライト:-17.5

161行目を次のように調整する必要があります:

  calcPrayerTimes(year、month、dayOfMonth、30.2、30、2、-19.5、-17.5、fajr、sunRise、zuhr、asr、maghrib、isha);  

これらの祈りの時間はまだ「2倍」であり、時間形式に変換する必要があることに注意してください。 Mahmoud Adly Ezzatは、数値を時間と分に分割するdoubleToHrMin関数(calcPrayerTimes関数の前にあります)を作成しました。 int変数へのdoubleと2つの参照が必要です。

便利だと思ったら、親指を立てるのを忘れないでください。

追記: 祈りの時間の計算アルゴリズムは、Mahmoud AdlyEzzatによって作成されました。詳細については、彼のブログ投稿をご覧ください。

コード

  • イスラムの祈りの時間のあるArduino時計
イスラムの祈りの時間を持つArduino時計 Arduino
--HatemZehirによるNokia5510 / 3310ディスプレイでの祈りの時間
-祈りの時間の計算は、http://3adly.blogspot.com/2010/07/prayer-times-calculations-pure-c-code.html
 #include "Wire.h" #include からのものです。 #include  Adafruit_PCD8544 display =Adafruit_PCD8544(7、6、5、4、3); int xegg、yegg; #define DS1307_I2C_ADDRESS 0x68 //これはI2CアドレスですlongpreviousMillis =0; //最後に更新された時刻を保存しますbytesecond、minute、hour、dayOfWeek、dayOfMonth、month、year; long interval =200; int displayx、displayy、displayradius、x2、y2、x3、y3; int zero =0; char * Day [] ={""、 "Sun"、 "Mon"、 "Tue"、 "Wed"、 "Thu"、 "Fri"、 "Sat"}; double fajr、sunRise、zuhr、asr、maghrib、isha; //通常の10進数を2進化10進数に変換するdecToBcd(byte val){return((val / 10 * 16)+(val%10));} // 2進化10進数を通常の10進数に変換するbytebcdToDec(byte val){ return((val / 16 * 10)+(val%16));} // ds1307から日付と時刻を取得し、resultvoid getDateDs1307(){//レジスタポインタをリセットしますWire.beginTransmission(DS1307_I2C_ADDRESS); //Wire.write(0x00); Wire.write(ゼロ); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS、7); 2番目=bcdToDec(Wire.read()&0x7f);分=bcdToDec(Wire.read());時間=bcdToDec(Wire.read()&0x3f); dayOfWeek =bcdToDec(Wire.read()); dayOfMonth =bcdToDec(Wire.read());月=bcdToDec(Wire.read()); year =bcdToDec(Wire.read());} void setDateDs1307(){Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(ゼロ); Wire.write(decToBcd(second)); // 0からビット7は、クロックを開始しますWire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); //午前/午後12時間、ビット6を設定する必要があります(readDateDs1307も変更する必要があります)Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission();} void printTime(){int hours、minutes; char s [12]; display.clearDisplay(); display.setCursor(0、16); display.print(Day [dayOfWeek]); display.print( ":"); display.print(char(dayOfMonth / 10 + 0x30)); display.print(char(dayOfMonth%10 + 0x30)); display.print( "/"); display.print(char(month / 10 + 0x30)); display.print(char(month%10 + 0x30)); display.print( "/"); display.print( "20"); display.print(char(year / 10 + 0x30)); display.print(char(年%10 + 0x30)); display.setCursor(18、26); display.print(char(時間/ 10 + 0x30)); display.print(char(時間%10 + 0x30)); display.print( ":"); display.print(char(分/ 10 + 0x30)); display.print(char(分%10 + 0x30)); display.print( ":"); display.print(char(second / 10 + 0x30)); display.print(char(second%10 + 0x30)); display.display(); delay(1000); doubleToHrMin(fajr、時間、分); display.clearDisplay(); display.setCursor(1、1); display.print( "Fajr"); display.print(hours); display.print( ":"); display.print(minutes); display.display(); doubleToHrMin(zuhr、時間、分); display.setCursor(1、10); display.print( "Zuhr"); display.print(hours); display.print( ":"); display.print(minutes); display.display(); doubleToHrMin(asr、時間、分); display.setCursor(1、20); display.print( "Asr"); display.print(hours); display.print( ":"); display.print(minutes); display.display(); doubleToHrMin(マグリブ、時間、分); display.setCursor(1、30); display.print( "Maghrib"); display.print(hours); display.print( ":"); display.print(minutes); display.display(); doubleToHrMin(isha、時間、分); display.setCursor(1、40); display.print( "Isha"); display.print(hours); display.print( ":"); display.print(minutes); display.display(); delay(5000);} void setup(){Wire.begin(); display.begin(); display.clearDisplay(); display.setContrast(25); xegg =(display.width())/ 2; yegg =(display.height())/ 2; display.setTextColor(BLACK); display.setTextSize(1); display.setCursor(22、18); display.print( "Hatem"); display.display(); delay(500); display.setCursor(24、28); display.print( "ZEHIR"); display.display(); delay(500); getDateDs1307();} void loop(){getDateDs1307(); calcPrayerTimes(year、month、dayOfMonth、39.8、21.4、3、-18.5、-19、fajr、sunRise、zuhr、asr、maghrib、isha); //年、月、日、経度、緯度、タイムゾーン、Fajr Twilight、Esha Twilight unsigned long currentMillis =millis(); if(currentMillis-previousMillis>インターバル){previousMillis =currentMillis; // getDateDs1307(); printTime(); }} / * ---------------------------------------------- --------------------------------------- * /// PRAYER TIME(by Mahmoud Adly Ezzat 、カイロ)//度をラジアンに変換double degToRad(doubledegree){return((3.1415926 / 180)* degree);} //ラジアンをDegreedoubleに変換radToDeg(double radian){return(radian *(180 / 3.1415926)); } //値が0から360の間であることを確認してくださいdoublemoreLess360(double value){while(value> 360 || value <0){if(value> 360)value- =360; else if(value <0)value + =360; }戻り値;} //値が0から24の間であることを確認してくださいdoublemoreLess24(double value){while(value> 24 || value <0){if(value> 24)value- =24; else if(value <0)value + =24; }戻り値;} // doubleの数値を時間と分に変換するvoiddoubleToHrMin(double number、int&hours、int&minutes){hours =floor(moreLess24(number)); minutes =floor(moreLess24(number-hours)* 60);} void calcPrayerTimes(int year、int month、int day、doublelongitude、double Latitude、int timeZone、double fajrTwilight、double ishaTwilight、double&fajrTime、double&sunRiseTime、double&zuhrTime 、double&asrTime、double&maghribTime、double&ishaTime){double D =(367 * year)-((year +(int)((month + 9)/ 12))* 7/4)+(((int)(275 *月/ 9))+日-730531.5);ダブルL =280.461 + 0.9856474 * D; L =moreLess360(L);ダブルM =357.528 +(0.9856003)* D; M =moreLess360(M);ダブルラムダ=L + 1.915 * sin(degToRad(M))+ 0.02 * sin(degToRad(2 * M));ラムダ=moreLess360(ラムダ);二重傾斜角=23.439-0.0000004 * D; double Alpha =radToDeg(atan((cos(degToRad(Obliquity))* tan(degToRad(Lambda)))));アルファ=moreLess360(アルファ);アルファ=アルファ-(360 *(int)(Alpha / 360));アルファ=アルファ+90 *(floor(Lambda / 90)-floor(Alpha / 90));ダブルST =100.46 + 0.985647352 * D; double Dec =radToDeg(asin(sin(degToRad(Obliquity))* sin(degToRad(Lambda)))); double Durinal_Arc =radToDeg(acos((sin(degToRad(-0.8333))-sin(degToRad(Dec))* sin(degToRad(latitude)))/(cos(degToRad(Dec))* cos(degToRad(latitude)) )));ダブル正午=アルファ-ST;正午=moreLess360(正午); double UT_Noon =Noon-経度; ////////////////////////////////////////////////祈りの時間アークの計算&Times // ////////////////////////////////////////// // 2) Zuhr Time [現地正午] zuhrTime =UT_Noon / 15 + timeZone; // Asr Hanafi // double Asr_Alt =radToDeg(atan(2 + tan(degToRad(latitude-Dec)))); double Asr_Alt =radToDeg(atan(1.7 + tan(degToRad(latitude-Dec)))); // Asr Shafii // double Asr_Alt =radToDeg(atan(1 + tan(degToRad(latitude --Dec)))); double Asr_Arc =radToDeg(acos((sin(degToRad(90-Asr_Alt))-sin(degToRad(Dec))* sin(degToRad(latitude)))/(cos(degToRad(Dec))* cos(degToRad(latitude) )))); Asr_Arc =Asr_Arc / 15; // 3)Asr Time asrTime =zuhrTime + Asr_Arc; // 1)Shorouq Time sunRiseTime =zuhrTime-(Durinal_Arc / 15); // 4)Maghrib Time maghribTime =zuhrTime +(Durinal_Arc / 15); double Esha_Arc =radToDeg(acos((sin(degToRad(ishaTwilight))-sin(degToRad(Dec))* sin(degToRad(latitude)))/(cos(degToRad(Dec))* cos(degToRad(latitude))) )); // 5)Isha Time ishaTime =zuhrTime +(Esha_Arc / 15); // 0)Fajr Time double Fajr_Arc =radToDeg(acos((sin(degToRad(fajrTwilight))-sin(degToRad(Dec))* sin(degToRad(latitude)))/(cos(degToRad(Dec))* cos( degToRad(latitude))))); fajrTime =zuhrTime-(Fajr_Arc / 15); return;} 

回路図


製造プロセス

  1. Arduinoハメ撮りビジョンクロック
  2. Arduinoを使用したDIYの最もシンプルなIV9Numitron時計
  3. Simple Word Clock(Arduino)
  4. マスタークロック
  5. Arduinoでコインアクセプターを制御する
  6. ArduinoTemp。 3.2ディスプレイを備えたモニターとリアルタイムクロック
  7. LEDを制御するBluetoothを搭載したArduino!
  8. Arduino UNOを使用してLCDTFTスクリーンに画像を表示する!
  9. 視覚の持続性
  10. DS1302RTCを備えたシンプルな目覚まし時計
  11. ArduinoUnoを使用した25kHz4ピンPWMファン制御