كود البحث

عرض درجة الحرارة من LM35 على LCD1602 بالدرجة المئوية والفهرنهايت والكلفن

عرض درجة الحرارة من LM35 على LCD1602 بالدرجة المئوية والفهرنهايت والكلفن

في هذا الدرس، سنتعلم كيفية استخدام حسّاس درجة الحرارة LM35 لقياس درجة الحرارة وعرض النتائج على وحدة LCD1602 بثلاث وحدات مختلفة: Celsius و Fahrenheit و Kelvin. هذا المشروع هو وسيلة ممتازة لدمج قراءات الحساسات مع الإخراج البصري، مما يعزز فهمك لكيفية عمل الحساسات والشاشات معًا في مشاريع أردوينو. سترى كيفية توصيل المكونات بشكل صحيح وكيفية تنفيذ الكود اللازم لهذه المهمة.

LM35_with_LCD-1

للشروع، سنستخدم مستشعر درجة الحرارة LM35، وهو جهاز بثلاث دبابيس. ينتج جهدًا تناظريًا يتوافق مع درجة الحرارة بالدرجات المئوية. سيتم استخدام LCD1602 لعرض قراءات درجة الحرارة. في نهاية الدرس، سيكون لديك نظام عرض درجة حرارة يعمل بكامل طاقته. لمزيد من التوضيحات، راجع الفيديو (في الفيديو عند 00:55).

شرح العتاد

تشمل المكونات الرئيسية لهذا المشروع مستشعر درجة الحرارة LM35 وشاشة LCD1602. يعمل LM35 عن طريق توفير إخراج جهد يتناسب خطيًا مع درجة الحرارة بالسيلسيوس، حيث يبلغ 10 مللي فولت/°م. وهذا يجعل من السهل تحويل قراءة الجهد إلى قراءة درجة الحرارة باستخدام حسابات بسيطة في الشيفرة.

LCD1602 هو شاشة عرض مكونة من 16x2 حرف يمكن أن تعرض سطرين من النص. يتم التحكم فيها عبر واجهة I2C، مما يسهل التوصيلات باستخدام أربع اتصالات فقط: VCC، GND، SDA (خط البيانات)، و SCL (خط الساعة). يقلل هذا الإعداد من عدد الدبابيس المطلوبة على الأردوينو، مما يسمح بتوصيلات وإدارة أسهل.

LM35_pinnout

تفاصيل ورقة البيانات

الجهة المصنعة تكساس إنسترومنتس
رقم الجزء LM35
جهد المنطق/إدخال وإخراج ٣-٣٠ فولت
جهد الخرج 10 مللي فولت/°م
نطاق درجة الحرارة -55 إلى +150 °م
دقة ±0.5 °م (عادي)
طرد تو-46، تو-220

  • تأكد من توفير مصدر طاقة مناسب، الحد الأدنى 4 فولت لـ LM35.
  • استخدم مقاومة سحب إذا لزم الأمر لخطوط SDA/SCL.
  • اجعل الأسلاك قصيرة لتقليل الضوضاء.
  • فصل مصدر الطاقة باستخدام المكثفات لتحقيق الاستقرار.
  • اختبر كل اتصال قبل تشغيل النظام.

تعليمات التوصيل

LM35_LCD1602_wiring_new

لتوصيل مستشعر درجة الحرارة LM35، قم بتوصيل السلك الأيسر بمصدر طاقة 5 فولت من الأردوينو، والذي تم تعريفه في الكود على أنهVCC2يجب توصيل الدبوس الأوسط، وهو دبوس الإخراج، بالدبوس المدخل التناظري.A0على الأردوينو. أخيرًا، قم بتوصيل الدبوس الأيمن من LM35 بالأرض.

بالنسبة لوحدة LCD1602، قم بتوصيل دبوس الأرضي بأرضية الأردوينو. يجب توصيل دبوس VCC بمخرج 5 فولت من الأردوينو. يجب توصيل خط البيانات (SDA) بالدبوس التناظري.A4، بينما يجب أن يتصل خط الساعة (SCL) بـA5تسمح هذه الإعدادات لـ Arduino بالتواصل مع شاشة LCD باستخدام بروتوكول I2C.

أمثلة على الكود وشرح مفصل

في الكود، نقوم بتعريف دبابيس الإدخال لحساس LM35 وإعداد شاشة LCD مع عنوانها I2C. وظيفة الإعداد تقوم بتهيئة الاتصال التسلسلي وعرض LCD. المقتطف التالي يوضح كيفية تهيئة الدبابيس:

const int inPin = A0; // Pin for LM35 output
const int VCC2 = 2; // Pin for LM35 VCC
const int iteration = 1000; // Number of readings for averaging

هنا،inPinمن المقرر أنA0، حيث يتم قراءة خرج LM35. الـVCC2يتم تعريف الدبوس لتوفير الطاقة لجهاز LM35، وiterationيستخدم لمتوسط قراءات درجة الحرارة.

بعد ذلك، لدينا الحلقة الرئيسية التي تتعامل مع قراءات درجات الحرارة وتعرضها على شاشة LCD. يتم عرض كل نوع من أنواع الحرارة بالتسلسل مع تأخير:

lcdDisplay(getTemperature('C'),'C');
delay(2000);
lcdDisplay(getTemperature('F'),'F');
delay(2000);
lcdDisplay(getTemperature('K'),'K');  
delay(2000);    

تقوم هذه الكتلة من الشيفرة باستدعاء الـlcdDisplayوظيفة لعرض درجة الحرارة بالدرجات المئوية والفهرنهايت والكلفن، مع فاصل زمني مدته 2 ثانيتين بين كل عرض.

سيتم تحميل الكود الكامل أدناه في هذه المقالة، حيث يمكنك رؤية جميع الوظائف والمنطق المنفذ لقراءة درجة الحرارة وعرضها بشكل مناسب.

عرض / ماذا تتوقع

LM35_with_LCD-2

عند تشغيل المشروع المكتمل، يجب أن يعرض شاشة الكريستال السائل قراءات درجة الحرارة بالدرجات المئوية والفهرنهايت وكلفن، مع التبديل بين كل عرض. يمكنك اختبار استجابة المستشعر من خلال تطبيق الحرارة، مثل استخدام مسدس الحرارة، ومراقبة التغيرات في درجة الحرارة المعروضة (في الفيديو عند :15). إذا كان المستشعر متصلاً بمصدر طاقة أقل من الجهد الموصى به، فقد تكون القراءات غير دقيقة، لذا تأكد من أنه يعمل عند حد أدنى قدره 4 فولت.

طوابع زمنية للفيديو

  • 00:00- المقدمة
  • 00:٥٥- نظرة عامة على الأجهزة
  • 03:30- تعليمات التوصيل
  • 06:15نظرة عامة على الكود
  • ٠٩:١٥- تظاهرة

الصور

LM35_pinout
LM35_pinout
LM35_LCD1602_wiring_new
LM35_LCD1602_wiring_new
LM35_with_LCD-2
LM35_with_LCD-2
LM35_with_LCD-1
LM35_with_LCD-1
326-On Lm35 Prints the temperature as C, F, or K on the LCD1602 or LCD2004
اللغة: C++
/*
 * This Arduino sketch is to use LM35 to measure temperature.

 * Prints the temperature as C, F, or K on the LCD1602 or LCD2004 with I2C module (4 wires).
 
 * 
 * Watch video instructions for this code: https://youtu.be/XpMtQVCMIRA
 * 
 
 * Written by Ahmad Shamshiri on May 12, 2020 at 19:53 in Ajax, Ontario, Canada
 * in Ajax, Ontario, Canada. www.robojax.com
 * 


 or make a donation using PayPal: http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    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 <https://www.gnu.org/licenses/>.


*/

const int inPin =A0;//can change
const int VCC2 =2;
const int iteration = 1000; //can change (see video)
const float LM35_FACTOR =0.01;// do not change

// start of settings for LCD1602 with I2C
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x26, 16, 2);
// end of settings for LCD1602 with I2C

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  Serial.println("Robojax LM35 with LCD for Arduino");
  
  pinMode(VCC2,OUTPUT);
  digitalWrite(VCC2, HIGH);
  
  lcd.begin();  
  lcd.backlight();
  lcd.print("Robojax LM35");
  lcd.setCursor(0,1);
  lcd.print("Temp: "); 
}

// the loop routine runs over and over again forever:
void loop() {
 //robojax.com LM35 with LCD Code for Arduino

  lcdDisplay(getTemperature('C'),'C');
  delay(2000);
  
  lcdDisplay(getTemperature('F'),'F');
  delay(2000);
    
  lcdDisplay(getTemperature('K'),'K');  
  delay(2000);    

if(getTemperature('C') >87)
{
 // do something here (watch video)
}

//  printTemperature('C');
//  Serial.println();
//  printTemperature('F');
//  Serial.println();  
//  printTemperature('K'); 
//  Serial.println();     
//  Serial.println();    
//  Serial.print(" Temperature: ");
//  printDegree();    
//  Serial.print(getTemperature('C'));
//  Serial.println();
  delay(100);
}

/*
 * getTemperature()
 * @brief gets the average temperature
 * @param average temperature
 * @param "type" is character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 * @return returns one of the values above
 * Written by Ahmad Shamshiri for robojax.com
 * on May 08, 2020 at 02:36 in Ajax, Ontario, Canada
 */
float getTemperature(char type)
{
    float value;
    float averageTemperature =0;
    int sensorValue = analogRead(inPin);
    float voltage = sensorValue * (5.0 / 1023.0); 
    float temperature = voltage / LM35_FACTOR;
    for(int i=0; i< iteration; i++)
    {
      averageTemperature += temperature;
    }

    averageTemperature /=iteration;
  if(type =='F')
   {
    value = averageTemperature *9/5 + 32;//convert to Fahrenheit 
   }else if(type =='K')
   {
    value = averageTemperature + 273.15;//convert to Kelvin
   }else{
    value = averageTemperature;// return Celsius
   }    
    return value ;
}//getTemperature()

/*
 * printTemperature()
 * @brief prints  temperature on serial monitor
 * @param charact type
 * @param "type" is character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 * @return none
 * Written by Ahmad Shamshiri for robojax.com
 * on May 08, 2020 at 02:45 in Ajax, Ontario, Canada
 */
void printTemperature(char type)
{
    float value;
    float temp = getTemperature(type);
   Serial.print(temp);
    printDegree();    
  if(type =='F')
   {
     Serial.print("F");
    }else if(type =='K')
   {
     Serial.print("K");
   }else{
     Serial.print("C");
   }    
 
}//printTemperature()

/*
 * @brief prints degree symbol on serial monitor
 * @param none
 * @return returns nothing
 * Written by Ahmad Shamshiri on July 13, 2019
 * for Robojax Tutorial Robojax.com
 */
void printDegree()
{
    Serial.print("\\xC2"); 
    Serial.print("\\xB0");  
}


/*
 * lcdDisplay(float value,char symbol)
 * displays value and title on LCD1602
 * How to use:
 * lcdDisplay(35.3,'C');

 */
void lcdDisplay(float value,char symbol)
{
   // Robojax.com LCD1602 for LM35 Demo   

   for(int i=7; i<16;i++)
   {
    lcd.setCursor(i,1);
    lcd.write(254);  
   }
   lcd.setCursor (7,1); //
   lcd.print(value);
   lcd.print((char)223);    
   if(symbol =='F')
   {
    lcd.print("F");
   }else if(symbol =='K')
   {
    lcd.print("K");
   }else{
    lcd.print("C");    
   }
 // Robojax.com LCD1602 for LM35 Demo
}

الأشياء التي قد تحتاجها

الموارد والمراجع

ملفات📁

لا توجد ملفات متاحة.