الأردوينو و مستشعر الحرارة

arduino-1128227_1920



مقدمة :

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


كيف يعمل مستشعر الحرارة ؟

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

المتطلبات :

  • أردوينو  Arduino
  • مستشعر الحرارة TMP36
  • 3 X مقاومات 220 أو 330
  • لوح تجارب Bread Board
  • أسلاك توصيل Wire Jumpers

الدائرة :

TMPsensor
قمنا بتوصيل ثلاث دايودات مضيئة إلى لوحة الأردوينو في المداخل 2 , 3 و 4  ..  و الطرف السالب من الدايودات تم توصيله إلى مقاومة 220 أوم و إلى الأرضي (Ground) على لوحة التجارب . مستشعر الحرارة لديه ثلاث أطراف الطرف الأيمن منها يتم توصيله إلى الGround و الذي في الوسط يمثل خرج المستشعر لذلك سنوصله إلى أحد المداخل التماثلية في الأردوينو و ليكن A0 , الطرف الأخير يوصل إلى مصدر الطاقة (يجب أن يكون الجانب المسطح من المستشعر مواجها لك).

الكود :

const int sensorPin = A0;
const float baselineTemp = 25.0;

void setup() {
  Serial.begin(9600); //open the serial comunication
  
  for (int pinNumber = 2; pinNumber < 5; pinNumber++) {
    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, LOW);
  }
}

void loop() {
  
  int sensorVal = analogRead(sensorPin);

  float voltage = (sensorVal / 1024.0) * 5.0;

  Serial.print(", degrees C: ");
  float temperature = (voltage - .5) * 100;
  Serial.println(temperature);

  
  if (temperature < baselineTemp) {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  } 
  else if (temperature >= baselineTemp  && temperature < baselineTemp + 3) {
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  } 
  else if (temperature >= baselineTemp + 3 && temperature < baselineTemp + 5) {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
  } 
  else if (temperature >= baselineTemp + 5) {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
  }
  delay(100);
}

الآن لنقم بشرح الكود :

const int sensorPin = A0;
const float baselineTemp = 25.0; 
 
قمنا بتعريف ثابتين أحدهما للPin الذي سيوص به المستشعر لتسهيل الإشارة إليه .. و الثاني نخزن فيه درجة حرارة أساسية ( لنسمها  درجة حرارة الغرفة ) و ستكون المقارنة على أساسها .. يمكنك أن تختار أي رقم ..
Serial.begin(9600); //open the serial comunication
  
  for (int pinNumber = 2; pinNumber < 5; pinNumber++) {
    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, LOW);
  }
في دالة setup قمنا ببدء  الإتصال التسلسلي مع الحاسب عن طريق الأمر  Serial.begin(9600) حتى نتمكن من طباعة درجة الحرارة على الشاشة  Serial Monitor . بعد ذلك استخدمنا الحلقة For لجعل المخارج 2 , 3 و 4 OUTPUT  و اعطائهم قيمة ابتدائية LOW .. بإستخدام for اختصرنا الكثير من الكتابة فبدل من كتابة  سطرين لكل Pin نكتبهما مرة واحدة و for تتكفل بالباقي .
int sensorVal = analogRead(sensorPin);
float voltage = (sensorVal / 1024.0) * 5.0; 
 
يتم تخزين قراءة المستشعر عن طريق الدالة analogRead  في المتغير sensorVal .. أما المتغير voltage فيخزن ناتج تحويل قراءة المستشعر إلى جهد .. ويتم ذلك بقسمة قراءة المستشعر على 1024 وهو مدى قراءة دالة analogRead  من 0 إلى 1023  ثم ضرب الناتج ب 5 وهو مقدار الجهد المعطى للمستشعر .
Serial.print(", degrees C: ");
float temperature = (voltage - 0.5) * 100;
Serial.println(temperature);

السطر الأول يطبع ", degree c :" على الشاشة .. بعدها نقوم بحساب درجة الحرارة و تخزينها في المتغير temperature  .. (قمنا بطرح 0.5 من voltage لأن المستشعر يعطينا قراءة 0.5 عند 0 درجة مئوية و بعد ذلك يزيد 10 ملي فولت لكل درجة ) .. فمثلا عند درجة حرارة 10 ستكون قراءة المستشعر (10 * 10 + 0.5 *1000) 10 هي درجة الحرارة و 10 الثانية هي الملي فولت لكل درجة .. أما 0.5 * 1000 فهي لتحويل ال0.5 من فولت إلى ملي فولت و بعد ضربها في 100 يصبح الناتج النهائي 10 .. المتبقي من الكود هو الجانب المنطقي حيث يقوم بمقارنة الناتج مع درجة حرارة الغرفة التي حددناها في بداية الكود .. فإذا كانت أقل منها اجعل كل المصابيح مطفأة .. أما إذا كانت أكبر من درجة حرارة الغرفة و أقل من درجة الغرفة + 3  قم بإضاءة المصباح الأول فقط .. و إذا كانت أكبر من درجة الغرفة + 3 و أقل من درجة الغرفة +5 أضء المصباحين الأولين فقط .. و إذا زادت عن ذلك قم بإضاءة كل المصابيح .
delay(100);

أخيرا قم بإيقاف الأردوينو لمدة 100 ملي ثانية . رابط الكود في حسابي على Github : أتمنى أن أكون قد وفقت في الشرح .. " سبحانك اللهم و بحمدك .. أشهد أن لا إله إلا أنت أستغفرك و أتوب إليك  "

المصادر :


تعليقات

المشاركات الشائعة من هذه المدونة

تجربتي مع كورسيرا

عن عام مضى