带有伊斯兰祈祷时间的 Arduino 时钟
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
|
应用和在线服务
|
关于这个项目
这是一个实时时钟,能够显示公历日期和每日祈祷时间。对于这个简单的电路,我们需要使用 Arduino UNO(或任何 Arduino 板)、RTC DS1307 和 NOKIA 5110 LCD。
您可以在这里购买零件(附属链接):
- Arduino UNO
- DS1307
- 诺基亚 5110 液晶显示屏
材料
Arduino UNO
Arduino Uno 是基于 ATmega328P 微控制器的开源微控制器板。该板配备多组模拟和数字GPIO(通用输入/输出),可与各种传感器、执行器、扩展板和其他电路接口。
Arduino UNO 具有:
- 14 个数字输入/输出引脚(其中 6 个可用作 PWM 输出)
- 6 个模拟输入
- 16 MHz 陶瓷谐振器
- 32 KB 闪存(引导加载程序使用 0.5 KB)
- 2 KB SRAM
- 1 KB EEPROM
- 直流电源插孔和 USB 端口
DS1307
DS1307 串行实时时钟 (RTC) 是一款低功耗、全二进制编码的十进制 (BCD) 时钟/日历。
时钟/日历提供秒、分、小时、日、日、月和年信息。对于少于 31 天的月份,月末日期会自动调整,包括闰年的更正。
DS1307 以 24 小时或 12 小时格式运行,带有 AM/PM 指示器。内置电源检测电路,可检测电源故障并自动切换至电池供电。
DS1307 引脚功能
- VCC、地: 直流电源通过这些引脚提供给设备。
- SCL(串行时钟输入): 用于同步串行接口上的数据移动。
- SDA(串行数据输入/输出): SDA 是 2 线串行接口的输入/输出引脚。 SDA 引脚为开漏,需要外部上拉电阻。
- SQW/OUT(方波/输出驱动器): 启用时,SQWE 位设置为 1,SQW/OUT 引脚输出四种方波频率之一(1Hz、4kHz、8kHz、32kHz)。 SQW/OUT 引脚是开漏引脚,需要外部上拉电阻。它将在应用 Vcc 或 Vbat 的情况下运行。
- X1、X2: 标准 32.768kHz 石英晶体的连接。内部振荡器电路设计用于使用指定负载电容为 12.5pF 的晶体
诺基亚 5110 液晶屏
诺基亚 5110 LCD 是一块 84*48 像素的单色屏幕,带有背光,可用于绘制文本、图形或图像。 LCD使用PCD8544控制器(与Nokia 3310 LCD相同),该控制器通过类似于SPI的串行总线接口连接到微控制器。
诺基亚 5110 LCD 引脚排列
- VCC、地: 直流电源通过这些引脚提供给设备。
- RST: 它重置显示。这是一个低电平有效引脚。您也可以将此引脚连接到 Arduino 重置,以便它会自动重置屏幕。
- CE (芯片启用): 低电平有效引脚,有助于选择共享同一 SPI 总线的众多连接设备之一。
- 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 的计算因国家/地区而异。
您还可以获得您所在城市的地理坐标,例如纬度和经度,通过访问伊斯兰搜索网站然后搜索您的城市,程序需要这些坐标来计算祈祷时间。
正如我们在上图中所注意到的,在我搜索开罗市后,除了一些信息外,还出现了祈祷时间。对我们来说重要的是纬度、经度、Isha 角和 Fajr 角,您将在程序中更改这些数字以适合您所在的城市。
该计划如何运作?
该函数采用年/月/日/经度/纬度/时区/FajrTwilight/IshaTwilight 的数据加上对双变量 (Fajr/SunRise/Zuhr/Asr/Maghrib/Isha) 的 6 个引用。这 6 个变量是返回数据的变量。还有一些函数可以帮助进行一些数字转换(例如,弧度到度数,反之亦然)。
所以,如果我们以开罗为例:
- 经度:30.2
- 纬度:30
- 时区:+2
- 黎明暮光:-19.5
- 艾莎暮光:-17.5
我们应该像这样调整第 161 行:
calcPrayerTimes(year, month, dayOfMonth, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha);
请注意,这些祈祷时间仍然是“双倍”,应转换为时间格式。 Mahmoud Adly Ezzat 制作了 doubleToHrMin 函数(您可以在 calcPrayerTimes 函数之前找到它),它将数字分成小时和分钟。它需要 double 和两个对 int 变量的引用。
如果觉得有用,请不要忘记点赞。
附: 祈祷时间计算算法由 Mahmoud Adly Ezzat 编写。您可以在他的博文中阅读更多相关信息。
代码
- 带有伊斯兰祈祷时间的 Arduino 时钟
带有伊斯兰祈祷时间的Arduino时钟Arduino
- Hatem Zehir 在诺基亚 5510/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地址long previousMillis =// 将存储上次更新时间byte second, 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"};双晨,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) );}// 从 ds1307 获取日期和时间并打印 resultvoid getDateDs1307(){ // 重置寄存器指针 Wire.beginTransmission(DS1307_I2C_ADDRESS); //Wire.write(0x00); Wire.write(零); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7);第二 =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(小时)); // 对于上午/下午 12 小时,需要设置第 6 位(也需要更改 readDateDs1307) Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission();}void printTime(){ int 小时,分钟;字符 [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(月/10 + 0x30)); display.print(char(月 % 10 + 0x30)); display.print("/"); display.print("20"); display.print(char(year / 10 + 0x30)); display.print(char(year % 10 + 0x30)); display.setCursor(18, 26); display.print(char(小时/10+0x30)); display.print( char( 小时 % 10 + 0x30) ); display.print(":"); display.print(字符(分钟/ 10 + 0x30)); display.print(char(分钟 % 10 + 0x30)); display.print(":"); display.print(char (second / 10 + 0x30)); display.print(char (second % 10 + 0x30));显示。显示();延迟(1000); doubleToHrMin(fajr, 小时, 分钟); display.clearDisplay(); display.setCursor(1, 1); display.print("黎明");显示。打印(小时); display.print(":");显示。打印(分钟);显示。显示(); doubleToHrMin(zuhr,小时,分钟); display.setCursor(1, 10); display.print("Zuhr");显示。打印(小时); display.print(":");显示。打印(分钟);显示。显示(); doubleToHrMin(asr, 小时, 分钟); display.setCursor(1, 20); display.print("Asr");显示。打印(小时); display.print(":");显示。打印(分钟);显示。显示(); doubleToHrMin(马格里布,小时,分钟); display.setCursor(1, 30); display.print("马格里布");显示。打印(小时); display.print(":");显示。打印(分钟);显示。显示(); doubleToHrMin(isha, 小时, 分钟); display.setCursor(1, 40); display.print("伊莎");显示。打印(小时); display.print(":");显示。打印(分钟);显示。显示();延迟(5000);}void setup(){Wire.begin();显示。开始(); display.clearDisplay(); display.setContrast(25); xegg =(display.width()) / 2; yegg =(display.height()) / 2; display.setTextColor(黑色); display.setTextSize(1); display.setCursor(22, 18); display.print("仇恨");显示。显示();延迟(500); display.setCursor(24, 28); display.print("ZEHIR");显示。显示();延迟(500); getDateDs1307();}void loop() { getDateDs1307(); calcPrayerTimes(year, month, dayOfMonth, 39.8, 21.4, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); // 年、月、日、经度、纬度、时区、黎明暮光之城、艾莎暮光之城 unsigned long currentMillis =millis(); if (currentMillis - previousMillis> interval) { previousMillis =currentMillis; //getDateDs1307();打印时间(); }}/*-------------------------------------------------------- ---------------------------------------*//// 祷告时间(作者:Mahmoud Adly Ezzat , Cairo)//将度数转换为弧度double degToRad(double degree){ return ((3.1415926 / 180) * degree);}//将弧度转换为度数double radToDeg(double radian){ return (radian * (180 / 3.1415926)); }//确保一个值在0和360之间double moreLess360(double value){ while (value> 360 || value <0) { if (value> 360) value -=360; else if (value <0) value +=360; } return value;}//确保一个值在0到24之间double moreLess24(double value){ while (value> 24 || value <0) { if (value> 24) value -=24; else if (value <0) value +=24; } return value;}//将双精度数转换为小时数和分钟数void doubleToHrMin(double number, int &hours, int &minutes){ hours =floor(moreLess24(number));分钟 =floor(moreLess24(number - hours) * 60);}void calcPrayerTimes(int year, int month, int day, double longitude, 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);双 Lambda =L + 1.915 * sin(degToRad(M)) + 0.02 * sin(degToRad(2 * M)); Lambda =moreLess360(Lambda);双倾角 =23.439 - 0.0000004 * D; double Alpha =radToDeg(atan((cos(degToRad(Obliquity)) * tan(degToRad(Lambda))))); Alpha =moreLess360(Alpha); Alpha =Alpha - (360 * (int)(Alpha / 360)); Alpha =Alpha + 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 =中午 - 经度; //////////////////////////////////////// // 计算祈祷时间弧&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 时间 sunRiseTime =zuhrTime - (Durinal_Arc / 15); // 4) 马格里布时间 马格里布时间 =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时间 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(纬度))))); fajrTime =zuhrTime - (Fajr_Arc / 15);返回;}
示意图
制造工艺