Konu Bilgileri
Konu: Amator Arduino ile Kulucka Makinasi Yazar: İbrahim Selcuk
Okunma: 33552 Yorum: 75
Konuyu Okuyanlar: 9 Ziyaretçi
Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5

İbrahim Selcuk 03-22-2016, Saat: 01:09 PM   
#21
Gunaydınlar,

Gelelim işin maliyet kısmına, Maliyeti 3 kısma böldüm. Kontrol, Standard donanım ve kabin.

1 X Arduino Uno 70 TL (http://www.robotistan.com/orjinal-arduin...i-versiyon) Klon 20 TL
1 X 12 Volt Adaptor 26 TL (http://www.robotistan.com/mervesan-12v-2...r-ms-2512p)
1 X Arduino Proto Shield 46 TL (http://www.robotistan.com/orjinal-arduin...-shield-r3) (Sadece elimde var diye kullandım gerek yok kullanmaya)
1 X 4 Lu Röle Seti 14 TL (http://www.robotistan.com/4-way-5v-relay...role-karti)
1 X Dht 22 Isı Sensörü (0,1 Derece Hassasiyetli) 25 TL (http://www.robotistan.com/dht22-isi-ve-n...oru-am2302)
1 X 20 X 4 LCD Ekran 42 TL (http://www.robotistan.com/20x4-lcd-ekran-yesil)
3 X Kırmızı Led 2 TL (http://www.robotistan.com/3mm-kirmizi-le...ti-10-adet)
3 X Led Yuvası Metalik 1,50 TL (http://www.direnc.net/3MM-METAL-LED-YUVA...18431.html)
1 X RTC Zaman Modulu 5 TL (http://www.robotistan.com/ds1307-rtc-ve-...fiza-karti)
3 X Push Button Düğme (Renk Sari ve Lacivert) 4,50 (http://www.robotistan.com/ic180-metal-bu...buton-sari)
1 X Power Supply Girişi Sigortalı 6 TL (http://www.direnc.net/POWER-GIRIS-SIGORT...-3911.html)
1 X Guc Kablosu 5 TL (http://www.direnc.net/Power-Kablosu-15MT-,PR-4190.html)
3 Metre 8 telli telefon kablosu yada Ethernet kablosuda olur. (Sensorler için) 5 TL

Kontrol üniteleri için benim kullandığım 252 TL lik malzeme kullanmışım. Bu malzemelerin çoğu elimde olduğu için ben bu bölümde nerede ise 20 TL ya harcadım ya harcamadım. Ama bu kısmı biraz daha budamak istersek. Arduino Proto Shield 46 TL kullanmaya hiç gerek yok ben sadece yapım aşamasında biraz daga az leyim yapmak için kullandım. Arduino 70 TL çin klonu 20 TL Yani bu iki kalemi çıkarttığımızda 96 TL lik bir harcamayi burdan düşebiliriz. Toplam 156 TL olur.

1 X Nem Nozulu 55 TL (http://www.efekulucka.com/urun/kulucka-m...nem-nozulu)
1 X 5 V Adaptor (Nem Nozulu İçin) 20 TL
1 X 200 Watt Tüp Isıtıcı Resistans25 TL (http://www.efekulucka.com/urun/kulucka-m...rezistansi)
3 X 2 delikli Kosebent (Resistansi baglamak icin) 3 TL
2 X 48 lık kendinden motorlu Viyol 55 TL (http://www.efekulucka.com/urun/48-yumurt...teli-viyol)
1 X 15 Watt Led Ampul 5 TL
1 X e27 Duy 2 TL
1 X 12 CM 220 Volt Fan 20 TL
1 X Klemens Orta Boy 2 TL
3 Metre Izole 3 X 1,5 Elektirik Kablosu 5 TL

240 TL Sadece makinanın içinde kullandığım standard donanım. Bunlar zaten bu şekilde bir makina yapıyorsanız almanız gereken demirbaş malzeme. Bunlardan çok kaçma şansı yok. Ama ne olabilirdi. Viyol leri kendim yapabilirdim, o zaman 110 TL lik bir kazancım olurdu.

60 5 X 5 Vida 4 TL
3 X Tabaka Mavi Izolasyon Kopugu 27 TL
4 X Tekerlek 20 TL
2 X Menteşe 25 TL
1 X Çektirmeli Kilit 27 TL
+ Sunta 150 TL civarı

Sunta kısmını hiç uğraşmadan Bauhaus'ta kestirdim, birde üstüne üstlük Kenarlarını kaplattım gerekli yerlerin. =) Normal bir marangoza gitseydim heralde 50-60 TL ye bana keserdi bunları. Öte yandan çektirme kilit ve menteşeleri tekne malzemesi satan bir dükkandan aldım. İkiside krom malzeme. Yani kabin maliyeti 250 TL civarına geldi bana.

Kısaca yaptığım makine maliyet olarak bana toplamda 450 - 500 TL (elimde elektonik malzemenin çoğu olduğu için) arasında bir fiyata mal oldu. Kapasite olarak suan 100 yumurta kapasitesi var ama 55 TL daha verir yada kendim bir raf sistemi ustunde ugrasirsam 150 yumurta kapasitesini rahat bir şekilde kaldırabileceğini dusunuyorum. Cunku resistans ile en alttaki viyol arasına (30cm) bir viyol koyma şansım daha var. Yani 150 yumurta kapasiteli tam otomatik bir makina yaptım. Bunu cimukanin bir makinası ile karsilastirmak cok mantıklı olmayabilir ama , 1400 TL hazır bir makina almaktansa 500 TL ye buna yakın bir tasarımda bir ürün ortaya çıkardığımı ve bunu yaparkende kendimi hem bilgi olarak hemde el becerisi olarak geliştirdiğimi düşünüyorum. Ayrıca bir şey ortaya çıkarmanın verdiği haz ve mutluluk da yok değil. =)

Bu modeli çok pahallı bulanlar olabilir, yada sırf uğraş vermek için yapmak isteyenler olabilir. Bu tamamen kendi seçimleridir. Bu makineleri ister benim yaptığım gibi ister başkalarının yaptığı gibi yapın, sizin zayıf noktanız neresi ise ona göre hesap yapmalısınız. Eğer zayıf noktanız maliyet ise ilk önce gerekenleri hesaplamalı ve bir bütçe çıkartmalısınız. Eğer zayıf noktanız elektirik tarafı ise ona göre hazır devre yada EMKO gibi ürünlere yönelmelisiniz. Eğer el becerisi ise tümden hazır Cimuka gibi markalı ürünleri düşünmeniz daha mantıklı olabilir.

Maliyet olayına eklemek istediğim bir başka nokta ise, ürünleri nereden temin ettiğiniz. Bu yazdığım fiyatlar benim Istanbul'da çat kapı dükkandan girip pazarlık yapmadan araştırmadan aldığım fiyatlar. Bu resistans mesela eminim Sirkeci'de 15 TL ye yapan yer vardır. Aldığım sunta lar eminim doğru düzgün bir marangoza yarı fiyatına yaptırtılabilir. Yada elektronik parçalar çinden 15-20 gün bekleyerek çok ucuza getirtilebilir.

Daha öncede dediğim gibi bana maliyeti budur ama size maliyeti daha ucuza olabilir. Bunun sizin araştırmanız gerekir.

Kolay Gelsin.
Ara
Cevapla
İbrahim Selcuk 03-22-2016, Saat: 02:18 PM   
#22
Arduino bağlantıları hakkında yardımcı olacağını düşündüğüm bir görsel hazırladım.



Bu resimden Arduino ile diğer aygıtların ne şekilde bağlandığını görsel olarak daha rahat ve açıklayıcı görebilirisiniz diye düşünüyorum. Kullandığım programda her modul olmadığı için Açma-Kapama yapan Relay modulu oraya yerleştiremedim ama oraya giden 5 kablo sol üst tarafta gozukuyor. O kısmını ve 220 volt kısmını sonra vaktim olursa çizmeye çalışıcam.

Kolay Gelsin.

(03-22-2016, Saat: 12:50 PM)Ahmet KUNT Adlı Kullanıcıdan Alıntı: Teşekkürler ibrahim bey;
Dht22 yide ayni hassasiyette saniyordum. Birde dhtlerin cin Menşeili olduğunu düsündüğüm için ds daha mantıklı gelmişti.
Tek sensör yerine  en az 2 sensör daha iyi sanirim.
Cam için ise sadece bakarken temiz olmasını istiyorsaniz bu miknatisli cam siliciler var. Disardan miknatisi oynatinca icerdeki silicide hareket ediyor. Bu sayede hallolabilir. Smile
Viyol olarak hazir viyol kullanıyorum ben. Saniye bazinda dönme olayınını ondalikli yaparsak dahada iyi olur.yani 12.2 saniye mesela. Bu sekilde bir ayarlama sapmayi azaltir. Bunu neden yapıyorum. Bu siviç işini hic sevmiyorum. Onlar olmadan konumu anlayan bir yapi yazilim olursa sizinki cok daha iyi. Evdeki wifiye bağlayıp uzaktan takip cok iyi olur.
Nozül olayini tekrarliyorum, kullanacaksaniz bile aritmaniz varsa o sudan kullanin.

Evet iki sensor daha mantıklı olabilir. Ben iki tane koymayı dusundum sonra aklıma şu geldi. Eğer kabin içinde iki farklı yerde çok farklı yada kuluçka süresini etkileyecek kadar ısı farkı varsa bu demektirki içerdeki hava sirkulasyonunda hata yapmışım demektir. Bundan dolayı tek sensör koydum. Ve ısı kalibrasyonu mümkün olduğunca farklı yerlerde yapmayı denedim. Bakalım ilk yüklemeden sonra ne kadar doğru yapmışız görücez.

Teşekkürler.
Ara
Cevapla
İbrahim Selcuk 03-30-2016, Saat: 04:20 AM   
#23
Merhabalar,

Sistemi bitirdikten sonra 4 gün aralıksız çalıştırdım ve test ettim. Test süreci boyunca herşey çok güzel stabil ve yolunda gitti. Bende 4 gün yeterli bir süredir diye düşündüm ve yumurta yükledim. 20 tane izmirden Light Sussex almıştım. 12 Tane Antalyada Light sussex almıştım. 70 tanede köy tavuğu yumurtam vardı onları koydum. Ve koyduğumun ilk saati sorunlar başladı.

İlk sorunum kullandığım nem yapıcı bozuldu. Yedeğim olmadığı için hemen su kapları ile su koyarak nemi %50 lere çıkarttım. Bu esnada yazılım ve ısı sensöründen kaynaklanan bir sorundan dolayı isi 1-2 saat 41 Dereceye çıktı. Bu sorunuda aştım derken ilk baştan beri kalitesinden çok memnun olmadığım çevirme motorlarından biri bozuldu. Allahtan yedeğim vardı ve hemen değiştirdim. Bu arada yazılımı düzelttim. Isı sensörünü kontrol ettim. araştırmaların sonucu DHT22 yerine SHT15 isi sensoru kullanmanın daha yerinde olacağını anladım. Şimdilik bir değişiklik yapmadım ama daha kaliteli, dayanıklı bir sistem için SHT15 isi sensoru kullanmak daha dogru olabilir. İlerde Arduino kullanmayı düşünenler bunu dikkate almalı diye dusunuyorum.

Nem cihazını aynı mantıkla çalışan başka bir nem cihazı ile değiştirdim. İlk kullandığım nem cihazının içine su almasından dolayı bozuldu.


İkinci olarak sistemi manuel takip etmek ve isi ve nem cihazını kontrol etmek kaliteli olduğunu dusundugum bir termometre ekledim. Daha once Eczaneden aldığım bir termometre kullanıyordum onunla bu resimdeki arasında 1 - 1,5 derece fark çıktı. Kullandığım elektronik Acurite termometre ilede farklılık gösterince iyicene rahatsız oldum. Yani kısaca elimde 4 farklı termometre ve 4 farklı değer olunca iyicene midem bulandı, kafam karıştı. Sonunda isi ve nem için aşağıdaki fotoğraftaki ölçüme güvenmeyi seçtim. Eczaneden aldığım ve evdeki kablosuz bebek termometresini kullanmayı biraktım.



Son olarak sistemde bir tane fan kullanıyordum. Yukardan aşağı üfleme yapıyordu. Bunun çok yeterli olmayacağını ve ön - arka ayrımının daha iyi olması için tabana bir fan daha monte ettim. Bu fanı monte ettikten sonra ısının daha eşit ve dengeli dağıldığını gözlemledim.



Bütün bu aksilikleri makinaya yumurtaları koyduktan sonra 4 saat içinde yaşamam çok ilginç ve bir panik havası estirdi. Çünkü yumurtalar bir kere ısınınca bir daha çıkartma ve işlemi yarıda kesme şansım olmadığını düşündüm ve hemen aksıyan yerleri düzeltmeye başladım/çalıştım. Bugun yumurtaların 7 inci günü, döl kontrolu rastgele 5-10 yumurtaya yaptım. Derece 41 e çıktığı için büyük ihtimalle üst sıradaki çoğu yumurtayı kaybettim. Ama alt sırada boş/dölsüz yumurta çok rastlamadım. Makinanın ilk denemesi için gerçekten çok iyi bir test oldu.

İlk 4 saatte yaşadığım sorunlar sonucunda kendimce aşağıdaki çıkarımları yaptım.
- Isı ve nem sensörünü daima en yüksek yere yerleştir. Ortalara yerleştirme.
- Isıtıcıya sıcakken dokunma.
- Viyoller yatay durumda iken döl kontrolu yapma. Önce düz pozisyona getir sonra döl kontrolu yap. (Ewet 1 tane kırdım elim çarptı)
- PANİK YAPMA SAKİN OL

Yazılım tarafında ise çok ciddi değişiklikler ve düzeltmeler yaptım.
- Viyoller paralel çalışıyor ve kalitesiz viyol olduğu için senkronizasyonları bozuluyordu. Bunları otomatik çevirme dışında düğmeler ile kontrolünü sağladım.

- Sıcaklık ve Nem sensörü programlamasında kilitlenmeler oluyordu. Uzun bir araştırma sonucunda çözdüm.

- İlk yaptığım menu sistemini değiştirdim şimdi daha kullanışlı bir ayar menusu ekledim.

- Derece ayarı 0,5 lik katlar ile artıyordu. Artık 0,1 derecelik katlar ile artıyor.

- Çevirme zamanı sadece yazılımdan değişiyordu. Artık Menuden ayarlanabiliyor.

- Menulere girildiği zaman ısıtıcı ve nem sisteminde sorun oluyordu düzeltildi.

- Zaman hesaplamasında değişiklik yapıldı.

- Tüm hafızayı silen bir özellik eklendi.

- Tarih/saat ayarı eklendi.

Evet şimdilik ilk haftanın deneyimleri, geliştirmeleri, aksilikleri bu kadar. Bakalım önümüzdeki hafta ne olacak merakla bekliyorum.

Kolay Gelsin.
Ara
Cevapla
A.Ümit GÜNENDİ 03-30-2016, Saat: 09:56 AM   
#24
Yaşadığınız sorunlardan dolayı geçmiş olsun İbrahim bey.

Arduino alıp kullanmayı düşünen arkadaşların faydalanması için, sağlıklı çalıştığını düşündüğünüz denemelerinizi yaptığınız yazılımı paylaşırsanız, kullanacak arkadaşlara şimdiden faydası olacağı kanısındayım.
Ara
Cevapla
İbrahim Selcuk 03-30-2016, Saat: 10:24 AM   
#25
(03-30-2016, Saat: 09:56 AM)A.Ümit GÜNENDİ Adlı Kullanıcıdan Alıntı: Yaşadığınız sorunlardan dolayı geçmiş olsun İbrahim bey.

Arduino alıp kullanmayı düşünen arkadaşların faydalanması için, sağlıklı çalıştığını düşündüğünüz denemelerinizi yaptığınız yazılımı paylaşırsanız, kullanacak arkadaşlara şimdiden faydası olacağı kanısındayım.

Evet Ümit bey paylaşıcam ama yarım yamalak bir şey paylaşmak istemiyorum. Tam hakkı ile bitirip sonra paylaşmayı tercih ederim. Testlerim, çıkımım tam olarak bitsin ne olacak bir görelim ne olduğunu. Birde bildiğim ama çalışmasını etkilemeyen bir iki mantık hatası var, onlarıda yavaş yavaş düzeltiyorum.

Teşekkürler.
Ara
Cevapla
Kamil SAİM 03-30-2016, Saat: 10:56 AM   
#26
s.a.
öncelikle bu işlerle uğraşan birilerini görmek mutlu ediyor.
konuyu tamamıyla okumadan yorum yapıyorum kusura bakmayın.

tavsiyeler :

daha önce arduino ile termostat yaptık, Ali hocam yaptı daha doğrusu, birçok kez oda test etti bende, özellikle çimukaya bağlayıp çalıştırdım.
kullandığımız sistemde roleler SSR ve Sensör daime SHT11 oldu dht lerden farkını görürsünüz.
yaptığınız sistem on off değilde PİD veya zaman oransal olursa rezistansta ısı yükselme olayına nadir rast gelirsiniz.
alta taktığınız rezistansı yerinizde olsam karşı duvara takardım ve fanı da ortasına duvara üfleyecek şekilde takardım. eğer arkada yer yoksa fanı rezistansın ortasına takın ve yine alta üflesin faydasını görürsünüz.
kalibre için civalı çok hassas termometreler kullanmalısınız (35-42 derecelik) yoksa sht sensörler zaten kalibrasyonlu olarak geliyor.kafanızı karıştırmayın başka termometreler ile.
Cevapla
İbrahim Selcuk 03-30-2016, Saat: 08:28 PM   
#27
(03-30-2016, Saat: 10:56 AM)Kamil SAİM Adlı Kullanıcıdan Alıntı: s.a.
öncelikle bu işlerle uğraşan birilerini görmek mutlu ediyor.
konuyu tamamıyla okumadan yorum yapıyorum kusura bakmayın.

tavsiyeler :

daha önce arduino ile termostat yaptık, Ali hocam yaptı daha doğrusu, birçok kez oda test etti bende, özellikle çimukaya bağlayıp çalıştırdım.
kullandığımız sistemde roleler SSR ve Sensör daime SHT11 oldu dht lerden farkını görürsünüz.
yaptığınız sistem on off değilde PİD veya zaman oransal olursa rezistansta ısı yükselme olayına nadir rast gelirsiniz.
alta taktığınız rezistansı yerinizde olsam karşı duvara takardım ve fanı da ortasına duvara üfleyecek şekilde takardım. eğer arkada yer yoksa fanı rezistansın ortasına takın ve yine alta üflesin faydasını görürsünüz.
kalibre için civalı çok hassas termometreler kullanmalısınız (35-42 derecelik) yoksa sht sensörler zaten kalibrasyonlu olarak geliyor.kafanızı karıştırmayın başka termometreler ile.

İlginize Teşekkürler.

- Evet bende DHT lerden istedigim verimi alamadıktan sonra biraz arastirma yapınca SHT11 ve SHT15 i sonradan farkettim. Daha stabil gozukuyor haklısınız.

- Arka duvarda yerim var ama ilk cıkım denememden sonra değiştiricem buyuk ihtimalle. Daha onceden hic kulucka makinası gormedigim ve kullanmadıgım icin eksiklikleri ya tavsiye yada deneyim yolu ile cozmeye calisiyorum.

- Hassas termometreyi ogrendigim iyi oldu tesekkurler.

Birde acaba fan direkt yumurtaların ustune uflese yanlıs mı olur ?

Tesekkurler.
Ara
Cevapla
İbrahim Selcuk 03-31-2016, Saat: 05:32 AM   
#28
Arkadaslar Kodu Asagida paylasiyorum. Mumkun Oldugunca ayrıntılı kod kısmını acıklamaya calistim. Nereye ne takılacağı konusunda onceden paylastigim bir resim var. Kodun icindede aciklamalar var. İnsallah birilerinin işine yarar yardimci olur.

Tek ricam. Bir eksik bulursanız yada soyle olursa daha iyi olur dediğiniz bir nokta olur ise forumda ayrıntılı bir şekilde yazarsanız cok sevinirim.

Teşekkürler.
Kod:
//////////////////////////////////////////
// Sahansiz  Yumurta Ver. 0.0002
// I. S. Elmas 31 / 03 / 2016
// Guncel Versiyon icin
// http://www.kuluckaclub.com/konu-amator-arduino-ile-kulucka-makinasi.html
//
// Ne Nereye Baglanacak
/*
      Sıcaklık Sensoru  Pin 3
      RTC I2C uzerine
      LCD I2C uzerine

      Yukari Dugmesi    Pın 7
      Asagi Dugmesi     PIN 8
      Tamam Dugmesi     PIN 9

      Isıtıcı Relay Pin 4
      Nem     Relay Pin 5
      Viyol 1 Relay Pin 6
      Viyol 2 Relay Pin 10

      Isıtıcı Led   Pin 14
      Nem Led       Pin 15
      Cevirme Led   Pin 16

      Dugmelere ve Ledlere gerekli dirençlerin Bağlanması Gerekmektedir!

    // Yazılımın Temel Calisma Mantığı

    Arduino İlk acildiginda EEPROM'dan gerekli bilgileri okur eğer bilgi yok ise direkt Ayar Menusu ekrana gelir.
    Zaman Modulu sayesinde, Saniye 15 ve 45 geçe mevcut isi ve nemi kontrol eder. Eğer açmak gerekiyor ise isiticiyi yada
    nem nozulunu acar. Her saniye Isı ve Nem Degeri kontrol edilir. Eğer Isı veya Nem istenen değerin ustunde veya eşit ise
    Isıtıcıyı yada Nem Nozulunu Kapatir.

    Her Saat Basi Cevirme yapılıp yapılmayacagini kontrol eder. Eğer O Saat diliminde cevirme yapılacak ise saniye 30 olduğunda
    çevirme işlemini başlatır. Çevirme Süresi ayarlardan ne kadar girildi ise çevirme işlemini girilen saniye süresince yapar sonra
    kapatir.

    Soğutma işlemini Öğlen Saat 12:00 ile 14:00 arasi yapar. Eğer 60 dakika seçildi ise 12 ile 13 arasi isitici açmaz. Eğer
    120 Dakika girildi ise 12:00 ile 14:00 arasi isitma ve nem relaylerini açmaz.

    Eğer herhangi bir sebepten Arduino kilitlenir yada isi nem sensoru bozulur ise kendine reset atar. Eğer düzelmez ise
    bu kısır döngü devam eder.

    Ağağı düğmesine basılı tutulur ise birinci viyolu, yukarı düğmesine basılı tutulursa ikinci viyolu basılı tutulduğu sürece
    döndürür.

    Ana Menuye girmek icin Tamam duğmesine 5 Sn basılı tutmak gerekir. Menu icinde asagi yukari ile menu değiştirilir. Tamam
    duğmesi ile seçim yapılır. Eğer değer giriliyor ise yine Aşağı Yukarı düğmesi ile değer seçilir/girilir Tamam ile onaylanır ve
    sonraki seçeneklere geçilir.

    Tespit Edilen Eksikler:
    - Son iki gün çevirme durdurulabilir.
    - Isıtma Fonksiyonu biraz daha zamana göre akıllı çalışabilir. Mesela ısıtıcı maksimum 3 dk devamlı çalışır gibi bir
    koruma konulabilir. Yada Isı farkı sadece 0.10 derece ise 10 sn ısıt sonra kapat denilebilir.
*/

// Makina acip kapatildiginda bilgileri hafızada tutmak icin kullanılan EEPROM'a kayıt yapabilmek icin kullanılan Kutuphane
#include <EEPROM.h>
// Zaman hesapları ve Saat makina kapalı olsada calismasi ve zamani tutmasi icin gerekli kutuphane
#include <RTCx.h>
// I2C ile calisan Saat (RTC) ve LCD ile haberlesmek icin gereken kutuphane
#include <Wire.h>
// Arduino kilitlenirse bunu tespit edip Arduino'yu tekrardan baslatacak olan Kutuphane
#include <avr/wdt.h>
// LCD Ekran ile haberlesmek icin gereken iki Kutuphane
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// Sıcaklik sensoru DHT11 veya DHT22 yi kullanabilmek icin gereken kutuphane
#include "DHT.h" // sıcaklık kütüphanesi

#define DHTPIN 3        // DHT11PIN olarak Dijital 3 belirtiyorum belirliyoruz.
#define DHTTYPE DHT22   // DHT 22 Sensoru Kullandigimizi belirtiyoruz.

//LCD
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified module

//Sicaklık Tanımlaması Yapıyoruz
DHT dht(DHTPIN, DHTTYPE);

//////////////////////////////////////////
// Tum Program icinde kullanıcagımız degiskenleri tanımlıyoruz. EPPROM da tutulan degerler yanında belirtilmistir.
float derece = 0;                     // İstenen Sıcaklık Derecesi                                                    (EEPROM)
float derece_olcum;                   // Olculen Sicaklık Derecesi
float derece_kalibre = 0;             // İsi donanımında kalibrasyon yapmak icin (Fabrika Reset Sonrasi 0 Olur)       (EEPROM)        (-5.00 ... 0 .. +5.00 )
long dereceolcmesec = 0;              // Her Saniyede 1 Kere sicaklik olcumu yapmak icin gerekli TEMP degisken
float derece_max;                     // Sıcaklık yukseldigi takdirde en yuksek sicaklıgı ekranda gostermek icin
int nem = 0 ;                         // Istenen Nem Değeri                                                           (EEPROM)
float nem_olcum;                      // Olculen Nem Degeri
int dondurme_saniye = 0;              // Viyollerin Kac Saniye Dondurulecegini tutan degisken                         (EEPROM)       (1 - 15 Sn)
int dondurme_zaman = 0;               // Viyollerin Kac Dakikada bir dondurulecegini tutan degisken                   (EEPROM)       (60 - 120 - 180 240 Dk)
int sogutma_suresi = 0;               // Günde 1 defa yumurta dinlendirme işlem süresi                                (EEPROM)       (0 - 60 - 120 Dk)
int kulucka_suresi = 21;              // Kulucka Suresi Gun olarak                                                    (EEPROM)       (1 - 45 Gun)
long kulucka_suresi_baslangic = 0;    // Kulucka baslangic tarihi Unixtimestamp olarak tutuluyor                      (EEPROM)      
long kalan_gun = 0;                   // Ekranda kalan gunu gostermek icin

int siradaki_dondurme_zamani = -1;    // Bir sonraki dondurme zamanını hesaplayıp tutar. Saat olarak (14:45:55 ise 14 tutar )
int son_dondurme_zamani = -1;         // Aynı saat icinde iki kere dondurmesin diye son Dondurme Zamanını tutar Saat olarak (14:45:55 ise 14 tutar )
long cevirmeMillis = 0;               // Cevirme Baslangic suresi ms olarak tutulur. Suanki ms > cevirme ms + (dondurme_saniye * 1000) ise dondurme kapatilir.
char mode = 'S';                      // Menuler icin yardimci degisken S = Setup   R = Calis   W = Saat Ayarlama M = Ana Menu
int menu = 0;                         // Ana menu icin yardimci degisken  0 => Ayarlama Menusu 1=> Saat Ayarlama 2=> Fabrika Ayarları 3=>Isı Kalibarasyon 4=>Yeni Kulucka Girisi 5=>Cikis
char ayar_duzenle = 'H';              // Menuler icin yardimci degisken H = Baslangic Tarih Sıfırlar E = Tarih Sabit Kalır

//////////////////////////////////////////
// Dugmeler
int asagiPin  = 8;                    // Asagi  Dugmesi Arduino ustunde 8 Nolu pin e baglanacak
int yukariPin = 7;                    // Yukari Dugmesi Arduino ustunde 7 Nolu pin e baglanacak
int okPin     = 9;                    // Tamam  Dugmesi Arduino ustunde 9 Nolu pin e baglanacak
int asagi     = 0;                    // Asagi Dugmesi icin degisken
int yukari    = 0;                    // Yukari Dugmesi icin degisken
int ok        = 0;                    // Tamam dugmesi icin degisken

//////////////////////////////////////////
// Relaylar
#define RELAY_ISI  4                  // Isı Acma Kapama icin Pın Tanımlama
#define RELAY_NEM  5                  // Nem acma Kapama icin Nem Tanımlama
#define RELAY_CEVIR  6                // Birinci Viyol icin Pin Tanımlama
#define RELAY_CEVIR_B  10             // İkinci Viyol icin Pin Tanımlama

//////////////////////////////////////////
// LED ler
int LED0 = 14;                        // Isıtıcı Led Pin Tanımlama
int LED1 = 15;                        // Nem Led Pin Tanımlama
int LED2 = 16;                        // Cevirici Led Pin Tanımlama

// LCD Ekran Korucu
int screensaver = 0 ;                 // Ekran koruyucu icin gecici degisken

void setup() {
  // Kilitlenme
  wdt_enable(WDTO_4S);                 // Kilitlenme Olursa diye 4 Saniyelik bir sure tanımlıyoruz ve fonk. baslatiyoruz. Eğer program 4 sn icinde tekrar aynı yere gelmez ise Arduino Reset atacak kendine
    dht.begin();                       // Isı Sensorunu Baslatiyoruz
  // Ledlerin Cikis oldugunu belirtiyoruz
  pinMode(LED0, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  // Ses
  pinMode(3, OUTPUT);                

  // Relaylar
  pinMode(RELAY_ISI, OUTPUT);
  pinMode(RELAY_NEM, OUTPUT);
  pinMode(RELAY_CEVIR, OUTPUT);
  pinMode(RELAY_CEVIR_B, OUTPUT);

  digitalWrite(RELAY_ISI,HIGH);
  digitalWrite(RELAY_NEM,HIGH);
  digitalWrite(RELAY_CEVIR,HIGH);
  digitalWrite(RELAY_CEVIR_B,HIGH);
    
  // Bilgisayara Bagli iken DEBUG mod icin
  // Serial.begin(9600);

  // I2C iletişimi icin Wire protokolunu baslatiyoruz
  Wire.begin();                    
  ////////////////////////////////////  
  //Saat Başlatma
  uint8_t addressList[] = {RTCx::MCP7941xAddress, RTCx::DS1307Address};
  if (rtc.autoprobe(addressList, sizeof(addressList))) {
    // Serial.print("Autoprobe found ");
    switch (rtc.getDevice()) {
      case RTCx::DS1307:
    // Serial.print("DS1307");
  break;
    case RTCx::MCP7941x:
      // Serial.print("MCP7941x");
      break;
    default:
      // Ooops. Must update this example!
      // Serial.print("unknown device");
      break;
    }
    // Serial.print(" at 0x");
    // Serial.println(rtc.getAddress(), HEX);
  }
  else {
    // Nothing found at any of the addresses listed.
    // Serial.println("No RTCx found");
    return;
  }

  // Enable the battery backup. This happens by default on the DS1307
  // but needs to be enabled on the MCP7941x.
  rtc.enableBatteryBackup();

  // Ensure the oscillator is running.
  rtc.startClock();

  if (rtc.getDevice() == RTCx::MCP7941x) {
    // Serial.print("Calibration: ");
    // Serial.println(rtc.getCalibration(), DEC);
    // rtc.setCalibration(-127);
  }

  rtc.setSQW(RTCx::freq4096Hz);
  ////////////////////////////////////////////////////////////
  // Saat Baslatma bitti
  
  
  mode =  EEPROM.read(16);   // Calisma Modunu EEPROMdan okuyoruz
  if(mode == 0)
  {
      // Mode yok ise Direkt ayarlama Menusune Gidiyoruz.
      mode = 'S';              
      EEPROM.write(16, mode);
  }
  
  // Eger Mod calisma modunda ise EEPROMdan gerekli bilgileri sadece 1 kereye mahsus okuyoruz.
  if(mode == 'R')
  {
     //derece =  EEPROM.read(20);
     EEPROM_readAnything(20, derece);
     nem = EEPROM.read(24);
     dondurme_saniye = EEPROM.read(28);
     dondurme_zaman = EEPROM.read(32);
     sogutma_suresi = EEPROM.read(36);
     kulucka_suresi = EEPROM.read(40);
     // Bitis timestamp okuyoruz
     EEPROM_readAnything(44, kulucka_suresi_baslangic);
     // Kalibrasyon Okuma
     EEPROM_readAnything(54, derece_kalibre);
  }

  // Ekrani aciyor ve temizliyoruz
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);
  lcd.clear();

  // Dugmelerin Giriş Oldugunu tanimliyoruz.
  pinMode(asagiPin, INPUT);
  pinMode(yukariPin, INPUT);
  pinMode(okPin, INPUT);
}

  // Dugmelere basili tutuldugunu anlamak icin gerekli gecici Degiskenler
  long onTime = 0;
  int lastReadingOk = LOW;
  int hold = 0;
  // Saat Ayarlama icin gerekli gecici degiskenler
  int saat_menu = 1;
  int temp_tarih = 0;
  int temp_gun = 0;
  int temp_ay = 0;
  int temp_yil = 0;
  int temp_saat = 0;
  int temp_dakika = 0;


// Ana Program Burda Basliyor

void loop() {
  wdt_reset();      // Kilitlenme İcin Gerekli Fonksiyonu Cagiriyoruz. Eğer 4 sn icinde program tekrar bu satıra gelmez ise Reset atıyor kendine
  //Saat icin
  struct RTCx::tm tm;
        ///////////////////////
        // Saat ayarlamasına Giriş Ekranı
       if(mode == 'W')
       {
        asagi = digitalRead(asagiPin);
        yukari = digitalRead(yukariPin);
        ok = digitalRead(okPin);
        
        lcd.setBacklight(HIGH);
          
        lcd.setCursor(0, 0);
        lcd.print("Tarih Ayarlama     ");

        if(temp_tarih == 0)
        {
            rtc.readClock(tm);
            temp_gun = tm.tm_mday;
            temp_ay = tm.tm_mon+1;
            temp_yil = tm.tm_year+1900;
            temp_saat = tm.tm_hour;
            temp_dakika = tm.tm_min;
            temp_tarih = 1; // Kayitta Sifirlanacak
        }

        lcd.setCursor(1, 2);
        if(temp_gun < 10){lcd.print(" ");}
        lcd.print(temp_gun);
        lcd.print("/");
        if(temp_ay < 10){lcd.print(" ");}
        lcd.print(temp_ay);
        lcd.print("/");        
        lcd.print(temp_yil);
        lcd.print("-");
        if(temp_saat < 10){lcd.print("0");}
        lcd.print(temp_saat);
        lcd.print(":");
        if(temp_dakika < 10){lcd.print("0");}
        lcd.print(temp_dakika);

                  
          lcd.setCursor(0, 3);
          lcd.print("Ayarla OK");
          
          if(saat_menu == 1)
          {
            //Gun Ayarla
            lcd.setCursor(2, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_gun = temp_gun - 1;
             }
             if(yukari == HIGH)
             {
                temp_gun = temp_gun + 1;
             }
             if(temp_gun < 1)
             {
              temp_gun = 1;
             }
             if(temp_gun > 31)
             {
              temp_gun = 31;
             }
          }
          if(saat_menu == 2)
          {
            //Ay Ayarla
            lcd.setCursor(5, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_ay = temp_ay - 1;
             }
             if(yukari == HIGH)
             {
                temp_ay = temp_ay + 1;
             }
             if(temp_ay < 1)
             {
              temp_ay = 1;
             }
             if(temp_ay > 12)
             {
              temp_ay = 12;
             }
          }
          if(saat_menu == 3)
          {
            //Yil Ayarla
            lcd.setCursor(10, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_yil = temp_yil - 1;
             }
             if(yukari == HIGH)
             {
                temp_yil = temp_yil + 1;
             }
             if(temp_yil < 2016)
             {
              temp_yil = 2016;
             }
             if(temp_yil > 2020)
             {
              temp_yil = 2020;
             }
          }
          if(saat_menu == 4)
          {
            //Saat Ayarla
            lcd.setCursor(13, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_saat = temp_saat - 1;
             }
             if(yukari == HIGH)
             {
                temp_saat = temp_saat + 1;
             }
             if(temp_saat < 0)
             {
              temp_saat = 0;
             }
             if(temp_saat > 23)
             {
              temp_saat = 23;
             }
          }
          if(saat_menu == 5)
          {
            //Dakika Ayarla
            lcd.setCursor(16, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_dakika = temp_dakika - 1;
             }
             if(yukari == HIGH)
             {
                temp_dakika = temp_dakika + 1;
             }
             if(temp_dakika < 0)
             {
              temp_dakika = 59;
             }
             if(temp_dakika > 59)
             {
              temp_dakika = 0;
             }
          }
          
          if(ok != HIGH)
           {
            
             saat_menu ++;
             if(saat_menu > 5)
             {
             if(ok != HIGH)
             {
                 // Clock Set
                
                 tm.tm_min   = temp_dakika;
                 tm.tm_hour  = temp_saat;
                 tm.tm_wday  = 0;
                 tm.tm_mday  = temp_gun;
                 tm.tm_mon   = temp_ay-1;
                 tm.tm_year  = temp_yil-2000;

                 rtc.setClock(&tm);
                 saat_menu = 1;
                 temp_tarih = 0;
                 mode = 'R';
                 lcd.clear();
                 lcd.noBlink();
             }
             }
           }
           delay(100);
       }

  ////////////////////////////
  // Ana Menu
  if(mode == 'A')
  {
     // Menuye girerse Isıtıcı ve Nemi Kapa
     if(digitalRead(RELAY_ISI)!=HIGH)
     {
       digitalWrite(RELAY_ISI,HIGH);
       delay(50);
       digitalWrite(LED0,LOW);
     }
     if(digitalRead(RELAY_NEM)!=HIGH)
     {
       digitalWrite(RELAY_NEM,HIGH);
       delay(50);
       digitalWrite(LED1,LOW);
     }
        
     // Menu 0 -> Ayar
     // Menu 1 -> Saat
     // Menu 2 -> Reset
     // Menu 3 -> Isı Kalibre
     // Menu 4 -> Yeni Kulucka Girisi
     // Menu 5 -> Cikis
     asagi = digitalRead(asagiPin);
     yukari = digitalRead(yukariPin);
     ok = digitalRead(okPin);
     lcd.setCursor(0, 0);
     lcd.print("MENU SEC            ");
     if(asagi == HIGH)
     {
        menu = menu - 1;
     }
     if(yukari == HIGH)
     {
        menu = menu + 1;
     }
     if(menu < 0){menu = 5;}
     if(menu > 5){menu = 0;}
          
     if(menu == 0)
     {
        lcd.setCursor(0, 1);
        lcd.print("Ayarlari Duzenle    ");
     }
     if(menu == 1)
     {
        lcd.setCursor(0, 1);
        lcd.print("Saat Ayarlama Menusu");
     }
     if(menu == 2)
     {
        lcd.setCursor(0, 1);
        lcd.print("Fabrika Ayarlari    ");
     }
     if(menu == 3)
     {
        lcd.setCursor(0, 1);
        lcd.print("Isi Kalibrasyon     ");
     }
     if(menu == 4)
     {
        lcd.setCursor(0, 1);
        lcd.print("Yeni Kulucka Girisi ");
     }
     if(menu == 5)
     {
        lcd.setCursor(0, 1);
        lcd.print("Cikis               ");
     }
     if(ok == LOW)
     {
          lcd.clear();
          if(menu == 0)
          {
            ayar_duzenle = 'E';
            mode = 'S';
          }
          if(menu == 1)
          {mode = 'W';}
          if(menu == 2)
          {
              /////////////
              // Eppromu sil
              mode = 'S';
              for (int i = 0 ; i < EEPROM.length() ; i++) {
                EEPROM.write(i, 0);
              }
          }
          if(menu == 3)
          {
              // Isı Kalibrasyonu Yap
              mode = 'H';
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("Isi Kalibrasyon");
              
          }
          if(menu == 4)
          {
            // Yeni Kulucka Girisi
            mode = 'S';
            ayar_duzenle = 'H';
          }
          
          if(menu == 5)
          {
              // Calismaya DeVam Et
              mode = 'R';
          }
          menu = 0;
     }
     delay(150);
  }

///////////////////////////////
// ISI Sensor Kalibrasyon + -
if(mode == 'H')
{
  asagi = digitalRead(asagiPin);
  yukari = digitalRead(yukariPin);
  ok = digitalRead(okPin);
  
  Serial.println(asagi);
  if(asagi == LOW)
   {
      derece_kalibre = derece_kalibre + 0.1;
   }
   if(yukari == LOW)
   {
      derece_kalibre = derece_kalibre - 0.1;
   }
  if(derece_kalibre > 5) {derece_kalibre = +5;}
  if(derece_kalibre < -5) {derece_kalibre = -5;}
  lcd.setCursor(0, 1);
  lcd.print(derece_kalibre);
  lcd.print(" ");
  if(ok == LOW)
  {
      // Derece Kalibre Et
      EEPROM_writeAnything(54, derece_kalibre);
      mode = 'A';
      menu = 3;
      delay(150);
  }
  delay(100);
}


  // Kulucka Genel Ayarlama Menusu
  if(mode == 'S')
  {
      lcd.setCursor(0, 0);
      lcd.print("KURULUM MENUSU");
      asagi = digitalRead(asagiPin);
      yukari = digitalRead(yukariPin);
      ok = digitalRead(okPin);
      /////////////////
      // Sıcaklık Ayarı
      if(menu == 0)
      {
          if(derece == 0) { derece = 37,5;};
          lcd.setCursor(0, 1);
          lcd.print("SICAKLIK: ");
          if(asagi == HIGH)
           {
              derece = derece - 0.1;    
           }
           if(yukari == HIGH)
           {
              derece = derece + 0.1;    
           }
           if(derece <= 25)
           {
            derece = 25;
           }
           if(derece > 41)
           {
            derece = 41;
           }
           if(ok != HIGH)
           {
               while(ok != HIGH)
               {
                    ok = digitalRead(okPin);
               }
               menu = 1;
               lcd.clear();
           }
          lcd.print(derece);
          lcd.print(" C");
          lcd.setCursor(0, 4);
          lcd.print("SONRAKI ICIN OK");
       }
       // Nem Ayarı
       if(menu == 1)
       {
           lcd.setCursor(0, 1);
           lcd.print("NEM : ");
           if(nem == 0) { nem = 50;};

           if(asagi == HIGH)
           {
              nem = nem - 1;    
           }
           if(yukari == HIGH)
           {
              nem = nem + 1;    
           }
           if(nem <= 40)
           {
            nem = 40;
           }
           if(nem > 85)
           {
            nem = 85;
           }
           lcd.print(nem);
          lcd.print(" %");
          lcd.setCursor(0, 4);
          lcd.print("SONRAKI ICIN OK");
          if(ok != HIGH)
           {
               while(ok != HIGH)
               {
                ok = digitalRead(okPin);
               }
               menu = 2;
               lcd.clear();
           }
       }
       // Dondurme Ayarı Açı
       if(menu == 2)
       {
           if(dondurme_saniye == 0) {dondurme_saniye = 10;};
           lcd.setCursor(0, 1);
           lcd.print("Dondurme Sn   : ");
           lcd.setCursor(0, 2);
           lcd.print("Dondurme Suresi: ");
           lcd.setCursor(0, 4);
           lcd.print("SONRAKI ICIN OK");
           lcd.setCursor(17, 1);
           lcd.print(dondurme_saniye);
           lcd.print(" ");
           lcd.setCursor(14, 1);
           lcd.blink();

           if(asagi == HIGH)
           {
              dondurme_saniye = dondurme_saniye - 1;    
           }
           if(yukari == HIGH)
           {
              dondurme_saniye = dondurme_saniye + 1;    
           }
           if(dondurme_saniye <= 1)
           {
            dondurme_saniye = 1;
           }
           if(dondurme_saniye > 15)
           {
            dondurme_saniye = 15;
           }
          
           if(ok != HIGH)
           {
               while(ok != HIGH)
               {
                ok = digitalRead(okPin);
                lcd.noBlink();
               }
               menu = 3;
               lcd.clear();
           }
       }
       // Dondurme Zamani
       if(menu == 3)
       {
           if(dondurme_zaman == 0) {dondurme_zaman = 60;};
           lcd.setCursor(0, 1);
           lcd.print("Dondurme Sn   :  ");
           lcd.setCursor(0, 2);
           lcd.print("Dondurme Suresi:   ");
           lcd.setCursor(17, 1);
           lcd.print(dondurme_saniye);
           lcd.print(" ");
           lcd.setCursor(16, 2);
           if(dondurme_zaman == 60) {lcd.setCursor(17, 2);};
           lcd.print(dondurme_zaman);
           lcd.setCursor(0, 4);
           lcd.print("SONRAKI ICIN OK");
          
           lcd.setCursor(15, 2);
           lcd.blink();

           if(asagi == HIGH)
           {
              dondurme_zaman = dondurme_zaman - 60;    
           }
           if(yukari == HIGH)
           {
              dondurme_zaman = dondurme_zaman + 60;    
           }
           if(dondurme_zaman <= 60)
           {
            dondurme_zaman = 60;
           }
           if(dondurme_zaman > 240)
           {
            dondurme_zaman = 240;
           }
             if(ok != HIGH)
             {
                 while(ok != HIGH)
                 {
                  ok = digitalRead(okPin);
                  lcd.noBlink();
                 }
                 menu = 4;
                 // Ayarlar değiştir dondurme tekrar hesaplanacak
                 siradaki_dondurme_zamani = -1;
                 son_dondurme_zamani = -1;
                 lcd.clear();
             }
          
       }
       // Sogutma Zamanı
       if(menu == 4)
       {
          lcd.setCursor(0, 1);
          lcd.print("Sogutma Suresi dk.:  ");

          lcd.setCursor(10, 2);
          if(sogutma_suresi < 70) {lcd.print(" "); lcd.setCursor(11, 2);};
          
          lcd.print(sogutma_suresi);

          if(asagi == HIGH)
           {
              sogutma_suresi = sogutma_suresi - 60;    
           }
           if(yukari == HIGH)
           {
              sogutma_suresi = sogutma_suresi + 60;    
           }
           if(sogutma_suresi <= 0)
           {
            sogutma_suresi = 0;
           }
           if(sogutma_suresi > 120)
           {
            sogutma_suresi = 120;
           }
          
             if(ok != HIGH)
             {
                 while(ok != HIGH)
                 {
                  ok = digitalRead(okPin);
                  lcd.noBlink();
                 }
                 menu = 5;
                 lcd.clear();
             }
          
       }
       if(menu == 5)
       {
          lcd.setCursor(0, 1);
          lcd.print("Kulucka Suresi Gun:  ");

          lcd.setCursor(10, 2);
          if(kulucka_suresi < 10) {lcd.print(" "); lcd.setCursor(11, 2);};
          
          lcd.print(kulucka_suresi);

          lcd.setCursor(0, 3);
          lcd.print("Sonraki icin OK");

          if(asagi == HIGH)
           {
              kulucka_suresi = kulucka_suresi - 1;    
           }
           if(yukari == HIGH)
           {
              kulucka_suresi = kulucka_suresi + 1;    
           }
           if(kulucka_suresi <= 1)
           {
            kulucka_suresi = 1;
           }
           if(kulucka_suresi > 45)
           {
            kulucka_suresi = 45;
           }
           if(ok != HIGH)
           {
             if(ok != HIGH)
             {
                 while(ok != HIGH)
                 {
                  ok = digitalRead(okPin);
                  lcd.noBlink();
                 }
                  mode = 'R';
                  menu = 0;
                  lcd.clear();
                  
                  EEPROM.write(16, mode);
                  // Degişkenleri Yaz
                  // Kulucka Derecesi
                  //EEPROM.write(20, derece);
                  EEPROM_writeAnything(20, derece);
                  // Nem
                  EEPROM.write(24, nem);
                  // Dondurme acisi
                  EEPROM.write(28, dondurme_saniye);
                  // Dondurme Zaman
                  EEPROM.write(32, dondurme_zaman);
                  // Sogutma Suresi
                  EEPROM.write(36, sogutma_suresi);
                  // Kulucka Suresi
                  EEPROM.write(40, kulucka_suresi);
                  // Kulucka Suresi Bitis
                  rtc.readClock(tm);
                  RTCx::time_t t = RTCx::mktime(&tm);
                  
                  if(ayar_duzenle == 'E')
                  {
                    
                  }
                  if(ayar_duzenle == 'H')
                  {
                    // Suani baslangic gunu olarak yaziyoruz. Unixtimestamp
                    // Edit te yazmamak lazım !!!
                    EEPROM_writeAnything(44, t);
                  }
             }
           }
       }
      delay(100);
  }
  //////////////////
  // Calisma Menusu
  if(mode == 'R')
  {
    
    asagi = digitalRead(asagiPin);
    yukari = digitalRead(yukariPin);
    // Yukari Dugmesine basinca 1. viyolu dondurur
    while(yukari != HIGH)
    {
        if(digitalRead(RELAY_CEVIR)!=LOW)
        {
          digitalWrite(RELAY_CEVIR,LOW);
          digitalWrite(LED2,HIGH);
        }
        asagi = digitalRead(asagiPin);
        yukari = digitalRead(yukariPin);
        // Kilitlenme
        wdt_reset(); // Kilitlenme İcin Gerekli Fonksiyonu Cagiriyoruz. Eğer 4 sn icinde program tekrar bu satıra gelmez ise Reset atıyor kendine
    }

    // Asagi Dugmesine basinca 2. viyolu dondurur
    while(asagi != HIGH)
    {
        if(digitalRead(RELAY_CEVIR_B)!=LOW)
        {
          digitalWrite(RELAY_CEVIR_B,LOW);
          digitalWrite(LED2,HIGH);
        }
        asagi = digitalRead(asagiPin);
        yukari = digitalRead(yukariPin);
        // Kilitlenme
        wdt_reset(); // Kilitlenme İcin Gerekli Fonksiyonu Cagiriyoruz. Eğer 4 sn icinde program tekrar bu satıra gelmez ise Reset atıyor kendine
    }
    
    // Dugmeler
    ok = digitalRead(okPin);
    
    // Isi Kontrol
    lcd.setCursor(0, 0);
    lcd.print("D: ");
    lcd.setCursor(2, 0);
    lcd.print(derece);
    lcd.setCursor(0, 1);
    lcd.print("N:");
    lcd.setCursor(2, 1);
    lcd.print(nem);
    lcd.setCursor(0, 2);
    lcd.print("G:");
    lcd.setCursor(2, 2);
    lcd.print(kulucka_suresi);
    /////////////////
    // Ekran Koruyucu Devreye giriyor
    screensaver ++ ;
    if(screensaver > 150)
    {
        if(screensaver < 200)
        {
        lcd.clear();
        lcd.setBacklight(LOW);
        screensaver = 200;
        }        
    }
    /////////////////
    // Ekran Koruyucu pasif
    if(ok != HIGH)
    {
        lcd.setBacklight(HIGH);
        screensaver = 0;
    }    
     ///////////////////////////////////////////////////////////
     // Ortam Sıcaklıgı ve Nem Ölçme Her saniye kontrol ediliyor
     //
     if(dereceolcmesec !=  tm.tm_sec)
     {
      derece_olcum = dht.readTemperature();
      derece_olcum = derece_olcum + derece_kalibre;
      nem_olcum = dht.readHumidity();
      dereceolcmesec = tm.tm_sec;
     }
     /////////////////////////
     // Nem Almayi Kapa
     if(nem < nem_olcum)
      {
        // NEM vermeyi kapa
        digitalWrite(RELAY_NEM,HIGH);
        delay(20);
        digitalWrite(LED1,LOW);
        // Fark cok ise nem alma icin bir relay ayarlanabilir.
        lcd.setCursor(19, 1);
        lcd.print(" ");
      }
     // Isıtıcıyı Kapa
     if(derece < derece_olcum)
     {
        // Isıtıcı Kapa
        digitalWrite(RELAY_ISI,HIGH);
        delay(50);
        digitalWrite(LED0,LOW);
        lcd.setCursor(19, 0);
        lcd.print(" ");
     }
     /////////////////////////////////////////////
     // Isı Sensoru Hata kontrol
     if (isnan(nem_olcum) || isnan(derece_olcum))
     {
        // Nem Sensoru Bozuk
        lcd.clear();
        lcd.setCursor(5, 3);
        lcd.print("Hata");
        
        if (isnan(nem_olcum))
        {
        lcd.print(" Nem");
        }
        if (isnan(derece_olcum))
        {
        lcd.print(" ISI");
        }
        // Hata verirse isitici ve nemi kapa
         if(digitalRead(RELAY_ISI)!=HIGH)
         {
           digitalWrite(RELAY_ISI,HIGH);
           delay(50);
         }
         if(digitalRead(RELAY_NEM)!=HIGH)
         {
           digitalWrite(RELAY_NEM,HIGH);
           delay(50);
         }
         // Isı sensoru hatalı oldugu icin Reset atsin diye 5 SN delay veriyoruz
         delay(5000);
     }
     else
     {
        lcd.setCursor(12, 3);
        lcd.print("        ");
        
        lcd.setCursor(8, 0);
        lcd.print(derece_olcum, 2);

        if(derece_olcum > derece_max)
        {
          derece_max = derece_olcum;
        }
        // Maksimum Derece Yazdırma
        lcd.print("M");
        lcd.print(derece_max, 2);
      
        lcd.setCursor(8, 1);
        lcd.print(nem_olcum);

        // Kalan Gun Hesabı
        rtc.readClock(tm);
        RTCx::time_t t = RTCx::mktime(&tm);
        ///////////////////////////////////////
        // Bitis suresinden bugunu cikartiyoruz
        kalan_gun = t - kulucka_suresi_baslangic;
        // Kalan gunu hesaplıyoruz
        kalan_gun = kalan_gun / 60 / 60 / 24;
        kalan_gun = kulucka_suresi - kalan_gun;

        //Serial.println(kulucka_suresi_baslangic);
        
        lcd.setCursor(5, 2);
        lcd.print(kalan_gun);
        lcd.setCursor(7, 2);
        lcd.print(" Gun");
        
        rtc.readClock(tm);
        lcd.setCursor(1, 3);
        printTm(Serial, &tm);
        
        
        lcd.setCursor(13, 2);
        lcd.print("Cev:");
        if(siradaki_dondurme_zamani < 10 && siradaki_dondurme_zamani > 0){lcd.print("0"); }
        if(siradaki_dondurme_zamani > -1)
        {
        lcd.print(siradaki_dondurme_zamani);
        }
        delay(100);
     }
    /////////////////
    // Cevirme Kapama
    
    if (millis() - cevirmeMillis >= dondurme_saniye*1000 && cevirmeMillis>0)
    {
        digitalWrite(RELAY_CEVIR,HIGH);
        delay(50);
        digitalWrite(RELAY_CEVIR_B,HIGH);
        delay(50);
        digitalWrite(LED2,LOW);
        cevirmeMillis = 0;
    }
    if(tm.tm_sec == 30)
    {
      ////////////////////////////////////////
      // Yumurta Çevirme
      // dondurme_zaman 60->1 120->2 180->3 240->4

      //Dondurme Set edilmedi ise
      if(siradaki_dondurme_zamani == -1)
      {
          // Daha Once hiç Donmedi ise makina ilk acildiginda 1 kere dondurme islemi yapmasını sağlıyoruz
          siradaki_dondurme_zamani =  tm.tm_hour;
      }
      
      if(tm.tm_hour == siradaki_dondurme_zamani && son_dondurme_zamani != siradaki_dondurme_zamani or ok != HIGH)
      {
            // Yumurta Dondur
            //Serial.print(digitalRead(RELAY_CEVIR));
            
            digitalWrite(RELAY_CEVIR,LOW);
            delay(50);
            digitalWrite(RELAY_CEVIR_B,LOW);
            delay(50);
            digitalWrite(LED2,HIGH);
            cevirmeMillis = millis();
            
            if(dondurme_zaman == 60)
            {siradaki_dondurme_zamani = tm.tm_hour+1;}
            if(dondurme_zaman == 120)
            {siradaki_dondurme_zamani = tm.tm_hour+2;}
            if(dondurme_zaman == 180)
            {siradaki_dondurme_zamani = tm.tm_hour+3;}
            if(dondurme_zaman == 240)
            {siradaki_dondurme_zamani = tm.tm_hour+4;}
            // Bir Daha Bu saatte Donmesin
            son_dondurme_zamani = tm.tm_hour;
            if(siradaki_dondurme_zamani > 23) {siradaki_dondurme_zamani = siradaki_dondurme_zamani-24;}
      }
    }
    
    if(tm.tm_sec == 15 or tm.tm_sec == 45)
    {
            ///////////////
            // Sogutma Kodu
            if((tm.tm_hour == 12 && sogutma_suresi > 0) or (tm.tm_hour == 13 && sogutma_suresi > 60))
            {
               // ISI ve Nemi kapa
               if(digitalRead(RELAY_ISI)!=HIGH)
               {
                 digitalWrite(RELAY_ISI,HIGH);
                 delay(50);
               }
               if(digitalRead(RELAY_NEM)!=HIGH)
               {
                 digitalWrite(RELAY_NEM,HIGH);
                 delay(50);
               }
               lcd.setCursor(19, 0);
               lcd.print("S");
            }
            else
            {
              // Isi Kontrol
              if(derece > derece_olcum)
              {
                // Isıtıcı Aç
                digitalWrite(RELAY_ISI,LOW);
                delay(50);
                digitalWrite(LED0,HIGH);
                delay(50);
                lcd.setCursor(19, 0);
                lcd.print("C");
              }
              //////////////////////////////////////////
              // Nem Kontrol
              // Nem Az
              if(nem > nem_olcum)
              {
                // Nem Vermeyi etkinleştir
                digitalWrite(RELAY_NEM,LOW);
                digitalWrite(LED1,HIGH);
                lcd.setCursor(19, 1);
                lcd.print("C");
              }
            }
    }
    
    
    
    // Setup a Geri Donme
    // Menu İçin Basılı Tutma
    if (ok == LOW && lastReadingOk == HIGH) {
        // Serial.println("bas 1");
        onTime = millis();
    }
    //held
   if (ok == LOW && lastReadingOk == LOW) {
     if ((millis() - onTime) > 2500) {
       hold = 1;
        if ((millis() - onTime) > 5000) {
          hold = 2;
        }
     }
   }
   if (ok == HIGH && lastReadingOk == LOW)
   {
       onTime = 0;
       if (hold == 1) {
             hold = 0;
             mode = 'A';
             lcd.clear();
       }
       if (hold == 2) {
             hold = 0;
             mode = 'A';
             lcd.clear();
       }
   }
   lastReadingOk = ok;
    delay(20);
  }
}

// Saat i ekrana bastirmak icin fonksiyon
void printTm(Stream &str, struct RTCx::tm *tm)
{
  lcd.setCursor(0, 3);
  // Yıl gun ay bastirmiyoruz
  /*
  if(tm->tm_mday<10){lcd.print('0');}
  lcd.print(tm->tm_mday);
  lcd.print('/');
  if(tm->tm_mon<10){lcd.print('0');}
  lcd.print(tm->tm_mon + 1);
  lcd.print('/');
  lcd.print(tm->tm_year + 1900);
  
  lcd.print(' ');
  */
  if(tm->tm_hour<10){lcd.print('0');}
  lcd.print(tm->tm_hour);
  lcd.print(':');
  if(tm->tm_min<10){lcd.print('0');}
  lcd.print(tm->tm_min);
  lcd.print(':');
  if(tm->tm_sec<10){lcd.print('0');}
  lcd.print(tm->tm_sec);
}

// EEPROM a uzun degerleri kaydetmek ve okumak icin gerekli fonksiyon
template <class T> int EEPROM_writeAnything(int ee, const T& value)
{
    const byte* p = (const byte*)(const void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++)
          EEPROM.write(ee++, *p++);
    return i;
}

template <class T> int EEPROM_readAnything(int ee, T& value)
{
    byte* p = (byte*)(void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++)
          *p++ = EEPROM.read(ee++);
    return i;
}
Ara
Cevapla
İbrahim Selcuk 04-01-2016, Saat: 08:40 AM   
#29
Selamlar,

İlk başta iki gün sorun yaşamama rağmen bugun fener ile döl kontrolu yaptım.
Son durum şu şekilde 96 yumurtadan 1 kırık, 22 tane dölsüz var. Yani Potansiyel 73 civciv bekliyorum. Derece 41 lere çıkmış olmasına rağmen çok kayıp yok. Birde bu ilk calistirma ve test asamasi oldugu icin bence kabul edilebilir.

Şimdi esas sorun bu yumurtalar 41 dereceyi gordugu icin fiziksel bir bozukluk olacak mı yada olur mu ? Bakalım. Onuda ayın 14'unde hep birlikte göreceğiz.

Arduino konusunda ise ilk iki gün yaptığım değişikliklerden sonra 12 gündür sorunsuz çalışıyor. hiç bir aksaklık yaşamadım. Çok erken konuşmak istemem, ama eğer çıkım sürecine kadar ve çıkım sürecindede sorunsuz çalışır ise kesinlikle tercih edilebilir diye dusunuyorum.

Son olarak makinanın menulerini detaylı olarak aşağıdaki videodan izleyebilirsiniz.

Tesekkurler.



Ara
Cevapla
Erkan Şensoy 04-02-2016, Saat: 01:09 AM   
#30
(03-31-2016, Saat: 05:32 AM)İbrahim Selcuk Adlı Kullanıcıdan Alıntı: Arkadaslar Kodu Asagida paylasiyorum. Mumkun Oldugunca ayrıntılı kod kısmını acıklamaya calistim. Nereye ne takılacağı konusunda onceden paylastigim bir resim var. Kodun icindede aciklamalar var. İnsallah birilerinin işine yarar yardimci olur.

Tek ricam. Bir eksik bulursanız yada soyle olursa daha iyi olur dediğiniz bir nokta olur ise forumda ayrıntılı bir şekilde yazarsanız cok sevinirim.

Teşekkürler.
Kod:
//////////////////////////////////////////
// Sahansiz  Yumurta Ver. 0.0002
// I. S. Elmas 31 / 03 / 2016
// Guncel Versiyon icin
// http://www.kuluckaclub.com/konu-amator-arduino-ile-kulucka-makinasi.html
//
// Ne Nereye Baglanacak
/*
      Sıcaklık Sensoru  Pin 3
      RTC I2C uzerine
      LCD I2C uzerine

      Yukari Dugmesi    Pın 7
      Asagi Dugmesi     PIN 8
      Tamam Dugmesi     PIN 9

      Isıtıcı Relay Pin 4
      Nem     Relay Pin 5
      Viyol 1 Relay Pin 6
      Viyol 2 Relay Pin 10

      Isıtıcı Led   Pin 14
      Nem Led       Pin 15
      Cevirme Led   Pin 16

      Dugmelere ve Ledlere gerekli dirençlerin Bağlanması Gerekmektedir!

    // Yazılımın Temel Calisma Mantığı

    Arduino İlk acildiginda EEPROM'dan gerekli bilgileri okur eğer bilgi yok ise direkt Ayar Menusu ekrana gelir.
    Zaman Modulu sayesinde, Saniye 15 ve 45 geçe mevcut isi ve nemi kontrol eder. Eğer açmak gerekiyor ise isiticiyi yada
    nem nozulunu acar. Her saniye Isı ve Nem Degeri kontrol edilir. Eğer Isı veya Nem istenen değerin ustunde veya eşit ise
    Isıtıcıyı yada Nem Nozulunu Kapatir.

    Her Saat Basi Cevirme yapılıp yapılmayacagini kontrol eder. Eğer O Saat diliminde cevirme yapılacak ise saniye 30 olduğunda
    çevirme işlemini başlatır. Çevirme Süresi ayarlardan ne kadar girildi ise çevirme işlemini girilen saniye süresince yapar sonra
    kapatir.

    Soğutma işlemini Öğlen Saat 12:00 ile 14:00 arasi yapar. Eğer 60 dakika seçildi ise 12 ile 13 arasi isitici açmaz. Eğer
    120 Dakika girildi ise 12:00 ile 14:00 arasi isitma ve nem relaylerini açmaz.

    Eğer herhangi bir sebepten Arduino kilitlenir yada isi nem sensoru bozulur ise kendine reset atar. Eğer düzelmez ise
    bu kısır döngü devam eder.

    Ağağı düğmesine basılı tutulur ise birinci viyolu, yukarı düğmesine basılı tutulursa ikinci viyolu basılı tutulduğu sürece
    döndürür.

    Ana Menuye girmek icin Tamam duğmesine 5 Sn basılı tutmak gerekir. Menu icinde asagi yukari ile menu değiştirilir. Tamam
    duğmesi ile seçim yapılır. Eğer değer giriliyor ise yine Aşağı Yukarı düğmesi ile değer seçilir/girilir Tamam ile onaylanır ve
    sonraki seçeneklere geçilir.

    Tespit Edilen Eksikler:
    - Son iki gün çevirme durdurulabilir.
    - Isıtma Fonksiyonu biraz daha zamana göre akıllı çalışabilir. Mesela ısıtıcı maksimum 3 dk devamlı çalışır gibi bir
    koruma konulabilir. Yada Isı farkı sadece 0.10 derece ise 10 sn ısıt sonra kapat denilebilir.
*/

// Makina acip kapatildiginda bilgileri hafızada tutmak icin kullanılan EEPROM'a kayıt yapabilmek icin kullanılan Kutuphane
#include <EEPROM.h>
// Zaman hesapları ve Saat makina kapalı olsada calismasi ve zamani tutmasi icin gerekli kutuphane
#include <RTCx.h>
// I2C ile calisan Saat (RTC) ve LCD ile haberlesmek icin gereken kutuphane
#include <Wire.h>
// Arduino kilitlenirse bunu tespit edip Arduino'yu tekrardan baslatacak olan Kutuphane
#include <avr/wdt.h>
// LCD Ekran ile haberlesmek icin gereken iki Kutuphane
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// Sıcaklik sensoru DHT11 veya DHT22 yi kullanabilmek icin gereken kutuphane
#include "DHT.h" // sıcaklık kütüphanesi

#define DHTPIN 3        // DHT11PIN olarak Dijital 3 belirtiyorum belirliyoruz.
#define DHTTYPE DHT22   // DHT 22 Sensoru Kullandigimizi belirtiyoruz.

//LCD
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified module

//Sicaklık Tanımlaması Yapıyoruz
DHT dht(DHTPIN, DHTTYPE);

//////////////////////////////////////////
// Tum Program icinde kullanıcagımız degiskenleri tanımlıyoruz. EPPROM da tutulan degerler yanında belirtilmistir.
float derece = 0;                     // İstenen Sıcaklık Derecesi                                                    (EEPROM)
float derece_olcum;                   // Olculen Sicaklık Derecesi
float derece_kalibre = 0;             // İsi donanımında kalibrasyon yapmak icin (Fabrika Reset Sonrasi 0 Olur)       (EEPROM)        (-5.00 ... 0 .. +5.00 )
long dereceolcmesec = 0;              // Her Saniyede 1 Kere sicaklik olcumu yapmak icin gerekli TEMP degisken
float derece_max;                     // Sıcaklık yukseldigi takdirde en yuksek sicaklıgı ekranda gostermek icin
int nem = 0 ;                         // Istenen Nem Değeri                                                           (EEPROM)
float nem_olcum;                      // Olculen Nem Degeri
int dondurme_saniye = 0;              // Viyollerin Kac Saniye Dondurulecegini tutan degisken                         (EEPROM)       (1 - 15 Sn)
int dondurme_zaman = 0;               // Viyollerin Kac Dakikada bir dondurulecegini tutan degisken                   (EEPROM)       (60 - 120 - 180 240 Dk)
int sogutma_suresi = 0;               // Günde 1 defa yumurta dinlendirme işlem süresi                                (EEPROM)       (0 - 60 - 120 Dk)
int kulucka_suresi = 21;              // Kulucka Suresi Gun olarak                                                    (EEPROM)       (1 - 45 Gun)
long kulucka_suresi_baslangic = 0;    // Kulucka baslangic tarihi Unixtimestamp olarak tutuluyor                      (EEPROM)      
long kalan_gun = 0;                   // Ekranda kalan gunu gostermek icin

int siradaki_dondurme_zamani = -1;    // Bir sonraki dondurme zamanını hesaplayıp tutar. Saat olarak (14:45:55 ise 14 tutar )
int son_dondurme_zamani = -1;         // Aynı saat icinde iki kere dondurmesin diye son Dondurme Zamanını tutar Saat olarak (14:45:55 ise 14 tutar )
long cevirmeMillis = 0;               // Cevirme Baslangic suresi ms olarak tutulur. Suanki ms > cevirme ms + (dondurme_saniye * 1000) ise dondurme kapatilir.
char mode = 'S';                      // Menuler icin yardimci degisken S = Setup   R = Calis   W = Saat Ayarlama M = Ana Menu
int menu = 0;                         // Ana menu icin yardimci degisken  0 => Ayarlama Menusu 1=> Saat Ayarlama 2=> Fabrika Ayarları 3=>Isı Kalibarasyon 4=>Yeni Kulucka Girisi 5=>Cikis
char ayar_duzenle = 'H';              // Menuler icin yardimci degisken H = Baslangic Tarih Sıfırlar E = Tarih Sabit Kalır

//////////////////////////////////////////
// Dugmeler
int asagiPin  = 8;                    // Asagi  Dugmesi Arduino ustunde 8 Nolu pin e baglanacak
int yukariPin = 7;                    // Yukari Dugmesi Arduino ustunde 7 Nolu pin e baglanacak
int okPin     = 9;                    // Tamam  Dugmesi Arduino ustunde 9 Nolu pin e baglanacak
int asagi     = 0;                    // Asagi Dugmesi icin degisken
int yukari    = 0;                    // Yukari Dugmesi icin degisken
int ok        = 0;                    // Tamam dugmesi icin degisken

//////////////////////////////////////////
// Relaylar
#define RELAY_ISI  4                  // Isı Acma Kapama icin Pın Tanımlama
#define RELAY_NEM  5                  // Nem acma Kapama icin Nem Tanımlama
#define RELAY_CEVIR  6                // Birinci Viyol icin Pin Tanımlama
#define RELAY_CEVIR_B  10             // İkinci Viyol icin Pin Tanımlama

//////////////////////////////////////////
// LED ler
int LED0 = 14;                        // Isıtıcı Led Pin Tanımlama
int LED1 = 15;                        // Nem Led Pin Tanımlama
int LED2 = 16;                        // Cevirici Led Pin Tanımlama

// LCD Ekran Korucu
int screensaver = 0 ;                 // Ekran koruyucu icin gecici degisken

void setup() {
  // Kilitlenme
  wdt_enable(WDTO_4S);                 // Kilitlenme Olursa diye 4 Saniyelik bir sure tanımlıyoruz ve fonk. baslatiyoruz. Eğer program 4 sn icinde tekrar aynı yere gelmez ise Arduino Reset atacak kendine
    dht.begin();                       // Isı Sensorunu Baslatiyoruz
  // Ledlerin Cikis oldugunu belirtiyoruz
  pinMode(LED0, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  // Ses
  pinMode(3, OUTPUT);                

  // Relaylar
  pinMode(RELAY_ISI, OUTPUT);
  pinMode(RELAY_NEM, OUTPUT);
  pinMode(RELAY_CEVIR, OUTPUT);
  pinMode(RELAY_CEVIR_B, OUTPUT);

  digitalWrite(RELAY_ISI,HIGH);
  digitalWrite(RELAY_NEM,HIGH);
  digitalWrite(RELAY_CEVIR,HIGH);
  digitalWrite(RELAY_CEVIR_B,HIGH);
    
  // Bilgisayara Bagli iken DEBUG mod icin
  // Serial.begin(9600);

  // I2C iletişimi icin Wire protokolunu baslatiyoruz
  Wire.begin();                    
  ////////////////////////////////////  
  //Saat Başlatma
  uint8_t addressList[] = {RTCx::MCP7941xAddress, RTCx::DS1307Address};
  if (rtc.autoprobe(addressList, sizeof(addressList))) {
    // Serial.print("Autoprobe found ");
    switch (rtc.getDevice()) {
      case RTCx::DS1307:
    // Serial.print("DS1307");
  break;
    case RTCx::MCP7941x:
      // Serial.print("MCP7941x");
      break;
    default:
      // Ooops. Must update this example!
      // Serial.print("unknown device");
      break;
    }
    // Serial.print(" at 0x");
    // Serial.println(rtc.getAddress(), HEX);
  }
  else {
    // Nothing found at any of the addresses listed.
    // Serial.println("No RTCx found");
    return;
  }

  // Enable the battery backup. This happens by default on the DS1307
  // but needs to be enabled on the MCP7941x.
  rtc.enableBatteryBackup();

  // Ensure the oscillator is running.
  rtc.startClock();

  if (rtc.getDevice() == RTCx::MCP7941x) {
    // Serial.print("Calibration: ");
    // Serial.println(rtc.getCalibration(), DEC);
    // rtc.setCalibration(-127);
  }

  rtc.setSQW(RTCx::freq4096Hz);
  ////////////////////////////////////////////////////////////
  // Saat Baslatma bitti
  
  
  mode =  EEPROM.read(16);   // Calisma Modunu EEPROMdan okuyoruz
  if(mode == 0)
  {
      // Mode yok ise Direkt ayarlama Menusune Gidiyoruz.
      mode = 'S';              
      EEPROM.write(16, mode);
  }
  
  // Eger Mod calisma modunda ise EEPROMdan gerekli bilgileri sadece 1 kereye mahsus okuyoruz.
  if(mode == 'R')
  {
     //derece =  EEPROM.read(20);
     EEPROM_readAnything(20, derece);
     nem = EEPROM.read(24);
     dondurme_saniye = EEPROM.read(28);
     dondurme_zaman = EEPROM.read(32);
     sogutma_suresi = EEPROM.read(36);
     kulucka_suresi = EEPROM.read(40);
     // Bitis timestamp okuyoruz
     EEPROM_readAnything(44, kulucka_suresi_baslangic);
     // Kalibrasyon Okuma
     EEPROM_readAnything(54, derece_kalibre);
  }

  // Ekrani aciyor ve temizliyoruz
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);
  lcd.clear();

  // Dugmelerin Giriş Oldugunu tanimliyoruz.
  pinMode(asagiPin, INPUT);
  pinMode(yukariPin, INPUT);
  pinMode(okPin, INPUT);
}

  // Dugmelere basili tutuldugunu anlamak icin gerekli gecici Degiskenler
  long onTime = 0;
  int lastReadingOk = LOW;
  int hold = 0;
  // Saat Ayarlama icin gerekli gecici degiskenler
  int saat_menu = 1;
  int temp_tarih = 0;
  int temp_gun = 0;
  int temp_ay = 0;
  int temp_yil = 0;
  int temp_saat = 0;
  int temp_dakika = 0;


// Ana Program Burda Basliyor

void loop() {
  wdt_reset();      // Kilitlenme İcin Gerekli Fonksiyonu Cagiriyoruz. Eğer 4 sn icinde program tekrar bu satıra gelmez ise Reset atıyor kendine
  //Saat icin
  struct RTCx::tm tm;
        ///////////////////////
        // Saat ayarlamasına Giriş Ekranı
       if(mode == 'W')
       {
        asagi = digitalRead(asagiPin);
        yukari = digitalRead(yukariPin);
        ok = digitalRead(okPin);
        
        lcd.setBacklight(HIGH);
          
        lcd.setCursor(0, 0);
        lcd.print("Tarih Ayarlama     ");

        if(temp_tarih == 0)
        {
            rtc.readClock(tm);
            temp_gun = tm.tm_mday;
            temp_ay = tm.tm_mon+1;
            temp_yil = tm.tm_year+1900;
            temp_saat = tm.tm_hour;
            temp_dakika = tm.tm_min;
            temp_tarih = 1; // Kayitta Sifirlanacak
        }

        lcd.setCursor(1, 2);
        if(temp_gun < 10){lcd.print(" ");}
        lcd.print(temp_gun);
        lcd.print("/");
        if(temp_ay < 10){lcd.print(" ");}
        lcd.print(temp_ay);
        lcd.print("/");        
        lcd.print(temp_yil);
        lcd.print("-");
        if(temp_saat < 10){lcd.print("0");}
        lcd.print(temp_saat);
        lcd.print(":");
        if(temp_dakika < 10){lcd.print("0");}
        lcd.print(temp_dakika);

                  
          lcd.setCursor(0, 3);
          lcd.print("Ayarla OK");
          
          if(saat_menu == 1)
          {
            //Gun Ayarla
            lcd.setCursor(2, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_gun = temp_gun - 1;
             }
             if(yukari == HIGH)
             {
                temp_gun = temp_gun + 1;
             }
             if(temp_gun < 1)
             {
              temp_gun = 1;
             }
             if(temp_gun > 31)
             {
              temp_gun = 31;
             }
          }
          if(saat_menu == 2)
          {
            //Ay Ayarla
            lcd.setCursor(5, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_ay = temp_ay - 1;
             }
             if(yukari == HIGH)
             {
                temp_ay = temp_ay + 1;
             }
             if(temp_ay < 1)
             {
              temp_ay = 1;
             }
             if(temp_ay > 12)
             {
              temp_ay = 12;
             }
          }
          if(saat_menu == 3)
          {
            //Yil Ayarla
            lcd.setCursor(10, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_yil = temp_yil - 1;
             }
             if(yukari == HIGH)
             {
                temp_yil = temp_yil + 1;
             }
             if(temp_yil < 2016)
             {
              temp_yil = 2016;
             }
             if(temp_yil > 2020)
             {
              temp_yil = 2020;
             }
          }
          if(saat_menu == 4)
          {
            //Saat Ayarla
            lcd.setCursor(13, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_saat = temp_saat - 1;
             }
             if(yukari == HIGH)
             {
                temp_saat = temp_saat + 1;
             }
             if(temp_saat < 0)
             {
              temp_saat = 0;
             }
             if(temp_saat > 23)
             {
              temp_saat = 23;
             }
          }
          if(saat_menu == 5)
          {
            //Dakika Ayarla
            lcd.setCursor(16, 2);
            lcd.blink();
            if(asagi == HIGH)
             {
                temp_dakika = temp_dakika - 1;
             }
             if(yukari == HIGH)
             {
                temp_dakika = temp_dakika + 1;
             }
             if(temp_dakika < 0)
             {
              temp_dakika = 59;
             }
             if(temp_dakika > 59)
             {
              temp_dakika = 0;
             }
          }
          
          if(ok != HIGH)
           {
            
             saat_menu ++;
             if(saat_menu > 5)
             {
             if(ok != HIGH)
             {
                 // Clock Set
                
                 tm.tm_min   = temp_dakika;
                 tm.tm_hour  = temp_saat;
                 tm.tm_wday  = 0;
                 tm.tm_mday  = temp_gun;
                 tm.tm_mon   = temp_ay-1;
                 tm.tm_year  = temp_yil-2000;

                 rtc.setClock(&tm);
                 saat_menu = 1;
                 temp_tarih = 0;
                 mode = 'R';
                 lcd.clear();
                 lcd.noBlink();
             }
             }
           }
           delay(100);
       }

  ////////////////////////////
  // Ana Menu
  if(mode == 'A')
  {
     // Menuye girerse Isıtıcı ve Nemi Kapa
     if(digitalRead(RELAY_ISI)!=HIGH)
     {
       digitalWrite(RELAY_ISI,HIGH);
       delay(50);
       digitalWrite(LED0,LOW);
     }
     if(digitalRead(RELAY_NEM)!=HIGH)
     {
       digitalWrite(RELAY_NEM,HIGH);
       delay(50);
       digitalWrite(LED1,LOW);
     }
        
     // Menu 0 -> Ayar
     // Menu 1 -> Saat
     // Menu 2 -> Reset
     // Menu 3 -> Isı Kalibre
     // Menu 4 -> Yeni Kulucka Girisi
     // Menu 5 -> Cikis
     asagi = digitalRead(asagiPin);
     yukari = digitalRead(yukariPin);
     ok = digitalRead(okPin);
     lcd.setCursor(0, 0);
     lcd.print("MENU SEC            ");
     if(asagi == HIGH)
     {
        menu = menu - 1;
     }
     if(yukari == HIGH)
     {
        menu = menu + 1;
     }
     if(menu < 0){menu = 5;}
     if(menu > 5){menu = 0;}
          
     if(menu == 0)
     {
        lcd.setCursor(0, 1);
        lcd.print("Ayarlari Duzenle    ");
     }
     if(menu == 1)
     {
        lcd.setCursor(0, 1);
        lcd.print("Saat Ayarlama Menusu");
     }
     if(menu == 2)
     {
        lcd.setCursor(0, 1);
        lcd.print("Fabrika Ayarlari    ");
     }
     if(menu == 3)
     {
        lcd.setCursor(0, 1);
        lcd.print("Isi Kalibrasyon     ");
     }
     if(menu == 4)
     {
        lcd.setCursor(0, 1);
        lcd.print("Yeni Kulucka Girisi ");
     }
     if(menu == 5)
     {
        lcd.setCursor(0, 1);
        lcd.print("Cikis               ");
     }
     if(ok == LOW)
     {
          lcd.clear();
          if(menu == 0)
          {
            ayar_duzenle = 'E';
            mode = 'S';
          }
          if(menu == 1)
          {mode = 'W';}
          if(menu == 2)
          {
              /////////////
              // Eppromu sil
              mode = 'S';
              for (int i = 0 ; i < EEPROM.length() ; i++) {
                EEPROM.write(i, 0);
              }
          }
          if(menu == 3)
          {
              // Isı Kalibrasyonu Yap
              mode = 'H';
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("Isi Kalibrasyon");
              
          }
          if(menu == 4)
          {
            // Yeni Kulucka Girisi
            mode = 'S';
            ayar_duzenle = 'H';
          }
          
          if(menu == 5)
          {
              // Calismaya DeVam Et
              mode = 'R';
          }
          menu = 0;
     }
     delay(150);
  }

///////////////////////////////
// ISI Sensor Kalibrasyon + -
if(mode == 'H')
{
  asagi = digitalRead(asagiPin);
  yukari = digitalRead(yukariPin);
  ok = digitalRead(okPin);
  
  Serial.println(asagi);
  if(asagi == LOW)
   {
      derece_kalibre = derece_kalibre + 0.1;
   }
   if(yukari == LOW)
   {
      derece_kalibre = derece_kalibre - 0.1;
   }
  if(derece_kalibre > 5) {derece_kalibre = +5;}
  if(derece_kalibre < -5) {derece_kalibre = -5;}
  lcd.setCursor(0, 1);
  lcd.print(derece_kalibre);
  lcd.print(" ");
  if(ok == LOW)
  {
      // Derece Kalibre Et
      EEPROM_writeAnything(54, derece_kalibre);
      mode = 'A';
      menu = 3;
      delay(150);
  }
  delay(100);
}


  // Kulucka Genel Ayarlama Menusu
  if(mode == 'S')
  {
      lcd.setCursor(0, 0);
      lcd.print("KURULUM MENUSU");
      asagi = digitalRead(asagiPin);
      yukari = digitalRead(yukariPin);
      ok = digitalRead(okPin);
      /////////////////
      // Sıcaklık Ayarı
      if(menu == 0)
      {
          if(derece == 0) { derece = 37,5;};
          lcd.setCursor(0, 1);
          lcd.print("SICAKLIK: ");
          if(asagi == HIGH)
           {
              derece = derece - 0.1;    
           }
           if(yukari == HIGH)
           {
              derece = derece + 0.1;    
           }
           if(derece <= 25)
           {
            derece = 25;
           }
           if(derece > 41)
           {
            derece = 41;
           }
           if(ok != HIGH)
           {
               while(ok != HIGH)
               {
                    ok = digitalRead(okPin);
               }
               menu = 1;
               lcd.clear();
           }
          lcd.print(derece);
          lcd.print(" C");
          lcd.setCursor(0, 4);
          lcd.print("SONRAKI ICIN OK");
       }
       // Nem Ayarı
       if(menu == 1)
       {
           lcd.setCursor(0, 1);
           lcd.print("NEM : ");
           if(nem == 0) { nem = 50;};

           if(asagi == HIGH)
           {
              nem = nem - 1;    
           }
           if(yukari == HIGH)
           {
              nem = nem + 1;    
           }
           if(nem <= 40)
           {
            nem = 40;
           }
           if(nem > 85)
           {
            nem = 85;
           }
           lcd.print(nem);
          lcd.print(" %");
          lcd.setCursor(0, 4);
          lcd.print("SONRAKI ICIN OK");
          if(ok != HIGH)
           {
               while(ok != HIGH)
               {
                ok = digitalRead(okPin);
               }
               menu = 2;
               lcd.clear();
           }
       }
       // Dondurme Ayarı Açı
       if(menu == 2)
       {
           if(dondurme_saniye == 0) {dondurme_saniye = 10;};
           lcd.setCursor(0, 1);
           lcd.print("Dondurme Sn   : ");
           lcd.setCursor(0, 2);
           lcd.print("Dondurme Suresi: ");
           lcd.setCursor(0, 4);
           lcd.print("SONRAKI ICIN OK");
           lcd.setCursor(17, 1);
           lcd.print(dondurme_saniye);
           lcd.print(" ");
           lcd.setCursor(14, 1);
           lcd.blink();

           if(asagi == HIGH)
           {
              dondurme_saniye = dondurme_saniye - 1;    
           }
           if(yukari == HIGH)
           {
              dondurme_saniye = dondurme_saniye + 1;    
           }
           if(dondurme_saniye <= 1)
           {
            dondurme_saniye = 1;
           }
           if(dondurme_saniye > 15)
           {
            dondurme_saniye = 15;
           }
          
           if(ok != HIGH)
           {
               while(ok != HIGH)
               {
                ok = digitalRead(okPin);
                lcd.noBlink();
               }
               menu = 3;
               lcd.clear();
           }
       }
       // Dondurme Zamani
       if(menu == 3)
       {
           if(dondurme_zaman == 0) {dondurme_zaman = 60;};
           lcd.setCursor(0, 1);
           lcd.print("Dondurme Sn   :  ");
           lcd.setCursor(0, 2);
           lcd.print("Dondurme Suresi:   ");
           lcd.setCursor(17, 1);
           lcd.print(dondurme_saniye);
           lcd.print(" ");
           lcd.setCursor(16, 2);
           if(dondurme_zaman == 60) {lcd.setCursor(17, 2);};
           lcd.print(dondurme_zaman);
           lcd.setCursor(0, 4);
           lcd.print("SONRAKI ICIN OK");
          
           lcd.setCursor(15, 2);
           lcd.blink();

           if(asagi == HIGH)
           {
              dondurme_zaman = dondurme_zaman - 60;    
           }
           if(yukari == HIGH)
           {
              dondurme_zaman = dondurme_zaman + 60;    
           }
           if(dondurme_zaman <= 60)
           {
            dondurme_zaman = 60;
           }
           if(dondurme_zaman > 240)
           {
            dondurme_zaman = 240;
           }
             if(ok != HIGH)
             {
                 while(ok != HIGH)
                 {
                  ok = digitalRead(okPin);
                  lcd.noBlink();
                 }
                 menu = 4;
                 // Ayarlar değiştir dondurme tekrar hesaplanacak
                 siradaki_dondurme_zamani = -1;
                 son_dondurme_zamani = -1;
                 lcd.clear();
             }
          
       }
       // Sogutma Zamanı
       if(menu == 4)
       {
          lcd.setCursor(0, 1);
          lcd.print("Sogutma Suresi dk.:  ");

          lcd.setCursor(10, 2);
          if(sogutma_suresi < 70) {lcd.print(" "); lcd.setCursor(11, 2);};
          
          lcd.print(sogutma_suresi);

          if(asagi == HIGH)
           {
              sogutma_suresi = sogutma_suresi - 60;    
           }
           if(yukari == HIGH)
           {
              sogutma_suresi = sogutma_suresi + 60;    
           }
           if(sogutma_suresi <= 0)
           {
            sogutma_suresi = 0;
           }
           if(sogutma_suresi > 120)
           {
            sogutma_suresi = 120;
           }
          
             if(ok != HIGH)
             {
                 while(ok != HIGH)
                 {
                  ok = digitalRead(okPin);
                  lcd.noBlink();
                 }
                 menu = 5;
                 lcd.clear();
             }
          
       }
       if(menu == 5)
       {
          lcd.setCursor(0, 1);
          lcd.print("Kulucka Suresi Gun:  ");

          lcd.setCursor(10, 2);
          if(kulucka_suresi < 10) {lcd.print(" "); lcd.setCursor(11, 2);};
          
          lcd.print(kulucka_suresi);

          lcd.setCursor(0, 3);
          lcd.print("Sonraki icin OK");

          if(asagi == HIGH)
           {
              kulucka_suresi = kulucka_suresi - 1;    
           }
           if(yukari == HIGH)
           {
              kulucka_suresi = kulucka_suresi + 1;    
           }
           if(kulucka_suresi <= 1)
           {
            kulucka_suresi = 1;
           }
           if(kulucka_suresi > 45)
           {
            kulucka_suresi = 45;
           }
           if(ok != HIGH)
           {
             if(ok != HIGH)
             {
                 while(ok != HIGH)
                 {
                  ok = digitalRead(okPin);
                  lcd.noBlink();
                 }
                  mode = 'R';
                  menu = 0;
                  lcd.clear();
                  
                  EEPROM.write(16, mode);
                  // Degişkenleri Yaz
                  // Kulucka Derecesi
                  //EEPROM.write(20, derece);
                  EEPROM_writeAnything(20, derece);
                  // Nem
                  EEPROM.write(24, nem);
                  // Dondurme acisi
                  EEPROM.write(28, dondurme_saniye);
                  // Dondurme Zaman
                  EEPROM.write(32, dondurme_zaman);
                  // Sogutma Suresi
                  EEPROM.write(36, sogutma_suresi);
                  // Kulucka Suresi
                  EEPROM.write(40, kulucka_suresi);
                  // Kulucka Suresi Bitis
                  rtc.readClock(tm);
                  RTCx::time_t t = RTCx::mktime(&tm);
                  
                  if(ayar_duzenle == 'E')
                  {
                    
                  }
                  if(ayar_duzenle == 'H')
                  {
                    // Suani baslangic gunu olarak yaziyoruz. Unixtimestamp
                    // Edit te yazmamak lazım !!!
                    EEPROM_writeAnything(44, t);
                  }
             }
           }
       }
      delay(100);
  }
  //////////////////
  // Calisma Menusu
  if(mode == 'R')
  {
    
    asagi = digitalRead(asagiPin);
    yukari = digitalRead(yukariPin);
    // Yukari Dugmesine basinca 1. viyolu dondurur
    while(yukari != HIGH)
    {
        if(digitalRead(RELAY_CEVIR)!=LOW)
        {
          digitalWrite(RELAY_CEVIR,LOW);
          digitalWrite(LED2,HIGH);
        }
        asagi = digitalRead(asagiPin);
        yukari = digitalRead(yukariPin);
        // Kilitlenme
        wdt_reset(); // Kilitlenme İcin Gerekli Fonksiyonu Cagiriyoruz. Eğer 4 sn icinde program tekrar bu satıra gelmez ise Reset atıyor kendine
    }

    // Asagi Dugmesine basinca 2. viyolu dondurur
    while(asagi != HIGH)
    {
        if(digitalRead(RELAY_CEVIR_B)!=LOW)
        {
          digitalWrite(RELAY_CEVIR_B,LOW);
          digitalWrite(LED2,HIGH);
        }
        asagi = digitalRead(asagiPin);
        yukari = digitalRead(yukariPin);
        // Kilitlenme
        wdt_reset(); // Kilitlenme İcin Gerekli Fonksiyonu Cagiriyoruz. Eğer 4 sn icinde program tekrar bu satıra gelmez ise Reset atıyor kendine
    }
    
    // Dugmeler
    ok = digitalRead(okPin);
    
    // Isi Kontrol
    lcd.setCursor(0, 0);
    lcd.print("D: ");
    lcd.setCursor(2, 0);
    lcd.print(derece);
    lcd.setCursor(0, 1);
    lcd.print("N:");
    lcd.setCursor(2, 1);
    lcd.print(nem);
    lcd.setCursor(0, 2);
    lcd.print("G:");
    lcd.setCursor(2, 2);
    lcd.print(kulucka_suresi);
    /////////////////
    // Ekran Koruyucu Devreye giriyor
    screensaver ++ ;
    if(screensaver > 150)
    {
        if(screensaver < 200)
        {
        lcd.clear();
        lcd.setBacklight(LOW);
        screensaver = 200;
        }        
    }
    /////////////////
    // Ekran Koruyucu pasif
    if(ok != HIGH)
    {
        lcd.setBacklight(HIGH);
        screensaver = 0;
    }    
     ///////////////////////////////////////////////////////////
     // Ortam Sıcaklıgı ve Nem Ölçme Her saniye kontrol ediliyor
     //
     if(dereceolcmesec !=  tm.tm_sec)
     {
      derece_olcum = dht.readTemperature();
      derece_olcum = derece_olcum + derece_kalibre;
      nem_olcum = dht.readHumidity();
      dereceolcmesec = tm.tm_sec;
     }
     /////////////////////////
     // Nem Almayi Kapa
     if(nem < nem_olcum)
      {
        // NEM vermeyi kapa
        digitalWrite(RELAY_NEM,HIGH);
        delay(20);
        digitalWrite(LED1,LOW);
        // Fark cok ise nem alma icin bir relay ayarlanabilir.
        lcd.setCursor(19, 1);
        lcd.print(" ");
      }
     // Isıtıcıyı Kapa
     if(derece < derece_olcum)
     {
        // Isıtıcı Kapa
        digitalWrite(RELAY_ISI,HIGH);
        delay(50);
        digitalWrite(LED0,LOW);
        lcd.setCursor(19, 0);
        lcd.print(" ");
     }
     /////////////////////////////////////////////
     // Isı Sensoru Hata kontrol
     if (isnan(nem_olcum) || isnan(derece_olcum))
     {
        // Nem Sensoru Bozuk
        lcd.clear();
        lcd.setCursor(5, 3);
        lcd.print("Hata");
        
        if (isnan(nem_olcum))
        {
        lcd.print(" Nem");
        }
        if (isnan(derece_olcum))
        {
        lcd.print(" ISI");
        }
        // Hata verirse isitici ve nemi kapa
         if(digitalRead(RELAY_ISI)!=HIGH)
         {
           digitalWrite(RELAY_ISI,HIGH);
           delay(50);
         }
         if(digitalRead(RELAY_NEM)!=HIGH)
         {
           digitalWrite(RELAY_NEM,HIGH);
           delay(50);
         }
         // Isı sensoru hatalı oldugu icin Reset atsin diye 5 SN delay veriyoruz
         delay(5000);
     }
     else
     {
        lcd.setCursor(12, 3);
        lcd.print("        ");
        
        lcd.setCursor(8, 0);
        lcd.print(derece_olcum, 2);

        if(derece_olcum > derece_max)
        {
          derece_max = derece_olcum;
        }
        // Maksimum Derece Yazdırma
        lcd.print("M");
        lcd.print(derece_max, 2);
      
        lcd.setCursor(8, 1);
        lcd.print(nem_olcum);

        // Kalan Gun Hesabı
        rtc.readClock(tm);
        RTCx::time_t t = RTCx::mktime(&tm);
        ///////////////////////////////////////
        // Bitis suresinden bugunu cikartiyoruz
        kalan_gun = t - kulucka_suresi_baslangic;
        // Kalan gunu hesaplıyoruz
        kalan_gun = kalan_gun / 60 / 60 / 24;
        kalan_gun = kulucka_suresi - kalan_gun;

        //Serial.println(kulucka_suresi_baslangic);
        
        lcd.setCursor(5, 2);
        lcd.print(kalan_gun);
        lcd.setCursor(7, 2);
        lcd.print(" Gun");
        
        rtc.readClock(tm);
        lcd.setCursor(1, 3);
        printTm(Serial, &tm);
        
        
        lcd.setCursor(13, 2);
        lcd.print("Cev:");
        if(siradaki_dondurme_zamani < 10 && siradaki_dondurme_zamani > 0){lcd.print("0"); }
        if(siradaki_dondurme_zamani > -1)
        {
        lcd.print(siradaki_dondurme_zamani);
        }
        delay(100);
     }
    /////////////////
    // Cevirme Kapama
    
    if (millis() - cevirmeMillis >= dondurme_saniye*1000 && cevirmeMillis>0)
    {
        digitalWrite(RELAY_CEVIR,HIGH);
        delay(50);
        digitalWrite(RELAY_CEVIR_B,HIGH);
        delay(50);
        digitalWrite(LED2,LOW);
        cevirmeMillis = 0;
    }
    if(tm.tm_sec == 30)
    {
      ////////////////////////////////////////
      // Yumurta Çevirme
      // dondurme_zaman 60->1 120->2 180->3 240->4

      //Dondurme Set edilmedi ise
      if(siradaki_dondurme_zamani == -1)
      {
          // Daha Once hiç Donmedi ise makina ilk acildiginda 1 kere dondurme islemi yapmasını sağlıyoruz
          siradaki_dondurme_zamani =  tm.tm_hour;
      }
      
      if(tm.tm_hour == siradaki_dondurme_zamani && son_dondurme_zamani != siradaki_dondurme_zamani or ok != HIGH)
      {
            // Yumurta Dondur
            //Serial.print(digitalRead(RELAY_CEVIR));
            
            digitalWrite(RELAY_CEVIR,LOW);
            delay(50);
            digitalWrite(RELAY_CEVIR_B,LOW);
            delay(50);
            digitalWrite(LED2,HIGH);
            cevirmeMillis = millis();
            
            if(dondurme_zaman == 60)
            {siradaki_dondurme_zamani = tm.tm_hour+1;}
            if(dondurme_zaman == 120)
            {siradaki_dondurme_zamani = tm.tm_hour+2;}
            if(dondurme_zaman == 180)
            {siradaki_dondurme_zamani = tm.tm_hour+3;}
            if(dondurme_zaman == 240)
            {siradaki_dondurme_zamani = tm.tm_hour+4;}
            // Bir Daha Bu saatte Donmesin
            son_dondurme_zamani = tm.tm_hour;
            if(siradaki_dondurme_zamani > 23) {siradaki_dondurme_zamani = siradaki_dondurme_zamani-24;}
      }
    }
    
    if(tm.tm_sec == 15 or tm.tm_sec == 45)
    {
            ///////////////
            // Sogutma Kodu
            if((tm.tm_hour == 12 && sogutma_suresi > 0) or (tm.tm_hour == 13 && sogutma_suresi > 60))
            {
               // ISI ve Nemi kapa
               if(digitalRead(RELAY_ISI)!=HIGH)
               {
                 digitalWrite(RELAY_ISI,HIGH);
                 delay(50);
               }
               if(digitalRead(RELAY_NEM)!=HIGH)
               {
                 digitalWrite(RELAY_NEM,HIGH);
                 delay(50);
               }
               lcd.setCursor(19, 0);
               lcd.print("S");
            }
            else
            {
              // Isi Kontrol
              if(derece > derece_olcum)
              {
                // Isıtıcı Aç
                digitalWrite(RELAY_ISI,LOW);
                delay(50);
                digitalWrite(LED0,HIGH);
                delay(50);
                lcd.setCursor(19, 0);
                lcd.print("C");
              }
              //////////////////////////////////////////
              // Nem Kontrol
              // Nem Az
              if(nem > nem_olcum)
              {
                // Nem Vermeyi etkinleştir
                digitalWrite(RELAY_NEM,LOW);
                digitalWrite(LED1,HIGH);
                lcd.setCursor(19, 1);
                lcd.print("C");
              }
            }
    }
    
    
    
    // Setup a Geri Donme
    // Menu İçin Basılı Tutma
    if (ok == LOW && lastReadingOk == HIGH) {
        // Serial.println("bas 1");
        onTime = millis();
    }
    //held
   if (ok == LOW && lastReadingOk == LOW) {
     if ((millis() - onTime) > 2500) {
       hold = 1;
        if ((millis() - onTime) > 5000) {
          hold = 2;
        }
     }
   }
   if (ok == HIGH && lastReadingOk == LOW)
   {
       onTime = 0;
       if (hold == 1) {
             hold = 0;
             mode = 'A';
             lcd.clear();
       }
       if (hold == 2) {
             hold = 0;
             mode = 'A';
             lcd.clear();
       }
   }
   lastReadingOk = ok;
    delay(20);
  }
}

// Saat i ekrana bastirmak icin fonksiyon
void printTm(Stream &str, struct RTCx::tm *tm)
{
  lcd.setCursor(0, 3);
  // Yıl gun ay bastirmiyoruz
  /*
  if(tm->tm_mday<10){lcd.print('0');}
  lcd.print(tm->tm_mday);
  lcd.print('/');
  if(tm->tm_mon<10){lcd.print('0');}
  lcd.print(tm->tm_mon + 1);
  lcd.print('/');
  lcd.print(tm->tm_year + 1900);
  
  lcd.print(' ');
  */
  if(tm->tm_hour<10){lcd.print('0');}
  lcd.print(tm->tm_hour);
  lcd.print(':');
  if(tm->tm_min<10){lcd.print('0');}
  lcd.print(tm->tm_min);
  lcd.print(':');
  if(tm->tm_sec<10){lcd.print('0');}
  lcd.print(tm->tm_sec);
}

// EEPROM a uzun degerleri kaydetmek ve okumak icin gerekli fonksiyon
template <class T> int EEPROM_writeAnything(int ee, const T& value)
{
    const byte* p = (const byte*)(const void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++)
          EEPROM.write(ee++, *p++);
    return i;
}

template <class T> int EEPROM_readAnything(int ee, T& value)
{
    byte* p = (byte*)(void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++)
          *p++ = EEPROM.read(ee++);
    return i;
}

Kod paylaşımı yapmanız çok iyi olmuş
Ara
Cevapla
Mustafa ALKAN 04-02-2016, Saat: 02:44 PM   
#31
Ben 98-99 yıllarında Excel üzerinden program yaparken Vicual - Basic tabanlı bağlantılardan program yapmıştım pek İngilizcem yok ama uğraşa uğraşa kodları kopyala yapıştır tercümelerini not alarak yapıyordum bu iş te o na benziyor güzel bir uğraş emekliliğime az kaldı inş o zaman bununla bizzat ilgileneceğim şu anda iş nedeniyle vakit ayıramam ama gerçekten eğlenceli ve güzel bir uğraş çoğu işleri de hafifletir aslında böyle bir sitemi tanıttığınız için teşekkürler İbrahim bey inşallah forumda bir kaç arkadaş daha ilgilenir kuluçka ve kümes sistemleri için uygulamalar geliştirirsiniz
Ne kadar bilirsen bil, anlatabildiklerin, karşındakinin anlayabileceği kadardır.
Mevlana

Ara
Cevapla
İbrahim Selcuk 04-02-2016, Saat: 03:28 PM   
#32
Selamlar,

Erkan bey, Mustafa bey ilginize tesekkur ederim.

Kolay Gelsin.
Ara
Cevapla
İbrahim Selcuk 04-08-2016, Saat: 08:28 AM   
#33
Selamlar,

Çıkıma altı gün kaldı. Bu arada bazı eksikleri yada olsa guzel olur dedigim eklentileri koda ekledim. İşler bitince, biraz sabırsızlıkda olunca gereksiz işlerle uğraşmaya başladım. Evet bir şey yaptık ortaya çıkardık ama peki bu ne kadar hesaplı sorusu ister istemez aklıma geldi. Onun için kodu biraz değiştirdim ve makinanın ne kadar elektirik kullandığını hesaplamaya calistim.

Arduino adaptör
12 V 2 A (MAX) ->24 Saat
Nem Nozulu
24 V 2 A -> 1 Saat (Tahmini)
Isıtıcı
220V 200 Watt -> 2 saat Günde (24 Derece ortam sicaklıgı)
Fanlar
220V 20 Watt + 220 V 10 Watt
Aydınlatma
220 V 5 Watt

12*1 = 12 Watt Arduino Saatte 300 Watt Günde
24*2/24 = 2 Watt Nem Saatte 50 Watt Günde
200 * 2 = 400 Watt Isıtma Günde
35/saat * 24 = 840 Watt Günde Aydınlatma + Fanlar

Toplamda 1590 Watt günde
Yani 1,6 Kw

1 Kw 42 Kuruş dan hesaplarsak
Günde 67 Kuruşluk bir fatura gelmesi lazım
Bir kuluçka süresi içinde aşağı yukarı 14 TL

Bu hesaplamayı yaptıktan sonra ısıtıcı nem ve arduino icin cok sıkıntılı bir sonuc cikmadi ama fanlar toplamda gercekten cok cekiyor. Daha hesaplı bir cozum bulunabilir diye dusunuyorum.

Cimuka Ct 120 ile kıyasladıgımda o gunde ortalama 1320 Watt kullanıyor.

Kıyaslama yapabilmek icin eger bir iki arkadas plastik saklama kaplarında izalasyonlu olup olmadıgını belirterek kaç watt ampul ile saatte ne kadar acik kaldıgı konusunda net bir bilgilendirme yapabilirse bir kıyaslama yapma sansim olacak.

Birde bu hesaplamalar tamamen kagıt ustunde yaptıgım hesaplamalar. Bir tane prize takıp olcum yapan cihazdan alıp 24 saat sure ile bir olcum yapıp bilgilendirmeye calisicam.

Tesekkurler.
Ara
Cevapla
Erkan Şensoy 04-08-2016, Saat: 10:24 AM   
#34
Hesaplama yapmanız çok iyi olmuş ben merak ediyodum ne kadar falan diye sizinkiyle kıyaslayınca belli oluyo yararlı yani
Ara
Cevapla
İbrahim Selcuk 04-08-2016, Saat: 10:57 PM   
#35
Selamlar

Boş vakitte Yaptıgım Son Guncellemeler.

Otomatik doldurma. Şamandırasız.




Tek kalın bir cam koymustum. Testlerde %70 nemde camda bugulanma ve damlacıklar olusuyor icerisinin gorunurlugunu azaltıyordu. Bende Bir tane ISIcam yaptırdım. Onu monte ettim. Çıkım esnasında damlacık olusmayacagını umit ediyorum.






http://www.efekulucka.com/urun/kulucka-m...kim-sepeti

Çıkım için çıkım altlıklarını temin etmiştim ama bunlar ne yazıkki sepet biçiminde değilmiş. Benim viyol raflarıma bir tek bunlar uyuyordu onun icin bunları almak durumunda kalmistim. Bende kenarlarını sıva kosebent fileleri ile yaptım. Yeni cikan bir civcivin ustunden atlıyabilecegini dusunmuyorum. 4 farklı yerden yumurta aldıgım icin, hepsinin cikimini ayri ayri gormek istedigimden bu yaptıgım sepetleri yumurta adetlerine gore ikiye boldum. Civcivden tavuktan anlamadıgım icin cinsleri karistiracagim icin cikim esnasında karismalarını istemedim. Cıkım sonrasi tire-up (kablo bagi) ile isaretlemeyi dusunuyorum. Kafama takılan bir baska konu ise bu yaptıgım sepetlerin altına bir sey serip sermemek. Sahsen dusuncem tum zemine kagıt havlu sermek. Aralıklar 7mm 7mm e . Ayakları araya girer sikisir diye dusundum ama dogrumu emin olamadım. Kagıt havlu hem ust kattan alt kalta yumurta kabuklarının asagi dusmesinide engeller.
Bu konuda tavsiyesi olan olursa cok sevinirim.

Kolay Gelsin.
Ara
Cevapla
Ahmet KUNT 04-09-2016, Saat: 02:23 PM   
#36
Ibrahim bey halı kaydırmazı kullanın en ideali o. Kagit havlu parcalanır...
Ara
Cevapla
İbrahim Selcuk 04-13-2016, Saat: 05:54 AM   
#37
Selamlar,

Yaklaşık 2 saat sonra (06:00) yumurtaları koyalı tam 21 gün oluyor. Akşam saatlerinde ilk delikleri açmaya başladılar. Ufak ufak ciklemeler geliyor. Dölsüzleri çıkardıktan sonra yaklaşık 70 tane kalmıştı. Tabi sayı çok olunca bir hareket gözüküyor ama iş tam olarak bitmeden nasıl bir verim alıcağım meçhul. Yani sonuçta ilk deneme %0 i da kabullendim. =)

İki tepsim, vardı, rafları çevirme viyollerine göre yaptığım için üst rafı şu an tam göremiyorum ama gördüğüm kadarı ile bir tanesi çıkmayı başarmış. Ben yazıyı yazarken ayaklandı dolaşmaya başladı.

Sanırsam ki ilk 2 gün, çok kısa süreliğinede olsa yüksek dereceye maruz kaldığı ve üst tepsi olmasından dolayı üst tepsi erken çıkacak genel olarak çünkü diğerlerine göre daha fazla ısıya maruz kaldılar.

Bakalım ne olucak.
Sabırsızlıkla bekliyoruz.
Isı: 37.5
Nem: %65

Bu arada şöyle ilginç bir sorunla karşılaştım. Gelişim sürecinde ısım çok iyiydi. Ama çıkım esnasında makinede ısı 37.8 in altına hiç düşmemeye başladı ve ne olduğunu anlıyamadım. Çünkü ısıtıcı hiç devreye girmiyordu ve isi hiç eksilmiyordu. Sonra denemek amaçlı LED ampul aydınlatmayı kapattım. 5 dakika sonra ısı düşmeye başladı. Ampulun led ampul olduguna eminim ama kulucka bittikten sonra fotoğrafını paylaşırım.

Kolay Gelsin.
Ara
Cevapla
İbrahim Selcuk 04-14-2016, Saat: 03:00 AM   
#38
Selamlar,

Çıkımlar gün boyu devam etti. 70 yumurtadan şimdilik 30 un üzerinde çıkım aldım. Kalan yumurtalarda delikler çoğunda açıldı ama biraz daha ağırdan alıcaklar sanırım.

Çıkımların bu kadar aralıklı (24 Saat) olması normal mi tam kestiremedim. Normalde bu homojen bir hava sirkulasyonu olmadı zaman oluyormuş. Isıtıcıyı ve fanın yerini zaten değiştiricem bir sonraki sefer için ama bu şekildede çok kötü olduğunu düşünmüyorum.

4 Farklı yerden yumurta almıştım. İzmir'den İbrahim bey (sussex), Göcekten Sonja hn (Sussex), ;Marmaris'ten köy tavuğu, Bandırma'dan Köy Tavuğu. Bunlar ilginç bir şekilde aldığım kişilerin civcivleri aynı zamanlarda çıktı. Sadece İbrahim Bey'den aldığım yumurtalardan daha çıkım alamadım. Sonja hanımdan aldığım yumurtalar biraz gözüme buyuk geldi ama hepsi tornadan çıkmış gibi aynıydı. İbrahim bey'den aldıklarımda küçük ve farklı renklerde idi. Bundan dolayı İbrahim bey den aldıklarım aklımda bir soru işareti. Bakalım akibetleri ne olucak daha çıkmadı bir tane bile. Sonja hanımdan aldıklarım tek tük çıktılar.

Evde ufak bir sandığım vardı 1 hafta burda bakıcam. Sonra araba ile yaklaşık 6-7 saatlik uzaklıkta bir yere götürmem lazım. bu taşıma işi için deneyimli arkadaşlardan fikir alabilirsem sevinirim. Şimdilik dusuncem 10'arlı ayakkabı kutularına koymak arka koltukta gidecekler. Giderken ek bir isitici koymayı dusunmuyorum ama araç içinde sıcaklığı 25 lerde filan tutmaya çalışıcam. Bu konuda yardımcı olabilirseniz çok sevinirim.





Bunlar kuluçka makinesi içinde kurumakta olanlar.



Bunlarda kurumuş olanlar. Kapağı her ne kadar açmak istemesemde 12 saati geçtikleri için dışarı aldım.



Sonradan talaş serdim ama onu çekmeyi unutmuşum.

Kolay Gelsin.
Ara
Cevapla
İbrahim Selcuk 04-14-2016, Saat: 08:55 AM   
#39
Son Durum:



33 tane dışarı aldım.
12 Tane Makinede kuruyor.

20-25 tane daha çıkıcak sanırım. Bekliyoruz.
Ara
Cevapla
Ahmet KUNT 04-14-2016, Saat: 10:34 AM   
#40
Bereketli olsun inşallah...
Ara
Cevapla


Amator Arduino ile Kulucka Makinasi Konusu Araçları
Direk Link
HTML Link
BBCode Link
Paylaş


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Arduino Kuluçka Makinası İlk Yükleme-ön Isıtma Yıldırım SARI 4 787 07-16-2017, Saat: 04:41 PM
Son Yorum: A.Ümit GÜNENDİ
  Amatörlükden kurtulalım. El yapımı tam otomatik kuluçka. Yıldırım SARI 14 3,237 05-26-2017, Saat: 10:25 AM
Son Yorum: Yıldırım SARI
  Arduino ile Kuluçka Makinası Ali Debre 1 802 05-12-2017, Saat: 08:11 PM
Son Yorum: İbrahim Selcuk
  The Gurk - Tam Otomatik Kuluçka Makinası Eray Yaşyerli 4 1,628 05-06-2017, Saat: 10:57 PM
Son Yorum: Eray Yaşyerli
Exclamation Deneme aşamasında olan kuluçka makinem EYÜP ÖZKAN 6 1,996 04-24-2017, Saat: 11:47 AM
Son Yorum: EYÜP ÖZKAN
  Saklama Kabından Kuluçka Makinam tarik aksoy 5 2,353 03-24-2017, Saat: 02:16 AM
Son Yorum: A.Ümit GÜNENDİ
  Kuluçka Makinası yaptım Nem artmıyor Berk Demirakı 8 4,075 12-28-2016, Saat: 11:18 PM
Son Yorum: ali altur
  EL YAPIMI KULUÇKA MAKİNEM Furkan POLAT 3 2,697 08-01-2016, Saat: 12:12 PM
Son Yorum: Kamil SAİM
  ahşap kuluçka sandığım özhan dönmez 1 1,743 07-17-2016, Saat: 06:36 PM
Son Yorum: Serkan TASCİ
  İlk kuluçka makinesi Furkan POLAT 8 4,216 06-08-2016, Saat: 02:11 AM
Son Yorum: Furkan POLAT

Hızlı Menü: