#include <DHT.h>
#include <Stepper.h>
// Định nghĩa chân cảm biến và thiết bị
const int DHT_PIN = 15;
const int DHT_TYPE = DHT22;
const int LED_PIN = 13;
const int LED_PIN2 = 25;
const int LED_DEN = 32;
const int photoresistorPin = 33;
const int trigPin = 5;
const int echoPin = 18;
const int pir = 19;
const int Buzzer = 21;
#define Pump 4
// Khởi tạo đối tượng Stepper và DHT
Stepper Stepper1(600, 12, 14, 27, 26);
DHT dht(DHT_PIN, DHT_TYPE);
// Hàm khởi tạo các cảm biến và thiết bị
void setup() {
Serial.begin(115200); // Khởi tạo Serial Monitor
// Cấu hình các chân vào/ra
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_DEN, OUTPUT);
pinMode(photoresistorPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pir, INPUT);
pinMode(Buzzer, OUTPUT);
pinMode(Pump, OUTPUT);
dht.begin(); // Khởi động cảm biến DHT22
}
// Hàm đọc nhiệt độ và độ ẩm từ cảm biến DHT22
void readTemperatureHumidity(float &temp, float &humid) {
temp = dht.readTemperature();
humid = dht.readHumidity();
Serial.print("Nhiet do: ");
Serial.print(temp);
Serial.println(" °C");
Serial.print("Do am: ");
Serial.print(humid);
Serial.println(" %");
}
// Hàm đọc cường độ ánh sáng từ cảm biến quang trở
float readLightIntensity() {
int lightIntensity = analogRead(photoresistorPin);
float voltage = lightIntensity / 4096.0 * 3.3;
float resistance = 2000 * voltage / (1 - voltage / 3.3);
float lux = pow(33 * 1e3 * pow(10, 0.7) / resistance, (1 / 0.7));
Serial.print("Cuong do anh sang: ");
Serial.print(lux);
Serial.println(" lux");
return lux;
}
// Hàm đọc khoảng cách từ cảm biến siêu âm
float readUltrasonicDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distanceCm = duration * 0.034 / 2;
Serial.print("Khoang cach: ");
Serial.print(distanceCm);
Serial.println(" cm");
return distanceCm;
}
// Hàm đọc giá trị từ cảm biến PIR
bool readPIR() {
int IP = digitalRead(pir);
if (IP == HIGH) {
Serial.println("Chuyen dong phat hien!");
return true;
} else {
Serial.println("Khong co chuyen dong.");
return false;
}
}
// Hàm điều khiển buzzer dựa vào trạng thái PIR
void controlBuzzer(bool motionDetected) {
if (motionDetected) {
tone(Buzzer, 1000);
} else {
noTone(Buzzer);
}
}
void loop() {
float temp, humid;
readTemperatureHumidity(temp, humid); // Đọc nhiệt độ và độ ẩm
float lux = readLightIntensity(); // Đọc cường độ ánh sáng
// Điều khiển LED dựa trên cường độ ánh sáng
digitalWrite(LED_PIN2, lux < 500 ? HIGH : LOW);
// Điều khiển LED đỏ dựa trên nhiệt độ và độ ẩm
digitalWrite(LED_PIN, (temp > 35 || temp < 12 || humid > 70 || humid < 40) ? HIGH : LOW);
// Điều khiển động cơ dựa trên cường độ ánh sáng
if (lux >= 1000 && lux <= 2000) {
digitalWrite(LED_DEN, LOW);
Serial.println("Anh sang tot | tat den | dong rem");
Stepper1.step(-500);
delay(100);
Stepper1.step(0);
} else if (lux < 1000) {
digitalWrite(LED_DEN, HIGH);
Serial.println("Anh sang yeu | mo den | dong rem");
Stepper1.step(-500);
delay(100);
Stepper1.step(0);
} else if (lux > 2000) {
digitalWrite(LED_DEN, HIGH);
Serial.println("Anh sang manh | mo den | mo rem");
Stepper1.step(500);
delay(100);
Stepper1.step(500);
}
float distanceCm = readUltrasonicDistance(); // Đọc khoảng cách siêu âm
// Điều khiển động cơ dựa trên khoảng cách siêu âm
if (distanceCm < 200) {
Stepper1.step(500);
} else {
Stepper1.step(-500);
delay(100);
Stepper1.step(0);
}
bool motionDetected = readPIR(); // Đọc cảm biến PIR
controlBuzzer(motionDetected); // Điều khiển buzzer dựa vào trạng thái PIR
delay(2000); // Thêm delay để vòng lặp ổn định
}