/*Bu proje Ankara Üniversitesi Elektronik Bölümü Mehmet Salim Çelik tarafından geliştirilmiştir,
Aşşağıda uygulama esnasında beklenen temel özellikler belirtilmiştir.
Uygulamadan Beklenen Minimum Özellikler;
->TMP36 sensörü ile sıcaklık okunacak
->Seçilen karakter LCD ekran üzerinde okunan sıcaklık değeri görülebilecek
->Fan ve Isıtıcı için iki tane çıkış olacak. (Temsili olarak Fan için mavi led, kırmızı için kırmızı led kullanılacak.)
->Fan ve ısıtıcının set değerleri kullanıcı tarafından 4x4 tuş takımı kullanılarak girilecek ve LCD ekranda bu değerler okunabilecek.
->Fan ve ısıtıcının çalışmasında Hysteresis kontrol kullanılacak olup. Band genişliği %10 alınacak.
->Isıtıcıya ait sıcaklık değeri fan sıcaklık değerinden büyük olmalıdır.
->Ayrıca iki çıkışın aynı anda çalışmasını ya da peş peşe çalışmasını engellemek için çalışma aralıkları arasında en az 3 derece fark olmalıdır.
->Kartın enerjisini kestiğimizde kullanıcının set değerleri silinmeyecek.
Devrenin çalışma gereksinimleri ve akış diyagramı aşamaları aşşağıda belirtilmiştir;
$ ilk etapta ekranda uygulama ismi olan "*** ARDUINO SICAKLIK UYGULAMASI ***" ismini yazdır.
$ Ardından arduino kullanısı ismini ekrana bastır ; 1.satır=> "HOSGELDINIZ" 2.satır=> " >Mehmet Bey" ardından 2ms sonra diğer aşamaya geç.
$ Üçüncü aşamada kullanıcı girdisi iste Set1-A ve Set2-B değerlerini kullanıcıdan iste aynı zamanda üst satırda sıcaklık değeride belirtilsin.
$ Kullanıcı girdisi olmadan sensörden istendiği kadar veri gelsin yinede SetFan ve SetIsıtıcı çalışmasın.
$ Kullanıcı girdisi girildiğinde set fan ve set ısıtıcı değerlerine göre ortalamalarını alıp ona göre sistemi çalıştırsın.
$ Eğer sisteme girdi verildikten sonra sistem resetlenir ise EEprom SET1 ve SET2 değerlerinde okunabilecek EEprom girdisi alınarak veri saklanacak.
Kısaca devre çalışma aşamaları bu şekilde olup aşşağıdaki kodda betimlenmiştir.*/
#include <Wire.h> //Arduino IC2 protokolünün kütüphanesini aktif edildi.
#include <LiquidCrystal.h> //Arduiuno IC2LCD Modül kütüphanesi aktif edildi.
#include <Keypad.h> //Arduino Keypad modülü kütüphanesi aktif edildi.
#include <EEPROM.h>// EEProm hafızasını aktif edildi.
int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //LCD'nin pin değişkenlerini tanımlıyoruz.
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //LCD'nin pin bağlantılarını ayarlıyoruz.
const byte ROWS = 4; //Keypad satır sayısı belirlendi.
const byte COLS = 4; //Keypad sütun sayısı belirlendi.
//4*4 keypad tuş takımı eklendi.
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROWS] = {7, 6, 5, 4}; // Satır'ın bağlı olduğu pinler belirlendi.
byte pin_column[COLS] = {3, 2, 1, 0}; // Sütun'un bağlı olduğu pinler belirlendi.
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROWS, COLS); //Keypad nesnesi oluşturuldu.
// LED pinleri
const int blueLedPin = 8; // Mavi LED pin belirlendi.
const int redLedPin = 9; // Kırmızı LED pin belirlendi.
// TMP36 sensörü
const int tmp36Pin = A0; //TMP36 pin belirlendi.
// Set değerleri
float fanSet = 0.0;
float isiticiSet = 0.0;
//====================================================================================================
/////////////////////////////////////////////SETUP////////////////////////////////////////////////////
//====================================================================================================
void setup() {
// // LCD yi başlatma
//lcd.backlight(); // lcd nin arka ışıgını açar
lcd.begin(16, 2); // LCD sütun ve satır sayısı ayarlandı.
pinMode(blueLedPin, OUTPUT);//Mavi led çıkış olarak ayarlandı.
pinMode(redLedPin, OUTPUT);//Kırmızı LED Çıkış olarak ayarlandı.
lcd.setCursor(1, 0); //İmlecin Sütun ve Satır sayısı belirtildi.
lcd.print("*** ARDUINO SICAKLIK UYGULAMASI ***"); //Belirtilen imlece uygulama ismi yazıldı.
for (int counter = 0 ; counter < 30; counter++) // Yazıyı döngüye alıp sol'a doğru gitmesi sağlandı.
{
lcd.scrollDisplayLeft(); // İmleci sol'a kaydır.
delay(150); // 150ms süre eklendi.
}
// lcd.begin(16, 2); // LCD sütun ve satır sayısı ayarlandı.
lcd.print(" HOSGELDINIZ"); // LCD ye yazı yazdırıldı.
lcd.setCursor(0, 1); //İmleci ayarladım 2. satıra geçildi.
lcd.print(" >Mehmet Bey"); //LCD 2. satıra yazı yazıldı.
delay(2000); //2ms zaman eklendi ardından loop'a geçecek.
lcd.setCursor(0, 1);// LCD'nin 2.sütununa konumlandırır.
lcd.print(" Set1-A Set2-B ");//LCD 2. satıra menü isimleri yazıldı.
// Ayar noktası değerlerini EEPROM'dan hafızaya yükler.
fanSet = EEPROM.read(0) * 0.1; //Fan set değerini okuyup EEPROM hafızasına kaydeder.
isiticiSet = EEPROM.read(1) * 0.1; //Isıtıcı set değerini okuyup EEPROM hafızasına kaydeder.
}
//====================================================================================================
//////////////////////////////////////////////LOOP////////////////////////////////////////////////////
//====================================================================================================
void loop() {
char key = keypad.getKey();
if (key) { //Eğer Menü key'e basılırsa A ve B Set değerlerini ayarlamak için LCD de değer girmeyi aktif et.
menuKey(key);
}
// TMP36 sensöründen sıcaklık okuma
float temperature = sicaklikOkuma();
// LCD'ye sıcaklık yazma ve TMP36 dan gelen veriyi ekler.
lcd.setCursor(0, 0);
lcd.print("sicaklik: ");
lcd.print(temperature);
lcd.print(" C");
// Set Fan ve Set Isıtıcı değerlerine göre LED'leri kontrol etme
ledControl(temperature);
}
void menuKey (char key) {//---------Menu fonksiyonu oluşturuldu.
switch (key) {
case 'A': // Eğer A ya basılırsa case 1 çalışsın.
lcd.clear();
lcd.print("1.Fan ");
lcd.setCursor(0, 1);
lcd.print("Set Degeri: ");
fanSet = getSetpoint();
// FanSet'i EEPROM'a kaydeder.
EEPROM.write(0, fanSet * 10);
break;
case 'B': // Eğer B ye basılırsa case 2 çalışsın.
lcd.clear();
lcd.print("2.isitici ");
lcd.setCursor(0, 1);
lcd.print("Set Degeri: ");
isiticiSet = getSetpoint();
// isitiSet'i EEPROM'a kaydeder.
EEPROM.write(1, isiticiSet * 10);
break;
}
}
float getSetpoint() { // 1. ve 2. Set değerlerini girdiği zaman bunu LCD set değerine yazdıran fonksiyon.
char key;
String setpointStr = "";
do {
key = keypad.getKey();
if ((key >= '0' && key <= '9') || key == '.') { //0'dan 9'a kadar olan haneyi kullan ve '#' ile enter'la.
setpointStr += key;
lcd.print(key);
} else if (key == '#') {
lcd.clear();
break;
}
} while (key != '#');
return setpointStr.toFloat();
}
float sicaklikOkuma() { //A0 pin den gelen veriyi okuyup ekrana çıktısını veren fonksiyon.
int sensorValue = analogRead(tmp36Pin);
float temperatureC = -890 + (sensorValue) / 10;
temperatureC = (temperatureC) / 10;
return temperatureC;
}
void ledControl(float temperature) {//---------LED'leri girilen Set değerlerine göre kontrol etsin.
if (fanSet != 0.0 && temperature >= fanSet * 1.1) { // Isıtıcı LED kontrol
digitalWrite(redLedPin, HIGH);
} else {
digitalWrite(redLedPin, LOW);
}
if (isiticiSet != 0.0 && temperature <= isiticiSet * 0.9) { // Soğutucu LED kontrol
digitalWrite(blueLedPin, HIGH);
} else {
digitalWrite(blueLedPin, LOW);
}
}