تحكم في الحرارة بدقة عالية جدا
Digital Thermometer ( بداية اريد أن اعبر عن اعتذاري بسبب تأخر الحلقة 2 ، و أود من الاخوة المتابعين ان يتقبلوا اسفي و اعتذاري ، و أتمنى أيضا أن تراسلونا بمشاكلكم التقنية و اقتراحاتكم و بالخصوص ذوي مشاريع التخرج و السلام . )
اليوم باذن نعرض ثاني دائرة (أو جهاز بتعبير ادق) نصممها في سلسلة إصنعها بنفسك، دائرة كما سابقتها قد تساعد العديدين منا ، مع امكانية تطويرها ايضا لتكيفها مع استعمالك الشخصي ، و هذه الخاصية سنعمل ان شاء الله على توفيرها في جميع دوائرنا حتى يتسنى للكل البحث و التطوير و اضافة بصمته الشخصية .
على العموم ، فكل الدوائر التي سنطرحها في هذه السلسلة مضمونة من طرف مهندسين أكفاء في هذا المجال ، و ان واجه أي واحد من الاخوة اي مشكل فلتصل بنا و باذن الله سنجد حلا في اقرب وقت ، و تكريسا لمبدأ نشر المعلومة ، فاننا سنقوم ان شاء الله بوضع دوائرة على فترارت متعددة ، كل واحدة لاستعمال معين ، و ستكون باذن الله من تصميمي الشخصي (زكرياء المغربي) كما هذه الدائرة و سابقتها ، و نرجوا الله العلي ان يوفقنا لما فيه خير و صلاح لامة الاسلام .
دائرة اليوم ، او لنقل الجهاز الذي نحن بصدده اليوم ، متحكم دقيق في درجة الحرارة ، قد يساعد بالاساس اصحاب البيوت البلاستيكية الزراعية ، يحتوى باساس على مايكروكنترولر نوع PIC16F877A ، الذي يقوم بتحليل المعطيات و التحكم بالاجهزة الثانوية ، و يمكن للمستخدم التواصل مع وحدة المعالجة عن طريق LCD و مفاتيح لادخال المعطيات ، و القلب النابض لهذه الدائرة هو الحساس LM35 .
مميازات الدائرة أو الجهاز :
هذا الجهاز او هذه الدائرة ، تمكن المستخدم من التحكم في درجة الحرارة بسلاسة ، اذ انها في بداية اشتغالها تطلب من المستخدم اختيار برنامج عمل بين برنامجين ، البرنامج الاول هو برنامج التسخين ، بينما البرنامج الثاني هو برنامج التبريد ، و تطلب منه ايضا تحديد مرجع للحرارة حتى تعمل عليه ، فان نزلت درجة الحرارة عن المرجع المحدد تعطي انذار بذلك و تبدأ في التسخين بالنسبة للبرنامج الاول ، و العكس بالنسبة للبرنامج الثاني ، بيحث تتواصل انت مع المتحكم من خلال 3 ازرار ، الرزين A و B للاختيارات و الزر V للتأكيد على الختيار .
القلب النابض للدائرة :
في الحقيقة ، فان هذه الدائرة لها قلب و عقل ، فقلبها هو حساس الحرارة LM35 ، لكن عقلها هو المتحكم PIC16F877A ، الذي بدوره يحتوي على CPU(وحدة معالجة مركزية) ، و كذلك مسجل ADC لتحويل الاشارة الانالوج Analog التي ينتجها الحساس LM35 .
كيف تتصرف الدائرة ؟ :
كي يكون لدينا فهم شامل للدائرة و تصور واضح لتصرف الجهاز ، لابد وأن نفهم سيرورته ولو بشكل مبسط ، فهي فعلا جد جد بسيطة مقارنة بالدائرة الأولى ، لأننا سنعتمد على البرمجة بالاساس ، فالسطور البرمجية ستختزل لنا العديد من التوصيلات و المكونات .
الدائرة بسيطة جدا ، حيث أن الحساس LM35 صمم كي يعطي 10mV لكل درجة حرارية C ° ، هذه الاشارة تدخل الى المتحكم لتتم معالجتها .
نقوم أولا تهيئ المتحكم لتعامل مع اشارة انالوج ، سنستعمل لغة السي و بالخصوص الدالة المبسطة ADC_Read(channel) و نحن نعلم أن هذا المتحكم سجل التحويل فيه ADC به 10 بتات ، أي أن الدقة أو resolution الخاصة بهذا السجل هي خارج قسمة أقصى جهد دخل (5 فولت لان هذه الدالة تضع المرجع الاعلى هو نفسه جهد تغذية المتحكم ) على 1023 تساوي تقريبا 4.88mV، هذه القيمة اذا قمنا بقسة جهد دخل 50 ميللي فولت (تناظر 5 درجات حرارة) عليها نحصل على قيمة 10.24 ، وهذه القيمة تعادل تقريبا ضعف قيمة الجهد لدرجة الحرارة 5 ، لذك سنقوم بقسمتها على 2.045 كي نحصل في الاخير على تحويل جهد الدخل الى درجة حرارة دقيقة و نخزن هذه القيمة في متغير لعرضها .
عند بدأ عمل الدائرة ، تكتب لك رسالة على الـ LCD فيها : '' SLCT A PROGRAM '' ، أي أن المتحكم يطلب منك اختيار البرنامج الذي تريد (تسخين أم تبيرد) ، اذا طغطت على الزر A يكتب لك على الشاشة : '' PROG 1 CHOSEEN '' ، و يشتعل ليد أحمر ، و ينتظر منك التأكيد أو تبديل الاختيار ، فاذا ضغط على الزر B يكتب لك على الشاشة : '' PROG 2 CHOSEEN '' ، و يشتعل ليد الأخضر و ينتظر تأكيد الاختيار بالضغط على V ، ما عليك انت الا ان تكتب على العلبة التي ستضع عليها الجهاز جوار الليد الأحمر كلمة 'التسخين' و جوار الليد الاخر كلمة 'التبريد' ، حتى اذا مررت على الجهاز اثناء عمله تكون على دراية باي ظام هو يشتغل . أذا لم تختر أي نظام ، فان الجهاز سيبقى مجرد تيرمومتر رقمي فقط .
بعد ضغطك على زر التأكيد V ، تظهر لك رسالة اخرى على الشاشة فيها : '' SLCT A REF TEMP '' ، يعني انه يطلب منك ادخال مرجع الحرارة ، تبقى هذه الرسالة مدة ثانية واحدة ، و بعد ذلك يرسل لك المتحكم رسالة على الشاشة فيها : ''REF =0'' ، ما عليك الآن الا الضغط على الزر A لرفع القيمة او الزر B لانقاصها ، بهذا تكون تحدد قيمة مرجع الحرارة ، بعد تحديدك لمرجع الحرارة تضغط على الزر A لتأكيد الاختيار ، بعد ذلك تظهر على الشاشة رسالة كالتالي : ''TEMPERATURE='' ، و يعطيك في كل لحظة درجة الحرارة . اذا تخظت درجة الحرارة المرجع المحدد ، يشغل المحرك في حالة برنامج التبريد أو المسخن في حالة برنامج التسخين و تظهر على الشاشة عبارة : ''TEMP+ RUN.'' أو ''TEMP- RUN.'' على حسب البرنامج الذي حددته في البداية .
سيكون الشكل النهائي للجهاز تقريبا تقريـــــــبا بهذا الشكل :
بهذا نكون انهينا البرمجة ، باقي الاشياء الاخرى سهلة جدا للذين لهم خلفية في الميكروسي ، أما من له لغة اخرى للبرمجة فقد يكون فهم المبدأ ، أما من لم سيبق له التعامل مع اي لغة و لا يعرف عما نتحدث فهذا ليس بمشكل ، يمنه البحث في النت على دروس برمجة المايكروكنترولر بلغة MicroC
كيف ابني هذا الجهاز ؟
ما تحتاجه لبناء هذا الجهاز :
مايكروكنترولر PIC16F877A :
المتحسس LM35 :
شاشة عرض LCD 16x2 :
مكثفين 33 بيكو
4 مفاتيح ضاغظة (BP) :
ترانزستورين BC337 :
3 ليدات خضراء و واحد أحمر :
2 ديود نوع 1n4007 :
2 ريلاي 12فولت :
وحدة تسخين heater coil (اختر بلدها ما تشاء ، ضع حتى انذار بدل التسخين) :
وحدة تبريد ، انا اخترت موتور بسيط فقط و انت اختر ما تشاء :
كيف اربط المكونات ببعضها :
الرسم يظهر ذلك بوضوح ، و الكود البرمجي الذي صممته ايضا سأرفقه مع المحاكاة ، و هذا فيديو أبسط فيه كيف تتعامل مع الجهاز :
ملاحظة :
يمكنك دمج الدائرة السابقة مع دائرة اليوم لتطورها و تصبح قادرا على التحكم في الحرارة عن بعد مثلا باستعمال المقاطاعت على المايكروكنترولر .
إنتهى الموضوع وترقبو مواضيع أخرى من سلسلة إصنعها بنفسك
الكود البرمجي :
sbit LCD_RS at Rd2_bit;
sbit LCD_EN at Rd3_bit;
sbit LCD_D4 at Rd4_bit;
sbit LCD_D5 at Rd5_bit;
sbit LCD_D6 at Rd6_bit;
sbit LCD_D7 at Rd7_bit;
sbit LCD_RS_Direction at TRISd2_bit;
sbit LCD_EN_Direction at TRISd3_bit;
sbit LCD_D4_Direction at TRISd4_bit;
sbit LCD_D5_Direction at TRISd5_bit;
sbit LCD_D6_Direction at TRISd6_bit;
sbit LCD_D7_Direction at TRISd7_bit;
char str[16];
char ste[8];
unsigned int temp;
float v;
int x,y;
void main(){
TRISA=1 ; TRISD=0; TRISC=1; TRISB=0; TRISE=1;
PORTB=0;
x=0;
Lcd_Init();
delay_ms(800);
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,2,"SLCT A PROGRAM");
Lcd_Cmd(_LCD_CURSOR_OFF);
for(;;){ if(PORTC.B0==1){y=5; delay_ms(100); Lcd_out(2,1," PROG 1 CHOSEEN"); PORTE=0; PORTE.B2=1;} //ÇáÊÓÎíä
if(PORTC.B1==1){y=10; delay_ms(100); Lcd_out(2,1," PROG 2 CHOSEEN"); PORTE=0; PORTE.B1=1;}
if(PORTC.B2==1){Lcd_Cmd(_LCD_CLEAR); break;}
}
Lcd_out(1,1," SLCT A REF TEMP");
delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
for(;;) {
Lcd_out(1,1," REF =");
if(PORTC.B0==1){x=x+1; delay_ms(500);}
if(PORTC.B1==1){x=x-1; delay_ms(500);}
if(PORTC.B2==1){break;}
inttostr(x,str); Lcd_out(2,3,str);
}
Lcd_Cmd(_LCD_CLEAR);
for(;;)
{
temp=ADC_Read(2);
v=temp/2.045;
floattostr(v,str);
Lcd_out(1,13,str);
Lcd_out(1,1,"TEMPERATURE=");
delay_ms(500);
if(y==5) { while(v<x)
{
PORTB=0X01;
temp=ADC_Read(2);
v=temp/2.045;
delay_ms(500);
Lcd_out(2,1," TEMP+ RUN.");
delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
if(v>x) {PORTB=0; break; }
}
}
if(y==10){while(v>x)
{
PORTB=0X04;
delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(2,1," TEMP- RUN.");
delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
temp=ADC_Read(2);
v=temp/2.045;
if(v<x) {PORTB=0; break; }
}}
}
}