#include <Keypad.h> //Tuş takımı kütüphanesi
#include <LiquidCrystal_I2C.h> //LCD ekran kütüphanesi
#include <EEPROM.h> //EEPROM belleğine veri okuma ve yazma işlemleri yapmak için
const int fanPin = 9; //Fan için bağlantı pini
const int heaterPin = 10; //Isıtıcı için bağlantı pini
const int tempSensorPin = A0; //Analog sıcaklık sensörü için bağlantı pini
const int upperTempDefault = 25; //Üst sıcaklık limiti belirlendi
const int lowerTempDefault = 20; //Alt sıcaklık limiti belirlendi
const int hysteresis = 2; //histerezis değeri (fan veya ısıtıcının açılıp kapanacağı sıcaklık farkı)
const int tempDifference = 3; //sıcaklık farkı varsayılan değerleri tanımlar
int upperTemp = upperTempDefault; // Değişkenlerin varsayılan sıcaklık değerleriyle tanımlar ve başlatır
int lowerTemp = lowerTempDefault;
const byte ROW_NUM = 4; //Tuş takımının düzenini tanımlar.
const byte COLUMN_NUM = 4;
char keys[ROW_NUM][COLUMN_NUM] = { //Tuş takımındaki kareterleri temsil eder.
{'1','2','3','A'}, //Bu satırda '1','2','3','A' karekterleri belirlenmiştir.
{'4','5','6','B'}, //Bu satırda '4','5','6','B' karekterleri belirlenmiştir.
{'7','8','9','C'}, //Bu satırda '7','8','9','C' karekterleri belirlenmiştir.
{'*','0','#','D'} //Bu satırda '*','0','#','D' karekterleri belirlenmiştir.
};
byte pin_rows[ROW_NUM] = {2, 3, 4, 5}; //Tuş takımının satırlarını ve sütunlarını arduinoda hangi bacağa bağlanması gerektiğini belirler
byte pin_column[COLUMN_NUM] = {6, 7, 8, 9};
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
LiquidCrystal_I2C lcd(0x27, 16, 2); //LCD boyutu 16 sütun ve 2 satır olarak başlar
void setup() { //setup arduino başladığında bir kez çağrılır
pinMode(fanPin, OUTPUT); // Fan çıkış olarak ayarlanır
pinMode(heaterPin, OUTPUT); // Isıtıcı çıkış olarak ayarlanır
lcd.begin(16, 2); //LCD ekranını başlatır
lcd.print("Sicaklik Gir:"); // LCD ekranına "Sıcaklık Gir:" yazısını yazdırır
loadSettings(); //Ayarları yüklemek için loadSettings() fonksiyonunu çağırır
}
void loop() { //lopp fonksiyonu staptan sonra çağtılır ve tekrar tekrar çalışır
char key = keypad.getKey(); // Bir tuş takımından gelen değeri okur ve basılan tuşun değerini döndürür
if (key) { // Tuşun basılıp basılmadığını sorgular. Eğer basılmamışsa bu kod çalışır
lcd.clear(); // LCD ekranı temizler
lcd.print("Sicaklik Gir:"); // LCD ekrana "Sıcaklık gir " yazar
lcd.setCursor(0, 1); //İmlecin konumunu ikinci satırdan başlatır
switch (key) { // key değerini kontrol eder ve basılan tuşa göre işlem yapar
case 'A': // Fan sıcaklığı ayarlamak için "A" tuşuna başılır.
lcd.print("Fan Sicakligi: "); //Fan sıcaklık değeri girilmesini ister
upperTemp = readTemperature(); //Sıcaklık okunur
break;
case 'B': // Isıtıcı sıcaklığı ayarlamak için "B" tuşuna basılır
lcd.print("Isitici Sicakligi: "); //Isıstıcı sıcaklığı değeri girilmesini ister
lowerTemp = readTemperature();
break;
case '#': // Bu tuşa basınca ayarlar kaydedilir
saveSettings();
lcd.print("Kaydedildi!"); // LCD ekrana "Kaydedildi!" yazdırır
delay(1000); // 1 saniye bekler
lcd.clear(); // LCD ekranını temizler
lcd.print("Sicaklik Gir:"); // LCD ekrana "Sicaklik Gir:" yazdırır
break;
default: // Yukarıdaki tuşlardan herhangi biri basılmadıysa bu kod bloğu çalışır
break;
}
lcd.print(upperTemp); //Bu satır, upperTemp değişkeninin değerini LCD ekrana yazdırır.
lcd.print("C - "); //Bu satır, "C - " metnini LCD ekrana yazdırır. Metin, tırnak işaretleri içinde yer alır.
lcd.print(lowerTemp); //Bu satır, lowerTemp değişkeninin değerini LCD ekrana yazdırır.
lcd.print("C"); //Bu satır, "C" metnini LCD ekrana yazdırır. Metin, tırnak işaretleri içinde yer alır.
}
int currentTemp = readTemperature();// Mevcut sıcaklık değerini okur ve değişkene atar.
//Bu değişken mevcut sıcaklık değerini depolamak için kullanılır
if (currentTemp >= (upperTemp + hysteresis)) { //Bu satır, currentTemp değişkeninin, upperTemp ve hysteresis değerlerinin toplamından büyük veya eşit olup olmadığını kontrol eder.
digitalWrite(fanPin, HIGH);//Eğer koşul sağlanıyorsa fanPin 1 olarak ayarlar. Fanı etkinleştirmek için kullanılır
} else if (currentTemp <= (lowerTemp - hysteresis)) { //Bu satır, currentTemp değişkeninin, lowerTemp ve hysteresis değerlerinin farkından küçük veya eşit olup olmadığını kontrol eder.
digitalWrite(heaterPin, HIGH); //Eğer bu koşul sağlanıyorsa heaterPin 1 olarak ayarlar. Isıtıcıyı etkinleştirmek içiçn kulallanılır
}
if (currentTemp <= (lowerTemp - tempDifference)) { //Bu satır, currentTemp değişkeninin, lowerTemp ve tempDifference değerlerinin farkından küçük veya eşit olup olmadığını kontrol eder.
digitalWrite(fanPin, LOW); // Eğer koşul sağlanıyorsa fanPin devre dışı bırakılır
}
if (currentTemp >= (upperTemp + tempDifference)) { //Bu satır, currentTemp değişkeninin, upperTemp ve tempDifference değerlerinin toplamından büyük veya eşit olup olmadığını kontrol eder.
digitalWrite(heaterPin, LOW); // Eğer koşul sağlanıyorsa ısıtıcı devre dışı bırakılır
}
}
int readTemperature() { //Bu satır, readTemperature() adlı bir fonksiyonun başlangıcını belirtir.
int sensorValue = analogRead(tempSensorPin); //Bu satır, analogRead() fonksiyonunu kullanarak tempSensorPin adlı analog pinden sıcaklık sensöründen gelen değeri okur ve sensorValue adlı bir değişkene atar.
float voltage = sensorValue * 5.0 / 1024.0; //Bu satır, sensorValue değişkenini kullanarak sıcaklık sensöründen okunan değeri gerilim değerine dönüştürür.
float temperatureC = (voltage - 0.5) * 100.0; //Bu satır, voltage değişkenini kullanarak sıcaklık değerini Celsius cinsinden hesaplar. Bu formül, sıcaklık sensörünün çıkış gerilimine dayanarak sıcaklık değerini hesaplar.
return temperatureC; //Bu satır, temperatureC değişkenini döndürerek readTemperature() fonksiyonunu sonlandırır.
}
void saveSettings() { //Bu satır, saveSettings() adlı bir fonksiyonun başlangıcını belirtir. Bu fonksiyon, ayarları kaydetmek için kullanılacaktır.
EEPROM.put(0, upperTemp); //u satır, upperTemp değişkeninin değerini EEPROM belleğine kaydeder
EEPROM.put(sizeof(int), lowerTemp); //Bu satır, lowerTemp değişkeninin değerini EEPROM belleğine kaydeder.
}
void loadSettings() { //Bu satır, loadSettings() adlı bir fonksiyonun başlangıcını belirtir. Bu fonksiyon, kaydedilen ayarları yüklemek için kullanılacaktır.
EEPROM.get(0, upperTemp); //Bu satır, EEPROM belleğinden upperTemp değişkeninin değerini alır.
EEPROM.get(sizeof(int), lowerTemp); //Bu satır, EEPROM belleğinden lowerTemp değişkeninin değerini alır.
}