مستشعر الحرارة هو عبارة عن دارة متكاملة مدمجة في مُركب صغير الحجم به ثلاث وصلات يعطينا تغير في الجهد متناسب مع التغير في درجة الحرارة.

الشيء الإيجابي مع هذا المستشعر كونه مُعَيَّر في المصنع و يخرج قيمة 10 ملي فولط لكل 1 درجة مئوية أو10 mV/°C مع 0 فولط عند 0°.

هذه الخاصية مهمة إذ يمكن عند تبديل المستشعر عدم إعادة المعايرة.

دقة هذا المستشعر تتراوح بين 0,5 و 0.75 °م.

المستشعرLM35D يمكنه قياس درجات الحرارة بين 0 و 100 م°.

يجب مراعات الحذر عند ربط هذا المستشعر. الصورة التالية تبين الطريقة.to92

  • +Vcc = يوصل مع مأخذ التيار 5+ فولط.
  • المخرج = الجهد المتناسب مع درجة الحرارة.
  • GND = القطب السالب للمأخذ.

 

مع المستشعر السابق سوف نصنع مقياس للحرارة مع إظهار قيمها في مراقب الوصل.

ما يلزمنا

  • لوحة أردوينو
  • لوحة تجارب
  • المستشعرLM35D
  • أسلاك توصيل.

قم بانشاء التركيب التالي

to92connection

 

مراجعة كيفية تمثيل الأعداد في المتحكم الدقيق

المستشعرLM35D يعطينا قيم دراجات الحرارة بدقة عُشرية. يمكن أن نحصل على قيم مثل 35,5 م° ما يلزمنا أن نسجلها في قيم من نوع float في الذاكرة.

قيم من نوع float تُخزّن بدقة عالية و لكنها تأخذ حيزاً أكبر في الذاكرة و كذلك تتطلب سرعة في المعالجة بعكس الأعداد الصحيحة.

لتوفير مساحة الذاكرة سوف نقوم بتخزين قيم درجات الحرارة في أعداد صحيحة.

المداخل التماثلية لأردوينو تقدم قيم بين 0 و 1023 و التي نوافقها بدرجات الحرارة بين 0 و 100 م°.

بما أننا نستعمل الأعداد الصحيحة فإن القيمة 35,7 م° مثلا يمكن أن تُخرج في مراقب الوصل كما بلي:

العدد «35» ثم الفاصلة العشرية «,» ثم الرقم العشري «7».

نقوم بتخزين القيمة السابقة في الذاكرة بالشكل : «357». و لفصل العددين 35 و 7 بالبرمجة يكفي إجراء قسمة صحيحة على العدد 10.

لأردوينو معامل خاص يمكنه حساب باقي القسمة العشرية بين عددين وهو الرمز « % » .

مثال

...
إظهار  357 بالشكل  35.7
int Val_Entiere = 357/10;
int decimal = 357%10;
...
Serial.print(Val_Entiere);
Serial.print(“,”);
Serial.print(decimal);

إفتح واجهة التطوير و حرر نص البرنامج التالي:

int temp_pin = A0;
float temperature = 0;

void setup()
{
Serial.begin(9600);
Serial.println("Thermometer with LM35 ");
analogReference(INTERNAL);
}

void loop() {

int nbre_ech = 20;
int lecture = 0;

for (int i = 0; i < nbre_ech; i++) {
   lecture = lecture +analogRead(temp_pin);
}
   lecture = lecture / nbre_ech; 

temperature = ((100*1.1* lecture)/1024)*10;

Serial.print("analog: ");
Serial.print(long(lecture));

Serial.print(" Temp : ");
Serial.print(long(temperature) / 10);
Serial.print(",");
Serial.println(long(temperature) % 10);
delay(500);
}

قم بفحص نص البرنامج ثم إرفعه إلى اللوحة.

قم بتنفيذ مراقب الوصل.

مراقب الوصل يُظهِر قيم درجات الحرارة.

ضع أصبعيك على المستشعر و لاحظ الإرتفاع في درجات الحرارة.

شرح عمل البرنامج

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

analogReference(INTERNAL)

كما رأينا من قبل أن المأخذ التماثلي يقبل قيم للجهد بين 0 و 5 فولط إفتراضياً و التي يقوم بتحويلها إلى قيم في النظام الثنائي بين 0 (0 فولط) و 1023 (5 فولط).

يمكنك أخذ خيارات أخرى ممكنة لهذه الدالة:

  • DEFAULT : القيمة الإفتراضية للمرجع أي 5 فولط.
  • INTERNAL : القيمة المرجعية الداخلية، و هي تساوي 1,1 فولط.
  • EXTERNAL : فرق الكمون المطبق على المأخذ AREF من لوحة أردوينوو الذي يؤخذ كمرجع.

الصورة التالية توضع عملية تحويل الإشارة حسب حالة analogReference.

adcconv

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

القيمة القصوى للجهد الذي يُخرجه المستشعر هو 1 فولط، لذلك نختار المرجع INTERNAL الذي يأخذ1,1 فولط كمرجع. إذن 1,1 فولط سوف يعطينا قراءة تساوي 1023. ما ينتج عنه ربح في الدقة قدرها 20% أكثر من فيما إذا كان المرجع هو5 فولط.

إذن القيمة القصوى لدرجة الحرارة أي 100م° مع المرجع 1,1 فولط. سوف يقرأ المحول (ADC):

1024/1,1 = 931.

باستعمال القاعدة الثلاثية :

 931 → 100 م°

القراءة lecture (القيمة التي يقرأها أردوينو)  →  temperature م°

و بذلك تكون درجة الحرارة المحسوبة د:

[latex]temperature = \frac{lecture\times100}{931}[/latex]

[latex]temperature = \frac{lecture\times100}{\frac{1024}{1.1}}[/latex]

[latex]temperature = \frac{lecture\times100\times1.1}{1024}[/latex]

 

و بذلك نكتب المعادلة الخاصة بالبرنامج:

temperature = ((100*1.1* lecture)/1024)*10;

حيث تمثل temperature قيمة درجة الحرارة.

لاحظ أننا ضربنا الناتج في 10 لأننا نستعمل قيم صحيحة في هذا البرنامج كما سبق و أن شرحنا في الأعلى.

كذلك في التعليمة Serial.print(long(temperature) % 10);

المتغير temperature هو من نوع float و إسباقه بالتعليمة ()long تُحوِّلُه إلى النوع long لأن التعليمة (%) باقي القسمة الصحيحة تنتظر قيمة من نوع long.

التعليمات char(), byte(), int(), word(), float() هي كذلك تعليمات تحويل النوع.

مثال

int i;

float j;

j = 67.8;

i = int(j);

i تحتوي القيمة: 67

ماتعلمناه

  • كيفية عمل المستشعر LM35
  • كيفية ربط مستشعر حراري
  • عمل الدالة () analogReference
  • معاملات تحويل النوع (casting).