Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Часы Arduino с исламским временем молитв

Компоненты и расходные материалы

Arduino UNO
× 1
Дисплей Nokia 5510
× 1
Seeed Pi RTC (DS1307)
× 1

Необходимые инструменты и машины

Штекерные / штекерные перемычки премиум-класса, 40 x 3 дюйма (75 мм )
Макет, вывод 400

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Это часы реального времени с возможностью показывать дату по григорианскому календарю и время ежедневных молитв. Для этой простой схемы нам нужно использовать 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;} 

Схема


Производственный процесс

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