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

İbrahim Selcuk 04-15-2016, Saat: 06:51 AM   
#41
Selamlar Tekrardan,

Evet, Çıkım işimiz bitti. İlk acemilik bir iki kritik hatam oldu ama ucuz atlattım gibi.

Yüklenen yumurta 96
Döllü Yumurta 70
Çıkım 56
Oran %80

Kayıplar:
Kabuğu kıramayan Yumurta 5 (Aynı yumurtalar, Kucuk, Kahverengi, Menşei: İzmir)
Kabuğu Kırıp Sıkışan 1
Kabuğu Kırıp Kuruyan 8 !!!!!!
Çıkım Günü 22

Sorunlar:

- Cıkımların 22'inci gun olması genel olarak ısıda biraz dusuk kaldıgımın bir işaretçisi. İkinci sefer için bir sey yapmaya gerek yok. Ama ikinci seferde 22 gun cıkım alırsam. 0,5 Derece ısıyı yukseltıcem

- Cıkım sepetlerini daha once fotografladıgım gibi ikiye bolmem ciddi bir sekilde yer kaybı yarattı. Yinede 48 lik viyolun kapladıgı alan ile aynı boyuttaki cıkım tepsisi 48 yumurta icin yeterli degil. Bundan dolayı iki viyol var ise 3 cıkım sepeti kullanmak lazım diye dusunuyorum.

- Cıkım sürem biraz aralıklı oldugu icin ilk cıkanları 12 saat sonra makinadan almam yerinde olur diye dusundum. Bu cok gereksiz bir hareket oldu cunku kabukta delik acan ve kapıya yakın olan yumurtalar ben her ne kadar cok cabuk hareket edip nem kacmasın diye ugrassamda yumurtadaki beyaz zırhın kuruması sonucu icerde sıkıstılar. Kapagi acmamın bu kadar zarar vereceğini gercekten hic dusunmemistim. Cunku nem %50 ye dusmesine ve 20 snde tekrar %65 e cıkmasına ragmen bu kurumanın onune gecemedim. Burda en buyuk sıkıntı cıkım sepetinin dar oldugunu dusunmem ve 12 saat daha makinada bırakmaya gonlum elvermemesi. Bir dahakine sepetten dusse isiticinin ustunde alev alsa bile kapagı acmam =)

- 96 yumurtada 26 dolsuz yumurta olması özellikle tek bir yerden aldıgım 20 yumurtanın 12 tanesinin dolsuz olması ve geri kalanlarınında 8 tanesinin 5 tanesindede kabugu bile kıramamaları temin ettiğim yerin duzgun bir yer olmadıgı kanısına vardırdı. Elden almama ragmen kargo ile gelen yumurtalardan daha fazla verim aldım.


Sonuc olarak konumuz Arduino ile bu iş olur mu ?

Evet kesinlikle olur. 21 Gun Arduino hiç bir şekilde sorun cıkartmadı ne bir kilitlenme, kapanma yada takılma basima geldi. Kullandıgım bileşenlerden en sıkıntılısı isi sensoruydu daha oncede bahsettigimiz gibi DHT22 yerine biraz daha kalite olsun dersek SHT 15 kullanılması daha isabetli bir karar olabilir. Ama ucuz olsun denirse DHT22 ile ve sıkı bir takip ilede yapılabilir. Bir kere DHT22 düzgün ayarlandımı sorunsuz çalışıyor fakat kalibrasyonun bastan yapılması lazım.



Kolay Gelsin.
Ara
Cevapla
Ahmet KUNT 04-15-2016, Saat: 09:14 AM   
#42
Ibrahim bey ısı için kesinlikle ds18b20 kullanin cok stabil ve dogru. Nem icin dht kullanin. Bu değişikliği yaparsanız cok yararını goreceksiniz. Isıyı ben 37.8 de kapan 37.6 da yan diye ayarladım. Tam vakitli oluyor hersey...
Ara
Cevapla
Hasan Çakan 04-17-2016, Saat: 01:35 PM   
#43
(04-15-2016, Saat: 06:51 AM)İbrahim Selcuk Adlı Kullanıcıdan Alıntı: Selamlar Tekrardan,

Evet, Çıkım işimiz bitti. İlk acemilik bir iki kritik hatam oldu ama ucuz atlattım gibi.

Yüklenen yumurta 96
Döllü Yumurta 70
Çıkım 56
Oran %80

Kayıplar:
Kabuğu kıramayan Yumurta 5 (Aynı yumurtalar, Kucuk, Kahverengi, Menşei: İzmir)
Kabuğu Kırıp Sıkışan 1
Kabuğu Kırıp Kuruyan 8 !!!!!!
Çıkım Günü 22

Sorunlar:

- Cıkımların 22'inci gun olması genel olarak ısıda biraz dusuk kaldıgımın bir işaretçisi. İkinci sefer için bir sey yapmaya gerek yok. Ama ikinci seferde 22 gun cıkım alırsam. 0,5 Derece ısıyı yukseltıcem

- Cıkım sepetlerini daha once fotografladıgım gibi ikiye bolmem ciddi bir sekilde yer kaybı yarattı. Yinede 48 lik viyolun kapladıgı alan ile aynı boyuttaki cıkım tepsisi 48 yumurta icin yeterli degil. Bundan dolayı iki viyol var ise 3 cıkım sepeti kullanmak lazım diye dusunuyorum.

- Cıkım sürem biraz aralıklı oldugu icin ilk cıkanları 12 saat sonra makinadan almam yerinde olur diye dusundum. Bu cok gereksiz bir hareket oldu cunku kabukta delik acan ve kapıya yakın olan yumurtalar ben her ne kadar cok cabuk hareket edip nem kacmasın diye ugrassamda yumurtadaki beyaz zırhın kuruması sonucu icerde sıkıstılar. Kapagi acmamın bu kadar zarar vereceğini gercekten hic dusunmemistim. Cunku nem %50 ye dusmesine ve 20 snde tekrar %65 e cıkmasına ragmen bu kurumanın onune gecemedim. Burda en buyuk sıkıntı cıkım sepetinin dar oldugunu dusunmem ve 12 saat daha makinada bırakmaya gonlum elvermemesi. Bir dahakine sepetten dusse isiticinin ustunde alev alsa bile kapagı acmam =)

- 96 yumurtada 26 dolsuz yumurta olması özellikle tek bir yerden aldıgım 20 yumurtanın 12 tanesinin dolsuz olması ve geri kalanlarınında 8 tanesinin 5 tanesindede kabugu bile kıramamaları temin ettiğim yerin duzgun bir yer olmadıgı kanısına vardırdı. Elden almama ragmen kargo ile gelen yumurtalardan daha fazla verim aldım.


Sonuc olarak konumuz Arduino ile bu iş olur mu ?

Evet kesinlikle olur. 21 Gun Arduino hiç bir şekilde sorun cıkartmadı ne bir kilitlenme, kapanma yada takılma basima geldi. Kullandıgım bileşenlerden en sıkıntılısı isi sensoruydu daha oncede bahsettigimiz gibi DHT22 yerine biraz daha kalite olsun dersek SHT 15 kullanılması daha isabetli bir karar olabilir. Ama ucuz olsun denirse DHT22 ile ve sıkı bir takip ilede yapılabilir. Bir kere DHT22 düzgün ayarlandımı sorunsuz çalışıyor fakat kalibrasyonun bastan yapılması lazım.



Kolay Gelsin.


arduino ile bu işin daha alası olur. piyaadaki çümuka termostatta bile benzer mikrodenetleyici var.
fakat sensör konusunda dht 22 grubu iyi değillleri. % 80 nem üzerinde kitlenirler etrafı niagara şelalesine çevirirler.

o neden piyasada çok daha iyi sensörler var.
htu21 d sht21 (3.3 volt) sht 3031 silab 7026
gibi ürünler.
sht 11-15 grubu 1 saniye ölçüm verirken yukarda ismini yazdığım sensörler "10-50 ms içinde size ölçüm verir ve hata payı sıcaklıkta %1 nemde %2 nin altına inmş vaziyette

peki napıcaz.

arduino ile piyasadaki tekli 2 li 4 röleleri kullanmaktan vazgecicez.
çünkü pid kütüphanesi var onu kullancaz. mekanik rölenin ortalam yükte 10 000 vuruşluk ömrünü düşürsek bu iş onla olmaz.
onun yerine aliexpressden yada muadili sitelerden solid state röleler var
5 volt olandan alıcaz
maxksimum 400 watt sürersiniz o rölelerle.
bu rölede kontak yok ses yok girişine 1 verdiniz mi çalışır 0 verdinmi söner.

gelelim başka bir meseleye

sıcak memlekette kulucka işi yapısanır.
dış ortam sıcaklığı 30 derece üstündeki iller
220 volt ac fanlar ortama 40 wattlık enerji harcıyr
buda kabin içinin rezistans yada ampül kullanmadan ısınmasına neden olup 38-39 derecelere çıkartıyor. bunun yerine
daha düşük güçlü server fanları var 12 volt ile 10 watt civarı onu kullanın
hem daha ucuz hemde daha fazla hava m3 üflüyor.

şimdiden iyi çalışmalar
Cevapla
Mustafa ALKAN 04-17-2016, Saat: 11:36 PM   
#44
İbrahim bey bu sistemde parçaları birbirine bağlarken lehim mi kullanılıyor yoksa bir ana kart üzerinde birbirine bağlamak için fiş ve yuvalarımı var resimli bir görüntü ekleyebilirmisiniz mesela uno3 ile 4 lü röle ana kart üzerinden nasıl buluşturuyorsunuz beni de başlatacaksınız erkenden bu işe bu gidişle
Ne kadar bilirsen bil, anlatabildiklerin, karşındakinin anlayabileceği kadardır.
Mevlana

Ara
Cevapla
Hasan Çakan 04-18-2016, Saat: 11:16 AM   
#45
(04-17-2016, Saat: 11:36 PM)Mustafa ALKAN Adlı Kullanıcıdan Alıntı: İbrahim bey bu sistemde parçaları birbirine bağlarken lehim mi kullanılıyor yoksa bir ana kart üzerinde birbirine bağlamak için fiş ve yuvalarımı var resimli bir görüntü ekleyebilirmisiniz mesela uno3 ile 4 lü röle ana kart üzerinden nasıl buluşturuyorsunuz beni de başlatacaksınız erkenden bu işe bu gidişle

4 lü röle üzerinde erkek headerlar var
fakat lcd shieldi arduino uno üzerinde oturttuğunda üüzerindeki dişi headerlar gömülü kalıyor bu nedenle
lcd shield üzerinde çıkışları kullanmak üzere dellikler var. o deliklere bir tarafı dişi header olan jumper kablosu alıp diğer tarafını deliğe lehimlemeniz gerekli
Cevapla
İbrahim Selcuk 04-18-2016, Saat: 05:38 PM   
#46
Merhabalar,

Kusura bakmayın gec cevap verdim. Civcivleri tasima telasindayim. Maglum ev ortamında 60 tanesine bakmak biraz sıkıntılı koku acisindan.

Simdi ben cogu baglantiyi soketler ile yaptım. Cunku bu bir prototip oldugu icin bazı degisiklikler icin devamlı kablo degistirmem gerekiyordu. Daha saglıklı olması icin leyimli ve klipsli soketler ile yapıcam ama bu sekildede kutu icinde sorunsuz calisti.

Yaptıgım baglantılar.

Öncelikle lcd nin arkası:


Arduino ustundeki benzer baglanti yeri. Ekrandan cikip direkt buna benzer girişlere giriyor. İlk resimde kablonun acik ucunu gorebilirsiniz.


Relay baglantı kablolarıda aynı sekilde. Bu kablolar bu sekilde cok duzensiz. Ne renk uyumu nede bir goruntu guzelliği var. Toparlayıp yapacagimi bu sekilde yapmıyacam. Cok daha temiz olucak. Bu sekilde bir arıza durumunda mudahale etmek yada bir seyin yerini degistirmek icin her kablonun nereye gittigini ezbere bilmek yada elinizde cok iyi bir dokumantasyon olması lazım.


Burdada rolelerin yakından baglantısını gorebilirsiniz.


İnsallah isinize yarar eger bir sorununuz olursa en kısa sürede cevaplamaya calisirim.

Röle ve Isı devresi konusunda cevap yazıcam sonra hasan bey'e.

Kolay Gelsin.
Ara
Cevapla
Ahmet KUNT 04-18-2016, Saat: 05:39 PM   
#47
Ibrahim bey fritz üzerinde anlatsaniz daha iyi anlarlar sanırım. Sizin icinde kolay olur
Ara
Cevapla
İbrahim Selcuk 04-18-2016, Saat: 05:56 PM   
#48
Önceki gönderilerimde fritz çizimini paylaşmıştım. Ama burda bağlantı leyim mi soket mi diye soruluyor ahmet bey.

Leyim yaptıgım ender yerlerden biri. Led lerin direkt ustune leyim attım boardun ustune ugrasmiyim diye.



Ama düğmeleri soket ile bağladım. Zira bu düğmeler leyim ile beraber çok ısınıp içlerindeki plastik eriyebiliyor.


Deminki ilk resim çıkmamış.
Ara
Cevapla
İbrahim Selcuk 04-25-2016, Saat: 09:12 PM   
#49
Şamandırasız nasıl otomatik dolum yaptığımı sordu bir arkadaş ozelden.

Öncelikle bir dolum kabınız olması lazım. Bu dolum kabının çıkışına cimuka dan aldığım depo bağlantı aparatını bağladım. Depoya sadece hortum bağlı, ust kapağı olduğu gibi silikonladım ve hava geçirmez yaptım. Bu şekilde deponun içine hava girmediği sürece su çıkışıda fizik kanunlarına göre mümkün olmuyor.



Depo şu şekilde.

Nem nozülünü ise makinenin içinde bir kaba koydum ve yukardan gelen hortumu istediğim su seviyesinde tkablo bağı ile sabitledim. Bu şekilde su eksildiğinde hortum ucundan hava alıyor ve depoya hava gidiyor hava gidince depodan su geliyor.

Nem nozulu kısmıda aşağıdaki şekilde.



Bu sistem aynı sulukların ve evdeki su sebillerinin çalışma mantığı ile çalışıyor.

Bu sistemin düzgün çalışması için, deponun vakum olduğunda büzülmeyecek kalınlıkta ve sağlamlıkta olması gerekiyor. Eğer PET şişe kullanırsanız olmaz. Sert plastik bir depo olması ve kesinlikle hava almaması lazım. Makinenin içinde koyacağınız kap ve hortumun seviyeside tepe seviyesinden 3-4 cm aşağıda olması lazım. Bir diğer önemli husus ise aşağıdan hava alınca hortumun içinde hava kabarcığı direkt depoya ulaşmalı. Yani kısa hortum, aşağıdan hep yukarı doğru gitmeliki hava kabarcığı kolay bir şekilde depoya ulaşabilsinki vakumu azaltsın deponun su vermesine izin versin.

PS: 3-4 cm pay vermemizin sebebi, suyu depoya ilk koyduktan sonra alttaki hazne su dolar ama 3-4 saat geçtikten sonra dinlenmiş su içindeki havayı bırakmaya baslar ve vakum bir nebze azalır. Bundan dolayı ilk dolum sonrası su hortumun çok az üzerine çıkar, depodaki buharlaşma bittikten sonra su bitene kadar su hortum seviyesinde kalır.

Kolay Gelsin.
Ara
Cevapla
İbrahim Selcuk 04-29-2016, Saat: 02:21 AM   
#50
Selamlar,

İlk yuklemeden %30 dolsuz yumurta cikmisti. Kumeste kavga eden, sorunlu tum horozları kesildigi icin biraz horoz sıkıntısı cekiyorum. Bundan dolayı bu ikinci yuklemedede %20 ile %30 dolsuz yumurta bekliyorum. Eger bundada verimli bir cikim alirsam kis basinda cins arayislarına baslicam.

Makine ilk cikimi bana gore gayet basarili idi. Bu ikinci seferde daha yuksek bir oran beklentisindeyim bir aksilik olmaz ise.



Yuklenen Yumurta 98 adet
Falsolu yumurta 1 Adet.
Bakalım Bulabilecekmisiniz =) Meraktan ve denemek icin koydum. Sekil bozuklugu hakkında bir bilgi verir belki.

Kolay Gelsin.
Ara
Cevapla
Ahmet KUNT 04-29-2016, Saat: 02:23 AM   
#51
falsolu olan averel gibi olan mı Big Grin
Ara
Cevapla
İbrahim Selcuk 04-29-2016, Saat: 02:24 AM   
#52
Evet aynen ta kendisi =)
Ara
Cevapla
Ahmet KUNT 04-29-2016, Saat: 02:26 AM   
#53
onu haşlar çay kaşığı ile yerdim ben Big Grin
Ara
Cevapla
İbrahim Selcuk 04-29-2016, Saat: 02:53 AM   
#54
Selamlar,

Yüklemeyi dün yaptım, ilk yüklemede başıma gelen ısı yükselmesinden dolayı bu sefer isiyi kademe kademe ayarladım. İlk bir saat 30 Derece, ikinci saat 35 derece sonrada normal 37,5 dereceye sabitledim. Nemi %45 olarak belirledim ilk 7 gün.

Gecen sefer cikimda yaptıgım hatalar cok zarar vermemiş olsada bu sefer son 3 gun kesinlikle kapagi acmayi dusunmuyorum. Nem durumunu yedinci ve 14 uncu gunlerde yumurta uzerinden hava kabarcıgını isaretliyerek yapmaya calisicam. Planim her ne kadar forumda cogu kisi %65 az desede, %65 nem orani ile cikima giricem.

Makinede cok ufak bir iki degisiklik yaptım. Raf sistemi cok kullanıslı olmadıgı icin degistirdim. Isı sensorunu makinanın icinde en yuksek noktaya aldım. Eskiden tam makinanın orta seviyesinde idi. Bu sekilde isida bir sorunum olur ise referansim tepe noktası olacak. İyi hava sirkulasyonu olan bir makinede bunun sorun olmaması gerekiyor.

Ikıncı kullanım oncesi makinayı sirkeli su ile sildim. Baglantı yerlerini sıcak silikon ile muhurledim. Bu sekilde hem ağaç malzeme daha az nem cekecek hemde birleşim aralarında mikrop, bakteri olusumunu engellerim diye dusundum.

Ek olarak bir Watt olcer ekledim. Kagit uzerinde onceden paylastigim hesap gunluk 1,6 Kw ceker diye hesaplamistim. İlk 30 saatte harcama 2,1 Kw olarak gozukuyor. Simdilik karsilastirma icin yetersiz ama bu hesaba gore 1,7 Kw lik bir kullanım gibi gozukuyor. 3-5 gun icinde daha net bir veri olusur. Buyuk ihtimal ile kagıt uzerindeki hesaba yakın bir hesap cikacak. Maksimum çektiği watt 180, bekleme pozisyonunda 40 Watt (2 Fan).



Kolay Gelsin.
Ara
Cevapla
Ahmet KUNT 04-29-2016, Saat: 02:58 AM   
#55
65 nemle hem gelisim hem cikim yapip iyi sonuclar alanlar olduğunu okuyoruz bazen. ş kulucka süresi kisa olsa deniycem bunu Big Grin.
Ara
Cevapla
İbrahim Selcuk 05-22-2016, Saat: 05:50 AM   
#56
Selamlar,






İkinci Denememde
Yüklenen 96
Dölsüz 12
Kayıp 15
Çıkan 66+3
Oran: %82

İkinci denemem için esasında sonucın daha iyi olmasını bekliyordum ama ne yazıkki bir aksilik oldu. Öncelikle ikinci hafta fanlarımdan biri bozuldu. Sanırım ilk çıkımda makina içindeki o ince tüyler fan yatağına girdi ve bir iki gün garip sesler çıkardıktan sonra fan durdu. Burda fanı değiştirememin en büyük sebebi bağlantılarının ve montajının yumurtaların olduğu yerde vidalı sabit olması ve o kısma yumurtaları dışarı almadan müdahale etme şansım olmaması. Bundan dolayı tek fan ile üçüncü haftayı tamamladım. En büyük kayıbıda üst rafta verdim. 10 yumurta üst raftan çıkmadı. Diğer fana yakın alt raf 21 inci güne girerken çok hızlı çıktılar. Fakat üst raf yüksekte olmasına rağmen alt rafta çıkımlar bitti ama üst rafta halen çıkım başlamamıştı. Buda sirkulasyonun ne kadar önemli olduğunu gösterdi. Neyseki 21 inci günün sonunda üst raftakilerde çıkmaya başladı ama 10 tanesi delik bile açamadılar yumurtada. Bende müdahale etmek istemedim.

Toplamda 66 tane sağlıklı civciv çıktı. Fakat 3 tanesine çıkımı tamamlayamadıkları için ben geç müdahale etmek durumunda kaldım. Bir tanesi sakat, 2 tanesi bitkin şimdilik elde besliyorum. Kurtulma şansları ne yazık ki çok düşük belki bir tanesini kurtarabilirim. 4-5 saatte bir su ve şırınga ile besleme yapıyorum.

Sonbahara kadar bir daha yükleme yapmıyacam. Zira sıcaklar geldi. Bundan sonra çıkacak civcivler sıcakta çok verimli olmayacağı inancındayım. Ekim gibi belki bir kere daha yükleme yapıp sezonu kapatıcam.

Bu çıkımda öğrendiğim bir iki nokta:

- Ne yazık ki fenerle kontrol yaparken viyoller yatık pozisyonda idi bundan dolayı elim çarptı ve bir tanesi kırıldı. Bu sahne çok üzücü paylaşıp paylaşmamakta kararsız kalmıştım ama en azından belki bunu görüp daha dikkat etmek aklımızda kalır diye paylaşıyorum.

- Her türlü isitici, nem nozülü, fan gibi parçalar makinanın kolay ulaşılabilir bir yerinde olmalı, soketli olmalı, ve vidalı bir parça olmamalı. Çünkü bozulan bir parçayı değiştirmek çok zor makina dolu iken.


Bir iki ekleme daha sonra yapmaya çalışıcam. Şimdilik bu kadar.

Kolay Gelsin.
Ara
Cevapla
Servet ÇOBAN 05-22-2016, Saat: 06:57 AM   
#57
Malesef elle yardım edilerek çıkan civciv ya ölüyor ya da halsiz kalıyor ya da yaşasa bile emsalerinin yanında küçük kalabiliyor. Bunun sebebi civcivin yumurta içerisinde gelişimini tam olarak tamamlamamış olması, civciv yumurtaya ilk deliği açtıktan sonra yumurta içerisinde karnından beslenmeye devam ediyor, karnından beslendiği gıdayı tam olarak tüketmeden biz çıkamıyor diye yardım ediyoruz. Kendi kendine çıkabilen civcivler çok güçlü olarak yaşamaya devam ediyor. Ben elle yardım işini artık bıraktım. Son yaptığım çıkımda 23. günün sonunda bile çıkım oldu. Çıkım süresi uzayabilir sorun değil, elle yardım en son çare olmalı.
Ara
Cevapla
İbrahim Selcuk 05-22-2016, Saat: 07:17 AM   
#58
(05-22-2016, Saat: 06:57 AM)Servet ÇOBAN Adlı Kullanıcıdan Alıntı: Malesef elle yardım edilerek çıkan civciv ya ölüyor ya da halsiz kalıyor ya da yaşasa bile emsalerinin yanında küçük kalabiliyor. Bunun sebebi civcivin yumurta içerisinde gelişimini tam olarak tamamlamamış olması, civciv yumurtaya ilk deliği açtıktan sonra yumurta içerisinde karnından beslenmeye devam ediyor, karnından beslendiği gıdayı tam olarak tüketmeden biz çıkamıyor diye yardım ediyoruz. Kendi kendine çıkabilen civcivler çok güçlü olarak yaşamaya devam ediyor. Ben elle yardım işini artık bıraktım. Son yaptığım çıkımda 23. günün sonunda bile çıkım oldu. Çıkım süresi uzayabilir sorun değil, elle yardım en son çare olmalı.

Evet elle çıkanlarda dediğiniz sorun olabiliyor. Geçen sefer 6 tanesini elle çıkartmıştım ve çok iyilerdi. Ama önemli olan deliği açtıktan sonra çıkıp çıkamayacaklarını anlamak. Eğer çıkamayaklarını anladı iseniz ve o an müdahale ederseniz düzgün oluyorlar. Ama yumurtanın içinde fazla kalırlar ise popo tarafları çok şişkin ve halsiz düşmüş oluyorlar.

Diye dusunuyorum. Ama elle mudahale edilmemesi konusuna katılıyorum bende. Mecbur kalmadıkca dokunmamak lazım.

Kolay Gelsin.
Ara
Cevapla
İSMAİL AKTEPE 11-11-2016, Saat: 03:56 AM   
#59
Sa İbrahim Bey Yaptığınızprojeyi imrendim bizzat yapmaya karar verdim öncelikle kodu denedm fakat lcd.h Hatası aldım kütüphaneyi paylasirsaniz Sevinirim tesekkurler


Ek Dosyalar Resimler
   
Ara
Cevapla
ali altur Information  12-28-2016, Saat: 10:50 PM   
#60
İbrahim bey öncelikle böyle farklı bir yöntemle kuluçka makinesi yapmanızı ve bu makineyi ayrıntılıarı ile paylaşmanızdan dolayı sizi kutlarım.

3 sayfayı okudum ve gerçekten farklı bir çalışma olmuş.Çalışmanızdan sonra nasıl olacağını merak ettim ve bu makineyi yapmaya karar verdim. Yorumlarınızda projenin ilk yazdığınız kod'dan sonra yaşadığınız çıkım denemelerinde yaşadığınız sıkıntılar nedeniyle kod'da düzeltmeler yapmışsınız. Sizin için sıkıntı olmaz ise projenin kodlarında yaptığınız değişiklerin olduğu kodun en son halini paylaşır mısınız?


İyi Çalışmalar dilerim.









(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;
}
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 773 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,217 05-26-2017, Saat: 10:25 AM
Son Yorum: Yıldırım SARI
  Arduino ile Kuluçka Makinası Ali Debre 1 791 05-12-2017, Saat: 08:11 PM
Son Yorum: İbrahim Selcuk
  The Gurk - Tam Otomatik Kuluçka Makinası Eray Yaşyerli 4 1,618 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,988 04-24-2017, Saat: 11:47 AM
Son Yorum: EYÜP ÖZKAN
  Saklama Kabından Kuluçka Makinam tarik aksoy 5 2,339 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,054 12-28-2016, Saat: 11:18 PM
Son Yorum: ali altur
  EL YAPIMI KULUÇKA MAKİNEM Furkan POLAT 3 2,687 08-01-2016, Saat: 12:12 PM
Son Yorum: Kamil SAİM
  ahşap kuluçka sandığım özhan dönmez 1 1,732 07-17-2016, Saat: 06:36 PM
Son Yorum: Serkan TASCİ
  İlk kuluçka makinesi Furkan POLAT 8 4,203 06-08-2016, Saat: 02:11 AM
Son Yorum: Furkan POLAT

Hızlı Menü: