ويتم توصيله مع المتحكم بالصورة التالية
اذا الان تعرفنا علي الجرس وطريقة توصيله وهو الذي سوف يقوم المتحكم بتشغيله عندما تصل درجة الحرارة الي حد معين وذلك عن طريق تسليط جهد قدره 5 فولت علي طرف الجرس الموجب
الان دعونا ننتقل الي مرحلة اخري
هل تعلم ان نظامنا هذا نستطيع ان نوصله مع اي مكيف لكي يقوم بتشغيله عند درجة حرارة معينة ثم يقوم بفصله عند درجة حرارة معينة
لكن لدينا مشكلة ان المتحكم لا يستطيع ان يؤمن لنا الجهد اوالتيار المناسبين لتشغيل هذا المكيف او اي جهاز يعمل باكثر من 5 فولت واكثر من 25 ملي امبير
لحل هذه المشكلة نستخدم ما يسمي بدوائر الربط وهي دوائر تمكننا من ربط انظمة ذات جهد وتيار منخفضين مع انظمة اخري ذات جهد وتيار عالي دون ان يؤثر اي من النظامين علي الاخر وتوجد دوائر وعناصر الكترونية عديدة يمكن ان تقوم بهذا الدور لكن في حالتنا هذه وقع الاختيار علي المرحل او الريلي (relay) اذا ما هو الريلي
المرحل او الريلي عباره عن عنصر الكتروني يكون له اربعة اطراف او اكثر مكوناته الداخلية يتكون من ملف و عمود معدني متحرك في حالة الاربعة اطراف يكون طرفان متصلان بالملف والطرفان الاخران يتم توصيل الجهاز الاخر بهما ونظرية عمله هي انه عندما يمر جهد من خلال الملف الداخلي للمرحل يتكون حول هذا الملف مجال مغنطيسي يقوم هذا المجال المغنطيسي بجذب العمود المعدني فيقوم باغلاق الدائرة وهذا النوع يسمي normal open اي انه في الحاله الطبيعيه عندما لا يمر جهد من خلال الملف يكون غير موصل وعندما يمر جهد من خلال الملف يقوم بالتوصيل وهنالك نوع اخر يسمي normal closed وهذا النوع يكون في الحالة الطبيعية موصل وعندما يمر جهد خلال الملف يقوم بالفصل
سوف نقوم بالعمل علي النوع الاول normal open
وشكل الريلي يكون كما في الصورة التالية
كما يظهر من الشكل عندما يمر تيار عبر هذا الملف يتكون حوله مجال مغنطيسي فيقوم بجذب الجزء المعدني المتحرك الي نقطة التلامس وبذلك تكتمل الدائرة ويمر التيار
توجد انواع متعددة من المرحلات تختلف علي حسب جهد الملف وعلي حسب جهد الجهاز الذي يستطيع تشغيله وتياره
جهد الملف يختلف من مرحل الي اخر قد يبدأ جهد الملف من 5 فولت فاكثر
نحن سوف نقوم باستخدام مرحل جهد ملفه 5 فولت
لمعرفة المزيد عن المرحل قم بالحث عنه فهو من العناصر الضرورية جداً في مشاريع كثيرة
في هذا الرابط يوجد ملف فلاشي يوضح طريقة عمل المرحل بصورة جميلة و واضحة
http://www.qariya.com/electronics/relay.htm
ولكن لربط المرحل مع المتحكم نحتاج الي ان نربط ترانزستور بينهما يعمل كمفتاح فعدما يقوم المتحكم باخراج 5 فولت علي قاعدة الترانزستور يدخل الترانزستور الي منطقة التشغيل فيعمل كمفتاح مفتوح on فيسمح بمرور التيار من خلاله ونقوم بتوصيل مقاومة قيمتها 4.5k اوم بين الترانزستور والمتحكم لحماية الترانزستور
الترانزستور الذي سوف نستخدمه هو 2N2222 وهو من النوع NPN
ويتم ربط المرحل مع الترانزستور مع المتحكم كما في المخطط التالي
كما يتضح من الصورة انه عندما يقوم المتحكم باخراج جهد 5 فولت علي الطرف رقم 35 يمر هذا الجهد عبر قاعدة الترانزستور مما يجعل الترانزستور يعمل كمفتاح مفتوح on ولذلك سوف يسمح بمرور التيار من خلال طرفيه الكولكتر والاميتر الكولكتر موصول مع احد اطراف ملف المرحل وطرف الملف الاخر موصول مع مصدر جهد 5 فولت والاميتر موصول مع الارضي فعندما يسمح الترانزستور بمرور التيار بين الكولكتر والاميتر فانه يقوم باكمال الدائرة ويسمح بمرور الجهد القادم من المصدر 5 فولت عبر ملف المرحل ثم عبر الترانزستور الي الارضي وطالما ان المتحكم يخرج 5 فولت علي قاعدة الترانزستور يعمل الترانزستور كمفتاح مفتوح ويقوم بتوصيل الجهد عبر ملف المرحل وهذا الجهد سوف يكون مجال مغنطيسي حوله فيقوم هذا المجال المغنطيسي بسحب الجزء المعدني المتحرك من المرحل فيقوم بغلق الدائرة كما موضح في الرسم باللون الاحمر داخل المرحل فيسمح بمرور الجهد الخاص بتشغيل الجهاز الموصول مع المرحل فيمر الجهد من مصدر الجهد الخاص بهذا الجهاز عبر الجهاز نفسه الي مدخل المرحل ثم عبر المرحل الي الطرف الاخر الموصول مع ارضي المصدر الخاص بتشغيل الجهاز
عند تشغيل المرحل وفصله ونتيجتاً للمجال المغنطيسي وارتداد الجزء المعدني المتحرك اثناء عملية التوصيل والفصل يتكون تيار عكسي قد يؤدي الي تلف الريلي او الترانزستور الموصول معه وللتخلص منه نقوم بتوصيل دايود علي التوازي مع ملف الريلي لتصبح الصورة السابقة كالتالي
ارجو ان يكون قد اتضح الامر
ملاحظة
عند توصيل جهاز او مروحة صغيرة او اياً كان مع المرحل من الافضل ان يكون لهذا الجهاز مصدر جهد منفصل عن مصدر الجهد الخاص بالمتحكم
والان الي المرحلة القادمة وسوف نتعرف فيها علي الشاشة والتي سوف تساعدنا علي معرفة كم تبلغ درجة الحرارة الان وكذلك يمكننا ان نظهر عليها بعض الرسائل اثناء عمل وتشغيل النظام كل ذلك ممكن من خلال البرمجة الان دعونا نتعرف عليها وعلي طريقة توصيلها
الشاشة الكرستالية Character LCD 16*2
كما قلنا سوف نستخدمها لاظهار درجة الحرارة وبعض الرسائل الخاصة بالنظام
وهي شاشة يمكن ان نكتب عليها سطرين من النصوص وفي كل سطر نستطيع ان نكتب 16 حرف لذلك سُميت 2*16 لانها تحتوي علي سطرين وكل سطر يحتوي علي 16 حرف اذاً يمكننا ان نكتب عليها 32 حرف لكن بدون مسافة بين الحروف لان المسافة تُعتبر حرف وشكلها كما في الصورة التالية
وكل حرف او المساحة التي يظهر فيها الحرف تتكون من عدد من المربعات الصغيرة في شكل عدد من البكسل يتم تشكيل الحرف المراد كتابته فيها تحتوي علي 16 طرف يتم توصيل بعضها بالمتحكم وبعضها بمصدر الجهد و الارضي اطرافها مقسمة كما في الصورة التالية
الطرف رقم 1 GND يتم توصيله مع الارضي
الطرف رقم 2 Vcc يتم توصيله مع مصدر الجهد 5 فولت
الطرف رقم 3 VEE يتم توصيله مع مقاومة متغيرة 10k اوم ويستخدم هذا الطرف للتحكم في شدة ظهور الاحرف علي الشاشة هل تكون الحروف واضحة ام باهتة ويتم التحكم في ذلك عن طريق المقاومة المتغيرة
الطرف رقم 4 RS يوصل مع المتحكم ويُستخدم للتفاهم بين المتحكم والشاشة وعن طريق هذا الطرف تعرف الشاشة هل الاشارة القادمة اليها عباره عن بيانات ام اوامر كمسح الشاشة وغيره فاذا كان الجهد علي هذا الطرف 0 فولت فهذا يعني ان الاشارة القادمة عباره عن اشارة تحكم واذا كان الجهد علي هذا الطرف 1 فولت فهذا يعني ان الاشارة القادمة عباره عن بيانات يجب اظهارها علي الشاشة
الطرف رقم 5 R/W هو لمعرفة هل نريد القراءة من الشاشة ام نريد الكتابة عليها وفي حالتنا هذه نريد الكتابة عليها وسوف نقوم بتوصيله مع الارضي اي نطبق علي هذا الطرف 0 فولت
الطرف رقم 6 EN ويتم توصيله مع المتحكم ويسمي طرف التمكين
اما الاطراف من 7 الي 14 (DB0 TO DB7) فهي اطراف البيانات يتم عن طريقها ارسال البيانات الي الشاشة ولدينا نظامين لارسال البيانات نظام 8bit وفيه يتم توصيل كافة اطراف البيانات من الشاشة مع المتحكم و نظام 4bit وفيه يتم توصيل 4 اطراف فقط من اطراف البيانات من الشاشة مع المتحكم ونحن سوف نستخدم النظام الثاني 4bit للارسال
الطرفان 15 و 16 (-Led+ / Led) هما طرفي الإضاءه الخلفية للشاشة وهي التي تمكننا من رؤية الشاشة وقراءتها في الظلام ويتم توصيل الطرف رقم 15 بالارضي والطرف رقم 16 بمصدر الجهد 5 فولت
ويتم توصيل الشاشة مع المتحكم بالصورة التالية
كما نلاحظ من الصورة اننا لم نستخدم الاطراف (D0\D1\D2\D3) لاننا نستخدم نظام الارسال عن طريق 4bit وفي هذا النظام نحتاج الي 4 اطراف فقط من اطراف البيانات اما بقية الاطراف الغير مستخدمة يُفضل توصيلها مع الارضي (D0\D1\D2\D3)
الان شبه انتهينا من توصيلاتنا الاساسية لكن لماذا لا نضيف لنظامنا بعض الاكسسوارات والخصائص الاضافية مثلا نضيف لدات مضيئه LED ولكن لماذا نضيفها سوف نضيفها حتي تكون كلمبات بيان او مؤشرات ضوئية وكل لد يكون بلون مختلف وكل لد يضئ سوف يرمز الي مستوي معين من درجة الحرارة مثلا عندما يضئ اللد الاحمر سوف اعرف ان درجة الحرارة اعلي من مستوي معين وعندما يضي اللد الاخضر سوف اعرف ان درجة الحرارة في مستوي مستقر مثلا , وعندما يضئ اللد الاصفر سوف اعرف ان مستوي الحرارة منخفضة كل هذه الخيارات متروكة لنا ولخيالنا ولاحتياجاتنا نفعل بها ما نشاء وكل هذا يمكن تحديده من خلال البرمجة
الان دعونا نتعرف علي طريقة توصيل هذه اللدات مع المتحكم الدقيق
الصورة توضح طريقة توصيل اللدات مع المتحكم الدقيق الطرف الموجب من اللد مع المتحكم والطرف السالب من اللد مع الارضي
الم تلاحظ من الصورة اننا اضفنا مقاومة قيمتها 330 اوم بين اللد والمتحكم الدقيق لماذا اضفنا هذه المقاومة ؟؟ وما فائدتها ؟؟ وكيف حسبنا قيمتها ؟؟
استخدمنا هذه المقاومة بين اللد والمتحكم لنقوم بحماية اللد من الجهد الزائد حتي لا يحترق لكن كيف نقوم بحسابها حسن سوف اعطيك طريقة حساب المقاومة اللازمة لحماية اي عنصر الكتروني ليس اللد فقط
لحساب قيمة المقاومة سوف نستخدم قانون اوم
الجهد = المقاومة * التيار
اذا المقاومة = الجهد \ التيار
لنحسب قيمة المقاومة يجب ان نعرف بعض المعطيات
قيمة الجهد الذي يحتاجه الجهاز الذي نريد توصيله وفي حالتنا هذه هو اللد واللد يعمل بجهد قدره 3 فولت تقريبا وهنالك لدات تعمل بجهد اعلي من ذلك
قيمة التيار الذي سوف يسحبه الجهاز المراد توصيله وفي هذه الحالة ايضا اللد واللد يسحب تيار قدره 20 ملي امبير تقريبا
معرفة قيمة الجهد الذي يوفره المصدر وفي هذه الحالة المصدر هو المتحكم والمتحكم يوفر جهد قدره 5 فولت
اللد محتاج الي 3 فولت لكي يعمل والمتحكم يعطينا 5 فولت اذاً هنالك جهد زائد نريد التخلص منه ومقداره الفرق بين الجهدين اذاً الجهد الذي نريد ان نتخلص منه هو
3-5=2 فولت اذاً نحن نريد ان نتخلص من جهد قدره 2 فولت وكما قلنا ان اللد يسحب تيار قدره 20 ملي امبيرا اذاً نريد ان نتخلص من جهد قدره 2 فولت في حالة سريان تيار قدره 20 ملي امبير فلنطبق هذا في قانون اوم
المقاومة = الجهد \ التيار
المقاومة = 2 \ (20*10^-3 )
اثنان مقسومة علي (عشرين مضروبة في عشرة اس سالب ثلاثة)
ضربنا في عشرة اس سالب ثلاثة للتحويل من ملي امبير الي امبير
اذاً
المقاومة = 100 اوم
وهذه اقل مقاومة يمكن توصيلها بين هذا اللد ومصدر الجهد هذا حتي لا يمر جهد زائد علي اللد قد يؤدي الي تلفه
ويمكن زيادة قيمة المقاومة هذه وذلك سوف يؤثر علي شدة اضاءة اللد فقط فكلما زادت المقاومة قلت شدة اضاءة اللد
وبهذه الطريقة يمكننا ان نحسب اي مقاومة لحماية اي عنصر
وبهذا نكون قد اتممنا كل ما يتعلق بطرق توصيل كافة الاجزاء في الدائرة الخاصة بمشروعنا من مصدر الجهد مرورا بالحساس ثم التوصيلات الضرورية لعمل الحساس ثم جرس الإنذار ثم المرحل وما يتعلق به ثم شاشة العرض ثم اللدات
الان دعونا ننتقل الي الجزء الممتع وهو جزء البرمجة ونقوم باعطاء المتحكم خطة العمل التي نريد ان يقوم بتنفيذها
ملاحظة
قبل اتمام المرحلة القادمة يجب ان تكون علي دراية ببرنامجين هما برنامج المحاكاة بروتوس proteus وبرنامج microC البرنامج الاول يسمح لنا بمحاكاة الدائرة لنري هل نظامنا يعمل بصورة صحيحة ام لا والبرنامج الثاني يسمح لنا بكتابة البرنامج الخاص بنظامنا وكتابة الاوامر له
فلن اتطرق لهذين البرنامجين وسوف ادخل في كود البرنامج
فلنبدأ بكتابة برنامجنا اذاً
قبل كتابة اي برنامج يُفضل ان تضع خطة البرنامج وان تحدد الاشياء التي تريد ان يفعلها نظامك
وخطة برنامجنا لهذا النظام كالاتي
اولا عند تشغيل النظام نريد ان يظهر لنا رسالة ترحيبية مثلا ان يقول لنا
( مرحب بك في نظام التحكم في درجة الحرارة ) وطبعا كل الرسائل سوف تكون باللغة الانجليزية وذلك لسهولت كتابتها علي الشاشة التي نستخدمها
تستطيع ان تكتب ما تريد
الخطوة التالية نريده ان يذهب ويقرأ لنا درجة الحرارة المقاسة من قبل الحساس
ثم يقوم بمقارنة درجة الحرارة المقاسة هذه بدرجات حرارة مرجعية نحددها نحن للنظام في البرنامج
فاذا وجد درجة الحرارة اعلي من 30 درجة مئوية مثلا يقوم بتشغيل المروحة وجرس الانذار ومعهم اللد باللون الاحمر الي ان تقل درجة الحرارة عن 30 درجة فيقوم بفصل جرس الانذار واللد الاحمر
واذا وجد درجة الحرارة بين ال 30 و 20 درجة مئوية يقوم بتشغيل المروحة زائد اللد الاخضر فقط وطالما درجة الحرارة في هذا المدي لا يفعل شئ غير هذا
واما اذا وجد درجة الحرارة اقل من 20 درجة مئوية يقوم بايقاف المروحة وتشغيل اللد باللون الاصفر فقط حتي ترتفع درجة الحراره اعلي من 20 درجة ويستمر يراقب درجة الحرارة كل فترة زمنية نحددها نحن وعلي حسب الدرجة التي يقيسها الحساس يتخذ احد الاجراءات السابقة
الان لكي نُعرف المتحكم علي الشاشة لا بد ان نعرف اطراف المتحكم التي قمنا بايصال الشاشة بها وهي كالاتي
RS من الشاشة مع RB2 من المتحكم
EN من الشاشة مع RB3 من المتحكم
D4 من الشاشة مع RB4 من المتحكم
D5 من الشاشة مع RB5 من المتحكم
D6 من الشاشة مع RB6 من المتحكم
D7 من الشاشة مع RB7 من المتحكم
اما بقية العناصر فقد تم توصيلها مع PORTC من المتحكم وهي كالاتي
اللد الاحمر مع RC0
اللد الاخضر مع RC1
اللد الاصفر مع RC2
الجرس مع RC3
المروحة مع RC7 (عن طريق الترانزستور والمرحل)
الحساس مع RA1
مهمة بسيطة اليس كذلك اذا دعونا نترجم خطتنا هذه الي برنامج نقوم بكتابته بواسطة برنامج microC
سوف اكتب البرنامج كاملا ثم اوضحهه خطوه خطوه
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
int temp_c;
int temp;
char tempre[9] ;
void main()
{
TRISA = 0b00000010;
TRISC = 0x00 ;
PORTC = 0B00000111;
Lcd_Init() ;
Lcd_Cmd(_LCD_CURSOR_OFF) ;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2,"Welcome") ;
delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2,"Temperature") ;
Lcd_Out(2,3,"project") ;
delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2,"Designed by") ;
Lcd_Out(2,2,"Alaeldin hbib") ;
delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
while(1)
{
Lcd_Out(1,1,"Temp now") ;
temp_c = Adc_Read(1) ;
temp =(temp_c*0.48876);
IntToStr(temp , tempre ) ;
Lcd_Out(2,1,tempre) ;
Lcd_Out_Cp(" ") ;
Lcd_Out(2,8,"celsius") ;
if (temp>=32)
{
PORTC = 0B10001001;
Lcd_Out(1,10," (hot)") ;
delay_ms(500);
}
if (temp<30 & temp>=20)
{
PORTC = 0B10000010;
Lcd_Out(1,10," (good)") ;
delay_ms(500);
}
if (temp<18)
{
PORTC = 0B00000100;
Lcd_Out(1,10," (Cool)") ;
delay_ms(500);
}
}
}
لنبدأ بشرح الكود جزء جزء اولا
هذا الجزء من الكود خاص بتعريف المتحكم باطراف الشاشة واين تم توصيلها وهو ثابت في اي برنامج نستخدم فيه الشاشة الكرستالية
نقول للمتحكم الطرف رقم كذا من الشاشة موصول مع الطرف رقم كذا حتي اذا اراد المتحكم ارسال بيانات او اوامر يعرف علي اي اطراف يجب عليه ارسالها
ويمكننا توصيل هذه الاطراف مع اي بورت نشاء فقط يجب علينا ان نوضح ذلك في البرنامج بالطريقة السابقة
هذا الجزء ايضا تابع لتعريف المتحكم بالشاشة وهنا نخبره بان اتجاه البيانات يكون بين هذه الاطراف وهو ايضا جزء ثابت في كل برنامج نستخدم فيه الشاشة فقط يمكننا تغيير الاطراف ونوضح ذلك في البرنامج بالطريقة السابقة
int temp_c;
int temp;
char tempre[9] ;
هنا قمنا بتعريف متغيرtemp_c من نوع int وهو عدد صحيح حتي نخزن فيه درجة الحرارة المقاسة من قبل الحساس او بالاصح سوف نخزن فيه الرقم الناتج من المحول التماثلي الي رقمي وهو يكافئ درجة الحرارة المقاسة بواسطة الحساس
وكذلك قمنا بتعريف متغير اخر temp سوف نخزن فيه قيمة درجة الحرارة المقاسة بعد اجراء بعض العمليات الحسابيه في قيمة temp_c سوف نوضحهها لاحقا
وكذلك قمنا بتعريف مصفوفة حرفية من نوع character وهذه المصفوفة لها استخدام خاص
الشاشة التي نستخدمها لا تستطيع اظهار الارقام هي فقط تتعامل مع السلاسل الحرفية ولكن سوف نتحايل علي ذلك بتحويل الارقام الي صيغة السلاسل الحرفية ثم ارسالها الي الشاشة ولذلك قمنا بتعريف هذه المصفوفة حتي نخزن فيها ناتج عملية التحويل من ارقام الي سلسة حرفية ثم ارسالها الي الشاشة
void main()
{
هنا قمنا باستدعاء دالة المين وهي الدالة الرئيسية في اي برنامج ولن يعمل البرنامج من دونها ثم كتبنا قوس بداية البرنامج ومن بعد هذا القوس يبداء تنفيذ البرنامج
TRISA = 0b00000010;
هنا قمنا بتعريف الطرف رقم 2 من البورت A علي انه دخل وهو الموصول معه الحساس
TRISC = 0x00 ;
هنا قمنا بتعريف البورت C علي انه خرج 0x تعني hexadecimal
و 0x00 تعادل 0b00000000
كاننا كتبنا TRISC =0B00000000
PORTC = 0B00000111;
الارجل الثلاثة الاولي من البورت C موصول معها الثلاثة لدات وبهذا الامر جعلنا الثلاثة لدات تعمل معا عند بداية تشغيل البرنامج لفترة محدده كانها حالة تاهب لبدء تشغيل البرنامج
Lcd_Init() ;
بهذا الامر نخبر المتحكم اننا نريد بدأ استخدام الشاشة وهو ايضا من الاوامر الثابتة في اي برنامج نستخدم فيه الشاشة واذا لم نكتب هذا الامر فسوف لن يتعرف المتحكم علي اي امر نعطيه له في البرنامج بخصوص الشاشة
Lcd_Cmd(_LCD_CURSOR_OFF) ;
هذا الامر نخبر فيه البرنامج باننا نريد الغاء المؤشر من الشاشة
عندما تقوم بالكتابة علي الحاسوب اليس هنالك مؤشر يخبرك بالمكان الذي تقف فيه ويومض كل فتره قصير نفس هذا المؤشر يوجد في الشاشة ونحن لا نريده ولذلك قمنا بايقافه عن طريق الامر السابق
Lcd_Cmd(_LCD_CLEAR);
هذا الامر يقوم بمسح الكتابة الموجودة في الشاشة اي بيانات كانت تظهر في الشاشة عندما نستخدم هذا الامر سوف يتم مسحهها من الشاشة وهنا استخدمناه في بداية البرنامج كاجراء احترازي ليس اكثر
Lcd_Out(1,2,"Welcome") ;
هذا الامر يُستخدم لاظهار البيانات او الكتابة علي الشاشة وهنا استخدمناه لكتابة كلمةWelcome علي الشاشة لكن هنالك ارقام قبل هذه الكلمة ماذا تعني
بواسطة هذه الارقام نستطيع ان نحدد المكان الذي نريد ان تظهر فيه الكتابة علي الشاشة
لانه كما قلنا ان الشاشة تتكون من صفين و16 حرف وكل حرف من ال 16 نقول عنه عمود اي الشاشة تتكون من صفين و 16 عمود
فالرقم الاول هو رقم الصف وهنا كتبنا 1 اي نريد لهذه الكلمة ان تظهر في السطر الاول والرقم الثاني يمثل رقم العمود وهنا كتبنا 2 اي نريد لهذه الكلمة ان تُكتب ابتدأ من العمود الثاني وهذا يعني اننا تركنا مساحة حرف واحد في بداية هذا الصف اي هذه الكلمة سوف تظهر في الصف الاول العمود الثاني
delay_ms(2000);
وهذا الامر يُستخدم للتاخير الزمني وفي هذه الحالة هو ثانيتين اي اننا اخبرنا البرنامج انه بعد ان تُظهر الكلمة السابقة انتظر لمدة ثانيتين لا تفعل فيهما شئ فقط اظهر هذه الكلمة لمدة ثانيتين
Lcd_Cmd(_LCD_CLEAR);
كما قلنا ان هذا الامر يُستخدم لمسح الكتابة الحالية من الشاشة كاننا قلنا للبرنامج بعد ان انتظرتا ثانيتين قم بمسح كل ما هو ظاهر علي الشاشة
واذا لم نقم بمسح الشاشة وقمنا باظهار بيانات اخري علي الشاشة سوف يحدث تداخل بين الكتابة القديمة الظاهرة علي الشاشة والجديدة والنتيجة لن تكون مرضية
Lcd_Out(1,2,"Temperature") ;
وهنا قلنا للبرنامج بعد مسح الشاشة قم باظهار هذه الكلمة Temperature في السطر الاول ابتدأ من العمود الثاني
يمكنك استبدال الكلمة بما تشاء فقط يجب أن لا تزيد عن 16 حرف بما فيها المسافة بين الكلمات
Lcd_Out(2,3,"project") ;
وهنا قلنا للبرنامج اظهر هذه الكلمة project في السطر الثاني ابتداء من العمود الثالث ولان البرنامج يتم تنفيذه بسرعة عالية جداً لا تلحظها العين البشرية فسوف نري الكلمتين السابقتين كانهما تظهران في نفس الوقت
delay_ms(2000);
وهنا ايضا قلنا للمتحكم انتظر لمدة ثانيتين بعد ان تظهر الكلمتين السابقتين علي الشاشة
حتي يتسنا لنا قراءة الكلمتين لانه اذا لم نكتب هذا التاخير الزمني فسوف تظهر الكلمتين بسرعة عالية لدرجة اننا لا نستطيع ان نلاحظ ظهورهما
Lcd_Cmd(_LCD_CLEAR);
هنا قلنا للمتحكم بعد ان تنتظر ثانيتين قم بمسح كل ما يظهر علي الشاشة
Lcd_Out(1,2,"Designed by") ;
هنا قلنا للمتحكم بعد ان تمسح الشاشة قم باظهار هذه الكلمات علي الشاشة
Designed by في السطر الاول ابتدأ من العمود الثاني
Lcd_Out(2,2,"Alaeldin hbib") ;
هنا قلنا للمتحكم قم باظهار هذه الكلمات Alaeldin hbib في السطر الثاني ابتدأ من العمود الثاني
انه اسمي ^_^ يمكنك استبداله باسمك فلا امانع علي ذلك ^_*
delay_ms(2000);
هنا ايضا اخبرنا البرنامج ان ينتظهر ثانيتين بعد ان يقوم باظهار الكلمتين السابقتين في الشاشة حتي نتمكن من قرأتهم
اصبح الامر مكرر اليس كذلك ^_^ وهو كذلك في اغلب البرامج بهذه الطريقة
تستطيع ان تكتب ما تشاء علي الشاشة وتستطيع ان تحدد مدة ظهور الكلمة
Lcd_Cmd(_LCD_CLEAR);
هنا ايضا قلنا للمتحكم قم بمسح اي شئ علي الشاشه حتي يتسنا لنا كتابة شئ جديد
while(1)
{
حلقة التكرار while عندما نضع الرقم 1 بحلقة التكرا while فهذا يعني اننا نريد الدخول في حلقة تكرارية غير منتهية
فكل ما سوف ياتي بعد هذا القوس فسوف يتم تكراره الي عدد لا نهائي الي ان نقوم بعمل reset للمتحكم او نقوم بفصل البور عن الدائرة
فكل الرسائل الترحيبيه السابقة التي اظهرناها في الشاشة سوف تظهر لمره واحدة فقط عند بداية تشغيل البرنامج وعندما يصل البرنامج الي الحلقة التكرارية while فانه سوف يقوم بتنفيذ الاوامر الموجودة داخل هذه الحلقة فقط ولن يخرج منها
فكل اجزاء البرنامج التالية لهذه الحلقة سوف يتم تنفيذها لعدد غير نهائي او حتي يتم ايقاف المتحكم او اعادة تشغيلة
واذا لم نكتب الرقم 1 فسوف يتم تنفيذ البرنامج او الاوامر التالية لمرة واحده فقط
Lcd_Out(1,1,"Temp now") ;
هنا اخبرنا المتحكم بان يقوم باظهار هذه الكلمات Temp now علي الشاشة في السطر الاول ابتدأ من العمود الاول وسوف تظل هذه الكلمات ظاهرة في هذا الموقع من الشاشة طالما البرنامج يعمل
temp_c = Adc_Read(1) ;
هنا اخبرنا المتحكم أن يذهب الي المحول من تماثلي الي رقمي وتحديداً الي الطرف رقم 2 من هذا المحول والذي هو RA1 لان ترقيم الاطراف يبدأ من الصفر لذلك هو الطرف رقم اثنين
ثم يقوم بقراءة القيمة الناتجة من عملية التحويل من تماثلي الي رقمي من هذا الطرف
ثم يقوم بتخزين هذه القيمة في المتغير temp_c الذي اعلنا عنه في بداية البرنامج
اذاً الان لدينا قيمة عددية مخزنة في المتغير temp_c تُمثل درجة الحرارة المقاسة بواسطة الحساس والتي تم تحويلها بواسطة المحول الي قيمة رقمية
temp =(temp_c*0.48876);
هنا قلنا للمتحكم قم بضرب القيمة العددية التي خذنتها في المتغير temp_c
بالعدد 0.48876 وخزن الناتج في المتغير temp
لكن لماذا هذا العدد بالتحديد
حسنا لنفهم كيف قمنا بحساب هذا العدد هنالك بعض المعادلات يجب ان نفهمها
وهي كالاتي
حسناً هذه المعادل تحتوي علي ناتج عملية التحويل من تماثلي الي رقمي وكذلك تحتوي علي الجهد الداخل الي المحول فاذا علمنا قيمة اي واحد من الاثنين نستطيع ان نجد الثاني و Vref او الجهد المرجعي في حالتنا هذه هو 5 فولت اذا اصبح لدينا مجهولين فقط في المعادلة متي ما علمنا احدهم نستطيع ايجاد الاخر
وناتج قسمة 5 علي 1023 هو 0.0048876 لكن هذه القيمة بالملي فولت ولتحويلها بالفولت نقوم بضربها في 1000 وتصبح 4.8876
حسناً في خصائص الحساس قلنا ان كل درجة حرارة تكافئي 10 ملي فولت اذا لكي نحصل علي درجة الحرارة بالتحديد يجب ان نقسم هذه القيمة علي 10 لكي نحصل علي درجة الحرارة المقاسة بالضبط
اذا القيمه سوف تصبح 0.48876
الان هل اتضح من اين اتينا بالمعادلة temp =temp_c*0.48876
IntToStr(temp , tempre ) ;
لقد قلنا سابقا ان الشاشة لا تستطيع ان تظهر الارقام وتستطيع ان تظهر السلاسل الحرفية فقط لكن لدينا هذه الدالة التي تقوم بتحويل الاعداد الصحيحة الي سلاسل حرفية حتي نتمكن من اظهارها علي الشاشة
IntToStr فهي int TO string
وسوف تقوم هذه الدالة بتحويل العدد الصحيح temp الي صيغة السلاسل الحرفية وتخزين ناتج عملية التحويل في المصفوفة tempre
Lcd_Out(2,1,tempre) ;
الان سوف ناخذ ناتج عملية التحويل ونظهره علي الشاشة وهو درجة الحرارة المقاسة
وقلنا للمتحكم قم بكتابة المصفوفة tempre في السطر الثاني ابتدأ من العمود الاول
Lcd_Out_Cp(" ") ;
الان قلنا للمتحكم اترك مساحة فارغة في الشاشة بمقدار حرف واحد
الم تلاحظ اننا اعلنا عن ذلك بصورة مختلفة هذه المرة ولم نحدد رقم الصف او العمود
هذه الطريقة ايضاً تستخدم للكتابة علي الشاشة وما يميزها هو انها تقوم بالكتابة علي الشاشة ابتدأ من اخر نقطة كان المؤشر واقف عليها وفي حالتنا هذه اخر شئ كتبناه هو محتويات المصفوفة tempre وكان ذلك في السطر الثاني العمود الاول واذا افترضنا ان محتويات المصفوفة tempre اخذت اربعة حروف او اربعة اعمدة من الشاشة وتحديدا في الصف الثاني وابتدأ من العمود الاول والثاني والثالث والرابع اذاً المؤشر الان يقف في الصف الثاني العمود الخامس فسوف يترك مساحة فارغة ويذهب الي العمود السادس
Cp تعني current position اي الموقع الحالي للمؤشر
Lcd_Out(2,8,"celsius") ;
حسنا هنا قلنا للمتحكم قم بكتابة كلمة celsius في السطر الثاني العمود الثامن
وهذه الكلمة سوف تظهر كتمييز لدرجة الحرارة بعد قيمتها
if (temp>=32)
{
PORTC = 0B10001001;
Lcd_Out(1,10," (hot)") ;
delay_ms(500);
}
حسنا هذه هي الاجراءات التي نريد من المتحكم ان يتخذها اذا كانت درجة الحرارة اعلي من32 درجة مئوية
فسوف يختبر درجة الحرارة بهذا الشرط (if (temp>=32
فاذا تحقق الشرط و وجد ان درجة الحرارة اعلي من او تساوي 32 سوف يقوم بعمل التالي واذا وجد انها اقل من 32 فسوف لن ينفذ ما بعد هذه الجملة الشرطية
فاذا وجدها اعلي من او تساوي 32 فسوف يقوم بجعل بورت B هكذا
PORTC = 0B10001001 اي انه سوف يخرج 5 في في الطرف رقم 1 من بورت B وهذا الطرف موصول معه اللد الاحمر اذاً ان اللد سوف يضئ
و 5 فولت علي الطرف رقم 4 من بورت B وهذا الطرف موصول معه جرس الانذار
اذاً ان الجرس سوف يصدر صوت انذار
و 5 فولت علي الطرف رقم 8 من بورت B وهذا الطرف موصول معه المروحه اذاً سوف تعمل المروحة
Lcd_Out(1,10," (hot)") ;
هذا الامر سوف يقوم بكتابة (hot) في السطر الاول ابتدأ من العمود العاشر لاحظ اننا تركنا مساحة حرف خالية قبل هذه الكلمة وهذا اجراء فني لتفادي عملية مسح الشاشة حتي لا يحصل تداخل مع كلمات اخري سوف نكتبها لاحقا
هذه الدالة سوف تقوم بكتابة ما بين علامتي التنصيص " " مهما كان حرف او مساحة خالية او اي شئ نكتبه
delay_ms(500);
وبهذا الامر نخبر المتحكم ان ينتظر لمدة نصف ثانيه لا يفعل فيها شئ بعد تنفيذ الخطوات السابقة
اذا المتحكم اذا وجد ان درجة الحرارة اعلي من او تساوي 32 سوف يقوم باخراج 5 فولت علي الاطراف التي حددناها له وذلك سوف يؤدي الي تشغيل اللد بالون الاحمر وكذلك جرس الانذار وتشغيل المروحة
الجملية الشرطية (if (temp>=32
يتبع لها ما بين القوسين { } فقط وهما ضروريان واذا لم نكتب القوسين فسوف يقوم البرنامج بتنفيذ اول سطر بعد الشرط فقط في حالة تحقق الشرط
if (temp<30 & temp>=20)
{
PORTC = 0B10000010;
Lcd_Out(1,10," (good)") ;
delay_ms(500);
}
هنا قلنا للمتحكم اختبر درجة الحرارة فاذا وجدتها اقل من 30 درجة و اعلي من او تساوي 20 درجة قم بتنفيذ الاتي واذا لم تكن درجة الحرارة في هذا المدي بين 20 و 30 لا تنفذ ما بعد هذا الشرط
فاذا تحقق الشرط و وجد ان درجة الحرارة اعلي من 20 واقل من 30 فسوف يقوم بتنفيذ الاتي
PORTC = 0B10000010 ;
سوف يقوم باخراج 5 فولت علي الطرف رقم 2 من بورت B وهو الطرف الموصول معه اللد باللون الاخضر اذاً هذا اللد سوف يضئ في هذه الحالة
ثم يقوم باخراج 5 فولت علي الطرف رقم 8 من بورت B وهو الطرف الموصول معه المروحة اذاً سوف يقوم بتشغيل المروحة في هذه الحالة
Lcd_Out(1,10," (good)") ;
وهنا قمنا بكتابة (good) علي الشاشة في السطر الاول ابتدأ من العمود العاشر وهي كلمه دلالية علي ان درجة الحرارة معتدلة
اذا كانت درجة الحرارة اعلي من 32 ثم اصبحت اقل من 30 فان هذه الكلمة (good) تحل محل الكلمة السابقة (hot) وتقوم بمسحهها وتظهر مكانها
delay_ms(500);
ثم بعد ذلك اخبرنا المتحكم ان ينتظر لمدة نصف ثانيه لا يفعل فيها شئ بعد تنفيذ الاوامر السابقة
ثم بعد نصف ثانيه سوف يذهب مره اخري لاختبار درجة الحرارة ليري هي في اي مدي حتي ينفذ الاوامر الخاصة بذلك المدي
اذاً المتحكم سوف يقوم بقياس درجة الحرارة كل نصف ثانية ثم يتخذ الاجراء المناسب تبعا لدرجة الحرارة التي سوف يقيسها
if (temp<18)
{
PORTC = 0B00000100;
Lcd_Out(1,10," (Cool)") ;
delay_ms(500);
}
هنا اخبرنا البرنامج ان يختبر درجة الحرارة هل هي اقل من 18 درجة ام لا فاذا وجدها اقل من 18 درجة فسوف يتخذ الاجراءات التالية واذا وجد انها اعلي من 18 درجة فسوف يتخذ اجراءات اخري
فاذا اختبر درجة الحرارة و وجد انها اقل من 18 درجة مئوية فسوف يقوم بتنفيذ الاتي
PORTC = 0B00000100;
سوف يقوم باخراج 5 فولت علي الطرف رقم ثلاثة من البورت B وهو الطرف الموصول معه اللد باللون الاصفر اذا في هذه الحاله سوف يقوم باضاءة اللد الاصفر فقط
Lcd_Out(1,10," (Cool)") ;
ثم يقوم باظهار (Cool) علي الشاشة دلالة علي ان الجو بارد
delay_ms(500);
ثم ينتظر المتحكم نصف ثانيه لا يفعل بها شئ بعد تنفيذ الاجراءات السابقة
ثم ختمنا برنامجنا بالقوسين
{
{
احدهم قوس الدالة الرئيسية main والاخر قوس الحلقة التكرارية while
هل لاحظتا اننا تركنا فجوات في مدي درجة الحرارة لم نفعل فيها شئ مثلا
بين 32 و 30 لم نحدد للبرنامج ماذا يفعل وكذلك بين 20 و 18 لم نحدد للبرنامج ماذا يفعل
هذا الاجراء اتخذناه لتفادي مشكلة في المرحل فاذا لم نترك هذا المدي وكانت درجة الحرارة بين 30 و29 فسوف تحصل ارتدادات سريعة جدا في المرحل سوف يفتح ويغلق عدة مرات في فترة بسيطة جداً وهذه الارتدادات قد ئؤدي إلي عدة مشاكل لذلك تركنا هذا المدي الذي لم نحدد فيه للمتحكم ماذا يفعل
وفي هذا المدي سوف تكون الاجراءات كما اخر حالة كان عليها النظام مثلا اذا كانت درجة الحرارة 32 ثم اصبحت 31 فسوف تبقي الاجراءات كما هيا اي كان درجة الحرارة هي 32
واذا كانت درجة الحرارة 29 ثم اصبحت 31 فسوف تبقي الاجراءات كما الحالة السابقة اي كان درجة الحرارة 29 وهكذا
وبهذا نكون قد اتممنا برنامجنا بنجاح ^_^
واتممنا النظام حسب ما خططنا له
يمكنك التعديل علي هذا البرنامج كما تريد فقط تُخبره ان يقيس درجة الحرارة واذا وجدها في المدي الذي تُريده يقوم باجراء خطوات محدده تحددها انت
if (temp>=32)
{
PORTC = 0B10001001;
Lcd_Out(1,10," (hot)") ;
delay_ms(500);
}
if (temp<30 & temp>=20)
{
PORTC = 0B10000010;
Lcd_Out(1,10," (good)") ;
delay_ms(500);
}
if (temp<18)
{
PORTC = 0B00000100;
Lcd_Out(1,10," (Cool)") ;
delay_ms(500);
}
هذا الجزء من البرنامج هو الذي يتحكم في البرنامج فالاجزاء السابقة سوف تكون ثابتة اما هذا الجزء هو الذي نحدد فيه خطة العمل لبرنامجنا فاطلق العنان لخيالك وافعل ما تريد