#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include "DHT.h" // DHT kütüphanesi
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // I2C LCD kütüphanesi
#define DHT_PIN 7 // DHT sensörünün veri pininin bağlı olduğu pin (örnek olarak D7)
#define DHT_TYPE DHT22 // Kullandığınız DHT sensörünün tipini burada belirtin (DHT11, DHT22, DHT21)
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C adresi 0x27 olan 20x4 LCD
#define PIR_PIN 2 // PIR sensörünün bağlı olduğu pin (örnek olarak D2)
#define BUZZER_PIN 4 // Buzzer'ın bağlı olduğu pin (örnek olarak D4)
#define LED_PIN 5 // Test için kullanılacak LED pin (örnek olarak D13 PB5'e karşılık gelir)
volatile uint8_t pir_triggered = 0;
volatile uint8_t alert_triggered = 0;
void pir_init() {
DDRD &= ~(1 << PIR_PIN); // PIR_PIN'i giriş olarak ayarla
PORTD |= (1 << PIR_PIN); // Pull-up direncini etkinleştir
PCICR |= (1 << PCIE2); // Pin Change Interrupt 2'yi etkinleştir
PCMSK2 |= (1 << PCINT18); // PIR_PIN için Pin Change Interrupt etkinleştir
}
void buzzer_init() {
DDRD |= (1 << BUZZER_PIN); // BUZZER_PIN'i çıkış olarak ayarla
buzzer_off(); // Buzzer'ı kapalı olarak başlat
}
void buzzer_on() {
PORTD |= (1 << BUZZER_PIN); // BUZZER_PIN'i yüksek yaparak buzzer'ı çalıştır
}
void buzzer_off() {
PORTD &= ~(1 << BUZZER_PIN); // BUZZER_PIN'i düşük yaparak buzzer'ı kapat
}
void led_init() {
DDRB |= (1 << LED_PIN); // LED_PIN'i çıkış olarak ayarla (PB5)
led_off(); // LED'i kapalı olarak başlat
}
void led_on() {
PORTB |= (1 << LED_PIN); // LED'i yak
}
void led_off() {
PORTB &= ~(1 << LED_PIN); // LED'i kapat
}
void dht_init() {
dht.begin();
}
float read_temperature() {
float temp = dht.readTemperature();
return temp; // Sıcaklık okuma
}
float read_humidity() {
float hum = dht.readHumidity();
return hum; // Nem okuma
}
void setup() {
Serial.begin(9600); // Seri portu başlat
buzzer_init();
pir_init();
led_init();
dht_init(); // DHT sensörünü başlat
lcd.begin(20, 4); // 20 sütun ve 4 satırlık LCD'yi başlat
lcd.backlight(); // LCD arka ışığını aç
lcd.setCursor(0, 0);
lcd.print("Sistem Hazir"); // Başlangıç mesajı
sei(); // Global kesmeleri etkinleştir
}
// PIR kesme işleyicisi
ISR(PCINT2_vect) {
if (PIND & (1 << PIR_PIN)) {
pir_triggered = 1;
}
}
void alert() {
while (alert_triggered) {
buzzer_on();
led_on(); // LED'i yak
_delay_ms(1000); // Buzzer'ı 1 saniye boyunca çalıştır
buzzer_off();
led_off(); // LED'i kapat
_delay_ms(1000); // Buzzer'ı kapalı tut
}
}
void loop() {
// Sıcaklık okuma ve LCD'ye yazdırma
float current_temperature = read_temperature();
lcd.setCursor(0, 0);
lcd.print("Sicaklik: ");
lcd.print(current_temperature);
// Nem okuma ve LCD'ye yazdırma
float current_humidity = read_humidity();
lcd.setCursor(0, 1);
lcd.print("Nem: ");
lcd.print(current_humidity);
// Alarm kontrolü
if (!alert_triggered) {
if (current_temperature < 20 || current_temperature > 30 ||
current_humidity < 50 || current_humidity > 70 || pir_triggered) {
alert_triggered = 1; // Alarm verildiğini işaretle
alert(); // Alarm fonksiyonunu çağır
}
} else {
// Alarm tetiklenmişse ve koşullar normale döndüyse alarmı durdur
if (current_temperature >= 20 && current_temperature <= 30 &&
current_humidity >= 50 && current_humidity <= 70 && !pir_triggered) {
alert_triggered = 0; // Alarmı durdur
}
}
// LCD'nin dördüncü satırına alarm durumunu yazdırma
lcd.setCursor(0, 3);
if (alert_triggered) {
lcd.print("ALARM!");
} else {
lcd.print(" "); // Eğer alarm yoksa satırı temizle
}
// Her döngü sonunda PIR tetiklemesini sıfırla
pir_triggered = 0;
_delay_ms(1000); // Döngüyü yavaşlat
}