亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带有伊斯兰祈祷时间的 Arduino 时钟

组件和用品

Arduino UNO
× 1
诺基亚 5510 显示屏
× 1
Seeed Pi RTC (DS1307)
× 1

必要的工具和机器

优质公/公跳线,40 x 3"(75 毫米) )
面包板,400 针

应用和在线服务

Arduino IDE

关于这个项目

这是一个实时时钟,能够显示公历日期和每日祈祷时间。对于这个简单的电路,我们需要使用 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);返回;}

示意图


制造工艺

  1. Arduino pov 视觉时钟
  2. DIY 最简单的 IV9 Numitron 时钟与 Arduino
  3. 简单字时钟(Arduino)
  4. 主时钟
  5. 使用 Arduino 控制硬币接收器
  6. Arduino 温度。使用 3.2 显示的监视器和实时时钟
  7. Arduino 带蓝牙控制 LED!
  8. 使用 Arduino UNO 在 LCD TFT 屏幕上显示图像!
  9. 视觉的坚持
  10. 使用 Arduino Uno 控制 LED 矩阵
  11. 带 DS1302 RTC 的简单闹钟
  12. 25 kHz 4 Pin PWM 风扇控制与 Arduino Uno