#include "thingProperties.h" // Cloud bağlantısının olduğu dosyayı ekledim
#include "DHT.h" // Sensör iletişimi için DHT kütüphanesini ekledim
#include <LiquidCrystal_I2C.h> // I2C LCD iletişimi için LiquidCrystal_I2C kütüphanesini ekledim
// Sensör ve LCD nesnelerinin tanımı
DHT dht(0, DHT22); // Pin 0 (DHT22 sensörü) için bir DHT nesnesi oluşturdum
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
// Adresi 0x27, 16 sütun ve 2 satır içeren bir I2C LiquidCrystal nesnesi oluşturdum
void setup() {
Serial.begin(9600); // Cloud iletişimini 9600 baud hızında başlattım
delay(1000); // 1 saniye delay attım
pinMode(12, OUTPUT); // LED için pin modunu ayarladım
LCD.init(); // lcd ekranı başlattım
LCD.backlight(); // arka ışığını açtım
LCD.setCursor(0, 0); // yazmaya başlayacağı konumu LCD ekranın en başına aldım (satır: 1, sütun: 1)
// arduino cloud kodları
initProperties(); // "thingProperties.h" doşyasındaki fonksiyon çağrıldı ve cloud ile bağlantı sağlandı
ArduinoCloud.begin(ArduinoIoTPreferredConnection); // cloud'u başlattı
setDebugMessageLevel(2); // hata ayıklama mesaj seviyesi ayarlandı
ArduinoCloud.printDebugInfo(); // Hata ayıklama bilgilerini yazdı
}
unsigned long eskiZaman = 0; // millis() için turun ilk başlangıç zamanını tutuyor
unsigned long yeniZaman; // bu değişkene gerçek zaman (başladığı andan beri geçen süre) atanıyor
unsigned long degisken = 0; // loop() içinde olacak her turda hangi değerin ekrana yazılacağını seçiyor
unsigned long baslangic = 0; // başlangıçta lcd ekrana yazılacak değerler çekiliyor. Bunun için bu değişken sadece 1 kere çalışmasına imkan sağlıyor.
String gelenMesaj; // bu değişken ile cloud dan gönderilen mesaj kaydediliyor ve bir daha değişiklik olana kadar ekrana bu mesaj yazdırılıyor.
// Burada update metodunu kullanınca mesaj değişkeninin içi sıfırlanıyordu(?). Bu yüzden faklı bir değişkende saklıyorum.
void loop() { // sürekli çalışan loop fonksiyonu
if (baslangic == 0){ // tek seferlik çalışması için baslangic isimli değişken kontrol edilir
sicaklik = dht.readTemperature(); // sıcaklık çekilir
nem = dht.readHumidity(); // nem çekilir
baslangic = 1; // bir daha çalışmaması için 1 yapılır
}
yeniZaman = millis(); // ne kadar süredir çalıştığı kaydedilir
onLedChange(); // ledlerin anlık sıçaklık değişimine göre değişmesi için buraya ekledim (cloud dan yapılan değişiklik burada olmuyor onun için beklemesi gerek)
if (yeniZaman - eskiZaman >= 2000) { // sonraki tura geçmek için 2 saniye bekliyor
eskiZaman = yeniZaman; // tur bittiği için şu anki zamanı eskiye alıp turun toplam süresini sıfırlamış olduk
if (degisken == 0) { // ilk ekrana nem değeri yazdırılıyor
nemYazdir(); // nemi ekrana yazdırma fonksiyonu çağırıldı
} else if (degisken == 1) { // ikinci olarak ekrana sıcaklık değeri yazdırılıyor
sicaklik = dht.readTemperature(); // sıcaklık değeri çekildi
LCD.clear(); // ekran sıfırlandı
LCD.setCursor(2, 0); // başlangıç konumu ayarlandı (satır: 1 sütün: 3)
LCD.print("TEMPERATURE"); // önce "sıcaklık" ilk satıra yazıldı.
if (dht.readTemperature() < 0){ // sıcaklık 0 dan küçük mü ?
LCD.setCursor(0, 1); // imlecin yeni konumu ayarlandı
LCD.print(String(sicaklik) + "-"); // ekrana sıcaklık değeri yazdırıldı
LCD.print("VERY LOW"); // "çok düşük" ibaresi eklendi
}else if (dht.readTemperature() <= 25){ // sıcaklık 25 veya aldı mı ?
LCD.setCursor(3, 1); // imlecin yeni konumu ayarlandı
LCD.print(String(sicaklik) + "-"); // ekrana sıcaklık değeri yazdırıldı
LCD.print("NORMAL"); // "normal" ibaresi eklendi
}else{
LCD.setCursor(3, 1); // imlecin yeni konumu ayarlandı
LCD.print(String(sicaklik) + "-"); // ekrana sıcaklık değeri yazdırıldı
LCD.print("HIGH"); // "yüksek" ibaresi eklendi
}
} else if (degisken == 2) { // son olarak ekrana varsa mesaj yazdırılıyor
ArduinoCloud.update(); // cloud güncellendi, mesaj alındı ve değerler günderildi
if(mesaj != ""){ // son mesaj var mı diye kontrol ettim
gelenMesaj = mesaj; // eğer son mesaj dolu ise gelenMesaj değişkenine mesaj değişkeni yazdırıldı
}
if (gelenMesaj != ""){ // gelenMesaj değişkeni boş mu diye kontrol ediliyor. Boş olma şansı cloud dan ilk seferde mesaj gelmemesi oluyor
onMesajChange(); // Mesajı ekrana yazdırıyorum
}else{ // gelenMesaj değişkeni boş ise
nemYazdir(); // nem yazdırılır
Serial.println("Humidity: " + String(nem) + "% || Temperature:: " + String(sicaklik) + "°C"); // alt panele sıcaklık ve nem yazdırılıyor
degisken = 0; // değişken 0 yapıldı çünkü altta bir artarak sıcaklığa geçiyor. Böylelikle sıra bozulmamış oluyor (mesaj yoksa tabi)
}
}
degisken++; // değişkeni arttırıyorum
if (degisken == 3) { // değişken 3 olunca tur tamamlanıyor
Serial.println("Humidity: " + String(nem) + "% || Temperature:: " + String(sicaklik) + "°C"); // alt panele sıcaklık ve nem yazdırılıyor
degisken = 0; // değişken resetleniyor
}
}
}
void onMesajChange() { // mesaj yazdırma fonksiyonu
LCD.clear(); // ekran sıfırlandı
LCD.setCursor(0, 0); // başlangıç konumu ayarlandı (satır: 1 sütün: 1)
LCD.print(gelenMesaj); // mesaj ekrana yazdırılır
}
void onLedChange() {
sicaklik = dht.readTemperature(); // sıcaklık değeri DHT22 sensöründen çekiliyor
if (led == false && sicaklik <= 25){ // clouddan gelen led değişkeni ve sıcaklık kontrol ediliyor
digitalWrite(12, LOW); // led kapalı durumda
}else{ // değilse
digitalWrite(12, HIGH); // led açık durumda
}
}
void nemYazdir(){ // nem yazdırma fonksiyonu
nem = dht.readHumidity(); // nem değeri DHT22 sensöründen çekiliyor
LCD.clear(); // ekran sıfırlandı
LCD.setCursor(4, 0); // başlangıç konumu ayarlandı (satır: 1 sütün: 5)
LCD.print("HUMIDITY"); // önce "nem" ilk satıra yazıldı.
LCD.setCursor(3, 1); // imlecin yeni konumu ayarlandı
LCD.print(String(nem) + "-"); // ekrana nem değeri yazdırıldı
if (dht.readHumidity() <= 50){ // nem 50 den küçük mü ?
LCD.print("LOW"); // "düşük" ibaresi eklendi
}else{ // değilse
LCD.print("HIGH"); // "yüksek" ibaresi eklendi
}
}