تحلیل کتابخانه

تحلیل و بررسی کتابخانه MAX6675

max6675-h-arduino-library-digispark
نوشته شده توسط معین صابری

در مجموعه آموزش های تحلیل و بررسی کتابخانه های آردوینو، این بار به بررسی کتابخانه MAX6675 می پردازیم. ماژول MAX6675 یک ماژول فوق العاده کاربردی جهت اتصال به سنسورهای ترموکوپل است. سنسورهای ترموکوپل سنسورهای دما با کاربری صنعتی هستند. این سنسورها می توانند بازه دمایی بسیار بیشتری را نسبت به سنسورهای دمای معمولی اندازه گیری کنند. جهت راه اندازی، کار و اتصال این سنسورها به میکروکنترلرها نیاز به ماژول تبدیل داریم. ماژول تبدیل MAX6675 یک ماژول کاربردی به عنوان واسط بین ترموکوپل و میکروکنترلرها به شمار می رود. جهت راه اندازی و کار با این ماژول کتابخانه تحت آردوینو توسعه یافته است. در این آموزش به بررسی و تحلیل این کتابخانه می پردازیم. در ادامه، با مرجع تخصصی رزبری پای و آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.

 


سنسور ترموکوپل تعریف و کاربرد


پیش از آنکه به ادامه بحث بپردازیم، بهتر است کمی در رابطه با ترموکوپل و عملکرد آن بدانیم. در بعضی از محیط های صنعتی نظیر کوره ها، سنسورهای دما باید بسیار سخت و مقاوم باشند. به عنوان مثال یک کوره ذوب فلزات را در نظر بگیرید. این کوره می تواند تا دمایی نزدیک به ۲۰۰۰ درجه سانتی را ایجاد کند.

سنسور ترموکوپل تعریف و کاربرد - دیجی اسپارک

 

حال فرض کنید که شما به عنوان یک مهندس طراح، قصد داریم تا به اجرای یک سیستم کنترل دمای کوره بپردازید. در این جا سنسورهای معمول دما نظیر LM35 و یا DS18B20  قادر به کنترل و اندازه گیری دما نیستند. به همین جهت از سنسورهای خاصی به نام ترموکوپل استفاده می شود. ترموکوپل ها می توانند بازه دمایی بسیار زیادی را در برگیرند. این سنسورها در کلاس های مختلفی تولید می شوند. به عنوان مثال یکی از کلاس های این سنسور ها در بازه ۲۷۰- الی ۱۸۰۰ درجه سانتی گراد را می توانند اندازه گیری کنند.

سنسور دما سنج صنعتی MAX6675 - دیجی اسپارک

 

سنسورهای ترموکوپل جهت اتصال به میکروکنترلرها نیاز به مبدل واسط دارند. یکی از این مبدل ها، MAX6675 است. در این آموزش به تحلیل و بررسی کتابخانه این ماژول جهت راه اندازی ترموکوپل می پردازیم.در قسمت بعد نحوه نصب کتابخانه و پس از آن به الزامات فنی کتابخانه می پردازیم. پس از آن به معرفی توابع کلیدی و کاربری خواهیم پرداخت. در نهایت با ارائه مثالی، نحوه استفاده از توابع را مشاهده خواهیم کرد.

 


نصب کتابخانه MAX6675


به منظور استفاده از کتابخانه MAX6675، ابتدا می بایست آن را نصب کنیم. به همین منظور، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید. پس از کلیک بر روی این گزینه، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و سپس نصب کنید. مطابق تصویر زیر، در کادر جست و جو عبارت MAX6675 را تایپ کرده و کتابخانه ای را که با کادر قرمز رنگ مشخص شده، با کلیک بر روی گزینه Install، نصب کنید.

نصب کتابخانه MAX6675 در آردوینو - دیجی اسپارک

 


الزامات و نکات فنی کتابخانه MAX6675


در این قسمت به بررسی الزامات فنی کتابخانه می پردازیم. توجه داشته باشید که ماژول MAX6675 از پورت سریال SPI جهت تبادل داده پشتیبانی می کند. اما به کمک کتابخانه این ماژول، شما می توانید پایه های دلخواه را برای پورت SPI تعیین کنید. این کتابخانه با بردهای آردوینو نظیر UNO و MEGA سازگاری دارد. اما از آنجاییکه بردهای ESP از سیستم عامل FREERTOS بهره می برند، می بایست عملکرد آن بر روی این بردها تست گردد. برای برقراری ارتباط SPI به سه پایه نیاز دارید. در حقیقت باید سه پایه را به عنوان ارتباط SPI در برنامه خود لحاظ کنید. این پایه ها عبارتند از.

  • SCK
  • CS
  • SO

پس از نصب و آشنایی جزیی با کتابخانه، قسمت بعد را به بررسی توابع کلیدی و کاربردی کتابخانه اختصاص می دهیم.

 


توابع کلیدی و کاربردی کتابخانه MAX6675


پس از بررسی کلیات کتابخانه MAX6675، نوبت به تحلیل و بررسی توابع می رسد. جدول زیر لیست این توابع را نمایش و کاربرد آن ها را تحلیل می کند.

شرح تابع
این تابع در حقیقت تابع سازنده کلاس کتابخانه است. هرکدام از ورودی های تابع مربوط به پایه مورد نظر است. MAX6675_Thermocouple(int SCK_pin, int CS_pin, int SO_pin)
این تابع دما را بر حسب سلسیوس خوانده و در خروجی قرار می دهد. double readCelsius()
این تابع دما را بر حسب کلوین خوانده و در خروجی قرار می دهد. double readKelvin();
این تابع دما را بر حسب فارنهایت خوانده و در خروجی قرار می دهد. double readFahrenheit()

 

توابع فوق، فرم کلی توابع کتابخانه MAX6675 هستند. در کنار این، کتابخانه MAX6675 قابلیت اندازه گیری مقادیر به دو روش میانگین گیری و  Smooth را در خود جای داده است. نکته جالب تر آنکه توابع اندازه گیری دما در این دو روش با روش عادی یکسان است. تنها تفاوت در تعریف شی و تابع سازنده کلاس کتابخانه است. برای روش میانگین گیری می بایست تابع سازنده به صورت زیر تعریف شود.

AverageThermocouple) Thermocouple* origin, int readingsNumber = DEFAULT_READINGS_NUMBER, int delayTimeInMillis = DEFAULT_DELAY_TIME)

 

مطابق تعریف فوق، تابع سازنده از کلاس کتابخانه دارای سه ورودی(از چپ به راست) است. ورودی نخست اشاره گری از کلاس کتابخانه اصلی جهت معرفی پایه های ارتباط SPI و استفاده از توابع آن است. این ورودی باید حتما لحاظ شود. دو ورودی دیگر به صورت اختیاری با مقادیر پیش فرض هستند. وروی دون جهت خواندن تعداد داده ها برای میانگیری و ورودی سوم جهت ایجاد تاخیر زمانی برای خواندن مقدار دماست. به عبارت دیگر ورودی سوم تعیین می کند که پس از خواندن مقدار فعلی، چقدر تاخیر برای خواندن مقدار بعدی ایجاد شود. ورودی دوم دارای مقدار پیشفرض ۱۰ نمونه و ورودی سوم دارای مقدار پیشفرض ۱۰ میلی ثانیه است.

پس از بررسی کتابخانه average، نوبت به کتابخانه smooth می رسد. این کتابخانه هم توابع یکسانی با کتابخانه اصلی دارد. تنها تفاوت در تابع سازنده کلاس کتابخانه و ورودی های آن است. برای این مورد، تابع سازنده به صورت زیر تعریف می شود.

SmoothThermocouple( Thermocouple* origin, int smoothingFactor = MIN_SMOOTHING_FACTOR)

 

مطابق تابع فوق، ورودی نخست همانند average از کلاس اصلی یک اشاره گر تعریف شده تا به توابع آن دسترسی وجود داشته باشد. ورودی دوم هم پارامتر smooth را تعیین می کند. این ورودی دارای مقدار پیش فرض ۲ بوده که می توانید این ورودی را بدون مقدار خالی بگذارید. برای روشن تر شدن موضوع، قسمت بعد را به اجرای نمونه برنامه اختصاص می دهیم.

 


نمونه برنامه شماره ۱: دریافت دما در حالت عادی


همانطور که در قسمت قبل مشاهده کردید، کتابخانه ترموکوپل دارای سه تعریف متفاوت است. در این قسمت به اجرای یک نمونه برنامه عادی پرداخته و دو قسمت بعد را به نمونه برنامه هایی جهت اجرای میانگین و smooth اختصاص می دهیم. در برنامه زیر دما از سنسور خوانده شده و در سریال مانیتور قرار می گیرد.

//تعریف کتابخانه ها
#include <Thermocouple.h>
#include <MAX6675_Thermocouple.h>

//تعریف پایه های مربوط به پورت SPI
#define SCK_PIN 3
#define CS_PIN 4
#define SO_PIN 5

Thermocouple* thermocouple;  //تعریف شی از  کلاس کتابخانه

void setup() {
  Serial.begin(9600);

  thermocouple = new MAX6675_Thermocouple(SCK_PIN, CS_PIN, SO_PIN);   //فراخوانی تباع سازنده
}

void loop() {
  //خواندن دما
  const double celsius = thermocouple->readCelsius();
  const double kelvin = thermocouple->readKelvin();
  const double fahrenheit = thermocouple->readFahrenheit();
  Serial.print("Temperature: ");
  Serial.print(celsius);
  Serial.print(" C, ");
  Serial.print(kelvin);
  Serial.print(" K, ");
  Serial.print(fahrenheit);
  Serial.println(" F");

  delay(500); // تاخیر برای چاپ داده ها در سریال مانیتور و دریافت داده های جدید
}

 


نمونه برنامه شماره ۲: دریافت دما در حالت میانگین


پس از دریافت دما در حالت عادی، نوبت به دریافت دما در حالت میانگین است. نمونه کد زیر به این موضوع اختصاص دارد.

#include <Thermocouple.h>  //فراخوانی کتابخانه ترموکوبل
#include <MAX6675_Thermocouple.h>  //فراخوانی کتابخانه اصلی ترموکوبل
#include <AverageThermocouple.h>  //فراخوانی کتابخانه میانگین دما 
//تعریف پایه های SPI
#define SCK_PIN 3
#define CS_PIN 4
#define SO_PIN 5
#define READINGS_NUMBER 10  //تعیین تعداد دفعات خواندن برای میانگین گیری
//تعیین تاخیر زمانی
#define DELAY_TIME 10
Thermocouple* thermocouple = NULL;   //تعریف شی از کلاس اصلی
void setup() {
  Serial.begin(9600);

  Thermocouple* originThermocouple = new MAX6675_Thermocouple(SCK_PIN, CS_PIN, SO_PIN);   //تعریف شی از کلاس اصلی 
  thermocouple = new AverageThermocouple(         //تعریف شی از کلاس میانگین گیری
    originThermocouple,
    READINGS_NUMBER,
    DELAY_TIME
  );
}

void loop() {
  // خواندن دما در یکاهای مختلف
  const double celsius = thermocouple->readCelsius();
  const double kelvin = thermocouple->readKelvin();
  const double fahrenheit = thermocouple->readFahrenheit();

  // Output of information
  Serial.print("Temperature: ");
  Serial.print(celsius);
  Serial.print(" C, ");
  Serial.print(kelvin);
  Serial.print(" K, ");
  Serial.print(fahrenheit);
  Serial.println(" F");

  delay(100); // optionally, only to delay the output of information in the example.
}

 


نمونه برنامه شماره ۳: دریافت دما در حالت smooth


در مرحله قبل نحوه دریافت دما در حالت میانگین را مشاهده کردیم. در این قسمت، به نمونه برنامه جهت smooth می پردازیم. نمونه کد زیر دریافت دما به روش smooth را با smooth factor 5 اجرا می کند.

#include <Thermocouple.h>
#include <MAX6675_Thermocouple.h>
#include <SmoothThermocouple.h>
//تعریف پایه های SPI
#define SCK_PIN 3
#define CS_PIN 4
#define SO_PIN 5
//تعین مقدار SMOOTH FACTOR
#define SMOOTHING_FACTOR 5
Thermocouple* thermocouple = NULL;  //تعریف شی از کلاس اصلی
void setup() {
  Serial.begin(9600);
  Thermocouple* originThermocouple = new MAX6675_Thermocouple(SCK_PIN, CS_PIN, SO_PIN);  //تعریف شی از کلاس 
  thermocouple = new SmoothThermocouple(originThermocouple, SMOOTHING_FACTOR);
}

// the loop function runs over and over again forever
void loop() {
  // Reads temperature
  const double celsius = thermocouple->readCelsius();
  const double kelvin = thermocouple->readKelvin();
  const double fahrenheit = thermocouple->readFahrenheit();

  // Output of information
  Serial.print("Temperature: ");
  Serial.print(celsius);
  Serial.print(" C, ");
  Serial.print(kelvin);
  Serial.print(" K, ");
  Serial.print(fahrenheit);
  Serial.println(" F");

  delay(500); // optionally, only to delay the output of information in the example.
}

 


لوازم مورد نیاز


انواع برد آردوینو

ماژول MAX6675  و ترموکوپل تایپ K

 


جمع بندی


در مجموعه آموزش های تحلیل و بررسی کتابخانه، این قسمت را به ماژول مبدل واسط MAX6657 می پردازیم. سنسورهای ترموکوپل جهت راه اندازی، کار و اتصال به میکروکنترلرها نیاز به آی سی های مبدل دارند. یکی از کاربردی ترین نوع این آی سی ها، MAX6657 است. به کمک این ای سی می توانیم سنسورهای ترموکوپل را با مبدل MAX6657 راه اندازی کنیم. جهت راه اندازی و کار با این ماژول مبدل کتابخانه ای تحت آردوینو توسعه یافته که در این آموزش به تحلیل و بررسی آن پرداختیم.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۴ دیدگاه

    • سلام
      به نظر می رسد کاربرد داشته باشد. البته باید ببینید که توسط ماژول MAX6675 پشتیبانی می شود یا خیر.

  • سلام و عرض ادب
    .
    سوالم این هست که وقتی با گوشی و نرم افزار arduinodroid اسکچ مربوط به سنسور max6675 رو کامپایل میکنم ارور میده و چندروزه درگیر این ارور هستم
    با کد های دیگه مشکلی نداشتم و همشون کامپایل شدن ولی چندین کد مربوط به این سنسور رو گرفتم هرکاری میکنم کامپایل نمیشن.اگر امکانش هست راهنمایی بفرمایید ممنونم از شما

    ارور این هست

    canonical-prefixes -std=gnu++11 -c -g -Os -w -mmcu=atmega328p -DF_CPU=16000000L -DUSB_VID=null -DUSB_PID=null -DARDUINO=10812 -DIDE=”ArduinoDroid” -DARDUINO_ARCH_AVR -DARDUINO_AVR_NANO /MAX6675_with_hardware_SPI/MAX6675.cpp -o /librariesBuild/MAX6675_with_hardware_SPI/MAX6675.cpp.o /MAX6675_with_hardware_SPI/MAX6675.cpp:3:1: error: prototype for ‘MAX6675::MAX6675(int16_t)’ does not match any in class ‘MAX6675’
    MAX6675::MAX6675(int16_t SSPin)
    ^
    In file included from /MAX6675_with_hardware_SPI/MAX6675.cpp:1:0:
    /MAX6675_library/MAX6675.h:14:7: error: candidates are: constexpr MAX6675::MAX6675(MAX6675&&)
    class MAX6675 {
    ^
    /MAX6675_library/MAX6675.h:14:7: error: constexpr MAX6675::MAX6675(const MAX6675&)
    /MAX6675_library/MAX6675.h:16:3: error: MAX6675::MAX6675(int8_t, int8_t, int8_t)
    MAX6675(int8_t SCLK, int8_t CS, int8_t MISO);
    ^
    /MAX6675_with_hardware_SPI/MAX6675.cpp:12:26: error: no ‘float MAX6675::readTempC()’ member function declared in class ‘MAX6675’
    float MAX6675::readTempC()
    ^
    /MAX6675_with_hardware_SPI/MAX6675.cpp:31:26: error: no ‘float MAX6675::readTempF()’ member function declared in class ‘MAX6675’
    float MAX6675::readTempF()
    ^
    Return code is not 0