#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// تعریف پین متصل به سنسور DHT و نوع آن
#define DHTPIN 2
#define DHTTYPE DHT22
// تعریف مقدار مورد نظر برای دمای استان دما
int astane_dama = 20;
// تعریف متغیرهای قبلی برای نگهداری مقادیر قبلی دما و رطوبت
float t_before = 0;
float h_before = 0;
// تعریف پینهای مربوط به سه LED به ترتیب به رنگ قرمز، سبز و آبی
#define r_led 6
#define g_led 5
#define b_led 3
// تعریف شیء صفحه نمایش LCD با آدرس 0x27، 16 ستون و 2 ردیف
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ایجاد یک شیء DHT برای خواندن دما و رطوبت
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// شروع ارتباط سریال با سرعت 9600 برای ارسال پیامها به کامپیوتر
Serial.begin(9600);
Serial.println("DHT22 testing!");
// شروع خواندن دادههای دما و رطوبت از سنسور DHT
dht.begin();
// شروع استفاده از صفحه نمایش LCD و روشن کردن نور پسزمینه آن
lcd.init();
lcd.backlight();
// تنظیم پینهای مربوط به سه LED به عنوان خروجی
pinMode(r_led, OUTPUT);
pinMode(g_led, OUTPUT);
pinMode(b_led, OUTPUT);
}
void loop() {
// خواندن دادههای دما و رطوبت از سنسور DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
// بررسی مقادیر دما و رطوبت و در صورت بروز خطا، پیام ارسال شده و عملیات متوقف میشود
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// تابع برای بهروزرسانی مقادیر دما و رطوبت در صفحه نمایش LCD
data_refreshing(h, t);
// تابع برای کنترل وضعیت سه LED بر اساس دما
rule_on_led(t);
}
// تابع برای بهروزرسانی مقادیر دما و رطوبت در صفحه نمایش LCD
void data_refreshing(float h, float t) {
// اگر مقدار دما یا رطوبت تغییر کرده باشد، اطلاعات جدید نمایش داده میشود
if (t_before != t || h_before != h) {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.println("");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
// تبدیل مقادیر به رشته برای نمایش بر روی LCD
String tempString = String(t, 1);
String humString = String(h, 1);
// پاک کردن محتوای LCD
lcd.clear();
// نمایش دما و رطوبت بر روی LCD
lcd.setCursor(0, 0);
lcd.print("Temp: " + tempString + " *C");
lcd.setCursor(0, 1);
lcd.print("Humidity: " + humString + " %");
// بروزرسانی مقادیر قبلی
t_before = t;
h_before = h;
}
}
// تابع برای کنترل وضعیت سه LED بر اساس دما
void rule_on_led(float t) {
// اگر دما در محدوده مشخصی باشد، LED قرمز روشن میشود
if (astane_dama - 4 < t && t < astane_dama + 4) {
digitalWrite(r_led, HIGH);
digitalWrite(g_led, LOW);
digitalWrite(b_led, LOW);
}
// اگر دما بالای مقدار مورد نظر باشد، LED سبز روشن میشود
else if (astane_dama - 4 < t) {
digitalWrite(r_led, LOW);
digitalWrite(g_led, HIGH);
digitalWrite(b_led, LOW);
}
// در غیر این صورت، LED آبی روشن میشود
else {
digitalWrite(r_led, LOW);
digitalWrite(g_led, LOW);
digitalWrite(b_led, HIGH);
}
}