#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 3
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адреса I2C для LCD
// Піни
const int smokePin = A0;
const int pirPin = 2;
const int doorPin = 4;
const int buzzerPin = 5;
const int greenLedPin = 6;
const int redLedPin = 7;
// Пороги
const int smokeThreshold = 300; // Приклад значення для диму/газу
void setup() {
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(doorPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.print("SafeHealth System");
delay(2000);
lcd.clear();
digitalWrite(greenLedPin, HIGH); // Система готова
}
void loop() {
// Читання даних з датчиків
int smokeValue = analogRead(smokePin);
bool isMovement = digitalRead(pirPin);
bool isDoorOpen = !digitalRead(doorPin); // Reed Switch активний низьким рівнем
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Перевірка на несправності DHT
if (isnan(humidity) || isnan(temperature)) {
lcd.setCursor(0, 0);
lcd.print("DHT Error!");
delay(1000);
return;
}
// Перевірка тривог
bool isAlert = false;
String alertMessage = "";
if (smokeValue > smokeThreshold) {
alertMessage = "SMOKE/GAS DETECTED!";
isAlert = true;
} else if (isMovement) {
alertMessage = "MOVEMENT DETECTED!";
isAlert = true;
} else if (isDoorOpen) {
alertMessage = "DOOR OPENED!";
isAlert = true;
} else if (temperature > 30 || humidity > 70) { // Приклад безпечних меж
alertMessage = "BAD CLIMATE!";
isAlert = true;
}
// Вивід на LCD та керування сигналізацією
if (isAlert) {
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
tone(buzzerPin, 1000, 500); // Звукова сигналізація
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALERT:");
lcd.setCursor(0, 1);
lcd.print(alertMessage);
} else {
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
noTone(buzzerPin);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print("%");
}
delay(1000); // Оновлення даних кожну секунду
}