السبت، 2 فبراير، 2013

LM35

حساس الحرارة LM35 



ستكون تدوينتي اليوم مخصصة للحديث عن حساس للحرارة مشهور يدعى LM35 , ذو خرج دقيق و مدى عمل واسع, و يعطي مباشرة خرج بالسليسيوس C و بتغير فولتية المخرج شكل منتظم مع درجة الحرارة المُقاسة , و يأتي بأشكال مختلفة و بمواصفات مختلفة , لكن هذا التعليب Package TO46 هو الأكثر شيوعاً 

الشكل الخارجي لها كما في الصورة 

من الصورة يتبين لنا أنها تتكون من 3 أرجل و هي 

Vs : و هي مدخل تغذية الحساس .
Vout:  و هو مخرج درجة الحرارة , و الذي نقوم بوصله بالمتحكم .
Gnd: ارضي الدارة .

المواصفات القياسية لهذا الحساس يمكن معرفتها من النشرة الفنية Datasheet  لها و يمكن أن نلخص أهمها فيما يلي :

1) تتغير فولتية الخرج خطياً مع درجة الحرارة "10mV/C "
2) نسبة الخطأ في درجة الحرارة لا تزيد أو تنقص عن 0.5C 
3) مدى حراري واسع يبدأ من 55C-  سيلسيوس إلى 150C
4)مقاومة الخرج قليلة 
5) يمكن تغذيته ضمن مدى فولتية كبير "من 4- 30 فولت "

هذه أهم المعلومات التي يمكننا أن نستعرض بها ميزات هذا الحساس , و القيم الكهربائية الضرورية لهذا الحساس موجودة في الجدول أدناه :



المعدات :

لكي تنفذ تجربة اليوم  ستحتاج إلى ما يلي :
1) بطاقة أردوينو 
2) الحساس LM35
3) أسلاك توصيل 
4) BreadBoard .
5) وسائل إظهار رقمية " اختيارية في حال توافرها " مثل المقطعات السباعية Seven segment أو الشاشة الكريستالية LCD1602




التوصيل :

التوصيل سهل للغاية 


نأتي الآن لجانب البرمجة .

البرمجة :

المعلومة الأكثر أهمية  لهذا الحساس هو أنه يقوم بمعايرة الخرج مباشرة بالسيلسيوس , ومن النشرة الفنية Datasheet نعرف أنه 

أذن كل 10 ملي فولت على المخرج تساوي 1 سيلسيوس , رائع .

البرنامج هنا , و بنفس التوصيل الموجود اعلاه
-------------------------------------------------
//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//****************************************************
//Name :Mohannad Rawashdeh .
//temeratuer sensor using LM 35 sensor.
//Push button on pin 3 "as power switch"
//Lm 35 have 3 pin , +Vcc,Gnd,out
//hooked up:
//connect pin one to +5v "from arduino board"
//connect pin two to A0 analoge input.
//connect pin three to Gnd
//LM 35 have a linearity curve
// it change 10mV for each 1 Celesus
// Programmed for http://genotronex.blogspot.com/
//****************************************************************
float LM35=0;
float input=0;  // reading the voltage on pin A0
float celsius=0;
void setup(){
Serial.begin(9600); 
pinMode(A0,INPUT);
}

void loop(){

LM35 = analogRead(A0);
input = (LM35*5000)/1024; // convert raw sensor value to millivolts       
celsius = input/10;         // convert millivolts to Celsius
Serial.println(" sensor read");
Serial.println(LM35);
Serial.println(" --------------------------");
delay(1000);
Serial.print("Temperature: ");
Serial.print(celsius,2);
Serial.println(" degrees C");
Serial.println("_ _ _ _ _ _ _ _ _ _ _ _ _ _  ");
delay (2000); // wait a 2 second
}
بعد أن تفتح السيريال Serial Monitor  سترى درجة الحرارة  على الشاشة .



لو أردنا تطوير المشروع , فما علينا سوى عرض قيمة الخرج Celsius على شاشة العرض المطلوبة .

هذا البرنامج يوضح عرض درجة الحرارة على 7seg 
---------------------------------
//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//****************************************************
//Name :Mohannad Rawashdeh .
//Date "30/9/2012 3:00pm
// Description: This  Code for using a 74HC595 Shift Register and Seven segment CA          //
// Display Temp degree with sensor LM35 , Using arduino pin # 8,10,11,12
// Programmed for http://genotronex.blogspot.com/
                
//****************************************************************
//define the Pins
//Pin connected to latch clock  of 74HC595 ""pin 12""
int latchPin = 8;
//Pin connected to shift clock of 74HC595 ""PIN 11 "
int clockPin = 12;
////Pin connected to serial Data A of 74HC595 "pin 14 "
int dataPin = 11;
///Output pin cotroller of 74HC595""pin 13""
int output_pin=10;
float C=0; //which express about the Analoge pin reading surrounded by 0-99
int Tens=0;//Number that will show on digit_2
int Ones=0;//Number that will show on digit_1
float d=0;
int Hundreds=0;
int thousands=0;
unsigned long mul=0;
int N[]={3,159,37,13,153,73,65,31,1,25,254,99}; 
//the Number from 0-9 in an array 254 for dot abd 99 for C symbol
float sensor=0;
float input=0;//voltage read on pin 2
float celsius=0;
int td=1;
//___________________________________________________

void setup() {
  Serial.begin(115200);
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(output_pin, OUTPUT);
  pinMode(A0,INPUT);
  digitalWrite(output_pin,HIGH); // this instruction to disable Output pins
}
void digit_1(){
   shiftOut(dataPin, clockPin, MSBFIRST, 1);
    delayMicroseconds(100);
}
void digit_2(){
  shiftOut(dataPin, clockPin, MSBFIRST, 2);
    delayMicroseconds(100);
}
void digit_3(){
  shiftOut(dataPin, clockPin, MSBFIRST, 4);
    delayMicroseconds(100);
}
void digit_4(){
  shiftOut(dataPin, clockPin, MSBFIRST, 8);
    delayMicroseconds(100);
}
 void digit_5(){
  shiftOut(dataPin, clockPin, MSBFIRST, 16);
    delayMicroseconds(100);
} 
void digit_6(){
  shiftOut(dataPin, clockPin, MSBFIRST, 32);
    delayMicroseconds(100);
}
void loop(){
         sensor = analogRead(A0);
         delay(1);
         sensor=constrain(sensor,0,1023);
         input = (sensor*5000)/1024; // convert raw sensor value to millivolts       
         C=input/10; 
         Serial.println(C);
         thousands=C/1000;
         d=C/100;      
         Hundreds=d-(thousands*10);
         d=C/100;    
         mul=C/100;                  
         Tens=(d*10)-(mul*10); 
         d=C/10;
         mul=C/10;
         Ones=(d*10)-(mul*10);
  //----------------------------------------------
  //**********************************************
  for(int i=0;i<50;i++){
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_1();
    shiftOut(dataPin, clockPin, MSBFIRST, N[11]);  
    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(td);   
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  //---------------------------------------------------------------
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_2();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Ones]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(td);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_3();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Tens]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(td);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
    //----------------------------------------------------------------
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_4();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Hundreds]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(td);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_5();
    shiftOut(dataPin, clockPin, MSBFIRST, N[0]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(td);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  //----------------------------------------------------------------
  
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_6();
    shiftOut(dataPin, clockPin, MSBFIRST, N[0]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(td);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  
  }
}



تحياتي 










20 التعليقات :

  1. المقال راائع ومتعوب عليه الله يعطيك العافية ..
    أتمنّى لك التوفيق.. بارك الله بك ونفع بك..

    ردحذف
  2. الله يعافيك نور الدين

    أخيراً كُتب لي اليوم أن ارى أول تعليق بعد مرور أكثر من 3 أشهر على افتتاح مدونتي

    شكراً لك أخي الكريم , و أعدك بالمزيد

    ردحذف
  3. يعطيك العافيه اخي على المجهود الرائع الذي تبذله على اظهار هذه المدونه بابهى صوره
    بس عندي استفسار
    كيف بدي اقدر اعالج مشكله error في درجه الحراره لو حكينا هيك بيزبط ؟؟
    input = (LM35*5000)/1024
    input= input - 5000
    celsius =input/10
    ونسبه الخطء 0.5 على ما اظن انها مؤثره شوي
    وشكرا

    ردحذف
    الردود
    1. اهلاً محمد

      على العكس هذا السنسور مميز في هذا الأمر

      اغلب السنسورات التي تماثله , نسبة خطأها +-2سيلسيوس

      النسبة غير مؤثرةلأن 0.5c شبه مهملة مع مدى هذا الحساس "-55>> 150 " سيلسيوس

      جربه و سترى هذا بنفسك

      تحياتي لك صديقي

      حذف
    2. يمكن أيضاً أخذ متوسط حسابي لقراءات هذا الحساس , هذا يقلل نوعا ما من نسبة الخطأ .

      حذف
    3. شكرا الك مهندس
      لم انتبه لمسأله المتوسط الحسابي
      ^^

      حذف
  4. مرحبا يا جماعة بدي مساعدة في برمجة Arduino uno أنا وصلت معها LM35) Temperature sensor على مدخل التماثليA0 و أريد أن أفعل ثلاثة مخارج بشروط معينه
    1:- أذا كانت الحرارة ما بين 13 الى 30 يضيء الليد على مخرج 2
    2:- أذا كانت الحرارة مابين 31 الى 55 يضيء الليد على مخرج 3
    3:- أذا كانت الحرارة مابين 56 الى 90 يضيء لليد على المخرج 4
    أنا بحاجة عقولكم يا اصدقائي
    ومشكورين على تعاونكم (:

    ردحذف
    الردود
    1. أهلاً بك , ستجد الكود في التعليق التالي .

      حذف
  5. //Name :Mohannad Rawashdeh .
    //temeratuer sensor using LM 35 sensor.
    //Push button on pin 3 "as power switch"
    //Lm 35 have 3 pin , +Vcc,Gnd,out
    //hooked up:
    //connect pin one to +5v "from arduino board"
    //connect pin two to A0 analoge input.
    //connect pin three to Gnd
    //LM 35 have a linearity curve
    // it change 10mV for each 1 Celesus
    // Programmed for http://genotronex.blogspot.com/
    //****************************************************************
    float LM35=0;
    float input=0; // reading the voltage on pin A0
    float celsius=0;
    const int first_cond_low =13;
    const int first_cond_high =30;
    const int second_cond_low =31;
    const int second_cond_high =55;
    const int third_cond_low =56;
    const int third_cond_high =90;


    void setup(){
    Serial.begin(9600);
    pinMode(A0,INPUT);
    for(int i=2;i<5;i++){
    pinMode(i,OUTPUT);
    }
    }

    void loop(){

    LM35 = analogRead(A0);
    input = (LM35*5000)/1024; // convert raw sensor value to millivolts
    celsius = input/10; // convert millivolts to Celsius
    Serial.println(" sensor read");
    Serial.println(LM35);
    Serial.println(" --------------------------");
    if(celsius >first_cond_low && celsius <= first_cond_high){
    digitalWrite(2,HIGH);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    }
    if(celsius >=second_cond_low && celsius <= second_cond_high){
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
    digitalWrite(4,LOW);
    }
    if(celsius >=third_cond_low && celsius <= third_cond_high){
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    }

    delay(1000);
    Serial.print("Temperature: ");
    Serial.print(celsius,2);
    Serial.println(" degrees C");
    Serial.println("_ _ _ _ _ _ _ _ ");
    }

    ردحذف
  6. أخي أريد برنامج في ج اردوينو LM35 الاستشعار مع لوحة اردوينو على شاشة LCD

    ردحذف
    الردود
    1. اكرر نحن هنا لا نكتب كودات خاصة لكل شخص كما يريد , نحن نضعك على اول الطريق و نسهل لك كل المواضيع , و انت عليك ان تبدع ما تريد .

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

    وشكرا جزيلا

    ردحذف
  8. شكرا على الموضوع بس يريت يكون شرح الكود بالعربي

    ردحذف
  9. موضوع رائع
    ولكن سؤال انا جربت الحساس على حهازتسخين وشبكة الحساس على الجهاز وكن درجة الحرارة بدأت من العد 4C مش المفروض يعطي الحساس درجة حرارة الغرفة بصراحة انا مش عارف وين المشكلة

    ردحذف
    الردود
    1. لا تستخدم lm35 بهذا الشكل لانه ابسط من ان يستخدم في قياس حرارة عاليه بشكل مباشرة بدون عزل .
      استخدم الثيرمستور افضل .

      حذف
  10. جيت اجرب الlm35 عن طريق كود مكتوب فى كتاب اردوينو ببساطة ولقيتها بطلع حاجات غريبة قيم بالسالب والموجب زالاختلاف كبيربين القيم وبعضها

    ردحذف
  11. السلام عليكم شكرا على المجهودات المبذولة
    هل يمكن اضهار القيم السالبة
    حسب النشرة الفنية لهذا الحساس نجد التيار المرجعي هو 1,8v وليس 5V

    ردحذف
  12. السلام عليكم
    بغيت مساعدة اريد برنامج الاردوينو للتحكم في درجة حرارة و برودة معينة في الماء بحيث اذا وصل مثلا الى درجة 50 يعمل الاردوينو على اعطاء اوامر لجهاز التبريد بالعمل و العكس صحيح اريد البرنامج لو سمحتون

    ردحذف
  13. م.محمد الرواشده
    جزاك الله خير

    ردحذف

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.