Örnekte sicaklikdegisken ini tuş ile veya joystick le 25 de 26 ya gibi bi değişim yaptırılabilir mi. bazı videolar da görmüştüm ama nasıl yapılacağını bulamadım çözemedim yardım edermisiniz.
Buton basma işinde parazit vardır. Basarken yada çekerken işlemciye ardarda basılıp çekiliyormuş gibi gösterir. Bunu engellemek için butonlara ufak kondansatörler bağlar yada kodla bekleme süresi ekleriz. En basit halini pulse in komutu ile verdim. daha detaylısı için millis() komutu ile bekletme işlevi kullanarak bekletilen süre dolunca ikinci basım gerçekleşiyormuş gibi işlemi devam ettirebilirsin. Bas çek şeklinde değilde açık kapalı butonlar ise onlarla menü gezintisi yapılmaz. PushButton tarzında olması menü gezintisi için daha iyidir.
En güzel yöntem ise rotary encoder kullanmak. İmzamdaki sitede bir adet tanıttım oraya bak istersen. Bazı araba teyiplerinde olan, basınca teyibi açan, çevirince sesi yükseltip düşüren sonsuz dönmeye sahip encoderler daha güzeldir.
Menü gezintisi ayarlayabilirsin tabi. Çok zor bir işlem değil. lcd print ile menü oluşturabilirsin. Mesela yukardaki verdiğim kodda sıcaklık artış ve azalmasının ardına lcd print komutu ekleyip değişimi ekrana yazdırabilirsin. 2 adet ayar değiştirme için giriş, 2 adet menü gezintisi için giriş sinyali olması yeterli olur. Menü gezintisi için giriş (onay seçim) ve çıkış olacak. Menü seviye değişkenlerin olacak. Her seviye için menü adları ekrana yazdırılacak.
switch komutu menü için iyi olur. Her münü adına bir kimlik numarası verirsin, menü seviye değişkenlerine kimlik numarasını kaydeder ve yapılması gereken işlem için dallandırmalı seçim yaptırırsın.
Tekrardan özür dilerim . verdiğiniz kod ile yapamadım. ama şu kod ile denedim ama birtürlü olmuyor.artım butona basıyorum sicaklikdegisken degisiyor herşey yolunda bir de düşüreyim diyorum düşmüyor. ISIS ile şemasını çıkardım. bi bakabilirseniz sevinirim. Rar halinde koydum.
// menü konum değişkeni, hangi konumda ise onunla ilgili işlem yapacak int menu = menu_sicaklik; // varsayılan açık menü sıcaklık yani 1
//sıcaklık ve nem değişkenleri float sicaklik = 29.1; float nem = 65.7;
//sıcaklik ve nem okuma değişkenleri int sicaklik_okuma; int nem_okuma; int sicaklik_eski = 0; int nem_eski = 0;
void setup() { // put your setup code here, to run once: pinMode(yukari, INPUT); pinMode(asagi, INPUT); pinMode(_menu, INPUT); pinMode(led, OUTPUT);
//lcd başlat lcd.begin(16,2); lcd.clear();
// lcd görünüm düzenlemesini yap // 1. satırı ayar değişkeni için kullanıyorum lcd.setCursor(0,0); lcd.print("C:");//yazım alanı 2,0 a kadar kaydı lcd.print(sicaklik, 1); // sıcaklık 4 karakter değerinde, 6,0 konumundasın lcd.setCursor(13,0); //ekrana :%R yazısı sığacak kadar sağa kaydırdım lcd.print(":%R"); lcd.setCursor(9,0);//ekransa nem değerini 4 karakter kaplayacak şekilde konumlandırdım lcd.print(nem, 1); lcd.setCursor(6,0);// seçili değişiklik alanı için ok işareti konumu lcd.print("<="); //LCD 1. satır içeriği //0123456789012345 //C:29.1<= 65.7:%R // 2. satırı aktif sıcaklık ve nem için kullanıyorum lcd.setCursor(0,1); lcd.print("C:"); lcd.setCursor(13,1); lcd.print(":%R"); //LCD 2. satır içeriği //0123456789012345 //C: :%R }
void loop() { // put your main code here, to run repeatedly: // tuş okumalarını yap if(digitalRead(yukari) == HIGH){ if((millis() - sureYukari) > beklemeSuresi){ artir();//hangi seçimde ise o seçimin değerini artıracak fonksiyon sureYukari = millis();//ikinci değişim için süreyi başa al } }else{ sureYukari = millis();//yukarı tuş süresi başlangıç değeri }
if(digitalRead(asagi) == HIGH){ if((millis() - sureAsagi) > beklemeSuresi){ azalt();//hangi seçimde ise o değeri azaltacak fonksiyon sureAsagi = millis();//ikinci değişim için süreyi başa al } }else{ sureAsagi = millis();//aşağı tuş süresi başlangıç değeri }
if(digitalRead(_menu) == HIGH){ if((millis() - sureMenu)> beklemeSuresi){ menu++;// menüyü artır if(menu > menu_adet){ menu = 1; }// limit menü sayısına ulaşınca başa dön sureMenu = millis();//ikinci değişim için süreyi başa al lcd_menu_oku();// menü oku yönünü değiştir } }else{ sureMenu = millis();//menü tuşu süresi başlangıç değeri }
//analog okuma ve aktif değerleri yazdırma // sıcaklık değeri okuma sicaklik_okuma = 0; for(int i=0; i<3; i++){ sicaklik_okuma = sicaklik_okuma + analogRead(A0);//A0 pinine sıcaklık sensörünü koy delayMicroseconds(150); } sicaklik_okuma = sicaklik_okuma / 3;// okumada oluşacak sapmaları önlemek için 3 kez okut nem_okuma = 0; for(int i=0; i<3; i++){ nem_okuma = nem_okuma + analogRead(A1);//A1 pinine nem sensörü bağlanacak delayMicroseconds(150); } nem_okuma = nem_okuma / 3; if(sicaklik_okuma != sicaklik_eski){ sicaklik_eski = sicaklik_okuma; lcd_sicaklik(); } if(nem_okuma != nem_eski){ nem_eski = nem_okuma; lcd_nem(); } }
void artir(){ switch(menu){ case menu_sicaklik: sicaklik = sicaklik + 0.1; lcd_sicaklik_ayar(); break; case menu_nem: nem = nem + 0.1; lcd_nem_ayar(); break; } }
void azalt(){ switch(menu){ case menu_sicaklik: sicaklik = sicaklik - 0.1; lcd_sicaklik_ayar(); break; case menu_nem: nem = nem - 0.1; lcd_nem_ayar(); break; } }
void lcd_menu_oku(){ lcd.setCursor(6,0); switch(menu){ case menu_sicaklik: lcd.print("<= "); break; case menu_nem: lcd.print(" =>"); break; } }
Örnekte sicaklikdegisken ini tuş ile veya joystick le 25 de 26 ya gibi bi değişim yaptırılabilir mi. bazı videolar da görmüştüm ama nasıl yapılacağını bulamadım çözemedim yardım edermisiniz.
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.