自制 Arduino 伊斯兰祷告时间实时时钟
零部件与物料
| Arduino UNO | ×1 |
| Nokia 5110 显示屏 (PCD8544) | ×1 |
| DS1307 实时时钟模块 (Seeed Pi RTC) | ×1 |
所需工具与设备
- 面包板 400 点
- 公对公跳线
应用与在线服务
- Arduino IDE
项目简介
本项目实现一个可显示公历日期与每日伊斯兰祷告时间的实时时钟。核心硬件为 Arduino UNO、DS1307 RTC 模块与 Nokia 5110 LCD。
主要元件介绍
Arduino UNO
基于 ATmega328P 的开源单片机板,提供 14 个数字 I/O(6 路 PWM)、6 个模拟输入、16 MHz 主频、32 KB Flash、2 KB SRAM、1 KB EEPROM。
DS1307 RTC
低功耗全二进制编码十进制 (BCD) 时钟/日历,提供秒、分、时、日、月、年信息,自动调整月份天数与闰年。支持 24/12 小时制,内置掉电检测自动切换备用电池。通过 I2C 接口 (SCL/SDA) 通信,需外接上拉电阻。
Nokia 5110 LCD
84×48 像素单色屏,带背光,采用 PCD8544 控制器,类 SPI 接口。引脚包括 VCC/GND、RST(复位)、CE(片选)、D/C(数据/命令)、DIN(数据输入)、CLK(时钟)、BL(背光控制,可接 PWM 引脚调光)。
程序配置方法
需修改代码第 161 行的 calcPrayerTimes() 参数:
calcPrayerTimes(year, month, day, 经度, 纬度, 时区, Fajr黄昏角, Isha黄昏角, ...);
可通过 IslamicFinder 查询所在城市的经纬度、Fajr 与 Isha 角度。以开罗为例:
- 经度:30.2
- 纬度:30
- 时区:+2
- Fajr 角度:-19.5
- Isha 角度:-17.5
对应代码修改为:
calcPrayerTimes(year, month, dayOfMonth, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha);
计算结果为 double 类型,需用 doubleToHrMin() 转换为时/分。
程序工作原理
算法基于天文学计算:通过儒略日计算太阳视黄经、赤道倾角、恒星时等,推导出各祷告时刻的时角,再转换为当地时间。核心函数 calcPrayerTimes() 由 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;
char *Day[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup() {
Wire.begin();
display.begin();
display.setContrast(25);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(BLACK);
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);
static unsigned long prev = 0;
if (millis() - prev > 200) {
prev = millis();
printTime();
}
}
// 包含 BCD 转换、RTC 读写、双精度转时分、祷告时间核心算法等函数
// 详见原文完整代码
原理图
电路连接:DS1307 SDA→A4, SCL→A5;Nokia 5110 接 D3~D7;共用 5V/GND。
制造工艺
- Arduino POV 时钟:自制视觉暂留 LED 显示器
- 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
- DIY Arduino单词时钟 – 极简优雅的实时文字显示
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- Arduino UNO 驱动 1.17 英寸 TFT 屏显示图片 (SD 卡读取)
- 自制便携式视觉暂留显示器:Arduino UNO 与 ATtiny85
- Arduino Uno驱动MAX7219级联8×8 LED矩阵:从入门到动画显示
- 用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟
- Arduino Uno 控制 25kHz 4 针 PWM 风扇 - 硬件、代码与测试