السبت، 29 أغسطس 2020

كيفية بناء ساعة ناطق من اردوينو باستخدام RTC وتحويل النص إلى كلام

 تعلم كيفية إنشاء ساعة قائمة على Arduino باستخدام RTC IC الذي يعبر عن الوقت والتاريخ عند الطلب!

في هذا البرنامج التعليمي ، سننشئ ساعة تعتمد على Arduino في الوقت الفعلي والتي ستتحدث عن الوقت والتاريخ عند الضغط على الزر. تكمن الفكرة في إنشاء طريقة لبيانات المستشعر من Arduino ليتم التحدث بها عبر الهاتف الذكي ، وأنا أستخدم وحدة RTC كمثال. يمكن أن يكون برنامجًا تعليميًا رائعًا للتصميم حول تطبيقات IoT وأجهزة الاستشعار للمكفوفين حيث يمكن مراقبة البيانات عبر الصوت.

باستخدام RTC IC

سنقوم بنشر IC على مدار الساعة في الوقت الحقيقي (RTC) بدلاً من استخدام IC المؤقت 555 العادي. يقوم RTC بتتبع الوقت حتى بدون طاقة. يحتوي على دائرة مدمجة لاستشعار الطاقة والتي تتعقب حالات انقطاع التيار وتتحول تلقائيًا إلى مصدر الطاقة الاحتياطية.

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

سنقوم بواجهة Arduino و RTC لإرسال البيانات إلى هاتف ذكي باستخدام وحدة Bluetooth التي تسمح بنطق البيانات عبر تطبيق تحويل النص إلى كلام.


الأجهزة المطلوبة

اردوينو UNO

وحدة DS1307 RTC

اللوح

توصيل الأسلاك

مزود الطاقة

اضغط الزر

وحدة بلوتوث HC-05

البرامج المطلوبة

اردوينو IDE

تطبيق تحويل النص إلى كلام اردوينو بلوتوث

الوحدة النمطية DS-1307 RTC

DS1307 عبارة عن ساعة في الوقت الحقيقي (RTC) بها ثمانية دبابيس وتستخدم واجهة I2C. إنها ساعة منخفضة الطاقة مع 56 بايت من البطارية الاحتياطية SRAM. توفر الساعة بيانات مؤهلة للثواني والدقائق والساعات واليوم والشهر والسنة. يتم تعديل تاريخ انتهاء كل شهر تلقائيًا ، بما في ذلك الأشهر التي تقل عن 31 يومًا.

Speaking_Clock_RW_MP_image8.jpg


الربط بين RTC و Arduino

RTClib هي مكتبة خفيفة الوزن تستخدم لتحديد تاريخ ووقت Arduino ويمكن تنزيلها من هنـــــــــــــــــا 

يتتبع RTC IC الوقت الحقيقي الحالي الذي يمكن استخدامه لبرمجة الإجراءات في وقت معين. يستخدم المذبذب البلوري في معظم الدوائر المتكاملة RTC بتردد 32.768 كيلوهرتز (نفس التردد المستخدم في ساعات الكوارتز والساعات). هذا التردد يساوي 2 ^ 15 دورة في الثانية.

وحدة بلوتوث HC-05

وحدة Bluetooth HC-05 هي مكون سهل الاستخدام يستخدم بروتوكول المنفذ التسلسلي (SSP). إنه مصمم لإنشاء اتصالات تسلسلية لاسلكية شفافة.

Speaking_Clock_RW_MP_image7.png

هذه الوحدة هي Bluetooth V2 + EDR (معدل بيانات محسّن) ، ولها تعديل 3 ميغابت في الثانية إلى جانب جهاز إرسال واستقبال لاسلكي 2.4 جيجا هرتز ونطاق أساسي. يستخدم جهاز Bluetooth ذو رقاقة أحادية خارجية من bluecore يعتمد على تقنية CMOS ويستخدم ميزة قفز التردد التكيفي (AFH). حجمها صغير مثل 12.7 مم × 27 مم.


ربط HC-05 مع Arduino باستخدام SerialSoftware.h

تم تطوير مكتبة SoftwareSerial لتمكين الاتصال التسلسلي على المسامير (الرقمية الأخرى) في Arduino باستخدام البرنامج لإعادة إنتاج وظائف المنفذ التسلسلي ، ومن هنا جاء اسمه "SoftwareSerial". من الممكن أيضًا أن يكون لديك أكثر من منفذ تسلسلي للبرنامج بسرعات تصل إلى 115200 بت في الثانية.

إعداد تطبيق Arduino Bluetooth لتحويل النص إلى كلام

يتلقى تطبيق الهاتف الذكي هذا رسائل نصية عبر البلوتوث من جهاز Bluetooth مقترن ، أي لوحة Arduino مع وحدة HC-05. ثم يقوم بتحويل النص المستلم إلى كلام.

Speaking_Clock_RW_MP_image10.png


Speaking_Clock_RW_MP_image4.png

تكوين زر الضغط

يتم توصيل زر الضغط عبر المقاوم 10 كيلو أوم ، المعروف باسم المقاوم المنسدل ، من الأرض إلى دبوس التبديل المتصل بـ Arduino. يقوم بتوصيل الدبوس بالأرض عندما يكون المفتاح مفتوحًا ، لذلك يقرأ LOW عندما لا يكون هناك جهد قادم من خلال المفتاح.


عند الضغط على الزر الانضغاطي ، يتم ضبط حالة الزر على HIGH ويتم تكوين إشارة الصوت عبر Bluetooth. بمجرد تحرير الزر ، تنتقل حالة الزر إلى LOW وتنقطع الدائرة.

فيما يلي مخطط الدائرة الذي يوضح وضع الزر الانضغاطي والمقاوم 10 كيلو أوم.

تكوين زر الضغط

يتم توصيل الزر الانضغاطي عبر المقاوم 10 كيلو أوم ، والمعروف باسم المقاوم المنسدل ، من الأرض إلى دبوس التبديل المتصل بـ Arduino. يقوم بتوصيل الدبوس بالأرض عندما يكون المفتاح مفتوحًا ، لذلك يقرأ LOW عندما لا يكون هناك جهد قادم من خلال المفتاح.

عند الغط على الزر الانضغاطي ، يتم ضبط حالة الزر على HIGH ويتم تكوين إشارة الصوت عبر Bluetooth. بمجرد تحرير الزر ، تنتقل حالة الزر إلى LOW وتنقطع الدائرة.

فيما يلي مخطط الدائرة الذي يوضح وضع الزر الانضغاطي والمقاوم 10 كيلو أوم.

Speaking_Clock_RW_MP_image1.png

تجميع الأجهزة

دعنا نربط المكونات الفردية والوحدات الموضحة أعلاه بـ Arduino UNO كما هو موضح في المخطط   التالي.

Speaking_Clock_RW_MP_image9.jpg


Speaking_Clock_RW_MP_image5.jpg


واجهة تحويل النص إلى كلام من Arduino Bluetooth

قم بتحميل كود Arduino من أسفل هذه المقالة. بمجرد التحميل ، افتح إعداد Bluetooth بهاتفك وابحث عن أجهزة Bluetooth. في قائمة أجهزة Bluetooth المتاحة ، قم بإقران هاتفك باسم الجهاز HC-05 باستخدام رمز المرور 1234 أو 0000. ثم افتح تطبيق تحويل النص إلى كلام Arduino Bluetooth. ستظهر لك قائمة الأجهزة المقترنة. حدد HC-05 كما هو موضح في الصور أدناه.

إذا ضغطت على زر الضغط ، فسيتحدث التطبيق ويعرض الوقت والتاريخ الحاليين. يمكن أيضًا التحكم في درجة الصوت والسرعة داخل التطبيق.

Speaking_Clock_RW_MP_image6.png


Speaking_Clock_RW_MP_image11.png


كود المشروع الكامل


#include <Wire.h>
#include <SoftwareSerial.h>
#include "RTClib.h"

//bluetooth variable
SoftwareSerial BT(10,11);

RTC_DS1307 rtc;

//pushbutton declaration
int buttonPin = 7;
int buttonState = 0;
boolean on=false;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char monthsOfTheYear[13][12] = {"m","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
void setup () 
{
 while (!Serial); // for Leonardo/Micro/Zero
 Serial.begin(9600);
 Wire.begin();
 rtc.begin();
 BT.begin(9600);
 if (! rtc.begin()) 
 {
   Serial.println("Couldn't find RTC");
   while (1);
 }
 if (! rtc.isrunning()) 
 {
   Serial.println("RTC is NOT running!");
 }
// This line sets the RTC with an explicit date & time, for example to set
// rtc.adjust(DateTime(2020, 1, 21, 19, 47, 36));
 pinMode(buttonPin, INPUT);

 //testing serial monitor
 Serial.print("Date: ");
 Serial.print(__DATE__);
 Serial.print('\n');
 Serial.print("Time: ");
 Serial.print(__TIME__);

}
void loop () {

  buttonState = digitalRead(buttonPin);
  DateTime now = rtc.now();
  if(buttonState == HIGH)
  {
    //Serial.print('test');
      on=true;
      if(on == true)
      {
         digitalWrite(buttonPin, HIGH);
         delay(4000);
         BT.println("Today is");
         delay(3000);
         BT.println(monthsOfTheYear[now.month()]);
         delay(1000);
         BT.println(now.day());
         delay(1000);
         BT.println(now.year());
         delay(3000);
         BT.println("Time in 24 hour clock is");
         delay(3000);
         BT.println(now.hour());
         delay(1000);
         BT.println("hours");
         delay(3000);
         BT.println(now.minute());
         delay(1000);
         BT.println("minutes");
         delay(3000);
         BT.println(now.second());
         delay(1000);
         BT.println("seconds");
        
      }
  }
  else if (buttonState == LOW)
  {
    digitalWrite(buttonPin, LOW);
  }
delay(800);