- المواد المطلوبة:
- المتطلبات المسبقة:
- مخطط الرسم البياني:
- برمجة المنبه:
- محاكاة:
- عمل المنبه الرقمي باستخدام PIC16F877A:
بدأت الثورة الرقمية في عام 1950 غيرت جميع الهياكل الإلكترونية الميكانيكية والتناظرية الحالية إلى أجهزة كمبيوتر رقمية. نظرًا لأن نمو الإلكترونيات الرقمية كان أسيًا ، فمن شبه المستحيل اليوم أن يقاوم أي شخص استخدام أي معدات إلكترونية. بدءًا من المنبه الذي يوقظك والمحمصة التي تقدم لك الإفطار ، كل شيء هو مساهمة من الإلكترونيات الرقمية. بالتفكير في كل هذه الأمور ، من المثير حقًا برمجة الأشياء الخاصة بنا التي يمكنها القيام بمهام بسيطة ولكنها مفيدة ، مثل المنبه الذي سنقوم ببنائه في هذا المشروع باستخدام PIC Microcontroller. لقد قمنا مسبقًا ببناء ساعة منبه مع وحدات تحكم دقيقة أخرى:
- ساعة منبه Raspberry Pi باستخدام وحدة RTC DS1307
- ساعة رقمية قائمة على اردوينو مع منبه
- المنبه باستخدام متحكم ATmega32
ستحتوي ساعة المنبه هذه على شاشة LCD مقاس 16 × 2 والتي ستعرض الوقت الحالي والوقت المحدد. سنستخدم بعض الأزرار الانضغاطية لضبط وقت التنبيه كلما لزم الأمر. سيتم الاحتفاظ بالوقت الحالي في المسار الصحيح باستخدام وحدة DS3231 RTC وسنستخدم اتصال IIC للحصول على هذه القيم من وحدة RTC. لقد تعلمنا بالفعل عن وحدة RTC وكيفية ربطها بـ PIC. لذلك يوصى بقراءة هذا البرنامج التعليمي ، وسوف نتخطى معظم المعلومات التي يغطيها هذا البرنامج التعليمي.
المواد المطلوبة:
- مجلس الخبز - 2Nos
- PIC16F877A
- مصدر طاقة 5 فولت - وحدة إمداد
- 20 ميجا هرتز الكريستال
- مكثف 33pf - 2Nos
- وحدة DS3231 RTC
- 16 * 2 وحدة عرض LCD
- 10 كيلو وعاء
- 10 كيلو و 1 كيلو المقاوم
- أزرار الضغط - 5Nos
- صفارة
- توصيل الأسلاك
المتطلبات المسبقة:
يتطلب هذا المشروع معرفة بعض الأساسيات حول الميكروكونترولر PIC وكيفية برمجته. سنستخدم GPIOs وشاشة LCD ووحدة RTC لهذا المشروع. لذلك من الأفضل تعلم كيفية استخدام هذه الوحدات مسبقًا. الروابط التالية سوف تساعدك على تعلم نفس الشيء
- كتابة برنامجك الأول باستخدام PIC Microcontroller
- واجهة LCD مع الموافقة المسبقة عن علم
- اتصال I2C باستخدام PIC
- واجهة DS3231 RTC مع الموافقة المسبقة عن علم
مخطط الرسم البياني:
يظهر أدناه مخطط الدائرة لمشروع المنبه المستند إلى الموافقة المسبقة عن علم ، والذي تم إنشاؤه باستخدام برنامج البروتيوس. كما سيتم استخدام المحاكاة بشكل أكبر في هذا المشروع.
تعمل أزرار الدفع الخمسة كمدخل لضبط المنبه للوقت المطلوب. لذلك يتم توصيل أحد طرفي جميع أزرار الدفع بالأرض والأطراف الأخرى متصلة بدبوس PORTB ، وسيتم استخدام المقاوم الداخلي للسحب على هذه المسامير لتجنب تطفو المسامير. سيعمل الجرس كإخراج وسيصدر صوتًا عندما يتم تشغيل الإنذار ويتم توصيله بدبوس PORT S. يتم دائمًا تتبع الوقت الحالي بواسطة وحدة DS3231 RTC التي تتلقى منها PIC البيانات عبر ناقل I2C ، لذلك يتم توصيل دبابيس SCL و SDA لوحدة RTC بدبوس SCL و SDA لوحدة التحكم PIC. يتم توصيل شاشة عرض LCD بلوحة PORTD الخاصة بالموافقة المسبقة عن علم والتي تستخدم لعرض الوقت الحالي والوقت المحدد. تعرف على المزيد حول استخدام وحدة DS3231 RTC مع الموافقة المسبقة عن علم هنا.
يمكن بناء الدائرة الكاملة على لوح التجارب. نظرًا لوجود بضع عشرات من الأسلاك للاتصال ، فما عليك سوى التحلي بالصبر والتأكد من صحة التوصيلات. بدا إعداد أجهزتي شيئًا كهذا أدناه بمجرد أن انتهيت من التوصيلات
لقد استخدمت وحدة اللوح ومحول 12 فولت لتشغيل الوحدة. هذا هو مصدري لجهد الإمداد + 5 فولت. كما لا بد لي من استخدام لوحين للحفاظ على الدائرة نظيفة. يمكنك أيضًا لحام الدائرة بأكملها بلوحة أداء إذا كنت تتطلع إلى إنشاء مشروع أكثر قوة.
برمجة المنبه:
في برنامج PIC الكامل لهذا المشروع المنبه يمكن العثور عليها في الجزء السفلي من هذه الصفحة. يتطلب هذا المشروع أيضًا ثلاث مكتبات لاستخدام LCD و I2C و RTC مع PIC. يمكن تنزيل الكود الكامل مع ملفات الرأس من ملف ZIP هنا ويمكن فتحه باستخدام MPLABX بعد الاستخراج. علاوة على ذلك ، سأشرح فقط ملف c الرئيسي كمقتطفات صغيرة. يمكنك الرجوع إلى البرامج التعليمية المذكورة أعلاه إذا كنت تريد معرفة كيفية عمل ملفات الرأس.
قبل الدخول في البرنامج الرئيسي ، يتعين علينا تحديد المسامير التي استخدمناها باسم أكثر وضوحًا. بهذه الطريقة سيكون من السهل استخدامها أثناء البرمجة. يتم عرض المسامير المحددة في برنامجنا أدناه
// حدد دبابيس LCD #define RS RD2 // إعادة تعيين دبوس شاشة LCD #define EN RD3 // تمكين دبوس LCD #define D4 RD4 // بت البيانات 0 من شاشة LCD # تعريف D5 RD5 // بت البيانات 1 من LCD # تعريف D6 RD6 // بت البيانات 2 من LCD #define D7 RD7 // بت البيانات 3 من LCD // تحديد الأزرار # تعريف MB RB1 // الزر الأوسط # تعريف LB RB0 // الزر الأيسر # تعريف RB RB2 // الزر الأيمن # حدد UB RB3 // الزر العلوي # تعريف BB RB4 // الزر السفلي // تحديد الطنانة #define BUZZ RD1 // الطنان متصل بـ RD1
داخل الوظيفة الرئيسية نبدأ بالإعلان عن دبابيس الإدخال والإخراج. في مشروعنا ، يتم استخدام PORTB للأزرار الانضغاطية وهي عبارة عن جهاز إدخال لذلك قمنا بتعيين المسامير الخاصة بهم كمدخلات ويتم استخدام PORTD لشاشات الكريستال السائل والجرس ، لذلك قمنا بتعيين دبابيسهم على أنها الإخراج. يجب أيضًا عدم ترك الدبوس مطلقًا بمعنى عائم ، يجب دائمًا توصيل دبابيس الإدخال / الإخراج إما بالأرض أو بجهد + 5 فولت. في حالتنا للأزرار الانضغاطية ، لن يتم توصيل المسامير بأي شيء عند عدم الضغط على الزر ، لذلك نستخدم مقاوم سحب داخلي يضبط الدبوس على مرتفع عندما لا يكون قيد الاستخدام. يتم ذلك باستخدام سجلات التحكم كما هو موضح أدناه
TRISD = 0x00 ؛ // اجعل دبابيس المنفذ D outptu لواجهة LCD TRISB = 0xFF ؛ // سويتشس يتم الإعلان عنها دبابيس مدخلات OPTION_REG = 0b00000000. // تمكين سحب المقاوم على المنفذ B للمفاتيح BUZZ = 0 ؛ // بدوره الجرس
نظرًا لأن لدينا ملف رأس LCD و I2C مرتبطين بالبرنامج الرئيسي ، يمكننا بدء تهيئة LCD عن طريق استدعاء وظيفة بسيطة. يمكن القيام بالشيء نفسه لتهيئة I2C أيضًا. نحن هنا نبدأ اتصال I2C عند 100 كيلو هرتز لأن وحدة RTC تعمل مع 100 كيلو هرتز.
Lcd_Start () ، // تهيئة وحدة LCD I2C_Initialize (100) ؛ // تهيئة I2C Master بساعة 100 كيلو هرتز
تُستخدم الوظيفة أدناه لتعيين الوقت والتاريخ على وحدة RTC ، بمجرد تعيين الوقت والتاريخ ، قم بإزالة هذا السطر. وإلا في كل مرة تبدأ فيها البرنامج ، سيتم تعيين الوقت والتاريخ مرارًا وتكرارًا
// إزالة تحت خط مرة واحدة الوقت والتاريخ و وضع لأول مرة. Set_Time_Date () ، // ضبط الوقت والتاريخ على وحدة RTC
للإشارة إلى بدء تشغيل البرنامج ، نعرض شاشة مقدمة صغيرة تعرض اسم المشروع واسم موقع الويب كما هو موضح أدناه
// أعط رسالة تمهيدية على شاشة LCD Lcd_Clear () ؛ Lcd_Set_Cursor (1،1) ، Lcd_Print_String ("المنبه") ؛ Lcd_Set_Cursor (2،1) ، Lcd_Print_String ("-Circuit Digest") ؛ __delay_ms (1500) ؛
بعد ذلك داخل حلقة while ، نحتاج إلى قراءة الوقت والتاريخ الحاليين من وحدة RTC ، ويمكن القيام بذلك بمجرد استدعاء الوظيفة أدناه.
Update_Current_Date_Time () ، // اقرأ التاريخ والوقت الحاليين من وحدة RTC
سيؤدي استدعاء الوظيفة المذكورة أعلاه إلى تحديث المتغيرات ثانية ودقيقة وساعة بالقيمة الحالية. من أجل عرضها على شاشة LCD ، يتعين علينا تقسيمها إلى أحرف فردية باستخدام الكود أدناه.
// انقسام الحرف إلى حرف لعرضه على شاشة lcd char sec_0 = sec٪ 10 ؛ char sec_1 = (ثانية / 10) ؛ char min_0 = min٪ 10؛ char min_1 = min / 10 ؛ char hour_0 = ساعة٪ 10 ؛ char hour_1 = ساعة / 10 ؛
بعد ذلك ، نقوم بتحديث القيم على شاشة LCD. سيتم عرض الوقت الحالي في السطر الأول والوقت المحدد الذي يجب أن يتم فيه تشغيل الإنذار في السطر الثاني. الرمز الذي يفعل نفس الشيء موضح أدناه.
// عرض الوقت الحالي على شاشة LCD Lcd_Clear () ؛ Lcd_Set_Cursor (1 ، 1) ، Lcd_Print_String ("TIME:") ؛ Lcd_Print_Char (hour_1 + '0') ؛ Lcd_Print_Char (hour_0 + '0') ؛ Lcd_Print_Char (':') ، Lcd_Print_Char (min_1 + '0') ؛ Lcd_Print_Char (min_0 + '0') ؛ Lcd_Print_Char (':') ، Lcd_Print_Char (sec_1 + '0') ، Lcd_Print_Char (sec_0 + '0') ، // عرض التاريخ على شاشة LCD Lcd_Set_Cursor (2 ، 1) ؛ Lcd_Print_String ("المنبه:") ؛ Lcd_Print_Char (alarm_val + '0') ؛ Lcd_Print_Char (alarm_val + '0') ؛ Lcd_Print_Char (':') ، Lcd_Print_Char (alarm_val + '0 ') ؛ Lcd_Print_Char (alarm_val + '0') ؛
الآن ، قمنا بعرض الوقت وضبط الوقت على شاشة LCD علينا التحقق مما إذا كان المستخدم يحاول ضبط وقت التنبيه. للقيام بذلك ، يجب على المستخدم الضغط على الزر الأوسط ، لذلك سوف نتحقق مما إذا كان الزر الأوسط مضغوطًا وتبديل متغير للدخول في وضع ضبط المنبه. سيتم الضغط على نفس الزر مرة أخرى للتأكيد على أن القيم قد تم ضبطها وفي هذه الحالة يجب أن نخرج من وضع ضبط المنبه. لذلك نستخدم سطر الكود أدناه لتغيير حالة المتغير set_alarm .
// استخدم الزر الأوسط للتحقق مما إذا كان يجب ضبط المنبه إذا كان (MB == 0 && set_alarm == 0) {// إذا تم الضغط على الزر الأوسط ولم يتم تشغيل التنبيه أثناء (! MB) ؛ // انتظر حتى يتم تحرير الزر set_alarm = 1 ؛ // بدء ضبط قيمة التنبيه } إذا (MB == 0 && set_alarm == 1) {// إذا تم الضغط على الزر الأوسط ولم يتم إيقاف التنبيه أثناء (! ميجابايت) ؛ // انتظر حتى يتم تحرير الزر set_alarm = 0 ؛ // إيقاف تعيين قيمة المنبه }
إذا ضغط المستخدم على الزر الأوسط ، فهذا يعني أنه يحاول ضبط وقت التنبيه. في هذه الحالة ، يدخل البرنامج في وضع ضبط المنبه باستخدام الكود أعلاه. داخل وضع ضبط المنبه إذا ضغط المستخدم على الزر الأيسر أو الأيمن ، فهذا يعني أنه يتعين علينا تحريك المؤشر إلى اليسار أو اليمين. للقيام بذلك ، نقوم ببساطة بزيادة إنقاص قيمة الموضع الذي يجب وضع المؤشر فيه
إذا (LB == 0) {// إذا تم الضغط على الزر الأيسر أثناء (! LB) ؛ // انتظر حتى يتم تحرير زر pos-- ؛ // ثم حرك المؤشر إلى اليسار } إذا (RB == 0) {// إذا تم الضغط على الزر الأيمن أثناء (! RB) ؛ // انتظر حتى يتم تحرير الزر pos ++ ؛ // حرك المؤشر إلى اليمين }
أثناء استخدام زر ضغط مع متحكم أو معالج دقيق ، هناك مشكلة شائعة يجب معالجتها. هذه المشكلة تسمى التبديل كذاب. هذا عندما يتم الضغط على الزر ، قد يعطي نبضات صاخبة إلى MCU / MPU والتي قد تزييف MCU لإدخالات متعددة. يمكن حل هذه المشكلة عن طريق إضافة مكثف عبر المفتاح أو باستخدام وظيفة التأخير بمجرد اكتشاف الضغط على الزر. هذا النوع من الحلول يسمى فك الارتداد. استخدمنا هنا حلقة while loop لإبقاء البرنامج في مكانه حتى يتم تحرير الزر. هذا ليس أفضل حل لإزالة الارتداد ولكنه سيعمل بشكل جيد بالنسبة لنا.
بينما (! RB) ؛
على غرار الزر الأيمن والأيسر ، لدينا أيضًا الأزرار العلوية والسفلية التي يمكن استخدامها لزيادة أو تقليل قيمة وقت التنبيه. يظهر رمز القيام بالشيء نفسه أدناه. لاحظ أن كل حرف من وقت التنبيه المحدد يتم تناوله بواسطة قيمة فهرس المصفوفة. كان هذا يمكننا الوصول بسهولة إلى الشخصية المطلوبة التي يجب تغيير قيمها.
إذا (UB == 0) {// إذا تم الضغط على الزر العلوي أثناء (! UB) ؛ // انتظر حتى يتم تحرير الزر alarm_val ++ ؛ // الزيادة التي معينة قيمة شار } إذا (BB == 0) {// إذا لم تضغط على الزر السفلي بينما (UB!)؛ // انتظر حتى يتم تحرير الزر alarm_val-- ؛ // تقليل قيمة حرف معينة هذه }
بمجرد ضبط وقت التنبيه ، سيضغط المستخدم على الزر الأوسط مرة أخرى. ثم يمكننا البدء في مقارنة الوقت الحالي بالوقت المحدد. المقارنة عن طريق التحقق مما إذا كان كل حرف في الوقت الحالي يساوي حرف الوقت المحدد. إذا كانت القيم متساوية ، فإننا نطلق الإنذار عن طريق ضبط متغير trigger_alarm ، وإلا فإننا نقارن فقط حتى يتساوى.
// إذا تم ضبط المنبه ، تحقق مما إذا كانت القيمة المحددة تساوي القيمة الحالية إذا (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1 ؛ // تشغيل الزناد إذا تطابق القيمة
إذا تم ضبط المنبه ، يجب أن نطلق صفيرًا لتنبيه المستخدم للتنبيه. يمكن القيام بذلك ببساطة عن طريق تبديل الجرس على فترات منتظمة كما هو موضح أدناه.
if (trigger_alarm) {// إذا تم إطلاق الإنذار // Beep the buzzer BUZZ = 1 ؛ __delay_ms (500) ؛ BUZZ = 0 ؛ __delay_ms (500) ؛ }
محاكاة:
يمكن أيضًا محاكاة هذا البرنامج باستخدام برنامج البروتيوس. ما عليك سوى إعادة إنشاء الدائرة الموضحة أعلاه وتحميل الملف السداسي في الموافقة المسبقة عن علم. يمكن العثور على الكود السداسي لهذا المشروع في ملف ZIP المرتبط هنا. يظهر أدناه لقطة شاشة تم التقاطها أثناء المحاكاة
تصبح المحاكاة مفيدة للغاية عندما تحاول إضافة ميزات جديدة إلى المشروع. يمكنك أيضًا استخدام وحدة مصحح الأخطاء I2C للتحقق من البيانات الواردة والصادرة عبر ناقل I2C. يمكنك محاولة الضغط على الأزرار وتعيين وقت التنبيه أيضًا. عندما يكون الوقت المحدد مساويًا للوقت الحالي ، فإن الجرس سوف يرتفع.
عمل المنبه الرقمي باستخدام PIC16F877A:
قم ببناء الدائرة على اللوح ، احصل على الكود من رابط التنزيل وقم بتجميعه باستخدام مترجم MplabX و XC8. إذا قمت بتنزيل الرمز من ملف ZIP المتوفر هنا ، فلن تواجه مشكلة في تجميعه نظرًا لأن ملفات الرأس مرفقة بالفعل.
بعد التجميع قم بتحميل البرنامج إلى الأجهزة الخاصة بك باستخدام مبرمج PicKit3. يظهر أيضًا الاتصال لتوصيل مبرمج الالتقاط إلى PIC IC في مخطط الدائرة. بعد تحميل البرنامج ، سترى شاشة المقدمة وبعد ذلك يمكنك استخدام أزرار الضغط لضبط وقت التنبيه. يبدو إعداد الجهاز عند تشغيله كما يلي.
عندما يتطابق وقت التنبيه مع الوقت الحالي ، سيبدأ الجرس في إصدار صفير لتنبيه المستخدم. يمكن العثور على العمل الكامل في الفيديو أدناه. يحتوي المشروع على عدد كبير من الخيارات للبناء عليها. يمكن لوحدة RTC تتبع أي وقت وتاريخ ، حتى تتمكن من أداء مهمة مجدولة في أي وقت / تاريخ مطلوب. يمكنك أيضًا توصيل جهاز تيار متردد مثل مروحة أو مصباح وجدولة تشغيله أو إيقاف تشغيله عند الحاجة. لا يزال هناك الكثير الذي يمكنك البناء عليه بناءً على هذا المشروع ، دعني أعرف ما هي الفكرة التي تخطر ببالك كترقية لهذا المشروع وسيسعدني أن أسمع منك.
آمل أن تكون قد فهمت المشروع وتعلمت شيئًا مفيدًا من هذه العملية. إذا كانت لديك أي شكوك في هذا المشروع ، فاستخدم قسم التعليقات لنشرها أو استخدم المنتديات للحصول على أي مساعدة فنية.
يمكن العثور هنا على كود الموافقة المسبقة عن علم الكامل مع ملفات الرأس