شِفر (کود) جستجو

شِفر (کود) آردوینو و ویدئو برای حساس(حس کننده) دما و رطوبت DHT22 با نمایشگر TM1637 و ریلی

شِفر (کود) آردوینو و ویدئو برای حساس(حس کننده) دما و رطوبت DHT22 با نمایشگر TM1637 و ریلی

در این آموزش به بررسی نحوه استفاده از حساس(حس کننده) دما و رطوبت DHT22 همراه با نمایشگر TM1637 و یک ریلی برای کنترل یک بار AC مانند هیتر یا فن می‌پردازیم. هدف روشن شدن بار زمانی است که دما به 50 درجه سانتی‌گراد برسد و خاموش شدن آن وقتی دما زیر این آستانه بیفتد. این چیدمان برای حفظ دمای مطلوب در یک محیط کنترل‌شده ایده‌آل است.

DHT22 sensor with PCB-1

برای تحقق این هدف، یک برنامه آردوینو می‌نویسیم که داده‌های دما و رطوبت را از حساس(حس کننده) DHT22 می‌خواند، دما را روی نمایشگر TM1637 نمایش می‌دهد و بر اساس قرائت‌های دما ریلی را کنترل می‌کند. برای روشن‌تر شدن، می‌توانید ویدیو را در زمان 10:00 مشاهده کنید.

سخت‌افزار، توضیح داده شده

اجزای اصلی این پروژه شامل حساس(حس کننده) DHT22، نمایشگر TM1637، ماجیول ریلی و یک برد آردوینو هستند. حساس(حس کننده) DHT22 مسئول اندازه‌گیری دما و رطوبت است و خروجی دیجیتالی فراهم می‌کند که آردوینو می‌تواند به‌راحتی آن را بخواند. نمایشگر TM1637 برای نمایش خوانش‌های دما به‌صورت کاربرپسند استفاده می‌شود، در حالی که ماجیول ریلی به ما اجازه می‌دهد دستگاه‌های با ولتاژ بالا مانند بخاری‌ها و پنکه‌ها را به‌طور ایمن کنترل کنیم.

حساس(حس کننده) DHT22 دارای سه پایه است: VCC (تغذیه)، GND (زمین) و DATA (خروجی). نمایشگر TM1637 از چهار پایه برای تغذیه، زمین، کلاک و انتقال داده استفاده می‌کند. ماجیول ریلی به آردوینو متصل می‌شود و به‌عنوان یک کلید برای بار AC عمل می‌کند و در هنگام کنترل دستگاه‌هایی که به ولتاژ بالاتری نیاز دارند، ایمنی عملکرد را تضمین می‌کند.

جزئیات دیتاشیت

تولیدکنندهآدافروت
شماره قطعهDHT22
ولتاژ منطقی/ورودی-خروجی3.3 ولت - 5.5 ولت
ولتاژ تغذیه3.3 ولت - 6 ولت
جریان خروجی (برای هر کانال)0.5 میلی‌آمپر
جریان اوج (برای هر کانال)۲٫۵ میلی‌آمپر
راهنمای فرکانس PWMقابل‌اعمال نیست
آستانه‌های منطقی ورودی0.3 V - 0.7 V
افت ولتاژ / RDS(on)/ اشباعقابل اعمال نیست
محدودیت‌های حرارتی-40°C تا 80°C
بستهبسته‌بندی 3 پایه
یادداشت‌ها / واریانت‌هاهمچنین با نام AM2302 شناخته می‌شود

  • از تأمین تغذیهٔ مناسب (3.3 V - 6 V) برای DHT22 اطمینان حاصل کنید.
  • در صورت لزوم از مقاومت‌های پول‌آپ روی خط داده استفاده کنید.
  • اجازه دهید خوانش‌های حساس(حس کننده) تثبیت شوند تا داده‌های دقیقی به‌دست آیند.
  • اتصالات پایه‌ها را مجدداً بررسی کنید تا از بروز خطای ارتباطی جلوگیری شود.
  • در مواجهه با بارهای AC احتیاط کنید؛ از عایق‌بندی و ایمنی مناسب اطمینان حاصل کنید.
  • اگر ریلی بارهای سنگین را کنترل می‌کند، برای آن هیت‌سینک نصب کنید.
  • هنگام خواندن داده‌های حساس(حس کننده)، در صورت نیاز از تکنیک‌های debounce استفاده کنید.
  • برای خوانش‌های دقیق، حساس(حس کننده) DHT22 را از نور مستقیم خورشید محافظت کنید.

دستورالعمل‌های سیم‌کشی

Wiring DHT11 DHT22 with TM1637 dispaly and relay
Wiring DHT11 DHT22 with TM1637 dispaly and relay

برای سیم‌کشی قطعات، با وصل کردن حساس(حس کننده) DHT22 شروع کنید. پایه VCC را به پایه 5V روی آردوینو، پایه GND را به زمین (GND) و پایه DATA را به پایه دیجیتال 9 روی آردوینو متصل کنید.

سپس نمایشگر TM1637 را سیم‌کشی کنید. پایه VCC را به پایه 5V روی آردوینو، پایه GND را به زمین، پایه CLK (ساعت) را به پایه دیجیتال 2 و پایه DIO (داده) را به پایه دیجیتال 3 وصل کنید. برای ماجیول ریلی، پایه VCC را به پایه 5V، پایه GND را به زمین و پایه کنترل (سیگنال) را به پایه دیجیتال 7 وصل کنید. در نهایت مطمئن شوید بار AC به‌طور ایمن مطابق دستورالعمل‌های سازنده به ماجیول ریلی متصل شده است.

نمونه‌های شِفر (کود) و راهنمای گام‌به‌گام

شِفر (کود) زیر حساس(حس کننده) DHT22 و نمایشگر TM1637 را راه‌اندازی می‌کند. پایه‌های لازم را تنظیم کرده و برای خواندن داده‌های دما آماده می‌شود.


#include 
#define CLK 2
#define DIO 3
#define DHTPIN 9
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  pinMode(RELAY, OUTPUT);
  dht.begin();
}

در این قطعه شِفر (کود)، کتابخانه‌های لازم را وارد کرده و پایه‌های نمایشگر TM1637 و حساس(حس کننده) DHT22 را تعریف می‌کنیم. تابع setup ارتباط سریال را مقداردهی اولیه می‌کند و پایه ریلی را به‌عنوان خروجی تنظیم می‌کند.

Wirig relay module to AC load

تابع loop دما را بازیابی می‌کند و بر اساس خوانش دما ریلی را کنترل می‌کند. اگر دما از 50 درجه تجاوز کند، ریلی فعال می‌شود.


void loop() {
  delay(TEST_DELAY);
  int temp = round(getTemp("c"));
  display.showNumberDec(temp, false, 3, 1);
  if(temp > 50) {
    digitalWrite(RELAY, LOW);
  } else {
    digitalWrite(RELAY, HIGH);
  }
}

این قطعه شِفر (کود) نحوه خواندن دما، نمایش آن و کنترل ریلی را نشان می‌دهد. دما گرد شده و روی نمایشگر TM1637 نمایش داده می‌شود و ریلی بر اساس آستانهٔ دما روشن یا خاموش می‌شود.

برای درک جامع‌تر، لطفاً به شِفر (کود) کامل بارگذاری‌شده در پایین مقاله مراجعه کنید.

نمایش / آنچه باید انتظار داشته باشید

وقتی برنامه را اجرا می‌کنید، باید دما روی نمایشگر TM1637 نمایش داده شود. وقتی دما از 50 درجه سانتی‌گراد فراتر رفت، ریلی فعال می‌شود و بار AC متصل را روشن می‌کند. برعکس، وقتی دما زیر 50 درجه سانتی‌گراد بیاید، ریلی غیرفعال شده و بار را خاموش می‌کند. مراقب قطبیت معکوس باشید و از اتصالات صحیح اطمینان حاصل کنید تا از آسیب به قطعات جلوگیری شود (در ویدیو در 12:30).

برچسب‌های زمانی ویدیو

  • 00:00- مقدمه
  • 02:15- توضیح سیم‌کشی
  • ۰۵:00- مرور شِفر (کود)
  • 10:00- نمایش
  • 12:30- مشکلات رایج

تصاویر

DHT11 Module
DHT11 Module
DHT22 sensor with PCB-1
DHT22 sensor with PCB-1
DHT22 sensor no PCB
DHT22 sensor no PCB
Wirig relay module to AC load
Wirig relay module to AC load
Wiring DHT11 DHT22 with TM1637 dispaly and relay
Wiring DHT11 DHT22 with TM1637 dispaly and relay
57-Arduino code for a DHT11 DHT22 temperature and humidity sensor with a TM1637 display.
زبان: C++
/*
 * Original code from TM1637 https://github.com/avishorp/TM1637
 * Original code and library for DHT22 https://github.com/adafruit/DHT-sensor-library
 * Watch the video for this code https://youtu.be/xD8wHXDzLkQ 
 * Other Arduino library and videos https://robojax.com
 */
 /*

 * Modified for Robojax video on January 10, 2018
 * by Ahmad Nejrabi, in Ajax, Ontario, Canada
 */
 
// ****** Start of TM1637 Display code 
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
// The amount of time (in milliseconds) between tests
#define TEST_DELAY   1000
TM1637Display display(CLK, DIO);
// ****** end of TM1637 Display code 

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
// updated by Ahmad for Robojax.com videos.
// on January 10, 2018 in Ajax, Ontario, Canada

// ****** Start of DHT code 
#include "DHT.h"
#define DHTPIN 9     // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
// ********** end of DHT22 code

#define RELAY 7 // the pin connected to relay
void setup()
{
  Serial.begin(9600);
  Serial.println("DHT22 Robojax Test with Display");
  pinMode(RELAY,OUTPUT);// set RELAY pin as output

  dht.begin();  
}

void loop()
{
  delay(TEST_DELAY);// wait
  // **** TM1637 code start
  display.setBrightness(0x0f);// set brightness
  uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 };// clear display values
  display.setSegments(data);//clear display
  // **** TM1637 code end
  

  // Robojax.com test video
  Serial.println(getTemp("c"));

  int temp = round(getTemp("c"));
  
  display.showNumberDec(temp, false, 3,1);
 if(temp >50 )
 {
  digitalWrite(RELAY, LOW);
 }else{
  digitalWrite(RELAY, HIGH);
 }


}// loop end


/*
 * getTemp(String req)
 * returns the temperature related parameters
 * req is string request
 * getTemp("c") will return temperature in Celsius
 * getTemp("hic") will return heat index in Celsius
 * getTemp("f") will return temperature in Fahrenheit
 * getTemp("hif") will return temperature in Fahrenheit
  * getTemp("h") will return humidity
 */
float getTemp(String req)
{

  // 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);

  // 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);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return 0.0;
  }
  // Compute heat index in Kelvin 
  float k = t + 273.15;
  if(req =="c"){
    return t;//return Celsius
  }else if(req =="f"){
    return f;// return Fahrenheit
  }else if(req =="h"){
    return h;// return humidity
  }else if(req =="hif"){
    return hif;// return heat index in Fahrenheit
  }else if(req =="hic"){
    return hic;// return heat index in Celsius
  }else if(req =="k"){
    return k;// return temperature in Kelvin
  }else{
    return 0.000;// if no request found, return 0.000
  }
 
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

منابع و مراجع

فایل‌ها📁

کتابخانه‌های آردوینو (zip)

فایل فریزینگ

راهنمای کاربر