‏إظهار الرسائل ذات التسميات أفكار هندسية. إظهار كافة الرسائل
‏إظهار الرسائل ذات التسميات أفكار هندسية. إظهار كافة الرسائل

الثلاثاء، 17 ديسمبر 2013

شرح مشروع اشارات المرور باستخدام المتحكم الدقيق PIC16F877A



فكرة المشروع 
إنشاء اشارت مرور لاربعة تقاطعات الاشارات الاساسية فقط من دون التفرعات والعدادات فقط ثلاثة اشارات لكل مسار الاخضر والاصفر والاحمر
استخدام المتحكم لاعطاء خرج خمسة فولت بازمان محددة نحددها نحن في البرنامج وخرج المتحكم هذا سوف نستخدمه لتشغيل اللدات التي تمثل الاشارات المختلفة لكل مسار 

مبدأ عمل المشروع


حسب البرنامج الذي سوف نقوم بكتابته سوف يقوم المتحكم الدقيق باخراج جهد علي اطرافه بالتناوب وبازمان محددة في البرنامج تمثل هذه الازمان وقت اغلاق وفتح كل اشارة والوقت الذي سوف تظل فيه كل اشارة مضيئة 
فسوف يضئ المسار الاول الاشارة الخضراء بينما بقية المسارات تكون باللون الاحمر وعند انتهاء الزمن المحدد للاشارة الخضراء للمسار الاول يتم اطفاء الاشارة الخضراء لهذا المسار واضاءة الاشارة الصفراء لوقت قصير نحدده نحن ثانية او ثانيتين او كما نريد وتظل بقية الاشارات حمراء ثم بعد ذلك يتم اطفاء الاشارة الصفراء للمسار الاول واضاء الاشارة الحمراء لهذا المسار وفي نفس الوقت يتم اضاءة الاشارة الصفراء للمسار الثاني استعداداً لاضاءة الاشارة الخضراء وبقية الاشارات تظل حمراء
ثم بعد ذلك يتم اضاءة الاشارة الخضراء للمسار الثاني وتظل بقية الاشارات حمراء للوقت المحدد في البرنامج ثم بعد انتهاء الوقت المحدد يتم اطفاء الاشارة الخضراء للمسار الثاني ثم اضاءة الاشارة الصفراء للمسار الثاني لوقت قصير ثم اطفاء الاشارة الصفراء للمسار الثاني ثم اضاءة الاشارة الحمراء للمسار الثاني وفي نفس الوقت اضاءة الاشارة الصفراء للمسار الثالث استعداداً للتحرك لوقت قصير ثم اطفاء الاشارة الصفراء للمسار الثالث واضاءة الاشارة الخضراء للمسار الثالث وبقية الاشارات تظل حمراء
وهكذا لكل المسارات حتي يتم الانتهاء من المسار الرابع والاخير واعادة نفس الاوامر الي مالانهاية او حتي اعادة تشغيل البرنامج او المتحكم الدقيق

العناصر المستخدمة في المشروع 

المتحكم الدقيق  PIC16F877A

لدات LED   بثلاثة الوان احمر  اصفر  اخضر

مقاومات لحماية اللدات  220 اوم


مخطط الدائرة






كما نلاحظ من الدائرة فانه تم استخدام المتحكم الدقيق pic16f877A  بالاضافة الي لدات تمثل الاشارات المختلفة وتم استخدام مقاومات بين المتحكم الدقيق واللدات لحماية اللدات من الاحتراق لان المتحكم يعطي 5 فولت بينما اللدات تحتاج الي ثلاثة فولت فقط في البروتوس يمكن الاستغناء عن هذه المقاومات اما في التنفيذ العملي فلا يمكن الاستغناء عنها الا اذا كانت اللدات تعمل بجهد قدره 5 فولت او اكثر
قمنا باختيار مقاومات قدرها 220 فولت وطريقة حساب المقاومات تم التطرق لها سابقاً في موضوعين 
في هذا المشروع  http://goo.gl/MU3RZx  ابحث عن الفقرة التي تتحدث عن 

طريقة حساب المقاومات لحماية العناصر الالكترونية المختلفة

وفي هذا الموضوع ايضاً    http://goo.gl/td4zmx  

تم توصيل اللدات مع المتحكم حسب الترتيب التالي 

المسار الاول 
الاحمر في الطرف رقم 1 من بورت B
الاصفر في الطرف رقم 2 من بورت B
الاخضر في الطرف رقم 3 من بورت B

المسار الثاني 
 الاحمر في الطرف رقم 6 من بورت B
الاصفر في الطرف رقم 7 من بورت B
الاخضر في الطرف رقم 8 من بورت B

المسار الثالث
الاحمر في الطرف رقم 6 من بورت B
الاصفر في الطرف رقم 7 من بورت B
الاخضر في الطرف رقم 8 من بورت B

المسار الرابع 
الاحمر في الطرف رقم 1 من بورت B
الاصفر في الطرف رقم 2 من بورت B
الاخضر في الطرف رقم 3 من بورت B


الان فلننتقل الي جزء المتعة وهو جزء البرمجة 

قلنا دائماً قبل كتابة اي برنامج يستحسن كتابة خطة البرنامج وخطتنا لهذا البرنامج بسيطة الي حد ما نريد من المتحكم ان يخرج 5 فولت في ارجل معينة موصول معها لدات محدده لمدة محددة ثم يقوم باخراج 5 فولت في ارجل اخري ثم 5 فولت في ارجل اخري وهكذا والبرنامج سوف يكون كالاتي

المسار الاول اخضر بقية المسارات احمر
انتظر لمدة 7 ثواني
المسار الاول اصفر بقية المسارات احمر 
انتظر لمدة 1 ثانية 
المسار الاول احمر و المسار الثاني اصفر وبقية المسارات احمر 
انتظر لمدة 1 ثانية
المسار الثاني اخضر بقية المسارات احمر
انتظر لمدة 7 ثواني
المسار الثاني اصفر بقية المسارات احمر 
انتظر لمدة 1 ثانية 
المسار الثاني احمر و المسار الثالث اصفر وبقية المسارات احمر
انتظر لمدة 1 ثانية
المسار الثالث اخضر بقية المسارات احمر
انتظر لمدة 7 ثواني 
المسار الثالث اصفر بقية المسارات احمر
انتظر لمدة 1 ثانية 
المسار الثالث احمر و المسار الرابع اصفر و بقية المسارات احمر
انتظر لمدة 1 ثانية
المسار الرابع اخضر بقية المسارات احمر 
انتظر لمدة 7 ثواني 
المسار الرابع اصفر بقية المسارات احمر
انتظر لمدة 1 ثانية
المسار الرابع احمر المسار الاول اصفر وبقية المسارات احمر
انتظر لمدة 1 ثانية 

ارجع لاعادة الاوامر السابقة  وهكذا الي مالانهاية او اعادة تشغيل المتحكم الدقيق

عندما نقول تشغيل اللد الاحمر او اطفاءه او غيره من اللدات نقصد به اخراج خمسة فولت علي الطرف الموصول بها هذا اللد للتشغيل او اخراج صفر فولت للاطفاء

الان الي البرنامج سوف اقوم بكتابة البرنامج ثم اقوم بشرحه خطوة خطوة


void main()
 {
trisb = 0b00000000;
trisd = 0b00000000;

portb = 0b00000000;
portd = 0b00000000;
for(;;)
{
portb = 0b00100100;
portd = 0b00100001;

delay_ms(7000);

portb = 0b00100010;
portd = 0b00100001;

delay_ms(1000);

portb = 0b01000001;
portd = 0b00100001;

delay_ms(1000);

portb = 0b10000001;
portd = 0b00100001;

delay_ms(7000);

portb = 0b01000001;
portd = 0b00100001;

delay_ms(1000);

portb = 0b00100000;
portd = 0b01000001;

delay_ms(1000);

portb = 0b00100001;
portd = 0b10000001;

delay_ms(7000) ;

portb = 0b00100001;
portd = 0b01000001;

delay_ms(1000);

portb = 0b00100001;
portd = 0b00100010;

delay_ms(1000);

portb = 0b00100001;
portd = 0b00100100;

delay_ms(7000);

portb = 0b00100001;
portd = 0b00100010;

delay_ms(1000);

portb = 0b00100010;
portd = 0b00100001;
delay_ms(1000);
}
}

الان الي الشرح خطوة خطوة


void main()
 {

استدعاء الدالة الرئيسية مين main ومن دونها لن يعمل البرنامج 
والقوس هو بداية البرنامج ويبدأ تنفيذ البرنامج من بعد هذا القوس

trisb = 0b00000000;
trisd = 0b00000000;
هنا قلنا للبرنامج اجعل بورت B و بورت D كخرج 
اي قمنا بتهيئة  بورت بي وبورت دي لاخراج الجهد عليهما لتشغيل اللدات


portb = 0b00000000;
portd = 0b00000000;

هنا قمنا بجعل اطراف بورت B و بورت D صفر فولت
اي ان كل اللدات مطفاءة عند بداية تشغيل البرنامج وهو اجراء احترازي حتي اذا كان هنالك اي خلل قبل بدأ البرنامج يتم تجاوزه بجعل كل اللدات مطفاءة في بدايةالبرنامج

for(;;)
{

هنا اخبرنا البرنامج بالدخول في حلقة تكرارية مغلقة 
اي ان يقوم بتكرار الاوامر التالية لقوس الحلقة الي مالانهاية او حتي يتم اعادة تشغيل المتحكم الدقيق 
كل الاوامر التي تاتي بعد هذا القوس سوف يتم تكرارها الي عدد غير محدود 
وهذه هي طريقة الاعلان عن حلقة مغلقة باستخدام الفور لوب for

portb = 0b00100100;
portd = 0b00100001;

هنا قمنا باخبار المتحكم ان يقوم باخراج 5 فولت علي الاطراف المحددة بالرقم 1 واخراج صفر فولت علي الاطراف المحددة بالرقم 0 من بورت B  و بورت D
فاي لد موصول مع طرف اخرجنا فيه 5 فولت سوف يضئ  واي لد موصول مع طرف اخرجنا فيه 0 فولت سوف يكون مطفاء
وفي الاوامر السابقة قمنا باخراج 5 فولت علي الاطراف
رقم ثلاثة من بورت B  وموصول معه اللد الاخضر للمسار الاول اي سوف يكون مضاء والطرف رقم 6 من بورت B وموصول معه اللد الاحمر للمسار الثاني اي سوف يكون مضاء والطرف رقم 6 من بورت D وموصول معه اللد الاحمر للمسار الثالث اي سوف يكون مضاء و الطرف رقم 1 من بورت D وموصول معه اللد الاحمر للمسار الرابع اي سوف يكون مضاء

delay_ms(7000);

هنا قلنا للبرنامج بعد ان نفذت الاوامر السابقة انتظر لمدة 7 ثواني لا تفعل فيها شئ اخر
يمكن تغيير هذا الرقم الي الزمن الذي نريد ان تظل فيه الاشارة الخضراء للمسار الاول مضاءة فكل ثانية تعادل 1000 مايكرو ثانية

portb = 0b00100010;
portd = 0b00100001;

هنا ايضا اخبرنا المتحكم بان يقوم باخراج 5 فولت علي الاطراف المحددة بالرقم 1 وان يقوم باخراج 0 فولت علي الاطراف المحددة بالرقم 0 
واللدات الموصولة مع الاطراف المحددة بالرقم 1 سوف تضئ واللدات الموصولة مع الاطراف المحددة بالرقم 0 سوف تكون مطفاءة 
راجع ترقيم الاطراف واللدات الموصوصلة معها التي ذكرتها اعلاه

delay_ms(1000);

هنا اخبرنا البرنامج انه بعد ان يقوم بتنفيذ الاوامر السابقة بان ينتظر لمدة 1 ثانية

portb = 0b01000001;
portd = 0b00100001;
  

هنا ايضا اخبرنا البرنامج بان يقوم باخراج 5 فولت علي الارقام المحددة بالرقم 1 و 0 فولت علي الارقام المحددة بالرقم 0


وهكذا يستمر تنفيذ البرنامج الي اخر امر ثم اعادة هذه الاوامر من جديد
ففي كل مرة نقوم باخراج 5 فولت علي اطراف محددة و 0 فولت علي اطراف اخري ثم ننتظر لمدة محددة ثم تنفيذ الامر التالي 

الان يمكننا ان نكتب البرنامج السابق بطريقة اكثر احترافية باستخدام الدوال بدل اوامر التاخير 
فبدل ان نكتب  (delay_ms(1000   او  (delay_ms(7000 في كل مرة نستطيع ان نكتب دالتين تحتوي كل واحدة منهما علي امر تاخير نقوم باستدعائها عندما نريد كتابة تاخير زمني 
وسوف يصبح شكل البرنامج السابق كالتالي



void delay1()
{
delay_ms(7000);
}
void delay2()
{
delay_ms(1000);
}

void main()
 {
trisb = 0b00000000;
trisd = 0b00000000;

portb = 0b00000000;
portd = 0b00000000;
for(;;)
{
portb = 0b00100100;
portd = 0b00100001;

delay1();

portb = 0b00100010;
portd = 0b00100001;

delay2();

portb = 0b01000001;
portd = 0b00100001;

delay2();

portb = 0b10000001;
portd = 0b00100001;

delay1();

portb = 0b01000001;
portd = 0b00100001;

delay2();

portb = 0b00100000;
portd = 0b01000001;

delay2();

portb = 0b00100001;
portd = 0b10000001;

delay1() ;

portb = 0b00100001;
portd = 0b01000001;

delay2();

portb = 0b00100001;
portd = 0b00100010;

delay2();

portb = 0b00100001;
portd = 0b00100100;

delay1();

portb = 0b00100001;
portd = 0b00100010;

delay2();

portb = 0b00100010;
portd = 0b00100001;
delay2();
}
}


فكما نلاحظ قمنا بانشاء دالتين delay1  و delay2  احداهما تحتوي علي امر تاخر 7 ثواني والاخري تحتوي علي امر تاخير 1 ثانية 
فعندما نريد تاخير بمقدار 7 ثواني فقط نقوم باستدعاء الدالة التي تحتوي علي امر التاخير هذا عن طريق كتابة اسمها فقط بالطريقة الموضحة في البرنامج
وعندما نريد تاخير زمني بمقدار 1 ثانية ايضا نقوم باستدعاء الدالة التي تحتوي علي امرالتاخير هذا عن طريق ذكر اسمها فقط بالطريقة الموضحة في البرنامج اعلاه

تم بحمد الله
واتمنا ان اكون قد وفقت في ايصال فهم المشروع وطريقة عمله

سوف تجدون ملفات المحاكاة والكود لهذا البرنامج علي الرابط التالي



هذا فيديو للتجربة



شكراً لكم علي صبركم وتعليقاتكم تسعدني
وارائكم تسعدني
ودمتم في سلام

الاثنين، 4 نوفمبر 2013

الشرح الكامل لمشروع التحكم في درجة حرارة وسط محيط باستخدام LM35 و PIC16F877A



فكرة المشروع


التحكم في درجة حرارة وسط محيط عن طريق قياس درجة الحرارة في هذا الوسط باستخدام حساس الحرارة LM35  ثم تمرير درجة الحرارة المقاسة الي المتحكم الدقيق PIC16F877A  الذي بدوره يقارن درجة الحرارة المقاسة مع درجات حرارة مرجعية مكتوبة في البرنامج (سوف يتم استخدام برنامج microC  لكتابة البرنامج) ثم يقوم المتحكم الدقيق بتشغيل او إيقاف المروحة المسؤولة عن توازن درجة الحرارة وعندما تصل درجة الحرارة الي حد الخطر يتم تشغيل جرس انذار ويتم اظهار درجة الحرارة المقاسة علي شاشة كرستالية  كل ذلك نحدده من خلال البرنامج الذي سوف نكتبه

باختصار هذا النظام يُعتبر مديرنا التنفيذي لدرجة الحرارة حيث  نُعطيه خطتنا لادارة درجة الحرارة ونقول له اجلس هنا وراقب لنا درجة الحرارة اذا زادت درجة الحرارة عن كذا قم بتشغيل هذه المروحة واذا قلت درجة الحرارة عن كذا قم بايقاف المروحة اقتصاداً للكهرباء  ^_^  واذا زادت درجة الحرارة وقمت بتشغيل المروحة ولكن 


لسبب  ما حتي بعد تشغيل المروحة لم تنخفض درجة الحرارة قم باطلاق جرس الانذار حتي اعلم بذلك وهذا المدير التنفيذي سوف يقوم بتنفيذ هذه الخطة حرفيا كما طلبنا منه وكل هذه الخطة و الاوامر سوف نخبره بها عن طريق البرمجة ويمكن أن نزيد عليها المزيد من الخصائص حسب ما نريد اذاً دعونا نبدأ بالتعرف علي مديرنا التنفيذي هذا ونتعرف علي مكوناتة

مخطط صندوقي للمشروع 




مبدأ عمل المشروع

سوف يقوم الحساس LM35 بقياس درجة الحرارة ثم يمررها الي المتحكم الدقيق PIC16F877A  الذي يقوم بتحويل الاشارة التماثلية القادمة من الحساس الي اشارة رقمية تمثل درجة الحرارة المقاسة  ثم يقوم بمقارنتها مع درجات مرجعية مخزنة لديه في البرنامج ثم يقوم باتخاذ القرار المناسب إما يقوم بتشغيل المروحة و إما يقوم باغلاقها حسب نتيجة المقارنة وسوف يتم تشغيل جرس إنذار عندما تصل درجة الحرارة الي مستوي معين يتم تحديده في البرنامج وسوف يقوم المتحكم الدقيق باظهار درجة الحرارة المقاسة علي شاشة كرستالية تستخدم لاظهار درجة الحرارة  واظهار رسائل من النظام للمستخدم


عناصر المشروع

المتحكم الدقيق PIC16F877A 

عناصر الكترونية مختلفة    (كرستاله + مكثفات + منظم جهد 5 فولت )

الحساس LM35

مروحة للتبريد

شاشة كرستال 16*2  LCD

مقاومات بقيم متعدده

ترانزستور  2N2222

لدات

ريلي (مرحل) عند الاحتياج الي تشغيل عنصر ذو جهد عالي مع الدائرة

مصدر جهد 12 فولت

شرح مُختصر لعناصر المشروع و خصائصها

الحساس LM35
يمتاز بالثبات الخطي فيعطي 10 ملي فولت لكل درجة حرارة مئوية
مجال قياسه واسع يتراوح ما بين -55 الي 150 درجة مئوية
لديه دقة قياس تقدر بنصف درجة مئوية عند 25 درجة مئوية
يعمل عند جهد من 4 فولت الي 30 فولت
التسخين الذاتي منخفض جدا

المتحكم الدقيق PIC16F877A 
لديه ذاكرة 8k
لديه محول داخلي من تماثلي الي رقمي (سوف نحتاجه في هذا المشروع )

الشاشة الكرستالية
استهلاكها للطاقة قليل وهذا جيد للتطبيقات التي تستخدم بطاريات صغيره كمصدر جهد
لديها دقه عالية في اظهار الكتابة
لديها اضاءه خلفية مما يتيح رؤية الكتابة عليها في الظلام


الترانزستور 2N2222
تم استخدامه لان التيار الخارج من المتحكم الدقيق غير كافي لتشغيل احمال خارجية كبيره لذا تم استخدام الترانزستورليعمل كمفتاح بحيث يسمح بتشغيل الاحمال الخارجية عن طريق الريلي (المرحل)


مخطط المشروع




حسناً الان دعونا نتتبع دائرة المشروع خطوه خطوه

فلنبدأ بدائرة التغذية التي تمد المتحكم الدقيق والحساس بالجهد المناسب هذه الدائرة تتكون من مصدر جهد 9 فولت او 12 فولت ثم بعد ذلك يتم تنظيم هذا الجهد لكي يخرج الينا 5 فولت ثابت وللحصول علي 5 فولت مستقر نستخدم مُنظم الجهد 7805 فهذا المُنظم ندخل اليه الجهد 9 فولت ويقوم باعطائنا في خرجه جهد 5 فولت مستقر وثابت  ويجب ان لا يقل الجهد الداخل الي المنظم عن 7 فولت حتي نحصل علي خرج مستقر (اقل فرق بين جهد الدخل وجهد الخرج 2 فولت)  واعلي جهد دخل يجب ان يكون اقل من 35 فولت في الواقع لكي تحصل علي افضل نتائج استخدم جهد دخل 9 فولت لتتجنب مسائل السخانه في المنظم وغيره واقصي تيار يمكن لهذا المنظم تامينه هو 1.5 امبير لمزيد من التفاصيل اطلع علي الداتا شيت الخاص بهذا المنظم


صوره لمنظم الجهد 7805






كما يتضح من الصورة فانه يتكون من ثلاثة اطراف علي اليسار الدخل القادم من البطارية او مصدر الجهد و في الوسط الارضي الذي يوصل مع ارضي البطارية او مصدر الجهد وكذلك مع بقية خطوط الارضي من بقية عناصر الدائرة وعلي اليمين الخرج 5 فولت الذي سوف نغذي به المتحكم الدقيق والحساس وبقية المكونات التي تحتاج الي جهد 5 فولت 


والان الي طريقة توصيل منظم الجهد 7805 في الدائرة






استقرار مصدر الجهد في دوائر المتحكم الدقيق يعني استقرار في عمل الدائرة وتجنب الكثير من المشاكل والعقبات
لقد قمنا بتوصيل مكثف قبل منظم الجهد ومكثف بعده وذلك للقضاء علي اي تشوهات قد تحدث في الجهد او تشويش
اذا كانت هنالك حرارة عالية في منظم الجهد يمكن تثبيته علي مشتت حراري مناسب
الان بعد ان اخذنا الجهد من مصدر الجهد وقمنا بتنظيمه واخراج 5 فولت التي هي كافية لتشغيل المتحكم الدقيق والحساس دعونا ننتقل الي المرحلة التالية والتي نتعرف فيها علي الحساس LM35 


الحساس LM35 

هو حساس لقياس درجة الحرارة يمكنه قياس الحرارة في الوسط المحيط به ويمتاز بموثوقية جيدة حيث لديه نسبة خطأ 0.5 درجة مئوية أي أن درجة الحراره التي سوف يعطينا لها يمكن ان تزيد او تنقص بمقدار نصف درجة مئوية فقط
وطبيعة عمله انه عندما نعطيه في دخله 5 فولت فان خرجه يزيد بمقدار 10 ملي فولت لكل درجة مئوية أي انه عند 1 درجة مئوية سوف يكون خرجه 10 ملي فولت وعند 2 درجة مئوية سوف يكون خرجه 20 ملي فولت وعند 3 درجة مئوية سوف يكون خرجه 30 ملي فولت وتكون هذه الزيادة خطية بهذه الصورة كل ما ترتفع درجة الحرارة درجة مئوية سوف يزيد الجهد الخارج من الحساس بمقدار 10 ملي فولت وكذلك كلما انخفضت درجة الحرارة درجة مئوية سوف ينخفض الجهد الخارج من الحساس بمقدار 10 ملي فولت وفي درجة حرارة الغرفة العادية 25 درجة مثلا سوف يعطي الحساس في خرجه 250 ملي فولت
وله ثلاثة ارجل يشبه في شكله الترانزستور كما يظهر في الصورة التالية



كما نلاحظ الحساس له ثلاثة ارجل الطرف اليسار هو دخل الحساس وهو 5 فولت ونوصله مع خرج منظم الجهد والطرف الوسط هو خرج الحساس ويتغير خرجه علي حسب درجة الحرارة في الوسط المحيط بالحساس ويتم توصيله مع المتحكم الدقيق والطرف الايمن هو ارضي الحساس ويتم توصيله مع ارضي الدائرة

الان بعد ان قمنا بتوصيل الحساس اصبح لدينا جهد خارج من الحساس يمثل درجة الحرارة سوف ناخذ هذا الجهد وندخله علي المتحكم الدقيق الذي سوف يقوم باجراء بعض المعالجات ثم يتخذ قرارات حسب نتيجة هذه المعالجات
لكن الان لدينا مشكله  خرج الحساس عباره عن جهد متغير وهو يعتبر اشارة تماثلية وصديقنا المتحكم الدقيق لا يفهم الاشارة التماثلية هو فقط يفهم الاشارة الرقمية كانما الحساس يتحدث اللغة العربية وصديقنا المتحكم الدقيق يتحدث اللغة الانجليزية ماذا نفعل اذا لكي نجعلهم يتواصلون مع بعض ويتخاطبون بالتاكيد لا بد ان ناتي بمترجم بينهم وفي حالتنا هذه عثرنا علي هذا المترجم ويسمي ADC اي المحول من تماثلي الي رقمي

( Analog TO Digital Converter)  هذا المترجم يستطيع ان يفهم الاشارة التماثلية وتحويلها الي اشارة رقمية لكنه لا يستطيع فعل العكس وهذا ما نريد نحن بالضبط نريد ان يتحدث الحساس مع المتحكم الدقيق فقط ولا نريد العكس ولحسن حظنا  ان المتحكم الدقيق الذي نستخدمه لديه ميزة جميلة وهي انه يحتوي علي محول من تماثلي الي رقمي داخلي اي لن نحتاج الي محول خارجي جيد الان ليس لدينا مشكله عثرنا علي المترجم الذي يُمكن المتحكم الدقيق من فهم لغة الحساس                                                 

الان دعنا نتعرف علي هذا المحول الذي يربط بين المتحكم الدقيق والحساس
اولا دعنا ننظر الي شكل الاشارة التماثلية الداخلة الي هذا المحول
الاشارة التماثلية هي اشارة متغيرة مع الزمن يعني في كل لحظه زمنية معينة لها قيمة مختلفة قد تكون سالبة او موجبة لكن دعنا الان ناخذ هذه الاشارة التي تمثل الجزء الموجب فقط





هذا هو شكل الاشارة التماثلية الداخلة الي المحول اذا ماذا سوف يفعل المحول حتي يقوم بتحويل هذه الاشارة الي رقمية
يقوم بعدة معالجات لكن دعني اختصرها لك في الخطوات التاليه حتي يسهل فهمها
اولا يقوم باخذ عينات من الاشارة كل فترة زمنية محددة ويقسم الاشارة التماثلية الي عدة مستويات  دعني اوضحهها لكل بالصورة انظر الي الصورة التالية






الان فهمت ماذا اقصد بتقسيم الاشارة الي مستويات كل فترة زمنية  اليس كذلك
اذا لاحظت الي تقسيم المستويات تجدا انها مقسمة من المستوي صفر الي المستوي
 2 اس n  ناقص 1  لعلك تود ان تعرف ما هي 2 اس n  ناقص 1  حسنا 2 عدد ثابت اما n فهي تمثل عدد البتات للمحول دعنا لا نتعمق فيها لكن دعني اخبرك ان المحول الذي سوف نعمل عليه لديه 10 بتات اذا المستويات للمحول الذي سوف نستخدمه تكون مقسمة من  (0 الي 2 اس 10 ) ناقص 1
اذاً المستويات سوف تكون (1024 - 1)  اي 1023 مستوي
الخطوة التالية يقوم فيها المحول بوصل العينات التي اخذها مع بعض كما في الصورة التالية






الان اصبحت الاشارة تشبه الاشارة الرقمية اليس كذلك فالاشارة الرقمية هي اشارة ثابتة القيمة في عدة فترات زمنية
في الصورة قمنا بتقسيم الاشارة الي بضعة مستويات فقط اما المحول فسوف يقوم بتقسيمها الي 1023 مستوي ولذلك سوف تكون الاشارة الناتجة تماثل الاشارة الداخلة تماما
حسنا هذا اكثر ما يهمنا في عملية التحويل من تماثلي الي رقمي عرفنا كيف يتم ذلك الان كيف نعرف ان هذا المستوي يكافئ كذا من الفولت الداخل
لمعرفة ذلك نقوم بالعملية التالية
ننظر الي المستوي الناتج من عملية التحويل من تماثلي الي رقمي اي الي خرج المحول مثلا اذا كان خرج المحول يشير الي المستوي 600 فكم يكافئ هذا المستوي من الفولتية في الاشارة التماثلية لمعرفة ذلك نقوم بالعملية الحسابية التالية





اتضحت الصورة اليس كذلك
اذا الان تعرفنا علي كيفية التحويل من تماثلي الي رقمي وتعرفنا علي كيفية معرفة القمية الرقمية كم تكافئ من الفولتية حسنا
الان اصبح بمقدور المتحكم الدقيق ان يتعرف علي الاشارة الاتية اليه من الحساس والتي تم تمريرها من خلال المحول الذي قام بتحويلها الي اشارة رقمية
الان ما هي المرحلة القادمة حتي الان لم نتحدث عن صديقنا المتحكم الدقيق دعنا نتعرف عليه في المرحلة القادمة ومعرفة كيف نتعامل معه

المتحكم الدقيق pic16f877A

اولا المتحكم الدقيق عباره عن رقاقة الكترونية صغيرة تحتوي في داخلها علي مكونات عديدة ويمكن ان نطلق عليه مايكروحاسوب لانه يحتوي علي نفس مكونات الحاسوب الرئيسية مثل المعالج و وحدات الادخال والاخراج  و الذواكر بانواعها الرام والروم وكذلك يمكن ربطه مع اجهزة خارجية وحتي يمكن ربطه عن طريق الانترنت
الحديث عنه يطول لكن الان دعنا نتعرف علي صديقنا pic16f877A
صديقنا الذي سوف نعمل معه شكله كما في الصورة التالية



ياتي هذا المتحكم ب 40 pin مقسمة 20 pin في كل جانب حيث تُقسم هذه البنات او الاطراف الي بورتات وهي (port A \port B \port C \port D \port E) 
حيث أن كل من بورت B \C \D تتكون من 8 طرف  لكل بورت منهما بينما بورت A يتكون من 6 طرف فقط و بورت E يتكون من 3 طرف فقط مجموع هذه الاطراف او الارجل هو 33 طرف وتبقت 7 اطراف هي محجوزة لاستخدامات خاصه ضرورية لتشغيل المتحكم الدقيق
بورت B\C\D يمكن استخدامها كدخل او خرج رقمي فقط اي ان صديقنا الحساس لايمكننا ان نوصله باي طرف من هذه البورتات لان صديقنا يعطي اشارة تماثلية بينما هذه البورتات لا تفهم سوي الاشارة الرقمية سوف تقول لي لماذا لا ناتي بصديقنا المترجم سوف اقول لك لدينا مترجم لكنه موجود في بورتات اخري فلا داعي بان ناتي بمترجم خارجي
اما بورت A\E فهي البورتات الموصوله مع صديقنا المترجم المحول من تماثلي الي رقمي ومجموع اطراف هذه البورتات هو 9 اطراف يمكننا استخدام 8 منها كدخل تماثلي الي المحول ما عدا الطرف رقم 5 من بورت A فهو يستخدم لشئ اخر (RA4)

لمعرفة المزيد عن خصائص هذا المتحكم ارجع الي الداتا شيت الخاصه به
وتوزيع الاطراف كما في الداتا شيت يظهر في الصورة التالية






الان لكي نقوم بتوصيل صديقنا المتحكم هذا حتي يستطيع العمل واداء المهام المطلوبة منه هنالك اشياء اساسيا لا بد ان نقوم بها
اولا لدينا بعض التوصيلات من دونها لا يمكن للمتحكم الدقيق ان يعمل ابداً وهي

اولا نقوم بتوصيل المتحكم مع مصدر الجهد والارضي ولدينا اطراف مخصصة لهذه المهمة فقط لامداد المتحكم الدقيق بالطاقة اللازمة لكي يعمل وهي الاطراف رقم 32\31\11\12  هذه الاطراف مخصصة لتوصيل المتحكم مع مصدر الجهد 2 مخصصة لتوصيله مع ال 5 فولت و2 مخصصه لتوصيله مع الارضي الاطراف المخصصه لتوصيلها مع ال 5 فولت هي 32\11 والاطراف المخصصة للتوصيل مع الارضي هي 12\31  يمكن توصيل طرف واحد فقط لل 5 فولت وكذلك للارضي
اذا اول توصيلة اساسية لكي يعمل المتحكم الدقيق هي مصدر الطاقة وعرفنا اين نوصله

ثانيا لدينا الطرف رقم 1 في المتحكم الدقيق الذي نعمل عليه يسمي MCLR  وهي ايضا توصيلة ضرورية لن يعمل المتحكم من دونها ويتم توصيل هذا الطرف (رقم 1) مع مقاومة 10k اوم ومن ثم توصيل المقاومة مع مصدر الجهد 5 فولت
مهمة هذا الطرف انه عندما نريد ان نعيد تشغيل المتحكم الدقيق (reset) نجعل الدخل علي هذا الطرف 0 فولت فيقوم باعادة تشغيل المتحكم الدقيق مثل (restar) في الحاسوب ولنتمكن من استخدام هذه الخاصية نقوم بتوصيل مفتاح عندما نضغط عليه يجعل الجهد علي هذا الطرف 0 فولت فيتم اعادة تشغيل المتحكم وطريقة توصيل هذا الطرف مع المقاومه والمفتاح و مصدر الجهد كما في الصورة التالية 






يجب ان يكون المفتاح من النوع الضاغط push button وفي الحالة الطبيعية يمر الجهد عبر المقاومة الي الطرف رقم 1 في المتحكم الدقيق ولا يمر عبر المفتاح لان المفتاح مفتوح اما عند الضغط علي المفتاح فسوف يختار التيار الطريق الاقل مقاومة وهو ان يمر عبر المقاومة ثم عبر المفتاح الي الارضي وبذلك يكون الجهد علي الطرف رقم 1 في المتحكم 0 فولت فيقوم المتحكم باعادة تشغيل نفسه واذا استمر الضغط علي المفتاح فسوف يقوم المتحكم باعادة تشغيل نفسه بصورة دورية ولن نتمكن من رؤيته وهو يعمل

اما الان فمع التوصيلة الثالثة الضرورية لكي يعمل المتحكم وهي الكرستالة او المذبذب
ما هي الكرستالة وما هي اهميتها
الكرستالة هي عنصر الكتروني يقوم باعطائنا نبضات او ذبذبات بتردد معين وهذه الذبذبات ضروية لتنظيم العمل في المتحكم الدقيق فالمتحكم يقوم بربط كل العمليات بهذه النبضات كل عملية او معالجة تتم داخل المتحكم تتم وفقا لهذه الذبذبات القادمة من الكرستالة
لنفهم عمل الكرستالة وضرورتها بصورة جيدة دعني اضرب لك هذا المثال
كلنا يعرف العروض العسكرية هنالك عروض عسكرية يتحرك فيها الجنود علي ايقاع من الموسيقي او ضرب الطبول المهم انهم يتحركون وفقا لهذا الايقاع فاذا تسارع هذا الايقاع تتسارع خطاهم معه واذا انخفض هذا الايقاع تنخفض حركتهم معه واذا توقف هذا الايقاع يتوقفون تخيل معي من غير هذا الايقاع هل يمكن للجنود ان يسيرو بنفس الايقاع جميعا ويسرعون في نفس الوقت ويبطئون في نفس الوقت بالتاكيد لا يستطيعون لانهم ليس لديهم ضابط للايقاع وكلا منهم سوف يسرع ويبطئ حسب تقديره
بالضبط هذا ما يحدث مع الكرستالة والمتحكم فالكرستالة او المذبذب هي ضابط ايقاع المتحكم يتم تنفيذ التعليمات وتمرير البيانات وفقا لايقاعها فاذا انخفض ايقاعها تنخفض سرعة كل العمليات داخل المتحكم واذا تسارع ايقاعها تتسارع كل العمليات داخل المتحكم واذا توقف ايقاعها سوف تتوقف كافة العمليات داخل المتحكم فاذاً نبضات المذبذب هي كنبضات القلب بالنسبه للمتحكم
وشكل هذه الكرستالة كما في الصورة التالية




شكل الكرستالة كما في الصورة وهي عديمة القطبية اي يمكن توصيلها باي اتجاه
وتُصنف علي حسب ترددها ونحن سوف نستخدم كرستالة بتردد 4MHz ويتم توصيلها مع المتحكم عبر طرفين مخصصين لها فقط وهما الطرفان 13\14 ويتم توصيلها مع المتحكم كما بالصورة التالية


هذه هي الطريقة التي يتم بها توصيل الكرستالة مع المتحكم وكما نلاحظ من الصورة انه قمنا بتوصيل مكثفين مع الكرستالة وذلك للقضاء علي التشويش وان تكون النبضات مستقرة  المكثفان ايضا عديما القطبية يمكن توصيلهما باي طريقة لان قيمتهما بالبيكو فاراد واي مكثف قيمته اقل من 1 مايكرو فاراد يكون عديم القطبية
عند التوصيل يجب مراعاة ان تكون الكرستالة قريبة جدا من اطراف المتحكم بقدر الإمكان 

اذاً لقد وصلنا الي مرحلة متقدمة من مشروعنا وقمنا بتوصيل كل التوصيلات الضرورية التي نحتاج لها لكي يعمل المتحكم الان دعونا ننتقل لمرحلة اخري ونتعرف علي اجهزة الاخراج الان المتحكم استلم الاشارة من الحساس وقام بالمعالجات اللازمة فنتائج هذه المعالجة سوف تظهر كخرج في اجهزة معينة وفي حالتنا هذه هي المروحة والجرس للانذار والشاشة


اذاً فلنبدأ بالجرس او ما يسمي buzzer
هو مكون الكتروني يصدر صوتاً عند تسليط جهد مناسب علي طرفيه وهو انواع متعددة منها الذي يعمل ب 5 فولت واكثر وهذا النوع عند تسليط جهد عليه يُصدر صوتا وعند ازالة الجهد يتوقف الصوت وهنالك نوع اخر منه يعمل عن طريق الترددات عندما نعطيه جهد بتردد معين يصدر صوت معين ويختلف الصوت باختلاف التردد وهذا النوع يمكن الاستفادة منه في اصدار النغمات او اصدرا اصوات محددة نرغب بها 
سوف نستخدم في مشروعنا نوع يعمل علي جهد 5 فولت فقط ولذلك يمكننا ان نوصله مع المتحكم دون الحاجة الي وسيط بينهم 
اي جهاز يعمل بجهد اقل من 5 فولت ويسحب تيار اقل من 25 ملي امبير يمكننا ان نوصله مع المتحكم دون الحاجة الي وسيط بينهم ولكن اذا كان الجهاز او العنصر يعمل بجهد اعلي من 5 فولت او يسحب تيار اكبر من 25 ملي امبير فلا يمكننا ان نوصله بالمتحكم مباشر وفي هذه الحالة سوف نستخدم بما يعرف بدوائر الربط  وسوف نتعرف عليها في المرحلة القادمة 
الجرس الذي سوف نستخدمه لديه طرفان طرف موجب وطرف سالب يمكن التمييز بينهم بالالوان فالموجب عادة يكون باللون الاحمر والسالب يكون باللون الاسود نوصل الطرف الموجب مع المتحكم الدقيق ونوصل الطرف السالب مع الارضي
تاكد من ان الجرس يعمل بجهد قدره 5 فولت وليس اكثر من ذلك
وشكل هذا الجرس كما في الصورة التالية



ويتم توصيله مع المتحكم بالصورة التالية




اذا الان تعرفنا علي الجرس وطريقة توصيله وهو الذي سوف يقوم المتحكم بتشغيله عندما تصل درجة الحرارة الي حد معين وذلك عن طريق تسليط جهد قدره 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);
}

هذا الجزء من البرنامج هو الذي يتحكم في البرنامج فالاجزاء السابقة سوف تكون ثابتة اما هذا الجزء هو الذي نحدد فيه خطة العمل لبرنامجنا فاطلق العنان لخيالك وافعل ما تريد