Часы Arduino с исламским временем молитв
Компоненты и расходные материалы
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 |
Необходимые инструменты и машины
![]() |
| |||
![]() |
|
Приложения и онлайн-сервисы
![]() |
|
Об этом проекте
Это часы реального времени с возможностью показывать дату по григорианскому календарю и время ежедневных молитв. Для этой простой схемы нам нужно использовать Arduino UNO (или любую плату Arduino), RTC DS1307 и NOKIA 5110 LCD.
Купить запчасти можно здесь (партнерские ссылки):
- Arduino UNO
- DS1307
- ЖК-дисплей NOKIA 5110
Материалы
Arduino UNO
Arduino Uno - это плата микроконтроллера с открытым исходным кодом, основанная на микроконтроллере ATmega328P. Эта плата оснащена наборами аналоговых и цифровых GPIO (ввод / вывод общего назначения), которые могут быть подключены к различным датчикам, исполнительным механизмам, платам расширения и другим схемам.
Arduino UNO имеет:
- 14 цифровых входов / выходов (из которых 6 могут использоваться как выходы ШИМ)
- 6 аналоговых входов
- Керамический резонатор 16 МГц.
- 32 КБ флэш-памяти (0,5 КБ используется загрузчиком)
- 2 КБ SRAM
- 1 КБ EEPROM
- Разъем питания постоянного тока и порт USB
DS1307
Последовательные часы реального времени (RTC) DS1307 - это маломощные часы / календарь с полным двоично-десятичным кодированием (BCD).
Часы / календарь содержат информацию о секундах, минутах, часах, дне, дате, месяце и году. Дата конца месяца автоматически корректируется для месяцев, содержащих менее 31 дня, включая поправки на високосный год.
DS1307 работает в 24-часовом или 12-часовом формате с индикатором AM / PM. Он имеет встроенную схему измерения мощности, которая обнаруживает перебои в питании и автоматически переключается на питание от батареи.
Функция контактов DS1307
- VCC, GND: На эти контакты подается питание постоянного тока на устройство.
- SCL (последовательный тактовый вход): используется для синхронизации движения данных по последовательному интерфейсу.
- SDA (последовательный ввод / вывод данных): SDA - это контакт ввода / вывода для 2-проводного последовательного интерфейса. Вывод SDA - это открытый сток, для которого требуется внешний подтягивающий резистор.
- SQW / OUT (прямоугольная волна / выходной драйвер): Когда этот параметр включен, бит SQWE установлен в 1, вывод SQW / OUT выводит одну из четырех частот прямоугольной волны (1 Гц, 4 кГц, 8 кГц, 32 кГц). Вывод SQW / OUT имеет открытый сток и требует внешнего подтягивающего резистора. Он будет работать как с Vcc, так и с Vbat.
- X1, X2: Разъемы для стандартного кварцевого кристалла 32,768 кГц. Схема внутреннего генератора рассчитана на работу с кристаллом с указанной нагрузочной емкостью 12,5 пФ.
NOKIA 5110 ЖК-дисплей
Nokia 5110 LCD - это монохромный экран 84 * 48 пикселей, он оснащен подсветкой и может использоваться для рисования текста, графики или изображений. В ЖК-дисплее используется контроллер PCD8544 (тот же, что и в ЖК-дисплее Nokia 3310), этот контроллер взаимодействует с микроконтроллерами через интерфейс последовательной шины, аналогичный SPI.
Распиновка ЖК-дисплея Nokia 5110
- VCC, GND: На эти контакты подается питание постоянного тока на устройство.
- RST: он сбрасывает дисплей. Это активный низкий контакт. Вы также можете подключить этот вывод к сбросу Arduino, чтобы он автоматически сбрасывал экран.
- CE (Chip Enable): активный нижний вывод, это помогает выбрать одно из множества подключенных устройств, использующих одну и ту же шину SPI.
- D / C (данные / команда): он сообщает дисплею, получает ли он данные или отображает их. Сигнал HIGH предназначен для данных, а сигнал LOW - для команды.
- DIN: это вывод последовательных данных для интерфейса SPI, он будет отправлять данные с микроконтроллера на ЖК-дисплей.
- CLK (Часы): ЖК-экран и микроконтроллер потребуют общих часов для работы из-за их связи SPI. эта булавка поможет сделать это.
- BL (Подсветка): он управляет подсветкой дисплея. Вы можете регулировать его яркость, добавив потенциометр или подключив его к выводу Arduino с функцией ШИМ (выводы № 3, 5, 6, 9, 10 и 11).
Как редактировать программу?
Вам следует адаптировать строку 161 кода:
calcPrayerTimes (год, месяц, день месяца, 41.3, 20.6, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha);
Необходимые параметры:
- Долгота / Широта / Часовой пояс желаемого места.
- Фаджр Сумерки / Эша Сумерки различаются в расчетах от страны к стране.

Вы также можете получить географические координаты вашего города, такие как широта и долгота, которые необходимы программе для расчета времени молитвы, посетив веб-сайт IslamicFinder и затем выполнив поиск вашего города.

Как мы отмечаем на изображении выше, после того, как я искал город Каир, в дополнение к некоторой информации появилось время молитв. Для нас важны широта, долгота, угол Иша и угол Фаджра. Вы измените эти числа в программе, чтобы они соответствовали вашему городу.
Как работает программа?
Функция принимает данные года / месяца / дня / долготы / широты / часового пояса / FajrTwilight / IshaTwilight плюс 6 ссылок на двойные переменные (Fajr / SunRise / Zuhr / Asr / Maghrib / Isha). Эти 6 переменных - те, в которые нужно возвращать данные. есть также некоторые функции, которые помогают в некоторых преобразованиях чисел (например, радианы в градусы и наоборот).
Итак, если мы возьмем Каир в качестве примера:
- Долгота:30,2
- Широта:30
- Часовой пояс:+2
- Сумерки фаджр:-19,5
- Эша Сумерки:-17,5
Мы должны адаптировать строку 161 следующим образом:
calcPrayerTimes (год, месяц, день месяца, 30,2, 30, 2, -19,5, -17,5, фаджр, восход солнца, зухр, аср, магриб, иша);
Обратите внимание, что это время молитвы по-прежнему "двойное" и должно быть преобразовано в формат времени. Махмуд Адли Эззат создал функцию doubleToHrMin (вы можете найти ее перед функцией calcPrayerTimes), которая разбивает число на часы и минуты. Требуется двойная и две ссылки на переменные типа int.
Не забудьте опустить палец вверх, если сочтете это полезным .
P.S: Алгоритм расчета времени молитвы написан Махмудом Адли Эззатом. Вы можете прочитать об этом в его сообщении в блоге.
Код
- Часы Arduino с временем исламской молитвы
Часы Arduino с исламским временем молитвы Arduino
- Время молитвы на дисплее Nokia 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 =0; // сохранит время последнего обновления байт секунда, минута, час, dayOfWeek, dayOfMonth, month, year; long interval =200; int displayx, displayy, displayradius, x2, y2, x3, y3; int zero =0; char * Day [] ={"", "вс", "пн", "вт", "ср", "чт", "пт", "сб"}; двойной фаджр, восход солнца, зухр, аср, магриб, иша; // Преобразование обычных десятичных чисел в двоично-десятичные байты 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 ()); год =bcdToDec (Wire.read ());} void setDateDs1307 () {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (ноль); Wire.write (decToBcd (второй)); // от 0 до 7 запускает часы Wire.write (decToBcd (minute)); Wire.write (decToBcd (час)); // для 12 часов утра / вечера необходимо установить бит 6 (также необходимо изменить readDateDs1307) Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (месяц)); Wire.write (decToBcd (год)); Wire.endTransmission ();} void printTime () {int часы, минуты; char s [12]; display.clearDisplay (); display.setCursor (0, 16); display.print (День [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 (год / 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 (второй / 10 + 0x30)); display.print (char (второй% 10 + 0x30)); display.display (); задержка (1000); doubleToHrMin (фаджр, часы, минуты); display.clearDisplay (); display.setCursor (1, 1); display.print («Фаджр»); display.print (часы); display.print (":"); display.print (минуты); display.display (); doubleToHrMin (zuhr, часы, минуты); display.setCursor (1, 10); display.print («Зухр»); display.print (часы); display.print (":"); display.print (минуты); display.display (); doubleToHrMin (asr, часы, минуты); display.setCursor (1, 20); display.print («Аср»); display.print (часы); display.print (":"); display.print (минуты); display.display (); doubleToHrMin (магриб, часы, минуты); display.setCursor (1, 30); display.print («Магриб»); display.print (часы); display.print (":"); display.print (минуты); display.display (); doubleToHrMin (isha, часы, минуты); display.setCursor (1, 40); display.print («Иша»); display.print (часы); display.print (":"); display.print (минуты); display.display (); задержка (5000);} установка void () {Wire.begin (); display.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 («Хатем»); display.display (); задержка (500); display.setCursor (24, 28); display.print («ЗЕХИР»); display.display (); задержка (500); getDateDs1307 ();} недействительный цикл () {getDateDs1307 (); calcPrayerTimes (год, месяц, день месяца, 39.8, 21.4, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); // год, месяц, день, долгота, широта, часовой пояс, Fajr Twilight, Esha Twilight unsigned long currentMillis =millis (); если (текущийМиллис - предыдущийМиллис> интервал) {предыдущийМиллис =текущийМиллис; // getDateDs1307 (); printTime (); }} / * ---------------------------------------------- --------------------------------------- * /// ВРЕМЯ МОЛИТВЫ (Махмуд Адли Эззат , Cairo) // конвертируем градус в двойной градус в градус (двойной градус) {return ((3.1415926 / 180) * градус);} // конвертируем радиан в градус двойной радТоДег (двойной радиан) {return (радиан * (180 / 3.1415926)); } // убедитесь, что значение находится в диапазоне от 0 до 360double moreLess360 (double value) {while (value> 360 || value <0) {if (value> 360) value - =360; иначе, если (значение <0) значение + =360; } return value;} // убедитесь, что значение находится в диапазоне от 0 до 24double moreLess24 (double value) {while (value> 24 || value <0) {if (value> 24) value - =24; иначе, если (значение <0) значение + =24; } return value;} // преобразовываем двойное число в часы и минутыvoid doubleToHrMin (double number, int &hours, int &minutes) {hours =floor (moreLess24 (number)); minutes =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 * год) - ((год + (int) ((месяц + 9) / 12)) * 7/4) + (((int) (275 * месяц / 9)) + день - 730531,5); двойной L =280,461 + 0,9856474 * D; L =более менее 360 (L); двойной M =357,528 + (0,9856003) * D; M =более менее 360 (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))))); Альфа =больше Меньше360 (Альфа); Альфа =Альфа - (360 * (int) (Альфа / 360)); Альфа =Альфа + 90 * (этаж (Лямбда / 90) - этаж (Альфа / 90)); двойной СТ =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 (широта))) / (cos (degToRad (Dec)) * cos (degToRad (широта)) ))); двойной полдень =Альфа - СТ; Полдень =больше Меньше360 (Полдень); double UT_Noon =Полдень - долгота; //////////////////////////////////////////// // Расчет дуг времени молитв &Времена // ////////////////////////////////////////// // 2) Zuhr Time [местный полдень] zuhrTime =UT_Noon / 15 + timeZone; // Аср Ханафи // double Asr_Alt =radToDeg (atan (2 + tan (degToRad (широта - Dec)))); double Asr_Alt =radToDeg (atan (1,7 + tan (degToRad (широта - Dec)))); // Аср Шафии // 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 (широта))) / (cos (degToRad (Dec)) * cos (degToRad (широта) )))); Asr_Arc =Asr_Arc / 15; // 3) Asr Time asrTime =zuhrTime + Asr_Arc; // 1) Shorouq Time sunRiseTime =zuhrTime - (Durinal_Arc / 15); // 4) Время Магриба maghribTime =zuhrTime + (Durinal_Arc / 15); double Esha_Arc =radToDeg (acos ((sin (degToRad (ishaTwilight)) - sin (degToRad (Dec)) * sin (degToRad (широта))) / (cos (degToRad (Dec)) * cos (degToRad (широта))) )); // 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 (широта))))); fajrTime =zuhrTime - (Fajr_Arc / 15); return;}
Схема

Производственный процесс
- Часы видения Arduino pov
- Самодельные простейшие часы Numitron IV9 с Arduino
- Простые часы со словами (Arduino)
- Основные часы
- Управление монетоприемником с помощью Arduino
- Arduino Temp. Монитор и часы реального времени с дисплеем 3.2
- Arduino с Bluetooth для управления светодиодом!
- Отображение изображения на ЖК-экране TFT с помощью Arduino UNO!
- Простой будильник с DS1302 RTC
- 4-контактный ШИМ-контроль вентилятора, 25 кГц, с Arduino Uno