راه اندازی سنسور دما DHT11

به آموزش راه اندازی سنسور دما DHT11خوش اومدید.

تو این آموزش می خوایم یاد بگیریم چطور با ESP32 و سنسور DHT11/DHT22 دما و رطوبت رو اندازه گیری کنیم. این سنسور داخلش یک چیپستی داره که مقادیر آنالوگ رو به دیجیتال تبدیل می کنه و تو خروجی دما و رطوبت رو به صورت داده های دیجیتالی ارائه میده.این سنسورها با هر میکروکنترلری هماهنگی دارن.

البته دو سنسور DHT11 و DHT22 تفاوتهایی تو مشخصاتشون با هم دارن و با جدول زیر میشه اونها رو با هم مقایسه کنیم.

رنج اندازه گیری DHT22 نسبت به DHT11 بزرگتر و قیمت بالاتری هم داره . داده های این سنسور رو هر ۲ ثانیه یک بار میشه خوند اما DHT11 محدودیت نداره و هر ثانیه داده هاش در دسترسه . هر دو سنسور یک مکانیزم کاری دارن و کد برنامه هر دو یکسانه.

پایه های ورودی و خروجی DHT

همونطور که تو شکل زیر میبینید این سنسور ۴ پایه داره و مشخصات این پایه ها در جدول زیر ارائه شده.

شماتیک مدار

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

  • ESP32
  • DHT11 یا DHT22
  • مقاومت ۱۰ کیلو اهم
  • بردبُرد
  • سیم جامپر

نصب کتابخونه های مورد نیاز

برای اینکه ESP32 با این سنسور کار کنه لازمه که کتابخونه مربوط به سنسور رو نصب کنید. تو نرم افزار ARDUINO IDE از قسمت  sketch =>include library => manage libraries به ترتیب اول کتابخونه  DHT library from Adafruit و بعد Adafruit Unified Sensor library رو طبق شکل های زیر نصب کنید و بعد از نصب نرم افزار رو ری استارت کنید.

کد برنامه

کد زیر رو که اطلاعات دما و رطوبت رو از سنسور رو میخونه، تو نرم افزار Arduino IDE کپی کنید .

// Example testing sketch for various DHT humidity/temperature sensors written by ladyada
// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

#include "DHT.h"

#define DHTPIN 4     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

توضیحات مربوط به کد

خب ابتدای کد کتابخونه و پین GPIO4 معرفی میشه.

بعد در قسمت بعد باید نوع سنسورDHT که استفاده میشه مشخص کنیم(خط ۱۴ و ۲۸).

در قسمت ()setup تنظیمات ارتباط سریال و کد خط ۳۰ تا ۳۲ اتصال با سنسور برقرار میشه

در قسمت ()loop با تاخیر ۲ ثانیه ای که مربوط به پریود نمونه برداری سنسور DHT22 (ابتدای آموزش گفته شد) هست شروع به کار می کنه. سه تا متغیر شناور h ، t  و  f برای رطوبت ، دما با واحد سلسیوس و دما با واحد فارنهایت تعریف شده. یک آبجکتی به اسم dht برای این اندازه گیری ها تعریف شده و با دستورهای  ()readHumidity و ()readTemperature انجام میشه (خط ۳۴ تا ۳۹).

تو مرحله بعدی مقادیر رو محاسبه می کنه (خطوط ۴۳ تا ۵۸ ) و نمایش میده(خطوط۶۰ تا ۷۰).

پیاده سازی

بعد از آپلود کردن کد تو ESP32 و تنظیمات مانتیور با بادریت ۹۶۰۰ ، هر دو ثانیه یک بار مقادیر دما و رطوبت تو مانیتور نمایش داده میشه.

عیب زدایی

اگر روال کار عادی پیش نره و سنسور ارور بده راه حل  چیه؟ خب اروری که سنسور میتونه بده دو حالت داره .

۱. سنسور پیام “!Failed to read from DHT sensor” یا “Nan” بده .

یکی از روش های زیر راه حل مشکله :

سیم بندی : مرحله اول عیب یابی هر مدار الکترونیکی بررسی اتصال سیم و المانها و بررسی درستی اتصال به پین هاست. اگر مشکل از اتصالات نبود راه حل مرحله بعد رو چک کنید.

بخش تغذیه مدار : ولتاژ مورد نیاز سنسور DHT11 بین ۳ تا ۵.۵ و سنسور DHT22 بین ۳ تا ۶ ولته . اگر سنسور با پین ESP32 که ولتاژی برابر با ۳.۵ ولت به سنسور میرسونه تغذیه بشه این مشکل پیش میاد و اکثرا با دادن ولتاژ ۵ ولت به سنسور ایراد رو رفع میکنه.

پورت یا کابل نامناسب USB : اگر کابل USB که ESP32 رو به پورت متصل کرده نامناسب باشه باعث میشه ارور بده . بهتره که کابلی با کیفیت بهتر و ترجیحا کوتاهتر استفاده بشه. و همچنین با تغذیه  ESP32 با اتصال مستقیم به پورت USB کامپیوتر هم ارور دیده بشه . بهتره که ESP رو به هاب USB که منبع تغدیه جداگانه ای داره وصل کنید.

منبع تغذیه : همونطور که تو مرحله قبل گفته شد بهتره که ESP32 با یک منبع مناسب تغذیه بشه.

نوع سنسور : دقت کنید تو کد برنامه نوع سنسور رو درست تعریف کرده باشین. تو مثال ما از DHT22 استفاده شده .

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

نرخ نمونه برداری : میدونیم که به دلیل نرخ نمونه برداری این سنسور هر دو ثانیه یک بار میتونه اطلاعات دریافت بشه. ممکنه زمانبندی ESP32 و سنسور با هم هماهنگی نداشته باشن و ارور دیده بشه . با بیشتر کردن فاصله زمانی بین دریافت اطلاعات از سنسور این مشکل حل میشه.

سوختن سنسور: اگر همه مراحل رو چک کردید و ظاهرا همه چی درست بود ممکنه خود سنسور خراب شده باشه و با تعویض کردن مشکل برطرف بشه.

مشکل آپلود کردن کد یا اتصال با مانیتور : اگر تو مانیتور هیچ پیامی نمیبینید ممکنه کد به درستی آپلود نشده باشه یا بادریت مانیتور رو درست تنظیم نکرده باشین و یا پورت COM اشتباه باشه.

۲. خطای مخرب : خطای دیگه زمان کامپایل کردن کد میده و به شکل زیر پیام میده :

fatal error: Adafruit_Sensor.h: No such file or directory 
#include <Adafruit_Sensor.h>

خب برای رفع این مشکل باید کتابخونه Adafruit Unified Sensor driver library رو طبق شکل زیر نصب کنید . نرم افزار رو ری استارت کنید و ارور برطرف میشه.

پایان آموزش راه اندازی سنسور دما DHT11 .

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

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

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...