Termostat

Arkadaşlar öncelikle iyi günler. Ben bir termostat yapmak istiyorum.Bunun içinde DHT11 sensör kullanmak istiyorum.Üç adette Buton kullanacağım Arttırma,Azaltma,menü tuşu olarak fakat butonlarla ayarlayacağım ısıdan 4 derece azaldığında devreye girecek ayarladığım ısıya geldiğinde devre kesilecek.Fakat bu ayarladığım ısı devamlı değişebilir bunu içinde hangi kodu kullanmam gerekiyor. Örn : 37 ayarladım sonra 35 çektim 4 derece düştüğünde devreye girmesi lazım tekrar 35 geldiğinde kesilmesi lazım bunun için bana yardımcı olur musunuz?

Ne konuda herhangi bir kod yok biraz araştırıp kod yazmaya başlamanız daha iyi olacaktır. Ama kolay bir devreye benziyor biraz araştırmanın ardından kolaylıkla yapabilirsiniz. Kolay gelsin

Merhaba, Öncelikle kullanacağın sensörü araştır datasheetini incele donanım bağlantısını doğru birşekilde yap. Daha sonra sensörden aldığın bilgiyi Sıcaklık bilgisine çevirmeyi dene. Sensörünü kurduktan sonra sıcaklık okuyabilmelisin. Bu adımları geçtikten sonra programının içeriğine geçebilirsin. Örnek olması açısından; 1.buton artttırma olsun 2.buton azaltma olsun 3.buton menü olsun menü tamamen sana kalmıs orasına değinmiyorum. Loop döndün içerisinde butonları kontrol etmen gerekicek. void loop () { sensordeger=buraya sensor okuma rutinini yazakcaksın sensörü nasıl okuyorsan (sıcaklık bilgisi olacak) bu sayede artık her döngüde sensörden deger okuyup sıcaklık karsılıgını alacaksın. elinde sıcaklık değerin olacak if(1.buton) sayici++; else if (2.buton) sayici–; //böylece bir değişkenin içeriğini buton ile arrtırıp azaltabilirsin //şimdi ise kontrol yazılımını yazman gerek örneğin if(sensordeger==(sayici-4))//ayarladıgın sıcaklık degerınden 4 derece azalırsa { //işlemini yaz.rölemi çektiricen transistörmü tetikliycen } else if (sensordeger== sayici) //eger sensorden okudugun sıcaklık ayarladıgın sıcaklıga gelırse { //işlemini yaz.rölemi kapatıcan. transistör mü kapatıcan } } Bu yazdığım bir taslak. Sadece fikir vermesi açısından yazdım. Umarım işine yarar

include DHT.h> include LiquidCrystal.h> define DHTPIN 20 define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); include <spi.h>
include <liquidcrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {

lcd.begin(16, 2);
lcd.clear();
analogWrite(10, 30);

}
byte key(){
//1 - 719, 2 - 477, 3 - 131, 4 - 305, 5 - 0
int val = analogRead(0);
if (val <50) return 5;
else if (val <150) return 3;
else if (val <350) return 4;

}

void loop() {
int sayici;

float t = dht.readTemperature();
if (isnan(t)) {
Serial.println(“Failed to read from DHT”);
}
else {
lcd.setCursor(0,0);
lcd.print(“sicaklik=”);
lcd.print(t);
lcd.print(" *C");
lcd.setCursor(0,1);

delay(500);
}

switch (key()){

case 3:
if(1.buton) sayici ++;

break;

case 4:
else if (2.buton) sayici–;
break;

if(sensordeger==(sayici-4))
else if (sensordeger == sayici)

}
delay(250);
}

---------------------------------- bende aynı şeyi yapıyorum ama biyerde eksiklil var bakarmısınız</liquidcrystal.h></spi.h>

Bu program sonucunda ne oluyor ? eksiklik dediğin kısım neresi ? Adım adım gidersen, sıcaklık okuyabiliyor musun ?

Merhaba bende aynı dertten muzdaribim. su 50 derece olduğunda devirdaim pompası çalışsın, 40 derece olduğunda dursun. Bunu programda değişkene yazdığımda sorun yok. Ancak bu değerleri değiştirmem gerektiğinde arduinoyu pc ile buluşturup programda ilgili yerleri değiştirip devam etmem gerekiyor ki bu hiç de pratik değil.Öncelikle Eeproma nasıl yazıp okuyacağımı çözmem gerekti. Dahili EEproma yazıp okumak için baya bi araştırdıktan sonra şu şekildeçözdüm. Bu işin kolay kısmı imiş asıl işin bir menu oluşturmak olduğunu ve bunun ana programdan daha büyük olabileceğini sonradan öğrendim :)Menu kısmını hala çözemedim :frowning: alt_isi = 40; ust_isi = 50; EEPROM.write(1, alt_isi); lcd.setCursor(10, 1); lcd.print(EEPROM.read(1)); EEPROM.write(2, ust_isi); lcd.setCursor(10, 2); lcd.print(EEPROM.read(2)); Normal program akışında ben bu rakamları değiştirmeliyim dediğimde nasıl olacağını merak ediyorum. Ana programda ki ilgili bölümleri buraya yazayım belki faydası olur /**************ÖLÇÜMLER****************/ /*sicak su isi hesaplanması*/ gv_sicak_su_isi = analogRead(sicak_su_isi_in); sicak_su_isi_volt = (gv_sicak_su_isi / 1023.0 * 5000); sicak_su_isi = sicak_su_isi_volt / 10.0; //sicaklik 50 den fazlaysa pompa calıssın sureklı if (sicak_su_isi >= 45) { pompadurum = 1; } //sicaklik 40 dan dusukse pompa dursun else if (sicak_su_isi < 40) { pompadurum = 0; } Tuşlarla değişkene atama yapabilme yolunu bulmak için ayrı bir program yazıp deniyorum. Netleştiğinde ana programa dahil etmek kolay. O program ise şöyle # include < LiquidCrystal.h > //boşluklar sayfada gözükebilsin diye verilmiştir. # include < EEPROM.h >//boşluklar sayfada gözükebilsin diye verilmiştir. LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32); int su_isi_min; int su_isi_eep_min; const int ust_buton = 33; const int enter_buton = 34; const int alt_buton = 35; int ust_but_durum; int alt_but_durum; int enter_buton_durum; void setup() { lcd.begin(20, 4); //LCD EKRANINI TANIMLA lcd.clear (); su_isi_eep_min = EEPROM.read(1); // EEPROMDAKİ VERİYİ OKUMA pinMode (ust_buton, INPUT); pinMode (enter_buton, INPUT); pinMode (alt_buton, INPUT); } void loop() { //EPROMDAKİ DEĞERİ EKRANA YAZ GÖRELİM :stuck_out_tongue: lcd.setCursor(0, 0); lcd.print("SU ISI EPROM MIN: "); lcd.print(su_isi_eep_min); // BUTONLARI OKU ust_but_durum = digitalRead(ust_buton); alt_but_durum = digitalRead(alt_buton); enter_buton_durum = digitalRead(enter_buton); su_isi_min = su_isi_eep_min ; // EEPROMDAKİ VERİYİ İŞLENECEK VERİYE AKTARMA /* BU KISMI BECEREMEDİĞİMDEN PAS GEÇTİM VERİ ZATEN EEPROMA YAZILIYOR. * ANCAK BİR SONRAKİ DEĞİŞKEN İÇİN ÇÖZÜLMEK ZORUNDA if (enter_buton_durum == 0) { su_isi_min = su_isi_min; } if (enter_buton_durum == 1) { su_isi_eep_min = su_isi_min ; EEPROM.write(1, su_isi_eep_min); } */ // ÜST BUTON İLE ARTTIRMA if (ust_but_durum == 0) { su_isi_min = su_isi_min; } else if (ust_but_durum == 1) { su_isi_min = (su_isi_min + 1); su_isi_eep_min = su_isi_min; EEPROM.write(1, su_isi_eep_min); delay(250); } // ALT BUTON İLE AZALTMA if (alt_but_durum == 0) { su_isi_min = su_isi_min; } else if (alt_but_durum == 1) { su_isi_min = (su_isi_min - 1); su_isi_eep_min = su_isi_min; EEPROM.write(1, su_isi_eep_min); delay(250); } // YENİ DEĞERİ YAZ lcd.setCursor(0, 3); lcd.print("suisiminset: "); lcd.print(su_isi_min); } Arduino işine yeni merak sardığımdan acemiliğim yazdığım programdan belli oldu. Tuşlar ile değişken değerlerini değiştirecek kısım sadece tek bir değişken için 62 satır civarı. Böyle yazılmayacağını hissetmekle birlikte özel komutları bilmediğim için onları öğrenmekten başka yolum yok. Bunu öğrenebilmem için yol gösterebileceklere de şimdiden teşekkür ederim.

Tecrübeliler bıkmış herhalde ki, kimse yeni başlayanlara bulaşmak istemiyor :)))

Ben 2 kere okudum problem hala nerede anlamadım :slight_smile: eproma mı yazamıyorsun ? sıcaklık değerlerin mi tutmuyor ? 50ye gelince durmuyor mu? 40 a gelince çalışmıyor mu? Değişkene atama değişkeni değiştirme filan demişsin nedir bu değişken neyi tutacak. Tam olarak kod yazmadan kısaca ne istiyorsun onu bi söyle bakalım hele :slight_smile:

program gayet güzel çalışıyor. programın içerisinde belirttiğim 50 de çalış 40 da dur gibi yerleri bir menu ve tus vs ile değiştirmek istiyorum.

programın kodlarını buraya yazabilirim, yaklaşık 400 satır olunca hepsini yazıp kafa karıştırmak istemedim

eeprom.put ve eeprom .get komutları ile değişkeni epromda saklamak okumak daha kolay olur eeprom.read ile tek byte okur yazar put get ile float veriyi bile okur yazar olursunuz. bu tip işlerde net değerler yerine isi=40 yerine isi>= 40 ve isi<=45 gibi aralıklı kullanımı tercih edin.

menün ve tuşların var ise tuşlarından birtanesini programlama tuşu olarak ikincil kullan. İkincilden kastım butonun normal görevini yapsın ( örneğin butona basınca bir sayı artsın veya azalsın ) aynı zamandada bu butona basıldığında bir timer saysın. Bu timeri 3sn-5sn gibi değerler ata. Bu butona ayarladığın değer kadar basılırsa (örneğin 3 sn) programda biryere dallandır. Bu 3 saniye bastıktan sonra artık normal loop döngünün içerisinde ikincil bir loopa sok orada da tuşlar yardımıyla 40,50 değerlerini değiştir ve epproma tekrar kaydet ve çık. Örneğin; Taslak olarak yazıyorum fikir vermesi açısından int programmodkontrolbit=1; void loop () { //bu genel if senin döngünün ya normal seyrinde yol almasını sağlayacak yada program modda yol almasını sağlayacak //ilk başta programkontrol1=1; dediğimiz için direk normal çalışma moduna girip sistemin çalışacak if(programmodkontrolbit) { //normal sistemin, sıcaklık okuma kontrollerin falan filan bu bölüme yazacaksın. //dereceyi okuyup 40 olunca çalış 50 olunca dur komutların burada olacak //son olarakta bir butonun basılma süresini kontrol edeceksin if(button3) //button3 program moduna giriş butonu olsun ve 3sn basılı tutulursa program moda girsin { timersay //bir timer saydır millis(); olabilir if(timer == 3s) //timerin 3 saniye olur ise { programmodkontrolbit=0; //artık program moda girmiş olacaksın ana loop döngün “programmodkontrolbit=0;” olduğu için artık ana ifin içine değilde elsenin içine girmeye başlayacak timer=0; } } } else { //3 saniye bastıktan sonra artık programın buraya girmeye başlayacak //burada yapmak istediklerini yap //durma çalışma aralıklarını değiştir //eproma kaydet //en son olarakta programkontrolbit=1; //komutu ile tekrar ana döngüne dön } }

Sayın Okaman, Eproma yazdırıp okumak için öğrenebildiğim komutlar şöyle EEPROM.write(1, sayac); (EEPROM.read(1)); öneriniz doğrultusunda put ve get komutlarının kullanımını öğrenip iki basamaklı sayıları saklamayı deneyeceğim. Isı sensöründen gelen veriyi şu şekilde işliyorum. //sicaklik 50 den fazlaysa pompa calıssın sureklı if (sicak_su_isi >= 50) { pompadurum = 1; } //sicaklik 40 dan dusukse pompa dursun else if (sicak_su_isi < 40) { pompadurum = 0; } Teşekkürler.

Sayın Ekmekci, önerilerinize çok sevindim. Şu an iki ( Sn. okoman’ın önerisi ile 3 oldu) 1. Bir menu programı yazmak veya çalışan basit bir menu programını kendi ihtiyacıma göre düzenlemek. İkinci yolda devam edip düzenlemeyi yapmaya çalışıyorum. 2. Sistemi yürüten programda ısı sensöründen alınan veri 50 derece ise pompayı çalıştır, 40 a düşünce durdur. Kısımında arduinoyu bilgisayara bağlamadan değişkenleri değiştirebilmeliyim ki, ev halkı da duruma göre değişiklikleri kolayca yapabilsinler. Yani 40- 50 değerleri epromda dursun ama lcd üzerinden görerek tuş veya rotary encoder vs gibi bir yolla bu rakamlar değiştirilebilinip set edilsin. 3. Eproma write ve read komutları yerine put ve get komutlarının kullanımını öğrenmek. İlginize teşekkürler

Sayın NevzatKalyoncu, sizin açmış olduğu post üzerine bir kaç şey söyleyeyim derken konu benim sorunlarıma döndü. Bunun içinözür dilerim. Sayın Okoman da onaylarsa yeni bir post açabilir oradan devam edebilirim. Siz buradan devam derseniz buradan devam ederiz. Saygılarımla teşekkürler.

40 ve 50 değerlerini bir değişkene ata. İnt maxisi = 50, İnt minisi = 40, Encoder kodları. Memü kodları Menü max ısı ayarla Encoder degeri = maxisi Menu min ısı ayarla Encoderdegeri = minisi, Normal ısı kontrol kodları.

Windshair teşekkürler

Rica ederim tuşlu kolay olur encoderli şık olur..

EEpromu get ve put komutları ile kullanmayı öğrendim. Menuyu yazdım. Menu de yapmak istediklerimi bitirdim sayılır. Bu menu programını ana programa entegre etmek kaldı. Hayalimde Encoderlı menu var fakat encodere vakıf olmam gerekiyor. Encoder için biraz yol haritasına ihtiyacım olabilir. Ayrıca program normal akışında menuye girmemeli. Bunun için bir şart sağlamalıyım. Bir butona 2 sn den uzun basıldı ise menuye git gibi yapılabilir mi ?

buton okuma rutininde buton basılı oldugu surece 100ms arayla buton durumunu test et basılıysa say 20 kere saydığında 2sn basılı olduğunu anlarsın buton bu sureden once bırakılmışsa sayacı sıfırlarsın.