Rotary Encoder
  • Merhabalar rotary encoder kullanarak data logger tasarlamaktayım.Fakat oluşturduğum döngülerde encoderin cıkışındaki veri ile görüntüleme yapıyorum yani
    if(encoder==40){
    LCD.print(sssss);
    }
    gibi fakat bu 40 bilgisi çok hızlı olarak değişim yapıyor yani saniye 30 kere 40 bilgisi giriyor bunu delayla yavaşlattığımda bile her 40 bilgisi geldiğinde ekran kendini yeniliyor tekrar basmak istiyor.Bu sorunun cözümü varmıdır ?
  • bir değişkenle kontrol edin nezaman basılması gerektiğini, değişkene bir kez değer verin tekrar ekranı guncellemk ıstediğinizde değişkendeki degeri silin.
  • Hocam onu düzelttim fakat rotary ile istediğim gibi kontrol edemiyorum menulerin arasında dolaşmak için
    if(rotary==40){
    LCD.print(adsasd);
    }
    gibi komutlar kullandım fakat bu komutlarla istediğim gibi kontrol olmuyor 40 koşulunu sağladığı her an bu döngüde kalıyor menunun içine girmek istediğim zaman bu dongunden cıkamıyorum.
    if(rotary==40){
    LCD.print(adsasd);
    if(rotaryanahtar==LOW){
    lcd.print(2);
    }
    gibi koşullarım var ama böyle bir döngü oluşturduğumda 2 koşuluda sağladığım için bir 40 koşulunu ekrana basıyor sonra low koşulunu ekrana basıyor.Yani rotary encoderi menuler arasında dolaşmak için nasıl bir döngü ile kullanabilirim ?
  • menu mantıgını rotaryden ayırsanız daha ıyı olur belki. menulerde ılerleme nasıl olur mesela ileri/geri yukarı/aşağı ve onay/ok gibi 3 tane fonksiyon yeter, once o tarafı helledın, sonra rotaryde ilerı gerı yukarı aşağı gibi yön tayini yapın ama her harekette sadece bır durum dönsun. yukarı veya geri ise bir onceki menuyu getırın diğer durumda bir sonraki menuyu getırın ok butonunda menuyu secmiş olun filan bu mantık daha kontrol edılebılır sanki.
  • Sadece yukarı aşşağı ve menülere girmek için rotary swhitch yeter benim için ama anlayamadım demek istediğinizi hocam yani pozizyona göre kontrol yapmamı demek istiyorsunuz pozizyon için fonksiyon oluştur bu fonksiyonlarlamı menuyu kontrol edeyim ?
  • menu mantıgın ayrı bır fonksiyon gibi olsun mevcut durumdan bır ılerı bır gerı veya secme/onaylama butonu basıldıgında menude lcd ye basacağın işlerı yap gerı don. bunu hem butonlu işlerde hemde başka şeylerle kullanabılırsın.
    rotary de işlerıde basitleştir sonucta 5 tur cevırdı yok 8 dur gerı gıttım dıye sayacağına son durum ne olmuş bır ılerı gırmiş veya bir geri gelmiş al bu değeri menu rutınıne ver bıtsın gitsin.
  • int rotary=0,last_rotary=0;

    void loop() {

    if (rotary!=last_rotary)
    {

    if (rotary==30){ LCD.print("pos1"); }
    if (rotary==40){ LCD.print("pos2"); }

    //*****
    //****

    last_rotary=rotary;

    {

    }

    Şeklinde bir denermisiniz. bu sadece rotary encoderin posizyonunun değiştiğinde çalışacaktır..

    menu olayına gelince.. Şöyle bir mantık izleyebilirsin.. Koddaki //****

    arasına (encoderden gelen data sıralamasını bilmiyorum attım)
    if ((rotary==30) &&(last_rotary==40)) {menu_index++;}
    if ((rotary==40) &&(last_rotary==30)) {menu_index--;}

    şeklinde menu_index pozisyonunu kaydırabilir, kayan bu değere görede menu işlemleri yapabilirsin..

    not: menu_index' i sınırlandırmayı unutma ör: if (menu_index>5) {menu_index=0;}


    menu_index ana menu, menu_index_a, menu_index_b ..... şeklinden altmenüler oluşturabilirsin.
    saygılarımla..
  • Hocam çok teşekkür ederim ilginiz için hemen deniyeceğim.Rotary encoder ile menüler arası geçiş ve secili menüye girmem benim için yeterli içerdeki bilgileri harici bir butonla düzeltiyorum.
  • Hocam denedim fakat 40 oldumu değere ulaşamıyorum.Encoder sürekli işlemler yapıyor sacmalama şeklinde -10 arttırıp +1 ekliyor gibi
  • encoderin ne senin yaw
  • gnd, a,b,sw pinlerimi var
  • Hocam kusura bakmayın jumper pimlerinden biri kırılmış o yüzden değerleri hatalı gösteriyormuş tekrar kontrol edince farketttim hemen deniyorum.Evet dediğiniz pinler var üzerinde
  • Hocam denedim şuanda döngünün içinde kalıyorum yine
    int rotary=0,last_rotary=0;

    void loop() {

    if (rotary!=last_rotary)
    {

    if (rotary==30){
    LCD.print("pos1");
    if(digitalRead(BUT2)==HIGH }
    LCDprint(asdas);
    }
    }
    if (rotary==40){ LCD.print("pos2"); }

    //*****
    //****

    last_rotary=rotary;

    {

    }
    but2 dediğim buton harici bir buton sectiğim menünün içine girmemi sağlıyor oraya atlamıyor program
  • iyide sen anlamamışsın olayı
    burdaki kodlar sadece encoderin hareketini algılar..
    menu olayı farklı bişey

    menu_index ile bahsettiğim olay yani
    sen içerde bitirmeye çalışıyorsun..
    @okoman dediği gibi her menu olayı için fonksiyon falan oluşturmalısın.. menu_index değerine göre o fonksiyonlara yönlenmelisin..
  • if ((rotary==30) &&(last_rotary==40)) {menu_index++;} bu yani demek istediğimiz olay değilmi hocam buraya encoderin konumunu ve buton durmunu koyup menünün içine girmesi için başka bir fonksiyon oluşturmayı denedim fakat şuan yaptığımdan farklı birşey olmuyor
  • menü algoritmanı oluşturmalısın önce yani ağaç yapısı gibi

    A
    >A1
    >A2
    >>A2.1
    >>A2.2
    >>A2.3
    >A3
    >>A3.1
    >>A3.2
    B
    >B1
    >>B1.1
    >>B1.2
    >>B1.3
    >B2
    >B3
    C
    >C1
    >C2
    >>C2.1
    >>C2.2
    >C3


    A,B,C Ana Menü olsun

    menu_index 1,2,3

    A altında bir menüye girdiğinde
    örneğin A1,A2,A3
    menu_index=11,12,13


    B altında bir menüye girdiğinde
    örneğin B1,B2,B3
    menu_index=21,22,23

    gibi....

    A2 altında bir alt menüye girdiğinde
    örneğin A2.1,A2.2,A2.3
    menu_index=121,122,123

    gibi

    Sonra al bu menu_indexi karşılaştır ve işlemini yap.


    örneğin if (menu_index==121) {LCD.print("A2.1 menüsü içerisindesiniz"); (/*** arasında olacak ki her döngüde LCD print etmesin. sadece enc kurcaladığında bassın ekrana)

    sürekli dönen döngüyede if ((menu_index==121) && (digitalRead(BUT2)==HIGH))
    yazalım ve geri çıksın {menu_index=menu_index/100>>12 yani A2 altmenüsüne gider..
    veya alt menüye gitsin diyelim
    if ((menu_index==12) && (digitalRead(BUT2)==HIGH)){menu_index=(menu_index*100) +1;} yani 121 yani A2.1 alt menüsüne gittin

    Karmaşık gibi görünsede kod hamallığı bir iş


    Kolay Gelsin

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.