آموزش آردوینوپروژه های آردوینو

آموزش اتصال سنسور دما و رطوبت SHT31 به برد آردوینو

اگر می خواهید تغییرات اقلیم داخل گلخانه را ثبت کنید، یک سیستم کنترل هومیدور بسازید یا برای ایستگاه هواشناسی دما و رطوبت ثبت کنید، سنسور دما و رطوبت SHT31 می تواند گزینه مناسبی باشد.

معرفی سخت افزار

ماژول مورد بحث شامل حسگر دیجیتال دما و رطوبت سری SHT31 شرکت Sensirion است؛ حسگری کم هزینه، آسان برای استفاده و با دقت بالا که از کارخانه کالیبره شده تحویل می گردد و برای راه اندازی به اجزای خارجی اضافی نیازی ندارد. با چند اتصال ساده و کمی کدنویسی روی Arduino می توانید فوراً رطوبت نسبی و دما را اندازه گیری کنید.

نمای ماژول سنسور SHT31 از روبرو

ابعاد کوچک ماژول آن را برای کاربردهایی مانند ترموستات، هیومیستیات، ایستگاه های هواشناسی داخلی و دستگاه های مشابه مناسب کرده است؛ تجهیزاتی که برای پایش یا کنترل رطوبت و/یا دما استفاده می شوند.

دوره آموزش آردوینو دوره آموزش ESP32 دوره آموزش اینترنت اشیا حرفه ای دوره آموزش AVR

قابلیت های اندازه گیری رطوبت و دما

SHT31 قادر است رطوبت را در بازه کامل 0 تا 100 %RH اندازه گیری کند و رزولوشن اندازه گیری رطوبت آن 0.01% RH است. خطای معمولی رطوبت در بازه 20% تا 80% RH برابر ±2% است.

بازه دمایی قابل اندازه گیری این حسگر از -40 تا +125°C است. رزولوشن دما 0.015°C بوده و دقت معمولی آن در 25°C برابر ±0.3°C است.

هشدار:

سنسور SHT31 پنجره کوچکی دارد که فیلم پلیمری حسگر را در معرض هوا قرار می دهد. تماس مایعات، گرد و غبار یا آلاینده های دیگر با این پنجره می تواند دقت اندازه گیری را کاهش دهد، بنابراین از برخورد این آلودگی ها با قسمت حساس جلوگیری کنید.

تغذیه

حسگر به طور مستقیم در بازه 2.4V تا 5.5V کار می کند، بنابراین ماژول با سطوح منطقی 3.3V و 5V سازگار است. می توانید آن را به میکروکنترلرهای 3.3V یا 5V متصل کنید بدون نگرانی درباره تطابق ولتاژ.

مصرف جریان SHT31 در حال اندازه گیری کمتر از 0.8mA و در حالت single shot (زمانی که اندازه گیری انجام نمی شود) کمتر از 0.2µA است. این مصرف پایین امکان استفاده در دستگاه های باتری محور مانند تلفن های همراه، پوشیدنی ها یا ساعت های هوشمند را فراهم می کند.

رابط I2C

SHT31 از پروتکل I2C استفاده می کند؛ یعنی فقط دو سیم داده/کلاک برای ارتباط لازم است و می توان آن را با سایر دستگاه های I2C روی همان باس به اشتراک گذاشت مشروط بر اینکه آدرس تکراری نداشته باشند.

این سنسور از دو آدرس I2C پشتیبانی می کند: 0x44Hex و 0x45Hex؛ این قابلیت امکان استفاده از دو ماژول SHT31 روی همان باس یا جلوگیری از برخورد آدرس با یک دستگاه دیگر را فراهم می کند.

برد ماژول SHT31 با نمایش پایه AD

پایه AD تعیین کننده آدرس I2C ماژول است. این پایه دارای یک مقاومت پول-داون داخلی می باشد؛ بنابراین وقتی پایه AD باز گذاشته شود، آدرس پیش فرض 0x44Hex خواهد بود و وقتی AD را به سطح ولتاژ بالا متصل کنید، آدرس به 0x45Hex تغییر می کند.

حالت هشدار (Alert Mode)

ماژول دارای یک خروجی هشدار با نام AL است که می تواند وقتی شرایط محیطی (رطوبت و/یا دما) از حدود تعریف شده توسط کاربر فراتر رود، فعال شود. این امکان باعث می گردد خوانش ها بر پایه وقفه انجام شوند و نیاز به پیمایش مداوم (polling) از بین برود؛ در نتیجه میکروکنترلر میزبان می تواند در زمان بین هشدارها به کارهای دیگر رسیدگی کند.

پایه خروجی هشدار (AL) روی ماژول SHT31

رفتار خروجی AL به این شکل است که وقتی رطوبت و/یا دما از حد بالایی عبور کند، پایه Alert در وضعیت HIGH قرار می گیرد و تا زمانی که دما کاهش یافته و از حد پاکسازی (clear limit) پایین تر نیامده است، در همین وضعیت می ماند. به طور مشابه وقتی رطوبت و/یا دما از حد پایین تر عبور کند، پایه هشدار HIGH می شود و تا زمانی که دما از حد پاکسازی بالاتر نرود، در وضعیت HIGH باقی می ماند.

نمودار حدود بالا و پایین حالت هشدار سنسور

مشخصات فنی

مشخصات کامل به صورت زیر است:

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
Power supply 2.4V to 5.5V
Current draw ~0.8mA (during measurements)
~0.2µA (during single shot mode)
Humidity Range 0 to 100 %RH
Humidity Accuracy ±2% over the range of 20% to 80% RH
Temperature Range -40˚C to +125˚C
Temperature Accuracy ±0.3˚C at 25°C

برای جزئیات بیشتر به دیتاشیت مربوطه مراجعه کنید (SHT31 Datasheet).

پین اوت ماژول SHT31

در ادامه نگاهی به پین های ماژول می اندازیم.

تصویر پین اوت ماژول SHT31 با نام پایه ها

VCC وظیفه تغذیه را بر عهده دارد. از آنجا که حسگر در بازه 2.4V تا 5.5V کار می کند، ولتاژ VCC را برابر با سطح منطقی میکروکنترلر خود انتخاب کنید؛ برای مثال برای آردوینو 5V، از 5V استفاده کنید.

GND زمین مشترک تغذیه و منطق است.

SCL پین کلاک I2C است؛ آن را به خط کلاک I2C میکروکنترلر متصل کنید.

SDA پین داده I2C است؛ آن را به خط داده I2C میکروکنترلر متصل کنید.

AD تعیین کننده آدرس I2C ماژول است. اگر AD را باز بگذارید، آدرس پیش فرض 0x44Hex خواهد بود و اگر AD را به سطح ولتاژ بالا متصل کنید، آدرس به 0x45Hex تغییر می کند. این پایه دارای مقاومت پول-داون داخلی است.

AL خروجی هشدار است که هنگامی فعال می شود که شرایط محیطی (رطوبت و/یا دما) از حدود تعریف شده توسط کاربر فراتر رود.

نحوه سیم کشی ماژول SHT31 به آردوینو

سیم کشی سنسور SHT31 بسیار ساده است.

برای شروع کار فقط چهار پایه باید متصل شوند: VCC، GND و دو خط داده I2C (SCL و SDA).

پایه SCL را به خط کلاک I2C و پایه SDA را به خط داده I2C آردوینو متصل کنید. توجه داشته باشید که هر برد آردوینو ممکن است پین های I2C متفاوتی داشته باشد و باید مطابق برد خود آن ها را پیدا کنید. در بردهای آردوینو با طرح R3، پین های SDA و SCL در سربرگ نزدیک AREF قرار دارند و به صورت A4 (SDA) و A5 (SCL) نیز شناخته می شوند.

شکل زیر سیم بندی را نشان می دهد.

شماتیک اتصال ماژول SHT31 به برد آردوینو

نصب کتابخانه

برای کار با سنسور به کتابخانه Adafruit SHT31 نیاز دارید. این کتابخانه در Arduino Library Manager در دسترس است.

برای نصب از منوی Sketch > Include Library > Manage Libraries… استفاده کنید و صبر کنید تا Library Manager فهرست کتابخانه ها را بارگذاری کند.

نمایی از Arduino Library Manager در حال بارگذاری

جستجو را با عبارت “SHT31” فیلتر کنید و کتابخانه Adafruit SHT31 را نصب کنید.

نتیجه جستجوی SHT31 در Library Manager

کتابخانه Adafruit_SHT31 به صورت داخلی از کتابخانه کمکی Adafruit Bus IO برای انتزاع عملیات I2C و SPI استفاده می کند، بنابراین در Library Manager عبارت “adafruit bus” را جستجو کرده و Adafruit Bus IO را نیز نصب کنید.

نمایی از جستجوی Adafruit Bus IO در Library Manager

کد آردوینو — خواندن دما و رطوبت

در ادامه یک اسکچ ساده آردوینو آمده است. آن را روی آردوینو آپلود کنید تا مقدار فعلی دما و رطوبت محیط را مشاهده کنید.

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

Adafruit_SHT31 sht31 = Adafruit_SHT31();

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

  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate I2C address
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }
}

void loop() {
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
  } else { 
    Serial.println("Failed to read temperature");
  }
  
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else { 
    Serial.println("Failed to read humidity");
  }

  delay(1000);
}

پس از آپلود کد، مانیتور سریال را روی 9600bps باز کنید. خروجی مشابه شکل زیر را خواهید دید. می توانید با نفس کشیدن به سمت حسگر، تغییرات مقادیر رطوبت و دما را مشاهده کنید.

خروجی مانیتور سریال حاوی دما و رطوبت

توضیح کد

کد نسبتا ساده است. در ابتدای فایل کتابخانه های Arduino.h، Wire.h و Adafruit_SHT31.h وارد شده و یک شیء از کلاس Adafruit_SHT31 در فضای سراسری ایجاد شده است.

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

Adafruit_SHT31 sht31 = Adafruit_SHT31();

در تابع setup، ارتباط سریال با کامپیوتر مقداردهی اولیه شده و سپس متد begin(<address>) فراخوانی می شود.

تابع begin(<address>) حسگر را مقداردهی اولیه می کند، که در آن <address> آدرس I2C حسگر است. به صورت پیش فرض مقدار آن 0x44Hex است؛ در صورت نیاز می توانید آدرس 0x45Hex را نیز استفاده کرده و همان مقدار را به تابع پاس دهید. این تابع در صورت یافتن و پاسخگویی صحیح حسگر مقدار True و در غیر اینصورت مقدار False بازمی گرداند.

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

  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate I2C address
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }
}

پس از مقداردهی اولیه، می توانید از متدهای شیء sht31 با عملگر نقطه استفاده کنید:

  • sht31.readTemperature() مقدار دمای شناور را به درجه سانتی گراد بازمی گرداند. برای تبدیل به فارنهایت از رابطه °F = °C × 1.8 + 32 استفاده کنید.
  • sht31.readHumidity() مقدار رطوبت را به صورت عدد اعشاری بین 0 و 100 بر می گرداند (واحد %RH).
void loop() {
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
  } else { 
    Serial.println("Failed to read temperature");
  }
  
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else { 
    Serial.println("Failed to read humidity");
  }

  delay(1000);
}

در حلقه اصلی، ابتدا دما و رطوبت خوانده می شوند و سپس با استفاده از تابع isnan() بررسی می شود که آیا مقدار خوانده شده معتبر است یا خیر. در صورت معتبر بودن مقادیر، آنها روی مانیتور سریال چاپ می شوند و در غیر اینصورت پیام خطا نمایش داده می شود. در انتهای هر چرخه، با دستور delay(1000) برای 1000 میلی ثانیه وقفه ایجاد می شود.

5 (1 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *