#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <Keypad.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
byte dolu[] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
byte bos[] = {
B11111,
B10001,
B10001,
B10001,
B10001,
B10001,
B10001,
B11111,
};
byte i[] = { // ı karakteri
B00000,
B00000,
B01110,
B00100,
B00100,
B00100,
B01110,
B00000,
};
byte s[] = { // büyük ş karakteri
B01111,
B10000,
B10000,
B01110,
B00001,
B00001,
B11110,
B00100,
};
byte ss[] = { // küçük ş karakteri
B00000,
B01110,
B10000,
B01110,
B00001,
B11110,
B00100,
B00000,
};
byte o[] = { // ö karakteri
B01010,
B00000,
B01110,
B10001,
B10001,
B10001,
B01110,
B00000,
};
byte u[] = { // ü karakteri
B01010,
B00000,
B10001,
B10001,
B10001,
B10001,
B01110,
B00000,
};
byte g[] = { // ğ karakteri
B01110,
B00000,
B01110,
B10001,
B10001,
B01111,
B00001,
B11110,
};
const int pirPin1 = 2;
const int pirPin2 = 3;
const int pirPin3 = 4;
const int pirPin4 = 5;
const int relayPin = A0;
const int blinkPin = A2;
// EEPROM adresleri
const int EEPROM_PASSWORD_ADDR = 0;
const int EEPROM_DELAY_ADDR = 20;
const int EEPROM_INITIALIZED_ADDR = 30;
byte rowPins[4] = {6, 7, 8, 9};
byte colPins[4] = {10, 11, 12, 13};
char keys[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, 4, 4);
bool settingsMode = false;
bool timerActive = false;
bool countdownFinished = false;
bool sensorTriggered = false;
bool waitForSensor = false;
bool relayTriggered = false;
unsigned long startTime = 0;
unsigned long delayTime = 19000;
unsigned long remainingTime = delayTime;
unsigned long lastKeyPressTime = 0;
int year, month, day, hour, minute;
String password = "1234";
String enteredPassword = "";
bool passwordMode = false;
void setup() {
lcd.init();
lcd.backlight();
lcd.createChar(0, bos);
lcd.createChar(1, dolu);
lcd.createChar(2, i);
lcd.createChar(3, s);
lcd.createChar(4, o);
lcd.createChar(5, u);
lcd.createChar(6, ss);
lcd.createChar(7, g);
pinMode(pirPin1, INPUT);
pinMode(pirPin2, INPUT);
pinMode(pirPin3, INPUT);
pinMode(pirPin4, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(blinkPin, OUTPUT);
digitalWrite(relayPin, LOW);
digitalWrite(blinkPin, LOW);
loadSettings();
lcd.setCursor(0, 0);
lcd.print(" ZT RK BiLi iM ");
lcd.setCursor(3, 0);
lcd.write(byte(4));
lcd.setCursor(6, 0);
lcd.write(byte(5));
lcd.setCursor(14, 0);
lcd.write(byte(3));
lcd.setCursor(0, 1);
lcd.print(" ZT RK YAZILIM ");
lcd.setCursor(3, 1);
lcd.write(byte(4));
lcd.setCursor(6, 1);
lcd.write(byte(5));
lcd.setCursor(0, 2);
lcd.print(" (0507) 537 0001 ");
delay(2000);
lcd.clear();
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("RTC bulunamadi!");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.setCursor(0, 1);
lcd.print("Sistem Haz r.");
lcd.setCursor(10, 1);
lcd.write(byte(2));
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
// Herhangi bir tuşa basıldığında blinkPin'i kontrol et
digitalWrite(blinkPin, HIGH);
lastKeyPressTime = millis();
}
// blinkPin'i 100ms sonra LOW yap
if (millis() - lastKeyPressTime >= 100) {
digitalWrite(blinkPin, LOW);
}
if (key == 'A') {
openSettingsMenu();
}
if (settingsMode) {
handleSettingsMenu(key);
} else if (passwordMode) {
handlePasswordEntry(key);
} else {
normalOperation(key);
}
}
void openSettingsMenu() {
settingsMode = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("1.Tarih saat ayar ");
lcd.setCursor(17, 0);
lcd.write(byte(2));
lcd.setCursor(0, 1);
lcd.print("2.S re ayar ");
lcd.setCursor(3, 1);
lcd.write(byte(5));
lcd.setCursor(11, 1);
lcd.write(byte(2));
lcd.setCursor(0, 2);
lcd.print("3. ifre de i tir");
lcd.setCursor(2, 2);
lcd.write(byte(3));
lcd.setCursor(10, 2);
lcd.write(byte(7));
lcd.setCursor(12, 2);
lcd.write(byte(6));
lcd.setCursor(0, 3);
lcd.print("B.C k ");
lcd.setCursor(3, 3);
lcd.write(byte(2));
lcd.setCursor(5, 3);
lcd.write(byte(2));
lcd.setCursor(6, 3);
lcd.write(byte(6));
}
void handleSettingsMenu(char key) {
if (key == '1') {
adjustDateTime();
} else if (key == '2') {
adjustDelay();
} else if (key == '3') {
changePassword();
} else if (key == 'B') {
exitSettingsMenu();
}
}
void adjustDateTime() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tarih/Saat Ayar ");
lcd.setCursor(15, 0);
lcd.write(byte(2));
lcd.setCursor(0, 1);
lcd.print("Y l: ");
lcd.setCursor(1, 1);
lcd.write(byte(2));
lcd.setCursor(5, 1);
year = getNumberInput(4);
lcd.setCursor(0, 1);
lcd.print("Ay (1-12):");
month = getNumberInput(2);
lcd.setCursor(0, 1);
lcd.print("G n (1-31): ");
lcd.setCursor(1, 1);
lcd.write(byte(5));
lcd.setCursor(11, 1);
day = getNumberInput(2);
lcd.setCursor(0, 1);
lcd.print("Saat (0-23): ");
hour = getNumberInput(2);
lcd.setCursor(0, 1);
lcd.print("Dakika (0-59): ");
minute = getNumberInput(2);
rtc.adjust(DateTime(year, month, day, hour, minute, 0));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tarih/saat");
lcd.setCursor(0, 1);
lcd.print("ayarland .");
lcd.setCursor(8, 1);
lcd.write(byte(2));
delay(2000);
openSettingsMenu();
}
void adjustDelay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S re Ayar (saniye)");
lcd.setCursor(1, 0);
lcd.write(byte(5));
lcd.setCursor(9, 0);
lcd.write(byte(2));
lcd.setCursor(0, 1);
lcd.print("Mevcut: ");
lcd.print(delayTime / 1000);
lcd.setCursor(0, 2);
lcd.print("Yeni: ");
int newDelay = getNumberInput(3); // En fazla 999 saniye
if (newDelay > 0) {
delayTime = newDelay * 1000; // Milisaniyeye çevir
EEPROM.put(EEPROM_DELAY_ADDR, delayTime); // EEPROM'a kaydet
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S re g ncellendi.");
lcd.setCursor(1, 0);
lcd.write(byte(5));
lcd.setCursor(6, 0);
lcd.write(byte(5));
lcd.setCursor(0, 1);
lcd.print("Yeni s re: ");
lcd.setCursor(6, 1);
lcd.write(byte(5));
lcd.print(newDelay);
lcd.print(" sn");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gecersiz giri !");
lcd.setCursor(13, 0);
lcd.write(byte(5));
}
delay(2000);
openSettingsMenu();
}
void changePassword() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ifre De i tir");
lcd.setCursor(0, 0);
lcd.write(byte(3));
lcd.setCursor(8, 0);
lcd.write(byte(7));
lcd.setCursor(10, 0);
lcd.write(byte(6));
lcd.setCursor(0, 1);
lcd.print("Eski ifre: ");
lcd.setCursor(5, 1);
lcd.write(byte(3));
String oldPass = getPasswordInput();
if (oldPass == password) {
lcd.setCursor(0, 2);
lcd.print("Yeni sifre: ");
String newPass = getPasswordInput();
password = newPass;
savePassword();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sifre degistirildi!");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Yanlis sifre!");
}
delay(2000);
openSettingsMenu();
}
int getNumberInput(int digits) {
String input = "";
while (input.length() < digits) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
input += key;
lcd.print(key);
// Tuşa basıldığında blinkPin'i kontrol et
digitalWrite(blinkPin, HIGH);
lastKeyPressTime = millis();
} else if (key == '#' && input.length() > 0) {
break;
}
// blinkPin'i 100ms sonra LOW yap
if (millis() - lastKeyPressTime >= 100) {
digitalWrite(blinkPin, LOW);
}
}
return input.toInt();
}
String getPasswordInput() {
String input = "";
while (true) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
input += key;
lcd.print('*');
// Tuşa basıldığında blinkPin'i kontrol et
digitalWrite(blinkPin, HIGH);
lastKeyPressTime = millis();
} else if (key == '#' && input.length() > 0) {
break;
}
// blinkPin'i 100ms sonra LOW yap
if (millis() - lastKeyPressTime >= 100) {
digitalWrite(blinkPin, LOW);
}
}
return input;
}
void exitSettingsMenu() {
settingsMode = false;
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Sistem Hazir.");
}
void normalOperation(char key) {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
int sensor1 = digitalRead(pirPin1);
int sensor2 = digitalRead(pirPin2);
int sensor3 = digitalRead(pirPin3);
int sensor4 = digitalRead(pirPin4);
lcd.setCursor(0, 3);
if (sensor1 == HIGH) {
lcd.write(byte(1)); // Özel karakteri yazdır
} else {
lcd.write(byte(0)); // Normal karakteri yazdır
}
lcd.setCursor(1, 3);
if (sensor2 == HIGH) {
lcd.write(byte(1)); // Özel karakteri yazdır
} else {
lcd.write(byte(0)); // Normal karakteri yazdır
}
lcd.setCursor(2, 3);
if (sensor3 == HIGH) {
lcd.write(byte(1)); // Özel karakteri yazdır
} else {
lcd.write(byte(0)); // Normal karakteri yazdır
}
lcd.setCursor(3, 3);
if (sensor4 == HIGH) {
lcd.write(byte(1)); // Özel karakteri yazdır
} else {
lcd.write(byte(0)); // Normal karakteri yazdır
}
if (key == 'D' && !timerActive && !countdownFinished && !relayTriggered) {
startTime = millis();
timerActive = true;
remainingTime = delayTime;
waitForSensor = true;
lcd.setCursor(0, 1);
lcd.print(" ");
}
if (timerActive) {
if (millis() - startTime >= delayTime) {
countdownFinished = true;
timerActive = false;
digitalWrite(blinkPin, LOW); // Geri sayım bittiğinde A2'yi kapat
lcd.setCursor(0, 1);
lcd.print("Alarm Kuruldu.");
} else {
unsigned long currentTime = millis();
remainingTime = delayTime - (currentTime - startTime);
lcd.setCursor(0, 1);
lcd.print("Geri sayim: ");
lcd.print(remainingTime / 1000);
lcd.print("s ");
// Her saniyede bir A2 pinini aç/kapa
if ((currentTime / 1000) % 2 == 0) {
digitalWrite(blinkPin, HIGH);
} else {
digitalWrite(blinkPin, LOW);
}
}
}
if (countdownFinished && waitForSensor) {
if (sensor1 == HIGH || sensor2 == HIGH || sensor3 == HIGH || sensor4 == HIGH) {
startTime = millis();
timerActive = true;
countdownFinished = false;
waitForSensor = false;
lcd.setCursor(0, 1);
lcd.print(" ");
}
}
if (countdownFinished && !waitForSensor && !relayTriggered) {
digitalWrite(relayPin, HIGH);
relayTriggered = true;
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("! Hareket Tespiti !");
}
if (key == '#' && (timerActive || countdownFinished || relayTriggered)) {
passwordMode = true;
enteredPassword = "";
lcd.setCursor(0, 2);
lcd.print("Sifre: ");
}
delay(100);
}
void handlePasswordEntry(char key) {
if (key != NO_KEY) {
if (key == '#') {
if (enteredPassword == password) {
resetSystem();
} else {
lcd.setCursor(0, 2);
lcd.print("Yanlis sifre! ");
delay(2000);
lcd.setCursor(0, 2);
lcd.print(" ");
passwordMode = false;
}
enteredPassword = "";
} else if (key >= '0' && key <= '9') {
enteredPassword += key;
lcd.setCursor(7 + enteredPassword.length() - 1, 2);
lcd.print('*');
}
}
}
void resetSystem() {
timerActive = false;
countdownFinished = false;
digitalWrite(relayPin, LOW);
digitalWrite(blinkPin, LOW);
relayTriggered = false;
passwordMode = false;
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(" Sistem Sifirlandi ");
lcd.setCursor(0, 2);
lcd.print(" OZTURK BiLiSiM ");
delay(2000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Sistem Hazir.");
}
void savePassword() {
for (int i = 0; i < password.length(); i++) {
EEPROM.write(EEPROM_PASSWORD_ADDR + i, password[i]);
}
EEPROM.write(EEPROM_PASSWORD_ADDR + password.length(), '\0'); // Null terminator
}
void loadSettings() {
// Sistemin başlatılıp başlatılmadığını kontrol et
byte initialized = EEPROM.read(EEPROM_INITIALIZED_ADDR);
if (initialized != 1) {
// İlk kurulum
initialSetup();
} else {
// Normal yükleme işlemi
String loadedPassword = "";
char c;
int i = 0;
while ((c = EEPROM.read(EEPROM_PASSWORD_ADDR + i)) != '\0' && i < 20) {
loadedPassword += c;
i++;
}
if (loadedPassword.length() > 0) {
password = loadedPassword;
}
EEPROM.get(EEPROM_DELAY_ADDR, delayTime);
if (delayTime == 0xFFFFFFFF) { // EEPROM boşsa
delayTime = 19000; // Varsayılan değer
}
}
}
void initialSetup() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ilk kurulum.");
lcd.setCursor(0, 1);
lcd.print("Yeni ifre girin:");
lcd.setCursor(5, 1);
lcd.write(byte(3));
lcd.setCursor(0, 2);
String newPassword = getPasswordInput();
if (newPassword.length() > 0) {
password = newPassword;
savePassword();
// Sistem başlatıldı olarak işaretle
EEPROM.write(EEPROM_INITIALIZED_ADDR, 1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sifre kaydedildi");
lcd.setCursor(0, 1);
lcd.print("Sistem hazir");
delay(2000);
}
}