Termostat yapımı

Merhaba, Oncelikle belirtmek isterim ki hem forum da hem de Arduino dunyasinda yeniyim. Bu nedenle eger iszleri rahatsiz edecek hatalarim olursa simdiden affola. Bir ekleme daha yapayim; ( bastan yapayim da isi bilenlerin gazabina ugramayayim :slight_smile: ) Amacim profesyonellere kodu yazdirip kisa yoldan isi bitirmek degil, aksine destek olabilecek herkesten kucukte olsa birseyler ogrenip profesyonellige bir adim olsun yaklasabilmek. Gelelim sorumuza; Amacim kucuk bir kettle yapabilmek. Standart sekilde suyu koy, dugmeye bas, su isininca rezistans kapansin, soguyunca yeniden calissin. Aslinda bu kadar yuzeysel degil ama ana mantik bu. Asagida yazdigim ( internetteki hazir kodlardan esinlendigim desek daha dogru olur :slight_smile: ) bi kac parca kod var, istedigimi simdilik elde ettim ama takildigim konulari sizinle paylamak istedim. Hazirladigim devrede kullandigim parcalar ; Arduino Uno ( klon ) butonlar, buzzer, ledler, DS18B20 sensor, 16X2 Lcd ekran ve ekran icin potans… Simdi gelelim kodlara; ----------------------------------- #include OneWire.h> #include LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int DS18S20_1_Pin = 6; int buzzer = 10; int buton1 = 7; int buton2 = 9; int buton3 = 13; int Led = 8; int b1; OneWire ds1(DS18S20_1_Pin); void setup() { pinMode(Led, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(buton1, INPUT); pinMode(buton2, INPUT); pinMode(buton3, INPUT); lcd.begin(16, 2); // lcd.setCursor(4, 0); lcd.print("Bir Garip Kettle "); lcd.setCursor(3, 1); lcd.print(“Kaynatalım :)”); delay(1000); lcd.clear(); lcd.print(“Lutfen Su”); lcd.setCursor(4, 1); lcd.print(“Doldurun”); delay(1000); } void loop() { float isi= getTemp(ds1); lcd.clear(); lcd.setCursor(0, 0); lcd.print(“Sicaklik:”); lcd.print(isi); lcd.print((char) 223); lcd.print(“C”); delay(1000); b1 = digitalRead(buton1); if (b1 == HIGH) { digitalWrite(Led , HIGH); } else if (isi>= 25) { digitalWrite(Led , LOW); lcd.print(“Su Kaynadı”); } else if (isi < 23) { digitalWrite(Led, HIGH); lcd.print(“Su Kaynatılıyor”); } } float getTemp(OneWire sensor) { byte data[12]; byte addr[8]; if ( !sensor.search(addr)) { sensor.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println(“CRC gecerli degil!”); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print(“Aygit taninmadi”); return -1000; } sensor.reset(); sensor.select(addr); sensor.write(0x44, 1); byte present = sensor.reset(); sensor.select(addr); sensor.write(0xBE); for (int i = 0; i < 9; i++) { data[i] = sensor.read(); } sensor.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); float TemperatureSum = tempRead / 16; return TemperatureSum; } ----------------------------------------------------- Yukarida ki kodlarda sisteme voltaj verdikten sonra 1. butona basildiginda Led yaniyor ( yani rezistans devreye giriyor. Burda temsili olarak rezistans yerine led kullandim) isi istenilen seviyo olan 25 dereceye yukseldiginde otomatik olarak led sonuyor ve su soguyup isi 23 derecenin altina indiginde yeniden led yanmaya basliyor. Buraya kadar mantik iyi ama sistemi ilk calistirdigimda eger suyun sicakligi 23 un altindaysa ben daha 1. butona basmadan led yanmaya yani kettle suyu kaynatmaya basliyor. Bu sorunun onune nasil gecebilirim? Ote yandan bir diger sorun da LCD ekran da void setup altindaki yazilari gosterebiliyorum sorunsuz calisiyor ancak void loop altindaki if lerden sonra gelen lcd.print ler cikmiyor. Su kaynarken sadece birinci satida " Sicaklik : 23 C " seklinde yazi cikiyor ve su sogusada, kaynasada ilgili uyari ekrana gelmiyor. Bu konularda bana fikir verebilirseniz, en azindan gidis yolunu gosterebilirseniz ben cikisi kendim bulabilirm diye umid ediyorum. Simdiden anlayisiniz ve yardimlariniz icin tesekkur ederim. Saygilarimla.

setup kısmında bır degısken tanımla kontrol onda olsun butna basınca o değişkene bır deger ver ısıtıcı kontrolde bu degıskenle beraber durumu kontrol edersın

Hocam tesekkur ederim. Sorunu sayenizde cozdum cok sukur :slight_smile: Su anda sistem gayet nefis calisiyor. Sayenizde biraz da arastirarak yeni bir bilgi daha ekledim kafamin bir kosesine :slight_smile: E tabi bende calismaya devam ediyorum ve yeni baslayan herkes gibi gelistirmeye calisiyorum kendimi. Simdi bu sisteme eeproma kayit yapabilip ordan veriyi cekebildigim bir isi degeri ekledim. Bu degeride butonlarla manuel olarak degistirebiliyorum. Ama ikinci bir isi degeri daha belirlemek istiyorum ki bu sefer butona bastigimda iki isi degeri birden yukseliyo yada alcaliyor. Sadece iki butonla birden fazla fonksiyona farkli farkli nasil mudahale edebilirim? degerler birbirinden bagimsiz olarak bu sekilde degistirilebilir mi? if(digitalRead(buton1)==HIGH) { digitalWrite(buzzer,HIGH); tone(buzzer, 4250, 100); delay(50); isidegeri1++; delay(50); } else if(digitalRead(buton2)==HIGH) { tone(buzzer, 4000, 100); delay(50); isidegeri1–; delay(50); } EEPROM.write(0, isidegeri1); Bu kodun aynisini revize ederek isidegeri2 ve isidegeri3 de eklemek istiyorum sisteme ama dedigim gibi butona basinca hepsinin degeri degisiyor :frowning: Acaba bu konuda da bana bir yol gosterebilirmisiniz? Simdiden ilgi ve alakaniz icin tesekkur eder, iyi calismalar dilerim. Saygilarimla.

Asagidaki kodlarla Rotary Encoder i calistiramadim. Acaba kodlarda bir hata mi var yoksa benim encoder sizlere omur mu olmus bi goz atabilirmisiniz mumkunse??? Simdiden tesekkurler, iyi calismalar. include <spi.h>
include <adafruit_gfx.h>
include <adafruit_pcd8544.h>

volatile byte seqA = 0;
volatile byte seqB = 0;
volatile byte cnt1 = 0;
volatile byte cnt2 = 0;
volatile boolean right = false;
volatile boolean left = false;
volatile boolean button = false;
boolean backlight = true;
byte menuitem = 1;
byte page = 1;
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 12, 11);

void setup() {

pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
// Enable internal pull-up resistors
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);

// Turn on LCD backlight
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);

// Initialize LCD
display.setRotation(0); // Set LDC orientation
display.begin(60); // Set LCD contrast
display.clearDisplay(); // Clear display
display.display(); // Apply changes

sei();
}

void loop() {

// Create Menu Pages
if (page==1) {

display.setTextSize(0);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(0, 0);
display.print("Menu");
display.setCursor(50, 0);
display.print("19:27");
display.drawFastHLine(0,8,83,BLACK);
display.setCursor(0, 10);
if (menuitem==1) { display.setTextColor(WHITE, BLACK);}
else {display.setTextColor(BLACK, WHITE);}
display.print("&gt;Ayarlar");
display.setCursor(0, 20);
if (menuitem==2) { display.setTextColor(WHITE, BLACK);}
else {display.setTextColor(BLACK, WHITE);}    
display.print("&gt;Manuel");
if (menuitem==3) { display.setTextColor(WHITE, BLACK);}
else {display.setTextColor(BLACK, WHITE);}  
display.setCursor(0, 30);
display.print("&gt;Aydinlatma");
if (backlight) {display.print("ON");}
else {display.print("OFF");}
if (menuitem==3) { display.setTextColor(WHITE, BLACK);}
else {display.setTextColor(BLACK, WHITE);}  
display.setCursor(0, 40);
display.print("&gt;Deneme");
display.display();}

else if (page==2) {
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(15, 0);
display.print(“TEST”);
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(5, 15);
display.print(“LEFT RIGHT”);
display.setTextSize(2);
display.setCursor(5, 25);
display.print(cnt1);
display.setCursor(55, 25);
display.print(cnt2);
display.setTextSize(2);
display.display();
}

// Take action if a new command received from the encoder
if (left) {
left = false;
menuitem–;
if (menuitem==0) {menuitem=3;}
}

if (right) {
right = false;
menuitem++;
if (menuitem==4) {menuitem=1;}
}

if (button) {
button = false;

if (page == 1 &amp;&amp; menuitem==3) {
  digitalWrite(13, LOW);
  if (backlight) {backlight = false; digitalWrite(13, LOW);}
  else {backlight = true; digitalWrite(13, HIGH);}
  }

else if (page == 1 &amp;&amp; menuitem==2) {
  page=2;
  cnt1=0;
  cnt2=0;        
 }

else if (page == 2) {
  page=1;
 }

}

}
</adafruit_pcd8544.h></adafruit_gfx.h></spi.h>

encoderim yok denemeyemem ama şunu yapın enkoderin bır ornek programını bulabılırsenız onunla deneyın

Hocam az once encoderi bi ornek kodla serial ekranda denedim. Cok tutarli oldugunu soyleyemeyecegim yavas yavas tek tik dondurdugumde herhangi bir hareket gorunmezken hizlica dondurdugumde ekranda sayilar alcalip yukseliyor. Ama yukarida yazdigim kodda malesef hic calistiramadim. O kodda bi eksik var saniyorum. Inanin cildirmak uzereyim. Halen calismalarim devam ediyor. Eger olurda cozebilirsem paylasirim ama eger sizin akliniza bir sey gelirs elutfen paylasin su isin icinden cikayim da bi yastik yuzu gorsun kafam hocam :frowning:

hangi tip enkoder kullanıyorsun. bağlantıyı lehimle yapın sağlam olsun enkoder uçlarında sarsıntı olmasın kabloda çok uzun olmasın.

Hocam robotlinking rotary encoder ( resim adresi : http://ecx.images-amazon.com/images/I/410XSbHjmzL.\_SX300\_.jpg ) Lehim yapmama gerek kalmiyor cunku erkek pinli. disi header i oturtunca sorun olmuyor. Kabloda standart kablo.

enkoderi tık tık cevırırken tıtresım olur pinler teması keserse sinyal olarak algılar ucuna kablo takıp oyle deneyın. şuradaki orneklerı deneyın http://playground.arduino.cc/Main/RotaryEncoders

Hocam tesekkur ederim encoder sorununu cozdum… Benim encoder nasil olduysa sizlere omur olmus :slight_smile: Yenisi sikintiyi giderdi. Tesekkurler. Ancak test kodlarinda gayet guzel calisirken encoder yukarida paylastigim kodlarda calismiyor. Kodun neresinde nasil bir hata olmus olabilir sizce? Su Maskeleme olaylarindan olabilecegini dusundum incelemedim site kalmadi bu PCINT olaylariyla ilgili ama yok yine basaramadi yine basaramadim. Gunlerdir bunula ugrasiyorm kafayi yiycem vallahi :frowning:

Hocam bu sorunuda cozdum cok sukur. Tesekkurler destekleriniz icin. Yogun arastirmalarin, uykusuz gecelerle birlesince pek bi verimli oldu :slight_smile: Boyle giderse yakinda Italya’ya cagirirlar beni… :slight_smile: Saka bi yana da hem zevkli hem de bagimilik yapici bir olaymis bu Ardu :slight_smile: Saygilar hocam. Bir sonraki sorumda gorusmek umidiyle :slight_smile:

kolay gelsin :slight_smile:

Cok kiymetli Hocam yine bir sorun, yine bir soru ve hikayenin kahramani yine ben :slight_smile: Arduino macerama basladigim daha 2 ay bile olmadi ancak ben yogun calismalarima ve arastirmalarima devam ediyorum. Yapmaya calistigim proje icin 5110 ekranini kullnarak bir menu yapmam lazim di. Sagolsunlar sizin gibi bu isin erbabi kisiler verdikleri fikirlerle bana cok yardimci oldular. Yukaridaki paylastigim kodlarda ve sistemde buyuk revizyona gittim. Ekran olarak 5110 a gectim ve rotary encoder yerine analogtan bagladigim butonlara dondum. Hersey su ana kadar guzel gidiyor sayenizde tesekkurler ancak menu yapiminda takildim ve sizden yine bir fikir almak istiyorum mumkunse. Menu basligi sayisi ekrana sigmayacak kadar cok oldugundan ekrani asagi dogru kaydrarak siradaki menu basligini gormek istiyorum ama beceremedim bir turlu. https://www.youtube.com/watch?feature=player\_embedded&v=MAF8jP9KnS0 Bu videoda ki gibi ben butona bastikca asagi dogru ilerlemesini sayfanin nasil saglayabilirim? Asagida ki kodlar da submenuitem==4 e kadar ekranda gosterebiliyorum ama 5 e gecmek istedigimde malum goremiyorum :slight_smile: submenu 5 e geldigin de display.clearDisplay(); yapayim pesine de display.display(); ile siradaki kodlari gostereyim dedim ama bu sefer de submenuitem==5 bolumunun icinde ki if ve else beni engelledi. Acaba nasil bir sonraki menuyu ekranda scroll row seklinde gosterebilirim.? Tabi video da ki gibi yuapabilsem super olur ama onun icin daha bi firin ekmek yemek lazim :slight_smile: Simdiden tum destek ve fikirleriniz icin tesekkur eder, saygilar sunarim. Iyi calismalar. void manuel(){ display.clearDisplay(); while(1){ display.display(); analogokusub(); reading=analogRead(buttonPin); delay(100); display.setTextSize(1); display.clearDisplay(); display.setTextColor(BLACK, WHITE); display.setCursor(0, 0); display.print(“Manuel”); display.setCursor(55, 0); display.print(temperature); //display.drawCircle(69,2,2, BLACK); //display.setCursor(73, 0); // display.print(“C”); display.drawFastHLine(0,7,84,BLACK); // 1. yatay çizgi display.drawFastVLine(0,7,30,BLACK); // Soldaki dikey çizgi display.drawFastHLine(0,27,84,BLACK); // 3. yatay çizgi display.drawFastHLine(0,17,84,BLACK); // 2. yatay çizgi display.drawFastHLine(0,37,84,BLACK); // 4. yatay çizgi //display.drawFastHLine(0,47,84,BLACK); // 5. yatay çizgi display.drawFastVLine(83,7,30,BLACK); // Sağdaki dikey çizgi if(submenuitem==1) { display.setTextColor(WHITE, BLACK); display.setCursor(5, 9); display.print(“> Isitma”); if(BUTTON1LOWreading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 9);
display.print(“Isitma”); }

 if(submenuitem==2) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 19);
display.print("1. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont1(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 19);
display.print("1. Adim"); }

if(submenuitem==3) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 29);
display.print("2. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont2(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 29);
display.print("2. Adim"); }

if(submenuitem==4) {      
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 39);
display.print("3. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont3(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 39);
display.print("3. Adim"); }

if(submenuitem==5) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 9);
display.print("4. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont()4; } }
else {      
display.setTextColor(BLACK,WHITE);
display.setCursor(5, 9);
display.print("4. Adim");}

if(submenuitem==6) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 9);
display.print("5. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont()5; } }
else {      
display.setTextColor(BLACK,WHITE);
display.setCursor(5, 9);
display.print("5. Adim");}

}}

şoyle dusun ekrana sonucta 5-6 satır sıgdırıyorsun. sat1 sat2 …sat5 olsun. o anda ekran gostermek istediğin seyı bu degıskenlere taşı bunları ekranda bas ama bu arada bunların hangı secenekler arasında oldugunu da takıp et yanı sat1,secenek 6… sat5,secenek11 gibi. menuyu bir tık kadırdıgında hersey bir ileri veya gerı gıdecek, bir page kaydırdıgında hersey 5 ileri veya geri kayacak. mantık boyle kurulur.

Hocam merhaba. Ne kadar yogun oldugunuzu tahmin edebiliyorum ve bu yogunlugunuzda sizi rahatsiz ettigim icin ozur dilerim. Yazdiginiz cevaba istinaden kafamda soru isaretleri olusmus olsada yine de kendi mantigimca birseyler derlemeye calisip sizin soylediginiz gibi ikinci bir degisken icerisine ikinci bir sayfa derledim. Kodlari asagida gorebilirsiniz. Balangicta sunu da belirtmek isterim ki ben henuz Arduino’da cok cko yeni bir ogrenciyim. Hatalar yapmis olabilme ihtimalim %99 bu nedenle lutfen beni mazur gorun. Birinci sayfaya Void manuel() ikinci sayfaya da void manuel1() olarak ulasabiliyorum artik cok sukur. submenuitem==1 - submenuitem==2 … submenuitem==10 - seklinde de basliklar yaptim birinci sayfanin sonuna if(submenuitem==5) { manuel1(); } kodunu ekledim ki bu sekilde manuel1 in icine girebileyim. Ayni sekilde de 2. sayfanin sonunda if(submenuitem==10) { manuel(); } yazdim ve 1. sayfaya geri dondum bu sekilde de. Menu basliklarinin oldugu satirlar arasinda gezinebilmek icinde submenu sayilarini asagidaki gibi editledim. /////////////////////// int analogokusub() { reading=analogRead(buttonPin); if(reading>BUTTON2LOW && readingBUTTON3LOW && reading Isitma");
if(BUTTON1LOWreading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 9);
display.print(“Isitma”); }

 if(submenuitem==2) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 19);
display.print("1. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 19);
display.print("1. Adim"); }

if(submenuitem==3) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 29);
display.print("2. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 29);
display.print("2. Adim"); }

if(submenuitem==4) {      
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 39);
display.print("3. Adim");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 39);
display.print("3. Adim"); }

if(submenuitem==5) 
{
  manuel1();     
}

}}
// MANUEL SAYFASI BITTI

// BURASI MANUEL1 ( MENUNUN IKINCI SAYFASI )

void manuel1(){
display.clearDisplay();
while(1){
display.display();
analogokusub();
reading=analogRead(buttonPin);
delay(100);
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(0, 0);
display.print(“Manuel1”);
display.setCursor(55, 0);
display.print(temperature);
//display.drawCircle(69,2,2, BLACK);
//display.setCursor(73, 0);
// display.print(“C”);
display.drawFastHLine(0,7,84,BLACK); // 1. yatay çizgi
display.drawFastVLine(0,7,30,BLACK); // Soldaki dikey çizgi
display.drawFastHLine(0,27,84,BLACK); // 3. yatay çizgi
display.drawFastHLine(0,17,84,BLACK); // 2. yatay çizgi
display.drawFastHLine(0,37,84,BLACK); // 4. yatay çizgi
//display.drawFastHLine(0,47,84,BLACK); // 5. yatay çizgi
display.drawFastVLine(83,7,30,BLACK); // Sağdaki dikey çizgi

if(submenuitem==6) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 9);
display.print("&gt; Isitm1");
if(BUTTON1LOW<reading button1high>reading) {

ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 9);
display.print(“Isitma1”); }

 if(submenuitem==7) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 19);
display.print("1. Adim1");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 19);
display.print("1. Adim1"); }

if(submenuitem==8) {
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 29);
display.print("2. Adim1");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 29);
display.print("2. Adim1"); }

if(submenuitem==9) {      
display.setTextColor(WHITE, BLACK);
display.setCursor(5, 39);
display.print("3. Adim1");
if(BUTTON1LOW<reading button1high>reading) {
ok_buton=1; kont(); } }
else { display.setTextColor(BLACK,WHITE);
display.setCursor(5, 39);
display.print("3. Adim1"); }

if(submenuitem==10) 
{
  manuel();     
}

}}
/////////////////////////
Durumu daha iyi anlatabilmek icin bir video cektim. Umarim tum bu yazdiklarima ve videoya goz atma sansiniz olabilir.

Video Linki : https://www.dropbox.com/s/ljug3bl5wjw3ps0/menuwebopt.mp4?dl=0

Tesekkur eder, saygilar sunarim.
Iyi calismalar.