#include <DHTesp.h>
#include <Wire.h>
#define DHTPIN 4
#define DHTTYPE DHT22
// Піни для ультразвукових датчиків
const int trigFront = 5, echoFront = 18;
const int trigLeft = 17, echoLeft = 16;
const int trigRight = 19, echoRight = 21;
// PIR датчик
const int pirPin = 25;
bool motionDetectedPrev = false;
unsigned long lastPirDetection = 0;
const unsigned long pirCooldown = 5000; // 5 секунд cooldown
// Будзер і світлодіоди
const int buzzer = 23;
const int ledRed = 12, ledYellow = 14, ledGreen = 27;
// Об'єкти датчиків
DHTesp dht;
void setup() {
Serial.begin(115200);
// Ініціалізація DHT22
dht.setup(DHTPIN, DHTesp::DHT22);
// Налаштування пінів
pinMode(trigFront, OUTPUT);
pinMode(echoFront, INPUT);
pinMode(trigLeft, OUTPUT);
pinMode(echoLeft, INPUT);
pinMode(trigRight, OUTPUT);
pinMode(echoRight, INPUT);
pinMode(pirPin, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
digitalWrite(ledGreen, HIGH); // Індикація готовності
Serial.println("Система запущена. Чекайте 30 секунд для ініціалізації PIR датчика...");
delay(30000); // Очікування ініціалізації PIR
}
void loop() {
// Перевірка перешкод
checkObstacle(trigFront, echoFront, "Front");
checkObstacle(trigLeft, echoLeft, "Left");
checkObstacle(trigRight, echoRight, "Right");
// Зчитування температури та вологості
readClimateData();
// Перевірка наявності людей
checkPresence();
delay(500); // Затримка між перевірками
}
void checkObstacle(int trigPin, int echoPin, String sensorName) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
if (distance < 50 && distance > 0) {
Serial.print("Перешкода "); Serial.print(sensorName); Serial.print(": ");
Serial.print(distance); Serial.println(" см");
tone(buzzer, 1500, 100);
digitalWrite(ledYellow, HIGH);
delay(100);
digitalWrite(ledYellow, LOW);
}
}
void readClimateData() {
TempAndHumidity data = dht.getTempAndHumidity();
if (!isnan(data.temperature) && !isnan(data.humidity)) {
Serial.print("Температура: "); Serial.print(data.temperature); Serial.print("°C, ");
Serial.print("Вологість: "); Serial.print(data.humidity); Serial.println("%");
// Попередження про несприятливі умови
if (data.temperature > 30 || data.humidity > 70) {
digitalWrite(ledYellow, HIGH);
tone(buzzer, 1200, 500);
delay(500);
digitalWrite(ledYellow, LOW);
}
}
}
void checkPresence() {
bool motionDetectedNow = digitalRead(pirPin);
if (motionDetectedNow && !motionDetectedPrev) {
if (millis() - lastPirDetection > pirCooldown) {
Serial.println("Увага! Можливе падіння!");
digitalWrite(ledRed, HIGH);
tone(buzzer, 2000, 1000);
delay(1000);
digitalWrite(ledRed, LOW);
lastPirDetection = millis();
}
}
}