بسم الله الرحمن الرحيم
هذا المشروع عبارة عن مقياس لدرجة الحرارة وساعة رقمية لعرض الوقت والتاريخ.
خطوات عمل البرنامج :
يتم عرض درجة الحرارة بالفهرنايت والسلسيوز عن طريق حساس الحرارة LM35 , وهناك زرين الاول لزيادة رقم المرجع ولاخر لتنقيص رقم المرجع , رقم المرجع هو الرقم اللي بموجبه يتم تشغييل المروحة او الدفاية , يتم حفظ رقم المرجع في ذاكرة من نوع EEPROM موصوله بالمتحكم عن طريق بروتوكول I2C , عشان اذا طفئ المتحكم يكون محفوظ رقم المرجع.
يتم استحصال الوقت والتاريخ من دارة التوقيت الخارجية الموصلة بالمتحكم عن طريق بروتوكول I2C وعرضها على الشاشة , في كل ثانية يتم اخراج نبضه من دارة التوقيت الى المتحكم ممايسبب مقاطعة ويتم بعدها حساب الوقت والتاريخ.
يتم حفظ درجة الحرارة والوقت والتاريخ في الذاكرة من نوع SD CARD داخل ملف اذا تم الضغط على زر .
يتم حذف ملف واحد في كل مرة يتم الضغط على الزر.
وزر اخر يقوم بمسح جميع الملفات من على الذاكرة.
في كل عملية حفظ يتم تخزين رقم الملف في ذاكرة من نوع EEPROM عشان لما المتحكم يكون طافي وتم تشغيله وقام المستخدم با الضغط على زر الحفظ يقوم المتحكم بحفظ الملف الجديد بعد الملف اللي قبله بدون حصول لخبطه في ترتيب الملفات, والذاكرة الخارجية EEPROM موصوله بالمتحكم عن طريق بروتوكول I2C.
طبعا البرنامج يعمل بشكل كامل في الزمن الحقيقي Real Time اي لم استخدم تاخير زمني بل تم الاعتماد على المؤقتات في ذلك , حتى الازرار تعمل على المقاطعات الخارجية.
شرح الدوال: البرنامج طويل جدا راح احاول شرحه بقدر المستطاع
() void _init :
فيها تعريفات التشابهي الرقمي ADC , شاشة الجرافيك, ازرار المقاطعات الخارجية, والتايمر0 , اقطاب المروحة والدفاية .
()void _initMemory:
فيها تعريفات ذاكرة التخزيين من نوع SD CARD للحفظ عن طريق نظام الملفات , والذاكرة موصوله بالمتحكم عن طريق بروتوكول
SPI.
void interrupt:
برنامج خدمة المقاطعة يقوم بخدمة الماقطعة عند الطفحان , وايضا عن حصول مقاطعات خارجية,
رح يكون فيه مقاطعة في كل 10ملي ثانية للتايمر وزيادة متغيرات بواحد في كل 10ملي ثانية.
ايضا هناك مقاطعات خارجية وهي عند دخول نبضه التوقيت من دارة التوقيت الى B2, الضغط على احد الازرار ,B4,B5,B6,B7
void I2C_eeprom_write:
تقوم بالكتابة على الذاكرة الخارجية EEPROM عن طريق بروتوكول I2C , نلاحظ انا القطب E0 مستخدم لحماية الذاكرة من الكتابات العشوائية اي انه لن يتم الكتابة على الذاكرة اذا لم يفعل هذا القطب,
طبعا الدالة تستقبل متغيرين الاول هو العنوان اللي نريد نكتب فيه البيانات, والثاني هو القيمة المراد حفظها.
unsigned char I2C_eeprom_read:
تقوم بقراءة البيانات من على الذاكرة الخارجية EEPROM , نلاحظ بان الدالة فقط تستقبل متغير واحد هو العنوان اللي نريد القراءة منه.
void Create_New_File:
تقوم بإنشاء ملف جديد بالاسم File وبعدها رقم يتم زيادته بواحد لترتيب الملفات رقميا من 1 الى 254 , بعدها يتم كتابة صيغة الملف بعد الاسم اللي هو TXT. ليكون الاسم النهائي للملف مثال لأول ملف File001.TXT , بعدها يتم استدعاء دالة انشاء الملفات
لإنشاء الملف بالاسم اللي كتبناه, بعده يتم استدعاء دالة لتقوم بعمل تهيئة للملف الجديد اي حذف اي بيانات ان وجدت , اخيرا يتم تصفير المتغيرات وارسال رقم الملف في ذاكرة الخارجية.
void Write_To_File :
تقوم بالكتابة على الملف اللي تم إنشاؤه , هذه الدالة تستقبل متغيرين الاول النص المراد كتابته والثاني عدد احرف النص , طبعا قبل الكتابة لازم نتاكد من انه عدد الملفت لم يجاوز العدد المسموح به, اخيرا يتم الكتابة وعرض رسالة تاكيد على الشاشة.
void _delete_file :
تقوم بحذف ملف واحد, اولا يتم استدعاء اسم الملف اللي تم انشاؤه وتحضير الملف للحذف اخيرا حذف الملف وانقاص رقم الملفات بواحد وارساله الى الذاكرة الخارجية وعرض رسالة تاكيد على الشاشة.
void _delete_all_files :
تقوم بحذف جميع الملفات اي عمل فورمات , طبعا يتم فعل ذلك في حلقة تقوم بالتكرار على عدد الملفات في الذاكرة .
void get_temp :
تقوم بقراءة درجة الحرارة في كل ثانية , اي اذا تم زيادة المتغير 1000ms_1_ مئة مرة في كل 10مللي ثانية
يعني 10ملي ثانية * 100 = 1000 ملي ثانية يعني واحد ثانية, اذا تحقق ذلك اقراء درجة الحرارة واعرضها على الشاشة , ويتم ايضا التحقق من رقم المرجع كما تم شرحه,
طبعا tmp1 = tempC / 100 تقوم باعطاء اول ثلاثة ارقام لدرجة الحرارة بالسلسيوز طبعا الارقم الثلاثة من اليسار الى اليمين
مثال اذا الحرارة 150.22 tmp1 سيأخذ فقط 150 ويترك الارقام بعد الفاصلة لان في ذاكرة الخارجية التي املكها لا نستطيع كتابة ارقام اكبر من 255, ولا ننسى بانه سيتم حجز العناوين من 0 الى 254 لارقام الملفات اي يجب علينا ان نوفر اماكن الحفظ,
في النهاية يجب تصفير عداد الثانية.
void _i2c_write_RTC :
تقوم بالكتابة على دارة المؤقت الخارجية , تستقبل متغيرين الاول العنوان والثاني للقيمة.
unsigned short _i2c_read_RTC :
تقوم بقراءة محتويات دارة التوقيت الخارجية وهي طبعا راح تكون الوقت والتاريخ.
unsigned char BCD2UpperCh & unsigned char BCD2LowerCh:
تقوم بتحويل الوقت والتاريخ من صغير BCD الى Decimal لان البيانات القادمة من دارة التوقيت تكون بصيغة BCD.
set_time_date:
دالة بسيطة تقوم بعمل تهيئة لدارة التوقيت الخارجية وتسجيل قيم مسبقة للوقت والتاريخ , اي عند تشغيل البرنامج رح يبدأ الوقت والتاريخ كما هو موجود في هذه الدالة , يجب حذفها بعد الانتهاء من ضبط الوقت عشان اذا تم اعادة تشغيل المتحكم لايرجع للقيم المبدئية المسجلة.
void get_time_date:
تقوم بقراءة الوقت والتاريخ من على دارة التوقيت الخارجية وعرضها على الشاشة طبعا.
هذه هي الدوال الفرعية في البرنامج والان سيتم تلخيص محتوى الدالة الرئيسية:
راح يتم فيها استدعاء دالة التعريفات اللي تم شرحه,
وفي الحلقة الدائمة للبرنامج انا مقسم العمليات الى اجزاء بخطوط طويلة تفصل كل عملية عن الثانية:
القسم الأول:
التحقق من ازرار رقم المرجع للزيادة او التنقيص اخيرا استدعاء دالة درجة الحرارة .
القسم الثاني:
اذا حصلت مقاطعة وصول نبضة من دارة التوقيت الخارجية يتم استدعاء دالة الوقت والتاريخ وبعدها يتم تصفير علم المقاطعة.
القسم الثالث:
اذا حصلت مقاطعة مفتاح الحفظ اي ضغط المستخدم على مفتاح الحفظ على الذكرة SD CARD , اولا احصل على رقم الملفات الموجودة من على ذاكرة EEPROM بعدها تحقق اذا كان عدد الملفات لم يتجاوز العدد المسموح به, بعدها استدعاء دالة انشاء الملفات
بعدها يتم كتابة درجة الحرارة والوقت والتاريخ في الملف اللي تم انشاؤه ,
اما اذا كان عدد الملفات تجاوز العدد المسموح به يتم عرض رسالة تنبيه بان الذاكرة ممتلئة , طبعا نلاحظ اني ماستخدمة زمن التاخير عشان يتم عرض الرسالة لفترة بل استخدمت التايمر.
القسم الرابع:
اذا تم الضغط على زر حذف جميع الملفات , يتم الحصول على عدد الملفات التي تم حفظها مسبقا , بعدها يتم التحقق من ان هناك توجد ملفات , اذا وجدت قم باستدعاء دالة حذف جميع الملفات, اما اذا لم توجد فقم بعرض رسلة تنبيه بان الذاكرة فاضية.
القسم الخامس:
اذا تم الضغط على زر حذف ملف واحد, اولا اذا فيه ملفات في الذاكرة يتم حذف ملف واحد , اذا لم توجد ملفات يقوم بعرض رسالة تنبيه بان الذاكرة فاضية.
<<<<<<<<< الحمدلله تم شرح البرنامج >>>>>>>>>>>>>>
اعلم بان الشرح غير كافي لان البرنامج طويل اخذ منى فترة في الكتابة , ولكن اذا كان في اي شي الرجاء عدم التردد في السؤال.
رابط التحميل:
http://www.libstock.com/projects/vie...imultaions-100