Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Arduino
120min
Share

مشروع المؤذن الآلي باستخدام الأردوينو

مع التطور المستمر في التكنولوجيا وتطبيقاتها في حياتنا اليومية، أصبح من الممكن تسخير الأنظمة الذكية لتسهيل المهام وتوفير حلول مبتكرة. مشروع المؤذن الآلي باستخدام الأردوينو هو أحد هذه المشاريع التي تهدف إلى دمج التكنولوجيا مع احتياجات المجتمع.

Project Video

Overview

في هذا المشروع، سوف نقوم ببناء دائرة تعمل كمؤذن آلي في المساجد ودور العبادة، حيث عندما يحين وقت الصلاة، تقوم بإطلاق صوت أذان (مسجل مسبقًا) عبر السماعة لتنبيه السامعين. استخدمنا موديول RTC مع الأردوينو حتى يعرف الأردوينو الوقت بدقة من خلاله، كما استخدمنا موديول MP3 لقراءة الملفات الصوتية من بطاقة الذاكرة.

Getting the Items

Arduino Uno R3 (Voltaat Version)
Get Item
DFPlayer Mini Mp3 Player Module
Get Item
Real Time Clock Memory Module - DS3231
Get Item
4R 3W Speaker
Get Item
2×16 LCD with I2C Module
Get Item
1/4 Watt Resistor (20 Pack)
Get Item
Half-size Breadboard
Get Item
Jumper Wires - Male to Male (40 Pack)
Get Item
Jumper Wires – Male to Female (40 Pack)
Get Item

Steps

في البداية، قم بإحضار بطاقة ذاكرة، ومن ثم قم بتهيئتها، (مسح البيانات المخزنة عليها). بعد ذلك، قم بتحميل ملف صوت الأذان من المصادر في الأسفل، وقم بنسخه في بطاقة الذاكرة، ثم قم بإخراجها من الحاسوب ووضعها في موديول MP3.

Wiring it Up

قم بتوصيل الأسلاك بين موديول MP3، وموديول RTC، والشاشة الكريستالية، ولوحة الأردوينو كما هو موضح في الصورة أدناه.

التوصيلات من الاردوينو الى لوحة التجارب  :

•  منفذ ال 5 فولت ← المنافذ الموجبة بلوحة التجارب

•  منفذ الجراوند ← المنافذ السالبة بلوحة التجارب

التوصيلات من موديول الRTC :

•  المنفذ الموجب من موديول الRTC ← المنافذ الموجبة بلوحة التجارب

•  المنفذ السالب من موديول الRTC ← المنافذ السالبة في لوحة التجارب

•  منفذ SDA من موديول الRTC ← منفذ رقم A4 في لوحة الأردوينو

•  منفذ SCL من موديول الRTC ← منفذ رقم A5 في لوحة الأردوينو

التوصيلات من موديول الMP3 :

• منفذ الVCC من موديول الMP3 ← المنافذ الموجبة بلوحة التجارب

• منفذ الGND من موديول الMP3 ← المنافذ السالبة في لوحة التجارب

• منفذ الTX من موديول الMP3 ← منفذ رقم 10 في لوحة الأردوينو

• منفذ الRX من موديول الMP3 ← الطرف الأوسط بين المقاومة 1 كيلو أوم والمقاومة 680 أوم

•  الطرف الأول للمقاومة 1 كيلو أوم ← المنافذ السالبة بلوحة التجارب

•  الطرف الأخر للمقاومة 680 أوم ← منفذ رقم 11 في لوحة الأردوينو

• منفذ الSPK_1 من موديول الMP3 ← الطرف الأول من السماعة

• المنفذ SPK_2 من موديول الMP3 ← الطرف الثانى من السماعة

التوصيلات من الشاشة الكريستالية:

• المنفذ الموجب للشاشة الكريستالية ← المنافذ الموجبة بلوحة التجارب

• المنفذ السالب للشاشة الكريستالية ← المنافذ السالبة بلوحة التجارب

• المنفذ SCL للشاشة الكريستالية ← منفذ رقم A5 فى لوحة الاردوينو

• المنفذ SDA للشاشة الكريستالية ← منفذ رقم A4 فى لوحة الاردوينو

Coding

في البداية، قم بتحميل الكود البرمجي الأول الخاص بإعداد الوقت والتاريخ، ثم افتح الشاشة التسلسلية واختر معدل نقل البيانات 57600. تأكد من أن بيانات الوقت والتاريخ تُطبع بشكل صحيح على الشاشة التسلسلية، ثم ارفع الكود البرمجي الخاص بالمؤذن الآلي إلى لوحة الأردوينو.

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib

#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

  Serial.begin(57600);

#ifndef ESP8266

  while (!Serial); // wait for serial port to connect. Needed for native USB

#endif

  if (! rtc.begin()) {

    Serial.println("Couldn't find RTC");

    Serial.flush();

    while (1) delay(10);

  }

  if (rtc.lostPower()) {

    Serial.println("RTC lost power, let's set the time!");

    // When time needs to be set on a new device, or after a power loss, the

    // following line sets the RTC to the date & time this sketch was compiled

    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    // This line sets the RTC with an explicit date & time, for example to set

    // January 21, 2014 at 3am you would call:

    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

  }

  // When time needs to be re-set on a previously configured device, the

  // following line sets the RTC to the date & time this sketch was compiled

  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  // This line sets the RTC with an explicit date & time, for example to set

  // January 21, 2014 at 3am you would call:

  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

}

void loop () {

 

    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    DateTime now = rtc.now();

    Serial.print(now.year(), DEC);

    Serial.print('/');

    Serial.print(now.month(), DEC);

    Serial.print('/');

    Serial.print(now.day(), DEC);

    Serial.print(" (");

    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);

    Serial.print(") ");

    Serial.print(now.hour(), DEC);

    Serial.print(':');

    Serial.print(now.minute(), DEC);

    Serial.print(':');

    Serial.print(now.second(), DEC);

    Serial.println();

    Serial.print(" since midnight 1/1/1970 = ");

    Serial.print(now.unixtime());

    Serial.print("s = ");

    Serial.print(now.unixtime() / 86400L);

    Serial.println("d");

    // calculate a date which is 7 days, 12 hours, 30 minutes, 6 seconds into the future

    DateTime future (now + TimeSpan(7,12,30,6));

    Serial.print(" now + 7d + 12h + 30m + 6s: ");

    Serial.print(future.year(), DEC);

    Serial.print('/');

    Serial.print(future.month(), DEC);

    Serial.print('/');

    Serial.print(future.day(), DEC);

    Serial.print(' ');

    Serial.print(future.hour(), DEC);

    Serial.print(':');

    Serial.print(future.minute(), DEC);

    Serial.print(':');

    Serial.print(future.second(), DEC);

    Serial.println();

    Serial.print("Temperature: ");

    Serial.print(rtc.getTemperature());

    Serial.println(" C");

    Serial.println();

    delay(3000);

}

/*

‍Voltaat learn (http://learn.voltaat.com)

Tutorial: Automated muezzin project using Arduino!

Connections from the Arduino to the breadboard:

• Arduino 5v pin → breadboard 5v line

• Arduino GND pin → breadboard GND line

Connections from the MP3 Module:

• VCC pin of the MP3 module → breadboard 5v line

• GND pin of the MP3 module → breadboard GND line

• TX pin of the MP3 module → Arduino pin 10

• RX pin of the MP3 module → The middle pin between the 1 kΩ resistor and the 680 Ω resistor

• First pin of the 1 kΩ resistor → Negative pins on the breadboard

• Other pin of the 680 Ω resistor → Arduino pin 11

• SPK_1 pin of the MP3 module → First terminal of the speaker

• SPK_2 pin of the MP3 module → Second terminal of the speaker

Connections from the RTC Module:

• VCC pin of the RTC module → breadboard 5v line

• GND pin pin of the RTC module → breadboard GND line

• SDA pin of the RTC module → Arduino pin A4

• SCL pin of the RTC module → Arduino pin A5

Connections from the LCD:

• I2C module GND pin → Breadboard GND line

• I2C module 5V pin → breadboard GND line

• I2C module SDA pin → Arduino pin A4

• I2C module SCL pin → Arduino pin A5

*/

#include <RTClib.h>

#include <LiquidCrystal_I2C.h>

#include "DFRobotDFPlayerMini.h"

#include <SoftwareSerial.h>

// Initialize RTC and I2C LCD

RTC_DS3231 rtc; // Using RTC_DS3231 from RTCLib

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address (0x27 is common, check yours)

const char* Elfajr = "04:34AM";

const char* Eldhuhr = "11:21AM";

const char* Elasr = "02:25PM";

const char* Elmaghrib = "04:45PM";

const char* Elisha   = "06:15PM";

// Fixed alarm times and corresponding names

const char* alarmTimes[5] = {Elfajr, Eldhuhr, Elasr, Elmaghrib, Elisha};

const char* alarmNames[5] = {"Elfajr", "Eldhuhr", "Elasr", "Elmaghrib", "Elisha"};

// DFRobotDFPlayer Mini setup

SoftwareSerial mySerial(10, 11); // RX, TX

DFRobotDFPlayerMini myDFPlayer;

// To track if an alarm was already triggered for the current minute

bool alarmTriggered = false;

const char* currentAlarmName = nullptr;

void setup() {

  // Initialize RTC

  if (!rtc.begin()) {

    lcd.init();

    lcd.backlight();

    lcd.print("RTC Error");

    while (1); // Halt if RTC is not connected

  }

  // Initialize LCD

  lcd.init();

  lcd.backlight();

  lcd.print("Initializing...");

  delay(2000);

  lcd.clear();

  // Initialize DFRobotDFPlayer Mini

  mySerial.begin(9600); // Communication with DFPlayer Mini

  if (!myDFPlayer.begin(mySerial)) {

    lcd.print("DFPlayer Error");

    while (1); // Halt if DFPlayer Mini is not connected

  }

  myDFPlayer.volume(20); // Set volume (0 to 30)

  lcd.print("System Ready");

  delay(2000);

  lcd.clear();

}

void loop() {

  // Get the current time

  DateTime now = rtc.now();

  // Convert to 12-hour format

  int hour12 = now.hour() % 12;

  if (hour12 == 0) hour12 = 12; // Adjust for 12-hour clock

  const char* meridiem = now.hour() >= 12 ? "PM" : "AM";

  // Display time and date in 12-hour format on the first line

  lcd.setCursor(0, 0);

  if (now.day() < 10) lcd.print("0"); // Leading zero for day

  lcd.print(now.day(), DEC);

  lcd.print("/");

  if (now.month() < 10) lcd.print("0"); // Leading zero for month

  lcd.print(now.month(), DEC);

  lcd.print("/");

  lcd.print(now.year(), DEC);

  lcd.print(" ");

  if (hour12 < 10) lcd.print("0"); // Leading zero for hour

  lcd.print(hour12, DEC);

  lcd.print(":");

  if (now.minute() < 10) lcd.print("0"); // Leading zero for minute

  lcd.print(now.minute(), DEC);

  lcd.print(meridiem);

  // Check if it's time to trigger any alarm

  int alarmIndex = getAlarmIndex(hour12, now.minute(), meridiem);

  if (alarmIndex != -1 && !alarmTriggered) {

    currentAlarmName = alarmNames[alarmIndex];

    playSong();

    alarmTriggered = true; // Avoid retriggering in the same minute

  }

  // Display alarm name on the second line if active

  if (currentAlarmName != nullptr) {

  lcd.setCursor(4, 1);

    lcd.print(currentAlarmName);

  } else {

    lcd.setCursor(0, 1);

    lcd.print("                "); // Clear the second line

  }

  // Reset alarm trigger flag after the minute changes

  if (alarmIndex == -1) {

    alarmTriggered = false;

    currentAlarmName = nullptr;

  }

  delay(1000);

}

// Function to get the index of the current alarm

int getAlarmIndex(int currentHour12, int currentMinute, const char* currentMeridiem) {

  char currentTime[8];

  sprintf(currentTime, "%02d:%02d%s", currentHour12, currentMinute, currentMeridiem);

  for (int i = 0; i < 5; i++) {

    if (strcmp(currentTime, alarmTimes[i]) == 0) {

      return i;

    }

  }

  return -1;

}

// Function to play the song using DFRobotDFPlayer Mini

void playSong() {

  myDFPlayer.play(1); // Play song 001 (index 1 on the SD card)

  delay(100); // Play for 10 seconds

}

Testing it Out

بعد رفع الكود البرمجي على لوحة الأردوينو، ستلاحظ طباعة الوقت والتاريخ على الشاشة الكريستالية. عند حلول وقت إحدى الصلوات الخمس (الفجر، الظهر، العصر، المغرب، العشاء)، يتم عرض اسم الصلاة على الشاشة الكريستالية، وتشغيل صوت الأذان عبر السماعة.

Resources

No items found.