klavye devresi veya arduino ile uçak kokpit paneli yapımı :)

İ2c modül olmadan çalışıyor ama kablo sayısı fazla oluyor. Resimdeki ürünü buton ve ekran gerektiren tüm projelerde kullanabilirsin.

n11.com'dan Arduino 20X04 Mavi LCD ve IIC/I2C Ekran Arayüz Modülü seçtim! Alışverişin Uğurlu Adresi'nde fiyatlar harika!
Gökhan abi i2c de yazdırma hızı daha mı düşük demiştin bir kere fark ediliyor mu, yani gözle görülebilir bir durum mu?
 
Gökhan abi i2c de yazdırma hızı daha mı düşük demiştin bir kere fark ediliyor mu, yani gözle görülebilir bir durum mu?
Onu başkası demişti. Gözle titreme şeklinde fark ediliyor ama öyle bekleyeyim de ekrana yazı gelsin gibi bir durum söz konusu değil. Yani sadece bir kaç milisaniye gecikme oluyor.
 
Gökhan abi i2c de yazdırma hızı daha mı düşük demiştin bir kere fark ediliyor mu, yani gözle görülebilir bir durum mu?
Onu başkası demişti. Gözle titreme şeklinde fark ediliyor ama öyle bekleyeyim de ekrana yazı gelsin gibi bir durum söz konusu değil. Yani sadece bir kaç milisaniye gecikme oluyor.

anladığım kadarıyla yazdırma hızı baya bi düşük. görüntüde titreme vs yok ama lcd kütüphanesini kullanmaya başladığımda rotary encoder kararsız hale geliyor. normalde delay kullandığımda da bu şekilde oluyordu. Çözümü için internette bi şey bulamadım açıkçası.

butonla denedim basılı ise arttıracak şekilde. o zaman hızlı bir şekilde artıyor. enteresan bir durum
 
Son düzenleme:
anladığım kadarıyla yazdırma hızı baya bi düşük. görüntüde titreme vs yok ama lcd kütüphanesini kullanmaya başladığımda rotary encoder kararsız hale geliyor. normalde delay kullandığımda da bu şekilde oluyordu. Çözümü için internette bi şey bulamadım açıkçası.

butonla denedim basılı ise arttıracak şekilde. o zaman hızlı bir şekilde artıyor. enteresan bir durum
delay() yerine millis() dene.
Yada örnekler içinden bir enkoder dosyası aç ve geri kalan kodları bunun üzerine ekleyerek devam et.
Enkoder işi bilmeyene çok çetrefilli bir iş.
 
delay() yerine millis() dene.
Yada örnekler içinden bir enkoder dosyası aç ve geri kalan kodları bunun üzerine ekleyerek devam et.
Enkoder işi bilmeyene çok çetrefilli bir iş.

rotary kütüphanesi vardı bir tane switch butonu destekleyen. onu indirip örnek üzerinden ilerlemiştim. zaten tek başına çalışırken süper. işin içine lcd girdiğinde patlıyor. farklı lcd kütüphaneleri de denedim yine patladı. kod alttaki gibi.

C++:
=======================================================
#include <rotary.h>;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

//
///*---------------------comvariables----------------------------------*/
float c1=123.45;
float c1s=120.45;
float c2=123.45;
float c2s=120.45;
float ct=0;
///*---------------------comvariables----------------------------------*/


///*---------------------navvariables----------------------------------*/
float n1=113.45;
float n1s=110.45;
float n2=113.45;
float n2s=110.45;
float nt=0;
///*---------------------navvariables----------------------------------*/



// Rotary(Encoder Pin 6 clk, Pin 4 sw, Pin 5 data)
Rotary r = Rotary(6, 4, 5);

void setup() {
   Serial.begin(9600);
   Serial.println("Initialized");
   lcd.begin();
}

void loop() {
   lcd.setCursor(1, 0);
   lcd.print("com1 " );
   lcd.setCursor(6, 0);
   lcd.print(c1);
   lcd.setCursor(14, 0);
   lcd.print(c1s);
//
   lcd.setCursor(1, 1);
   lcd.print("com2 " );
   lcd.setCursor(6, 1);
   lcd.print(c2);
   lcd.setCursor(14, 1);
   lcd.print(c2s);


   lcd.setCursor(1, 2);
   lcd.print("nav1 " );
   lcd.setCursor(6, 2);
   lcd.print(n1);
   lcd.setCursor(14, 2);
   lcd.print(n1s);
//
   lcd.setCursor(1, 3);
   lcd.print("nav2 " );
   lcd.setCursor(6, 3);
   lcd.print(n2);
   lcd.setCursor(14, 3);
   lcd.print(n2s);


// During each loop, check the encoder to see if it's been changed.
   volatile unsigned char val = r.process();

// if the encoder has been turned, check the direction
   if (val) {
      if (val == r.clockwise()) {
         float ct= c1 + 0.05;
         c1=ct;
         Serial.println(c1);
         delay(100);
      }
      else if (val == r.counterClockwise()) {
         float ct= c1 - 0.05;
         c1=ct;
         Serial.println(c1);
         delay(100);
      }
   }

// Check to see if the button has been pressed.
// Passes in a debounce delay of 20 milliseconds
   if (r.buttonPressedReleased(20)) {
      ct=c1;
      c1=c1s;
      c1s=ct;
      ct=0;
      Serial.println("switch com1 standby");
   }
}
 
Last edited by a moderator:
rotary kütüphanesi vardı bir tane switch butonu destekleyen. onu indirip örnek üzerinden ilerlemiştim. zaten tek başına çalışırken süper. işin içine lcd girdiğinde patlıyor. farklı lcd kütüphaneleri de denedim yine patladı. kod alttaki gibi.


=======================================================
#include <rotary.h>;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

//
///*---------------------comvariables----------------------------------*/
float c1=123.45;
float c1s=120.45;
float c2=123.45;
float c2s=120.45;
float ct=0;
///*---------------------comvariables----------------------------------*/


///*---------------------navvariables----------------------------------*/
float n1=113.45;
float n1s=110.45;
float n2=113.45;
float n2s=110.45;
float nt=0;
///*---------------------navvariables----------------------------------*/



// Rotary(Encoder Pin 6 clk, Pin 4 sw, Pin 5 data)
Rotary r = Rotary(6, 4, 5);

void setup() {
Serial.begin(9600);
Serial.println("Initialized");
lcd.begin();
}

void loop() {
lcd.setCursor(1, 0);
lcd.print("com1 " );
lcd.setCursor(6, 0);
lcd.print(c1);
lcd.setCursor(14, 0);
lcd.print(c1s);
//
lcd.setCursor(1, 1);
lcd.print("com2 " );
lcd.setCursor(6, 1);
lcd.print(c2);
lcd.setCursor(14, 1);
lcd.print(c2s);


lcd.setCursor(1, 2);
lcd.print("nav1 " );
lcd.setCursor(6, 2);
lcd.print(n1);
lcd.setCursor(14, 2);
lcd.print(n1s);
//
lcd.setCursor(1, 3);
lcd.print("nav2 " );
lcd.setCursor(6, 3);
lcd.print(n2);
lcd.setCursor(14, 3);
lcd.print(n2s);


// During each loop, check the encoder to see if it's been changed.
volatile unsigned char val = r.process();

// if the encoder has been turned, check the direction
if (val) {
if (val == r.clockwise()) {
float ct= c1 + 0.05;
c1=ct;
Serial.println(c1);
delay(100);
}
else if (val == r.counterClockwise()) {
float ct= c1 - 0.05;
c1=ct;
Serial.println(c1);
delay(100);
}
}

// Check to see if the button has been pressed.
// Passes in a debounce delay of 20 milliseconds
if (r.buttonPressedReleased(20)) {
ct=c1;
c1=c1s;
c1s=ct;
ct=0;
Serial.println("switch com1 standby");
}
}

=======================================================
Valla bir şey diyemeyeceğim. Bu enkoderler konusunda bende beceriksizim.
 
Valla bir şey diyemeyeceğim. Bu enkoderler konusunda bende beceriksizim.

hallettim :). tüm ekran bloğunu loopta sürekli yazıyordum. looptan silip setupta yazdırdım. sonra loopta ilgili bloğu değiştireceğim sadece. O da değişiklik olduğunda. kodu ekledim. örneğin videodaki selection olayı rotary encoder her değiştiğinde her satırın sadece 1. bloğunu değiştiriyor (void choice ile) .

tek elle videoyu düzgün çekemedim ama çalışıyor. gamepad kütüphanesini ekleyip oyun içerisinde deneyeceğim.


lcd:
#include <rotary.h>;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

#define rselPINA 4
#define rselPINB 6
#define rselPUSHB 5
int rselval = 0;

// Initialize the Rotary object
// Rotary(Encoder Pin 1, Encoder Pin 2, Button Pin) Attach center to ground
Rotary r = Rotary(rselPINA, rselPINB, rselPUSHB);        // there is no must for using interrupt pins !!

#define rsetPINA 8
#define rsetPINB 9
#define rsetPUSHB 10
int rsetval = 0;
int rsetold = 0;

Rotary s = Rotary(rsetPINA, rsetPINB, rsetPUSHB);        // there is no must for using interrupt pins !!



//
///*---------------------comvariables----------------------------------*/
float c1 = 123.45;
float c1s = 120.45;
float c2 = 123.45;
float c2s = 120.45;
float ct = 0;
///*---------------------comvariables----------------------------------*/


///*---------------------navvariables----------------------------------*/
float n1 = 113.45;
float n1s = 110.45;
float n2 = 113.45;
float n2s = 110.45;
float nt = 0;
///*---------------------navvariables----------------------------------*/


float chval= 0.05;


void setup ()
{
  digitalWrite (rselPINA, HIGH);     // enable pull-ups
  digitalWrite (rselPINB, HIGH);
  digitalWrite (rselPUSHB, HIGH);

  digitalWrite (rsetPINA, HIGH);     // enable pull-ups
  digitalWrite (rsetPINB, HIGH);
  digitalWrite (rsetPUSHB, HIGH);


  lcd.begin ();
  Serial.begin(9600);
  lcd.setCursor(0, 0);
  lcd.print("*" );
  lcd.setCursor(1, 0);
  lcd.print("com1 " );
  lcd.setCursor(6, 0);
  lcd.print(c1);
  lcd.setCursor(14, 0);
  lcd.print(c1s);
  //
  lcd.setCursor(1, 1);
  lcd.print("com2 " );
  lcd.setCursor(6, 1);
  lcd.print(c2);
  lcd.setCursor(14, 1);
  lcd.print(c2s);


  lcd.setCursor(1, 2);
  lcd.print("nav1 " );
  lcd.setCursor(6, 2);
  lcd.print(n1);
  lcd.setCursor(14, 2);
  lcd.print(n1s);
  //
  lcd.setCursor(1, 3);
  lcd.print("nav2 " );
  lcd.setCursor(6, 3);
  lcd.print(n2);
  lcd.setCursor(14, 3);
  lcd.print(n2s);

}  // end of setup


void choice(int chval )
{
  Serial.print(chval);
  if ( chval == 0)
  {
    lcd.setCursor(0, 0);
    lcd.print("*");
    lcd.setCursor(0, 1);
    lcd.print(" ");
    lcd.setCursor(0, 2);
    lcd.print(" ");
    lcd.setCursor(0, 3);
    lcd.print(" ");
  } else if ( chval == 1)
  {
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print("*");
    lcd.setCursor(0, 2);
    lcd.print(" ");
    lcd.setCursor(0, 3);
    lcd.print(" ");
  } else if ( chval == 2)
  {
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print(" ");
    lcd.setCursor(0, 2);
    lcd.print("*");
    lcd.setCursor(0, 3);
    lcd.print(" ");
  } else if ( chval == 3)
  {
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print(" ");
    lcd.setCursor(0, 2);
    lcd.print(" ");
    lcd.setCursor(0, 3);
    lcd.print("*");
  }
}

//int rsetfunc(int rsetfval )
//{
//  volatile unsigned char result = s.process();
//  if (result == DIR_CCW) {
//    rsetfval++;
//    delay(50);
//  } else if (result == DIR_CW) {
//    rsetfval--;  
//  }
//  Serial.print("rsetfval : ");
//  Serial.println(rsetfval);
//}


void loop ()
{
  volatile unsigned char result = r.process();
  if (result == DIR_CCW) {
    rselval++;
    if (rselval > 3 )
    {
      rselval = 3 ;
    }
    choice(rselval);
    delay(50);
  } else if (result == DIR_CW) {
    rselval--;  
    if (rselval < 0 )
    {
      rselval = 0 ;
    }
    choice(rselval);
    delay(50);
  }
  //Serial.println(rselval);

  volatile unsigned char resultt = s.process();
  if (resultt == DIR_CCW) {
    rsetval++;
     delay(50);
  } else if (resultt == DIR_CW) {
    rsetval--;  
    delay(50);
  }
 
 if (rsetval > rsetold)
 {
  if ( rselval == 0 )
  {
    float ct= c1 + chval;
    c1=ct;
    lcd.setCursor(6, 0);
    lcd.print(c1);
    //c1 chval kadar arttiracak buton ekle  
  } else if ( rselval == 1 )
  {
    float ct= c2 + chval;
    c2=ct;
    lcd.setCursor(6, 1);
    lcd.print(c2);  
    //c2 chval kadar arttiracak buton ekle  
  }else if ( rselval == 2 )
  {
    float nt= n1 + chval;
    n1=nt;
    lcd.setCursor(6, 2);
    lcd.print(n1);  
    //n1 chval kadar arttiracak buton ekle  
  }else if ( rselval == 3 )
  {
    float nt= n2 + chval;
    n2=nt;
    lcd.setCursor(6, 3);
    lcd.print(n2);  
    //n2 chval kadar arttiracak buton ekle  
  }
 } else if (rsetval < rsetold)
 {
  if ( rselval == 0 )
  {
    float ct= c1 - chval;
    c1=ct;
    lcd.setCursor(6, 0);
    lcd.print(c1);  
    //c1 chval kadar arttiracak buton ekle  
  } else if ( rselval == 1 )
  {
    float ct= c2 - chval;
    c2=ct;
    lcd.setCursor(6, 1);
    lcd.print(c2);  
    //c2 chval kadar arttiracak buton ekle
  }else if ( rselval == 2 )
  {
    float nt= n1 - chval;
    n1=nt;
    lcd.setCursor(6, 2);
    lcd.print(n1);  
    //n1 chval kadar arttiracak buton ekle
  }else if ( rselval == 3 )
  {
    float nt= n2 - chval;
    n2=nt;
    lcd.setCursor(6, 3);
    lcd.print(n2);  
    //n2 chval kadar arttiracak buton ekle
  }
 
 }

rsetold=rsetval;

  if (s.buttonPressedReleased(25)) {
    if ( rselval == 0 )
    {
      ct= c1;
      c1=c1s;
      c1s=ct;
      lcd.setCursor(6, 0);
      lcd.print(c1);
      lcd.setCursor(14, 0);
      lcd.print(c1s);
      //com1swap icin buton ekle        
    } else if ( rselval == 1 )
    {
      ct= c2;
      c2=c2s;
      c2s=ct;
      lcd.setCursor(6, 1);
      lcd.print(c2);
      lcd.setCursor(14, 1);
      lcd.print(c2s);        
      //com2 swap icin buton ekle
    }
    else if ( rselval == 2 )
    {
      nt= n1;
      n1=n1s;
      n1s=nt;
      lcd.setCursor(6, 2);
      lcd.print(n1);
      lcd.setCursor(14, 2);
      lcd.print(n1s);
      //nav1 swap icin buton ekle        
    } else if ( rselval == 3 )
    {
      nt= n2;
      n2=n2s;
      n2s=nt;
      lcd.setCursor(6, 3);
      lcd.print(n2);
      lcd.setCursor(14, 3);
      lcd.print(n2s);
      //nav2 swap icin buton ekle          
    }
   
  } //endif buttonPressedReleased


  if (r.buttonPressedReleased(25)) {
    Serial.println("burada frekans 1.00 olacak");
  } //endif buttonPressedReleased
} //End loop()
 

Ekler

  • VID_20210827_023854.mp4
    17.2 MB
Son düzenleme:
Gamepad kütüphanesini ekledim ve kodları yazdım. Son durum alttaki gibi. oyunla etkileşim tek yönlü. bu yüzden bir tane switch ekledim. switch kapalı iken gamepad çalışmaz. switch kapatılır ve değerler oyundakine eşitlenir sonra açılır ve oyuna başlanır. oyunda yapılan değişiklikler oyun ve ekranda aynı olur. 8 pin boşta kaldı başka amaçlar için kullanılabilir. kullanılan pinler kodda var ama isteyen olursa yardımcı olurum. :) developer değilim ama kodları kendim yazdım bu açıdan daha kısa yöntemler varsa öğrenmeye açığım :)
 

Ekler

  • WhatsApp Video 2021-08-28 at 17.02.39.mp4
    10.6 MB
  • radio-box-ok.ino
    33.5 KB · Görüntüleme: 55
Son düzenleme:

Forum istatistikleri

Konular
5,789
Mesajlar
99,023
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top