برمجة حساس درجة الحرارة
ربما جاءت فكرة في صنع آلة أو روبوت يعتمد على درجة الحرارة ليتفاعل مع محيطه، أو صنع جهاز يعمل بالحرارة وتريد أن تتحكم فيه حسب مستويات درجة الحرارة مثلا.... الجواب تجده في هذا المقال الذي يهدف لمساعدتك على تخطي تعقيدات هذه المسألة بكل سهولة.....
|
المحتوى
1. تقديم
2. مختلف استعمالاتها
3. مستشعر درجة الحرارة (من 40- إلى 150 درجة)
4. المقاومة الحرارية (من 55- إلى 105 درجة)
5. سلك مستشعر لدرجة الحرارة (من 100- إلى 500 درجة)
تقديم
تقاس درجة الحرارة بالوحدات التالية :
l الكلفن K: وهو المقياس المعتمد من قبل المنظومة العالميةوهو مقياس كثير الاستعمال في الميادين العلمية.
l السيلزيوس C: (درجة حرارة مئوية) وهو المقياس المعتمد في حياتنا اليومية في غالبية دول العالم.
l الفهرنهيت F : وهو المقياس المعتمد في الولايات المتحدة الأمريكية.
والمعادلات التالية تربط هذه الوحدات بعضها ببعض:
[°C] = ([°F] − 32) × 5⁄9
[°C] = [K] − 273.15
توجد واحدات أخرى لا داعي لذكرها هنا.
|
مختلف استعمالاتها
دعنا نفترض أنك تريد أن تصنع مروحة هواء لانعاشك في حر الصيف. عندما يدور محرك المروحة سترتفع درجة حرارته وبعض الأجزاء الإليكترونية الأخرى بطبيعة الحال. وتريد من مروحتك أن تكون ذكية شيئا ما عن طريق جعلها تتوقف عن العمل عندما تصل درجة الحرارة إلى نسبة معينة. في هذه الحالة ستحتاج لمستشعر درجة الحرارة وميكروكنترولور يعمل على إدارة هذه المسألة.
|
أما الأسلاك المستشعرة لدرجة الحرارة thermocouple فهي تستعمل بكثرة في أنظمة التدفئة والتهوية وتكييف الهواء كـ:
المكيف الهوائي
|
مسخن الماء
تصل درجة حرارة الماء إلى 95 أو 100 درجة. وبالتالي يمكنك أن تفرغ الماء فس كأس الشاي أو القهوة دون الحاجة لغلي الماء
|
مسخن هوائي
أو قل أنه مجمر كهربائي.
|
الفرن الكهرومغناطيسي
|
فرن كهربائي
وهو ما تجده في محلات صنع الأخباز والحلويات مثلا...
|
هل تجد عندك أفكارا جديدة لاستخدام هذا النوع من المستشعرات؟ فقط فكر وأبدع لنا.... فنحن نحتاج أمثالك في أمتنا.... ربما شيئا كهذا الكأس مثلا أو ما شابه....
تعلم معنا اليوم كيف تركب هذه المستشعرات وكيف تبرمجها وبالتالي لن تجد صعوبة في التعامل معها... هل كنت تعرف من قبل كيف تتعامل مع هذه الأشياء؟؟؟
|
مستشعر درجة الحرارة (من 40- إلى 150 درجة)
تعريف
باختصار شديد، إنما هو مركب اليكتروني يقيس لك درجة الحرارة....
مميزاته
l مجال درجة الحرارة: من 40- إلى 150 سيليسيوز.
l الجهد الكهربائي الموَلد: 0.1 فولط (أي 40- درجة سيليسيوز) إلى 0.2 فواط (أي 150 درجة سيليسيوز).
l يحتاج إلى: من 2.7 إلى 5.5 فولط فقط ليعمل على ما يرام.
قراءة درجة الحرارة
يمكنك أن تركبه في روبوتك أو في أي جهاز تفكر فيه عن طريق استعمال بطاقة Arduino البرمجية كالتالي:
|
//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); //انتظار لمدة ثانية واحدة
}
|
قراءة درجة الحرارة بدقة عالية
يمكنك أن تركبه في روبوتك أو أي جهاز تفكر فيه عن طريق استعمال بطاقة 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 درجة)
السلك اﻷسود هو الذي يعنينا هنا، أما المقاومة التي تراها جانبه إنما هي للتقارن حجمه بها.
كما أنه يمكنك استعمالها معه لقراءة درجة الحرارة كما سترى أسفله.
|
تعريف
تدعى المقاومة الحرارية بالإنجليزية (Thermistor). وهي عبارة عن مقاومة كهربائية عادية تتغير مقاومتها حسب درجة الحرارة المطبقة عليها. وبالتالي، فهي تعتبر أيضا مستشعرا لدرجة الحرارة. وانتهينا!
في الحقيقة
في الحقيقة، كل مقاومة كهربائية هي مقاومة حرارية أو قل مستشعرا لدرجة الحرارة. إلا أن مقاومتها تتغير بقسمة صغيرة جدا جدا وبالتالي سيصعب عليك يا حبيبي قياس درجة الحرارة. أما مثال يومنا هذا، أعني المقاومة الحرارية Thermistor، فهي صنعت خصيصا لتتغير بسرعة بسبب درجة الحرارة.
مميزاتها
أرخص
تريد أن تضعها في الماء؟ ضعها ولا تخف عليها...
لا يهم أي جهد كهربائي استعملت معها
من الصعب أن تخربها وتتخلص منها...وبالتالي فهي ممن يمكن الاعتماد عليه
دقة عالية لقياس درجة الحرارة (°0.25±)
الطريقة اﻷولى لقراءة درجة الحرارة
سنحتاج إلى مقاومة حرارية ومقاومة عادية أيا كانت قيمتها وبعض الأسلاك الكهربائية بالإضافة إلى بطاقة Arduino.
ما عليك الآن إلا أن تصل المقاومة العادية بالمربط 5V لبطاقة Arduino. ثم صل الطرف الآخر للمقاومة بإحدى طرفي المقامومة الحرارية(المستشعر). سيبقة طرف واحد فقط للمقاومة الحرارية، قم بإيصاله بمربط الأرضية (ground) للبطاقة. قم بإضافة سلك كهربائي بين المقاومتين وصله بالمربط التناظري 0 (Analog 0) للبطاقة.
|
لقياس درجة الحرارة سنحتاج لمعرفة قيمة المقاومة أولا.
يجب أن تعلم أن الميكروكنترولور لا يستطيع أن يتعرف على قيمة المقاومة. ولكن، يمكنه أن يحدد قيمة الجهد الكهربائي.وبالتالي لتمعرفة الجهد الكهربائي سنحتاج لإضافة مقاومة عادية أخرى. قم بكل بساطة بربط المقاومة والمستشعر على التوالي كما هو مبين في الدارة الكهربائية أعلاه. والآن يمكنك فقط أن تقيس الجهد الكهربائي في الوسط، حيث أنه كلما تتغير المقاومة فإن الجهد الكهربائي سيتغير أيضا طبقا للعلاقة الرياضية التي تربط شدة التيار الكهربائي بالمقاومة .
لنقل أن المقاومة التي تريد أن تضيفها هي 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);
}
|
الطريقة الثانية لقراءة درجة الحرارة
تزودنا البطاقة البرمجة Arduino بـ 5 فولط غالبا. وبالتالي فلحبذا لو نستعمل 3.3 فولط لقراءة قيمة المستشعر. قد تتساءل لماذا؟ في الحقيقة 5فولط تسبب "ضجيجا” أكبر في البطاقة. وبالتالي سيؤثر هذا في فعالية المستشعر. لتفادي هذا المشكل نستعمل المربط ذي 3.3 فولط والذي سنصله بـ AREF للبطاقة Arduino. هذه هي الخدعة الأولى لتحسين قراءة قيمة المقاومة.
أما الخدعة الثانية، فهي أن نقرءها عدة مرات ثم نحسب متوسط هذه القيم. نحتاج حوالي 5 قيم وهي كافية في هذه الحالة. سترى أننا أضفنا سلكا كهربائيا في الدارة يصل المربط ذي 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):
بحيث:
- 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;
T =1.0 / (log( R / R0) / B + 1.0 /(T0 + 273.15));
T -= 273.15; // تحويل إلى درجة الحرارة سيليسيوز
Serial.print("Temperature ");
Serial.print(T);
Serial.println(" *C");
delay(1000);
}
|
سلك مستشعر لدرجة الحرارة (من 100- إلى 500 درجة)
تعريف
يطلق عليه Thermocouple بالإنجليزية.
هذا المستشعر عبارة عن سلكين معدنيين. وهو حساس لدرجة الحرارة ولا يوجد أي مركب اليكتروني داخله. يمكن أن يتولد جهد كهربائي خفيف عندما يتعرض هذا المستشعر لدرجة الحرارة، ويعزى هذا بسبب اختلاف معدن السلكين.
مميزاته
بسبب اختلاف معدني السلكين، يمكنك أن تجد العديد من أنواع هذا المستشعر. هذا الاختلاف يسبب تغير مجال الجهد الكهربائي الذي يمكن توليده من المستشعر. فمثلا النوع K يمكن أن يقيس من 200- إلى 1350 درجة حرارة سيليسيوز، كما يوجد بعض الأنواع الذي يتجاوز 2300 درجة حرارة سيليسيوز!
المشكل في استعمال هذا المستشعر هو التغير الطفيف جدا للجهد الكهربائي المولد من طرف المستشعر، حوالي 50uV فقط (أي ما يعادل 1 مقسوم على 1000000 فولط). وبالتالي سيكون من الصعب تحديد درجة الحرارة من خلال هذا المقدار من الجهد الكهربائي باستعمال المستشعر مباشرة. لتفادي هذا المشكل يمكنك استعمال واجهة اليكترونية تكون الواسط بين المستشعر والميكروكنترولور. يمكن أن تصل المستشعر بهذه الواجهة (اسمها MAX6675 في مثال يومنا هذا) ثم تصلها هي بالبطاقة Arduino.
مميزات المستشعر الذي سنتكلم عنه اليوم هي كالتالي:
l النوع: K
l الطول: متر واحد (لكن يمكنك تقليصه حسب الطول الذي تريده)
l مجال درجة الحرارة: من 100- إلى 500 سيليسيوز.
l الجهد الكهربائي الموَلد: 6- إلى 20 ميليفولط.
l الدقة: 2± درجة سيليسيوز.
l الواجهة: رقمية (MAX6675) أو تناظرية (AD595)
كيف تركب؟
لهذا المستشعر سلكين أصفر (موجب +) وأحمر (سالب -). قم بإيصال السلك الأصفر بمربط الواجهةMAX6675 الذي يحمل إشارة +. والسلك المتبقس بالمربط الآخر.
|
لتصل الواجهة MAX6675 بالبطاقة Arduino، قم فقط بإيصال جميع مرابط الواجهة بمرابط البطاقةArduino من المربط 2 إلى المربط 6 (مرابط رقمية digital).
|
برمجة
أولا وقبل كل شيء قم بتحميل مكتبة شيفرات الواجهة 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. بعدها تحقق من عمل ما أنجزت يداك.