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

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 :

أتمنى أن أكون قد وفقت في الشرح ..
” سبحانك اللهم و بحمدك .. أشهد أن لا إله إلا أنت أستغفرك و أتوب إليك  ”

المصادر :

https://www.bc-robotics.com/tutorials/using-a-tmp36-temperature-sensor-with-arduino/
The sensor Data Sheet

الأردوينو و مستشعر الضوء

.

arduino-1128227_1920

مقدمة :

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

كيف يعمل مستشعر الضوء ؟

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

المتطلبات :

  • أردوينو  Arduino
  • حساس الضوء  Photo Cell (Photo Resistor)
  • مقاومة 220 أو 330
  • مقاومة 10KΩ
  • لوح تجارب Bread Board
  • أسلاك توصيل  Wire Jumpers

الدائرة :

LDR sensor_bb

قمنا بتوصيل الدايود الضوئي إلى Pin رقم 11 , لأنه أحد المداخل التي تدعم ما يسمى بال PWM   اختصار ل Pulse Width Modulation .

وهي طريقة للتحايل على عدم قدرة الأردوينو على إنتاج نبضات تماثلية , عن طريق انتاج موجات مربعة تنتقل بين حالتي ال 0 و 1  بسرعة .. و على حسب هذه السرعة تظهر لنا كإشارة تماثلية ..

يمكن معرفة المداخل التي تدعم هذه الخاصية بوجود علامة ‘ ~ ‘ أمامها .

أما المقاومة الضوئية فقد قمنا بتوصيلها إلى المدخل التماثلي A0 لأنها تنتج اشارة تماثلية .. و هذه المداخل تحتوي على ADC  (Analog to Digital Converter)وهو ما يقوم بتحويل هذه الإشارة إلى رقمية .. مع العلم بإمكانية استخدام هذه المداخل للإشارات الرقمية أيضا ..

الكود :

const int LEDpin = 11; //LED will be connected to pin 11;
int LEDvalue;  //The value that wil be assigned to the LED;
int sensorValue; // The value read by the sensor;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //Start Serial Communication with the computer 
  pinMode(LEDpin, OUTPUT); //Setting the LED pin as output;

}

void loop() {
  // put your main code here, to run repeatedly:
  sensorValue = analogRead(A0); //read the value at the sensor pin
  LEDvalue = map(sensorValue, 0, 1023, 0, 255);//mapping the value from the sensor to be valid
  analogWrite(LEDpin, LEDvalue);  //Writing the value to the LED
  Serial.print(sensorValue); //printing the value to the screen
  delay(100); //put a delay
  
}

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

const int LEDpin = 11;
int LEDvalue;
int sensorValue;

في الأسطر الأولى قمنا بتعريف ثابت LEDpin و الذي سيحمل القيمة 11 و هو المدخل الذي سيوصل به الدايود المضئ  .. و المتغير LEDvalue و الذي سيخزن القيمة التي سترسل إلى الدايود .. و أخيرا المتغير sensorValue و الذي سنستقبل فيه قراءة المستشعر ..

Serial.begin(9600);
pinMode(LEDpin, OUTPUT);

داخل دالة setup و هي الدالة التي تنفذ مرة واحدة فقط لذلك تستخدكم في تهيأة المداخل و المخارج ..
الأمر  Serial.begin(9600) هو المسؤول عن بداية التخاطب بين الأردوينو و الحاسب عن طريق وصلة الUSB و سيمكننا من طباعة شدة الإضاءة على ما يعرف بال Serial Monitor في بيئة الأردوينو ..

أما الأمر pinMode(LEDpin, OUTPUT) فهو الذي يقوم بتعريف وظيفة الPin كمخرج أو مدخل .. و تستقبل الدالة pinMode عنصرين .. الأول هو رقم المدخل أو اسمه اذا سبق و قمنا بتعريف اسم له كما فعلنا مع الPin رقم 11 .. و العنصر الثاني هو وظيفة هذا الPin وهي اما OUTPUT أو INPUT ..

sensorValue = analogRead(A0);
LEDvalue = map(sensorValue, 0, 1023, 0, 255);

analogWrite(LEDpin, LEDvalue);
Serial.print(sensorValue);

delay(100);

أما دالة loop   فهي الدالة التي سيتم تكرارها لذلك سنقوم بكتابة ما على الأردوينو أن تفعله بداخلها ..
الأمر analogRead(A0) هو المسؤول عن قراءة قيمة المستشعر التماثلية و تحويلها إلى قيمة رقمية بين
0 – 1023 .. وتستقبل الدالة عنصر واحد فقط و هو رقم المدخل التماثلي .. بعد ذلك سيتم تخزين الناتج في المتغير sensorValue  ..

الدالة map(sensorValue, 0, 1023, 0, 255) .. تقوم هذه الدالة بتحويل القيمة المستقبلة في المدى
0 – 1023 إلى المدى 0 – 255 (الشرح غير واضح أليس كذلك 🙂  ) ..

الدالة التي بعدها analogWrite(LEDpin, LEDvalue) هي المسؤولة عن توليد الخرج التماثلي بإستخدام خاصية ال PWM التي تحدثنا عنها .. و هي تستقبل عنصرين .. الأول هو اسم أو رقم الPin و الثاني هو القيمة المراد اخراجها و يجب أن تكون بين 0 – 255  (لذلك احتجنا  دالة الmap ) حيث تعني القيمة 0 صفر فولت و القيمة 255 تعني 5 فولت ..

Serial.print(sensorValue) تستقبل عنصر واحد و تقوم بطباعة قيمة هذا العنصر على شاشة الحاسب ..

delay(100) تقوم هذه الدالة بإيقاف الأردوينو لمدة 100 ملي ثانية .. قبل أن تبدأ بتنفيذ دالة loop مجددا و السبب هو أن الأردوينو سريع جدا و لسنا بحاجة إلى قراءات بتلك السرعة ..

الآن قم بتحميل الكود على الأردوينو و افتح شاشة الSerial Monitor  الموجودة في أعلى الجهة اليمنى في بيئة الأردوينو IDE  لتشاهد قراءة المستشعر ..

رابط الكود في حسابي على Github :

أتمنى أن أكون قد وفقت في الشرح ..
” سبحانك اللهم و بحمدك .. أشهد أن لا إله إلا أنت أستغفرك و أتوب إليك  ”

المصادر :

https://www.arduino.cc/en/Reference
http://simplyarduino.com/
https://en.wikipedia.org/wiki/Photoresistor

باسمك اللهم

دون سابق إنذار قررت أن أبدأ أول تدوينة لي ..

بسبب التسويف كنت في كل مرة أؤجل البداية ..

ستكون هذه المدوة شخصية أكثر من كونها تخصصية  ..

سأكتب فيها عن خواطري و آرائي ربما .. أشارككم فيها تجاربي وألخص فيها  ما قرأته من كتب  ..

ربما أترجم فيها ما يعجبني من مقالات ..

أيضا سأكتب عن ما أتعلمه عن Android Development  و Arduino أو أي  شئ آخر ..

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

“فرب حامل فقه إلى من هو أفقه منه” ..

أيضا مع مرور الوقت سيتحسن أسلوبي في الكتابة و ستساعدني في تثبيت المعلومات أكثر ..

و ربما أكون سببا في إلهام أحدهم بطريقة ما إن شاء الله .. 


سأحاول أن لا أتكلف كثيرا و سأكون خفيفا قدر الإمكان بإذن الله 😊 .. 

سأكتفي بهذا القدر ..


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

” باسمك اللهم نخوض دروبًا جديدة، آملين أن لا نتعثّر “