اهلا بك

الكاتب

مرحبا بكم

البحث فى المدونه

اشترك ليصلك كل جديد

احصل على كل جديد فى عالم التدوين لحظه بلحظه اشترك الان

الاثنين، 23 فبراير 2015

برمجة حساس درجة الحرارة

برمجة حساس درجة الحرارة
image001
ربما جاءت فكرة في صنع آلة أو روبوت يعتمد على درجة الحرارة ليتفاعل مع محيطه، أو صنع جهاز يعمل بالحرارة وتريد أن تتحكم فيه حسب مستويات درجة الحرارة مثلا.... الجواب تجده في هذا المقال الذي يهدف لمساعدتك على تخطي تعقيدات هذه المسألة بكل سهولة.....

المحتوى 
image002
1.        تقديم
2.        مختلف استعمالاتها
3.        مستشعر درجة الحرارة (من 40- إلى 150 درجة)
4.        المقاومة الحرارية  (من 55- إلى 105 درجة)
5.        سلك مستشعر لدرجة الحرارة  (من 100- إلى 500 درجة) 

تقديم

تقاس درجة الحرارة بالوحدات التالية :

l         الكلفن Kوهو المقياس المعتمد من قبل المنظومة العالميةوهو مقياس كثير الاستعمال في الميادين العلمية.
l         السيلزيوس C: (درجة حرارة مئوية) وهو المقياس المعتمد في حياتنا اليومية في غالبية دول العالم.
l         الفهرنهيت  F : وهو المقياس المعتمد في الولايات المتحدة الأمريكية.

والمعادلات التالية تربط هذه الوحدات بعضها ببعض:

[°C] = ([°F] − 32) × 59

[°C] = [K] − 273.15

توجد واحدات أخرى لا داعي لذكرها هنا.

image003

مختلف استعمالاتها

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

image004
  
أما الأسلاك المستشعرة لدرجة الحرارة thermocouple فهي تستعمل بكثرة في أنظمة التدفئة والتهوية وتكييف الهواء كـ:

image005
image006
المكيف الهوائي

مسخن الماء

تصل درجة حرارة الماء إلى 95 أو 100 درجة. وبالتالي يمكنك أن تفرغ الماء فس كأس الشاي أو القهوة دون الحاجة لغلي الماء

image007
image008
مسخن هوائي

أو قل أنه مجمر كهربائي.
الفرن الكهرومغناطيسي

image009







فرن كهربائي

وهو ما تجده في محلات صنع الأخباز والحلويات مثلا...





هل تجد عندك أفكارا جديدة لاستخدام هذا النوع من المستشعرات؟ فقط فكر وأبدع لنا.... فنحن نحتاج أمثالك في أمتنا.... ربما شيئا كهذا الكأس مثلا أو ما شابه....

تعلم معنا اليوم كيف تركب هذه المستشعرات وكيف تبرمجها وبالتالي لن تجد صعوبة في التعامل معها... هل كنت تعرف من قبل كيف تتعامل مع هذه الأشياء؟؟؟

image010


مستشعر درجة الحرارة (من 40- إلى 150 درجة)
image011
تعريف
باختصار شديد، إنما هو مركب اليكتروني يقيس لك درجة الحرارة....

مميزاته 
l         مجال درجة الحرارة: من 40- إلى 150 سيليسيوز.
l         الجهد الكهربائي الموَلد: 0.1 فولط (أي 40- درجة سيليسيوز) إلى 0.2 فواط  (أي 150 درجة سيليسيوز).
l         يحتاج إلى: من 2.7 إلى 5.5 فولط فقط ليعمل على ما يرام.

قراءة درجة الحرارة
image012
يمكنك أن تركبه في روبوتك أو في أي جهاز تفكر فيه عن طريق استعمال بطاقة Arduino البرمجية كالتالي:
image013

//TMP36 متغير يمثل مربط المستشعر
int sensorPin =0;

void setup()
{
  Serial.begin(9600);  //سرعة التحويل لتهيئة البطاقة
}

void loop()
{
 //قراءة قيمة الصادرة من المستشعر
 int reading = analogRead(sensorPin); 

//تحويل القيمة المقروءة إلى الجهد الكهربائي
// يمكنك أن تستبدل 5.0 إلى 3.3 في حالة استعمال 3.3 فولط
 float voltage = reading * 5.0;
 voltage /= 1024.0;

 // كتابة قيمة الجهد الكهربائي على الشاشة
 Serial.print(voltage); Serial.println(" volts");

 // التحويل إلى درجة الحرارة
 float temperatureC =(voltage - 0.5)*100; 

 //سيليسيوز
 Serial.print(temperatureC); Serial.println(" degrees C");

 // فهرنت
 float temperatureF =(temperatureC * 9.0 / 5.0)+ 32.0;
 Serial.print(temperatureF); Serial.println(" degrees F");

 delay(1000);      //انتظار لمدة ثانية واحدة
}

قراءة درجة الحرارة بدقة عالية

 image014
يمكنك أن تركبه في روبوتك أو أي جهاز تفكر فيه عن طريق استعمال بطاقة Arduino البرمجية كالتالي:

/* شيفرة لامتحان المستشعر من الموقع
http://www.ladyada.net/make/logshield/lighttemp.html
*/

#define aref_voltage 3.3  // ARef نصل 3.3 فولط بـ

int tempPin =1;  //TMP36 متغير يمثل مربط المستشعر
int tempReading;

void setup(void)
{
  Serial.begin(9600);  
  analogReference(EXTERNAL);  // Aref استعمال
}

void loop(void)
{
  tempReading = analogRead(tempPin);   
  Serial.print("Temp reading = ");
  Serial.print(tempReading);   

  // تحويل القيمة المقوءة إلى الجهد الكهربائي
  float voltage = tempReading * aref_voltage;
  voltage /= 1024.0;
  Serial.print(" - ");
  Serial.print(voltage); Serial.println(" volts");

  // التحويل إلى درجة الحرارة
  float temperatureC =(voltage - 0.5)*100; 

  //سيليسيوز
  Serial.print(temperatureC); Serial.println(" degrees C");

  // فهرنت
  float temperatureF =(temperatureC * 9.0 / 5.0)+ 32.0;
  Serial.print(temperatureF); Serial.println(" degrees F");
  delay(1000);
}


المقاومة الحرارية (من 55- إلى 105 درجة)

image015
السلك اسود هو الذي يعنينا هنا، أما المقاومة التي تراها جانبه إنما هي للتقارن حجمه بها
كما أنه يمكنك استعمالها معه لقراءة درجة الحرارة كما سترى أسفله.

 
تعريف
تدعى المقاومة الحرارية بالإنجليزية (Thermistor). وهي عبارة عن مقاومة كهربائية عادية تتغير مقاومتها حسب درجة الحرارة المطبقة عليهاوبالتالي، فهي تعتبر أيضا مستشعرا لدرجة الحرارةوانتهينا!

في الحقيقة
في الحقيقة، كل مقاومة كهربائية هي مقاومة حرارية أو قل مستشعرا لدرجة الحرارةإلا أن مقاومتها تتغير بقسمة صغيرة جدا جدا وبالتالي سيصعب عليك يا حبيبي قياس درجة الحرارةأما مثال يومنا هذا، أعني المقاومة الحرارية Thermistor، فهي صنعت خصيصا لتتغير بسرعة بسبب درجة الحرارة.

مميزاتها
أرخص
تريد أن تضعها في الماء؟ ضعها ولا تخف عليها...
لا يهم أي جهد كهربائي استعملت معها
من الصعب أن تخربها وتتخلص منها...وبالتالي فهي ممن يمكن الاعتماد عليه
دقة عالية لقياس درجة الحرارة (°0.25±)

الطريقة اولى لقراءة درجة الحرارة
سنحتاج إلى مقاومة حرارية ومقاومة عادية أيا كانت قيمتها وبعض الأسلاك الكهربائية بالإضافة إلى بطاقة Arduino.
ما عليك الآن إلا أن تصل المقاومة العادية بالمربط 5V لبطاقة Arduinoثم صل الطرف الآخر للمقاومة بإحدى طرفي المقامومة الحرارية(المستشعر). سيبقة طرف واحد فقط للمقاومة الحرارية، قم بإيصاله بمربط الأرضية (groundللبطاقةقم بإضافة سلك كهربائي بين المقاومتين وصله بالمربط التناظري 0  (Analog 0للبطاقة.
image016
لقياس درجة الحرارة سنحتاج لمعرفة قيمة المقاومة أولا.
يجب أن تعلم أن الميكروكنترولور لا يستطيع أن يتعرف على قيمة المقاومةولكن، يمكنه أن يحدد قيمة الجهد الكهربائي.وبالتالي لتمعرفة الجهد الكهربائي سنحتاج لإضافة مقاومة عادية أخرىقم بكل بساطة بربط المقاومة والمستشعر على التوالي كما هو مبين في الدارة الكهربائية أعلاهوالآن يمكنك فقط أن تقيس الجهد الكهربائي في الوسط، حيث أنه كلما تتغير المقاومة فإن الجهد الكهربائي سيتغير أيضا طبقا للعلاقة الرياضية التي تربط شدة التيار الكهربائي بالمقاومة .

لنقل أن المقاومة التي تريد أن تضيفها هي 10000 أومأما المقاومة الحرارية فدعنا نسميها Rولنرمز للقيمة المقروءة من المربط التناظري بـADCيمكنك استعمال العلاقة التالية لحساب المقاومة R:

R = 10000 /(1023/ADC - 1)

لا أريد أن أبين لك كيف تم الحصول عليها حتى لا تمللكن إذا ألححت فيمكنك ترك سؤال في نهاية هذا المقال حتى يتسنى لنا الرد عليك إن شاء الله!

#define Rn  10000                        // قيمة المقاومة المضافة
#define THERMISTORPIN A0    // رمز المربط التناظري للبطاقة

void setup(void)
{
  Serial.begin(9600);
}

void loop(void)
{
  float R;
  reading = analogRead(THERMISTORPIN); // قراءة قيمة المستشعر
  Serial.print("Analog reading ");
  Serial.println(reading);

  // تحويل القيمة إلى المقاومة
  R= Rn /(1023/ R  -1);
  Serial.print("Thermistor resistance ");
  Serial.println(R);
  delay(1000);
}
  
الطريقة الثانية لقراءة درجة الحرارة 
image017
تزودنا البطاقة البرمجة Arduino بـ فولط غالباوبالتالي فلحبذا لو نستعمل 3.3 فولط لقراءة قيمة المستشعرقد تتساءل لماذا؟ في الحقيقة 5فولط تسبب "ضجيجا” أكبر في البطاقةوبالتالي سيؤثر هذا في فعالية المستشعرلتفادي هذا المشكل نستعمل المربط ذي 3.3 فولط والذي سنصله بـ AREF للبطاقة Arduinoهذه هي الخدعة الأولى لتحسين قراءة قيمة المقاومة.

أما الخدعة الثانية، فهي أن نقرءها عدة مرات ثم نحسب متوسط هذه القيمنحتاج حوالي قيم وهي كافية في هذه الحالةسترى أننا أضفنا سلكا كهربائيا في الدارة يصل المربط ذي 3.3 فولط بالمربط AREF.

#define THERMISTORPIN  A0  // رمز المربط التناظري للبطاقة
#define Rn   10000                      // قيمة المقاومة المضافة
#define N  5         // عدد القيم التي سنحسب من خلالها القيمة المتوسطة للمقاومة

int samples[N];

void setup(void)
{
  Serial.begin(9600); 
  analogReference(EXTERNAL); // Aref استعمال
}

void loop(void)
{
  uint8_t i;
  float R;

  // لنأخذ عددا محددا من قيم المستشعر مع انتظار طفيف بينها
  for(i=0; i< N; i++)
    {
   samples[i]= analogRead(THERMISTORPIN);
   delay(10);
  }

  // القيمة المتوسطة لكل القيم السابقة
  R=0;
  for(i=0; i< N; i++) R+= samples[i];
  R/= N;
  Serial.print("Average analog reading ");
  Serial.println(R);

  // تحويل القيمة إلى المقاومة
  R= Rn / (1023/ R  -1);
  Serial.print("Thermistor resistance ");
  Serial.println(R);
  delay(1000);
}

التحويل إلى درجة الحرارة 
كما رأيت سابقا أننا كنا نريد أن نقرأ قيمة المقاومة فقطلكننا نريد أن نحول هذه القيمة إلى درجة الحرارةوبالتالي سنضيف بعض الأسطر في الشيفرة لتقوم بهذه المهمة. 
توجد علاقة رياضية فيزيائية تدعى بمعادلة ستينهارت-هارت (Steinhart-Hart). تساعدنا هذه العلاقة بتحويل تقريبي لقيمة المقاومة إلى درجة الحرارة بالكلفين (kelvin):
 image018
بحيث:
  • R هي قيمة المقاومة الحرارية (المستشعر).
  • R0 هي قيمة المقاومة المضافة.
  • T0 هي درجة حرارة الغرفة (حوالي 25 درجة).
  • B هي معامل المقاومة الحرارية (في هذه الحالة هي 3950.  يجب أن تجد هذه القيمة مصحوبة مع المستشعر عند شراءهيرمز لها بـ B25/50.)
  • T هي درجة الحرارة التي نبحث عنها.
  •  
لتحويل درجة الحرارة من الكلفين ألى السيليسيوز نستعمل العلاقة التالية: (1C = 273.15 Kelvin)

#define N 5                                      // عدد القيم التي سنحسب من خلالها القيمة المتوسطة للمقاومة
#define Rn 10000                            // قيمة المقاومة المضافة
#define THERMISTORPIN A0    // رمز المربط التناظري للبطاقة
 #define R0 10000                          // المقاومة عند 25 درجة حرارة سليسيوز
#define T0 25                                 // درجة الحرارة الطبيعية
#define B 3950                              // ( 3000-4000) معامل المقاومة الحرارية غالبا بين
  
int samples[N];

void setup(void)
{
  Serial.begin(9600);
  analogReference(EXTERNAL);
}

void loop(void)
{
  uint8_t i;
  float R;
    // لنأخذ عددا محددا من قيم المستشعر مع انتظار طفيف بينها
  for(i=0; i< N; i++)
  {
   samples[i]= analogRead(THERMISTORPIN);
   delay(10);
  }

    // القيمة المتوسطة لكل القيم السابقة
  R=0;
  for(i=0; i< N; i++)  R += samples[i];
  R/= N;
  Serial.print("Average analog reading ");
  Serial.println(R);

   // تحويل القيمة إلى المقاومة
  R= Rn /(1023/ R 1);
  Serial.print("Thermistor resistance ");
  Serial.println(average);
   
  // تحويل المقاومة إلى درجة الحرارة
    float T;
  =1.0 / (log/ R0) / + 1.0 /(T0 + 273.15));
  -= 273.15;                         // تحويل إلى درجة الحرارة سيليسيوز
  Serial.print("Temperature ");
  Serial.print(T);
  Serial.println(" *C");
  delay(1000);
}


سلك مستشعر لدرجة الحرارة (من 100- إلى 500 درجة) 

 image019
تعريف 
يطلق عليه Thermocouple بالإنجليزية.
هذا المستشعر عبارة عن سلكين معدنيين. وهو حساس لدرجة الحرارة ولا يوجد أي مركب اليكتروني داخله. يمكن أن يتولد جهد كهربائي خفيف عندما يتعرض هذا المستشعر لدرجة الحرارة، ويعزى هذا بسبب اختلاف معدن السلكين.

مميزاته 
بسبب اختلاف معدني السلكين، يمكنك أن تجد العديد من أنواع هذا المستشعر. هذا الاختلاف يسبب تغير مجال الجهد الكهربائي الذي يمكن توليده من المستشعر. فمثلا النوع K يمكن أن يقيس من 200- إلى 1350 درجة حرارة سيليسيوز، كما يوجد بعض الأنواع الذي يتجاوز 2300 درجة حرارة سيليسيوز! 

المشكل في استعمال هذا المستشعر هو التغير الطفيف جدا للجهد الكهربائي المولد من طرف المستشعر، حوالي 50uV فقط (أي ما يعادل 1 مقسوم على 1000000 فولط). وبالتالي سيكون من الصعب تحديد درجة الحرارة من خلال هذا المقدار من الجهد الكهربائي باستعمال المستشعر مباشرة. لتفادي هذا المشكل يمكنك استعمال واجهة اليكترونية تكون الواسط بين المستشعر والميكروكنترولور. يمكن أن تصل المستشعر بهذه الواجهة (اسمها MAX6675 في مثال يومنا هذا) ثم تصلها هي بالبطاقة Arduino.

مميزات المستشعر الذي سنتكلم عنه اليوم هي كالتالي:
l         النوعK
l         الطول: متر واحد (لكن يمكنك تقليصه حسب الطول الذي تريده)
l         مجال درجة الحرارة: من 100- إلى 500 سيليسيوز.
l         الجهد الكهربائي الموَلد: 6- إلى 20 ميليفولط.
l         الدقة: 2± درجة سيليسيوز.
l         الواجهة: رقمية (MAX6675) أو تناظرية (AD595)

كيف تركب؟
image020
لهذا المستشعر سلكين أصفر (موجب +) وأحمر (سالب -). قم بإيصال السلك الأصفر بمربط الواجهةMAX6675 الذي يحمل إشارة +. والسلك المتبقس بالمربط الآخر.
image021
لتصل الواجهة MAX6675 بالبطاقة Arduino، قم فقط بإيصال جميع مرابط الواجهة بمرابط البطاقةArduino من المربط 2 إلى المربط 6 (مرابط رقمية digital).

image022
برمجة 
أولا وقبل كل شيء قم بتحميل مكتبة شيفرات الواجهة MAX6675  من هنا: http://github.com/adafruit/MAX6675-library 
ثم قم بتثبيتها في حاسوبك كما هو مبين في هذا المقال: http://www.ladyada.net/library/arduino/libraries.html 
قم بإعادة تشغيل برنامج Arduino IDE ثم افتح الشيفرة التالية عن طريق هذا المسار:

File→Examples→MAX6675→serialthermocouple  
 // مثال لاستعمال هذا المستشعر 
// www.ladyada.net/learn/sensors/thermocouple 
#include "max6675.h" //   استعمال المكتبة المخصصة للواجهة 
int thermoDO =4; 
int thermoCS =5; 
int thermoCLK =6;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
int vccPin =3; 
int gndPin =2; 
void setup() 
  Serial.begin(9600); 
  pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); 
  pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); 
  Serial.println("MAX6675 test"); 
  delay(500); 
void loop() 
   Serial.print("C = ");  // درجة الحرارة بالسيليسيوز 
   Serial.println(thermocouple.readCelsius()); 
   Serial.print("F = ");// درجة الحرارة بالفرنهيت 
   Serial.println(thermocouple.readFarenheit());  
   delay(1000); 

قم بتنفيذه وتحويله إلى بطاقة Arduino. بعدها تحقق من عمل ما أنجزت يداك. 

التعليقات
0 التعليقات

0 التعليقات:

إضغط هنا لإضافة تعليق

إرسال تعليق

Blogger Widgets