Raspberry Pico ile Keypad Kullanımı

@taydin abi düşündüm de A ile V butonuna gerek kalmadı sanki. Set tuşuna basınca amperi ve voltajı ayarlayabildiğim ekrana geçiyorum zaten. Orada yaptığım ayarı da enter ile onaylıyorum.

Acaba set butonunu boşa çıkarıp Amperi ve Voltu kendi tuşlarına ayrı ayrı mı atasam acaba?

 
Böyle şeyleri deneyerek en optimum hale getirmen lazım zaten. Aklına gelen bütün senaryoları dene.
 
Video da bahsettiğim üzere keypad den girdiğim sayıyı ondalıklı olarak yazamıyorum.
İlgili kod bloğu aşağıdadır.


C:
/// KEYPAD FONKSİYONU ////////////////////
void keyPress(char kidx) {
  if ( isdigit(kidx) ) {
    Serial.print(kidx);
    uint8_t sayi = kidx - '0';
    ToplamSayi = ((ToplamSayi * 10) + sayi);
    if (konsol) {
      Serial.print( "Tuslanan Sayi:" );
      Serial.println(ToplamSayi);
    }
   
  } else if ( kidx == 'E' ) {
    page ='e';
    Serial.println("E tuşuna basıldı");
   
    /*int urlEk = ToplamSayi;
      String TamUrl = url_ekle + urlEk;
      SiparisVer(TamUrl, urlEk);*/
    ToplamSayi = 0;
  } else if ( kidx == 'A' ) {
    /// AMPER DEĞERİNİ DEĞİŞTİRİR ////////////
    page = 'a';
    Serial.println("A tuşuna basıldı");
  } else if ( kidx == 'V' ) {
      Serial.println("V tuşuna basıldı");
      page = 'v';
      ToplamSayi = 0;
      //// Voltaj değerini ekrana yazdırma /////
    u8g2.clearBuffer();
    drawF(0, 0, 128, 64, 1, 1, 126, 62);
     u8g2.drawLine(5, 18, 122, 18);
    u8g2.drawLine(5, 46, 122, 46);
    u8g2.setFont(u8g2_font_VCR_OSD_tr);
    u8g2.setCursor(4, 40);
    u8g2.print("SET:");
    u8g2.setCursor(50, 40);
    u8g2.print("00.00");
    u8g2.setCursor(112, 40);
    u8g2.print(F("V"));
    u8g2.sendBuffer();
    /*SatirTemizle(1);
      lcd.print("A");*/
  } else if ( kidx == 'D' ) {
    // D TUŞU GİRİLEN DEĞERİ SİLER!
    Serial.println("D tuşuna basıldı");
    ToplamSayi = 00.00;
    /*SatirTemizle(1);
      lcd.print("B");*/
  } else if ( kidx == 'T' ) {
    // C Tuşu NodeMCU ya Reset Atar!
    // digitalWrite(D0, LOW);
  } else if ( kidx == 'S' ) {
    Serial.println("SET tuşuna basıldı");
    page = 'i';
    // S TUŞU DEĞER GİRME EKRANINI AÇAR!
    //// SET YAZISI //////////////////////////

  }
  delay(100);
}
void loop(void) {
  /// KEYPAD KODLARI /////////////////////
  uint8_t idxx = keyPad.getKey();
  char idx = "DV0AO987E654S321"[idxx];
  keyPress(idx);
 
  if(page == 'a'){
    u8g2.clearBuffer();
    drawF(0, 0, 128, 64, 1, 1, 126, 62);
    u8g2.drawLine(5, 18, 122, 18);
    u8g2.drawLine(5, 46, 122, 46);
    u8g2.setFont(u8g2_font_VCR_OSD_tr);
    u8g2.setCursor(4, 40);
    u8g2.print("SET:");
    u8g2.setCursor(50, 40);
    u8g2.print("00.00");
    u8g2.setCursor(112, 40);
    u8g2.print(F("A"));
    u8g2.sendBuffer();
   
  }else if (page == 'v') {
    Serial.println(ToplamSayi);
    //// Voltaj değerini ekrana yazdırma /////
    u8g2.clearBuffer();
    drawF(0, 0, 128, 64, 1, 1, 126, 62);
     u8g2.drawLine(5, 18, 122, 18);
    u8g2.drawLine(5, 46, 122, 46);
    u8g2.setFont(u8g2_font_VCR_OSD_tr);
    u8g2.setCursor(4, 40);
    u8g2.print("SET:");
    u8g2.setCursor(50, 40);
    ival = ToplamSayi * 100;
    sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
    u8g2.print(buffer);
    u8g2.setCursor(112, 40);
    u8g2.print(F("V"));
    u8g2.sendBuffer();
    }
}
 
abi aklıma şöyle bişey geldi displaye 4 digit sayı yazabiliyoruz sen 2 dijiti yazdıktan sonra sorun yaşıyorsun.
2 dijiti yazdıktan sonra girilen sayıyı/10 yapıp 10a bölünmüş halini toplama eklersek olmaz mı acaba aklıma birtek bu geldi
 
abi aklıma şöyle bişey geldi displaye 4 digit sayı yazabiliyoruz sen 2 dijiti yazdıktan sonra sorun yaşıyorsun.
2 dijiti yazdıktan sonra girilen sayıyı/10 yapıp 10a bölünmüş halini toplama eklersek olmaz mı acaba aklıma birtek bu geldi
Bana kod lazım. Kafa basmıyor. Zaten sabahtan beri uğraşıyorum beynim sulandı iyice. Düşünemez hale geldim .
 
Düşündüm de bizim her basamağı bağımsız kodlamamız lazım. Çünkü enkoder kullanırken öyle yapmamız gerekecek. Dört basamak için dört değişken tanımlayıp ayrı ayrı müdahale etmeliyiz.
En sonda toplamsayi = değişken1 + değişken2 "." değişken3 + değişken4
Gibi bir şey olmalı. Ama ne?
 
abi uğraştım önce float'dan string'e çevirdim sonra length ile kaç dijit olduğunu saydırdım "."'yıda dijitl sayıyormuş önemli değil.
nokta dahil 3 dijit olursa toplanan değeri/10 yapıyorum bu sefer 0lar uzama başlıyor her toplamda sıfır ekliyor
 
abi uğraştım önce float'dan string'e çevirdim sonra length ile kaç dijit olduğunu saydırdım "."'yıda dijitl sayıyormuş önemli değil.
nokta dahil 3 dijit olursa toplanan değeri/10 yapıyorum bu sefer 0lar uzama başlıyor her toplamda sıfır ekliyor
Şuan da her sayıyı ayrı değişkene yazdırmak üzere çalışıyorum.
Bu sayıları ayrı ayrı 4 değişken ile elde ettikten sonra işimiz daha kolay olacaktır.

C:
/// KEYPAD FONKSİYONU ////////////////////
void keyPress(char kidx) {
  if ( isdigit(kidx) ) {
    Serial.print(kidx);
    uint8_t sayi = kidx - '0';
    //ToplamSayi = ((ToplamSayi * 10) + sayi);
      if(tur == 0){
      sayi1 = sayi;
      Serial.print("sayi1;");
      Serial.println(sayi1);
      }else if(tur == 1){
        sayi2 = sayi;
        Serial.print("sayi2;");
      Serial.println(sayi2);
      }else if(tur == 2){
        sayi3 == sayi;
        Serial.print("sayi3;");
      Serial.println(sayi3);
      }else if(tur == 3){
        sayi4 = sayi;
        Serial.print("sayi4;");
      Serial.println(sayi4);
        tur = 0;
      }
      tur++;
   
  }
 
Şu şekilde sayıları tek tek değişkene attım.
Şimdi sıra geldi bunları birleştirmeye.
Vaktim kalmadı işe gitmeliyim. Orada düşünürüm bu konu üzerine.

C:
void keyPress(char kidx) {
  if ( isdigit(kidx) ) {
    Serial.print(kidx);
    uint8_t sayi = kidx - '0';
    //ToplamSayi = ((ToplamSayi * 10) + sayi);
      if(tur == 0){
      sayi1 = sayi;
      Serial.print("sayi1;");
      Serial.println(sayi1);
      }else if(tur == 1){
        sayi2 = sayi;
        Serial.print("sayi2;");
      Serial.println(sayi2);
      }else if(tur == 2){
        sayi3 = sayi;
        Serial.print("sayi3;");
      Serial.println(sayi3);
      }else if(tur == 3){
        sayi4 = sayi;
        Serial.print("sayi4;");
      Serial.println(sayi4);
        tur = -1;
      }
      tur++;
 
Kürsör pozisyonu en solda iken basama 10 oluyor, yani 10^1. Kürsör pozisyonu en sağda iken basamak 0.01 oluyor, yani 10^(-2). Bu durumda sayı şöyle ise:

AB.CD

O zaman voltaj veya akım için hesap da şöyle:

[math]V = A\times10^1 + B\times10^0 + C\times10^{-1} + D\times10^{-2}[/math]
 
Kürsör pozisyonu en solda iken basama 10 oluyor, yani 10^1. Kürsör pozisyonu en sağda iken basamak 0.01 oluyor, yani 10^(-2). Bu durumda sayı şöyle ise:

AB.CD

O zaman voltaj veya akım için hesap da şöyle:

[math]V = A\times10^1 + B\times10^0 + C\times10^{-1} + D\times10^{-2}[/math]
Döktürmüşsün yine abi.
Değişkeni float tanımladığımız da bu bize 00.00 olarak mı döner, yoksa 0000 olarak mı döner?

Ekrana yazdırma olayını şöyle çözerim gibime geliyor.
Bu şekilde hem ekrana yazdırmış olurum hemde encoder kullanacağım zaman tek tek müdahale etme şansım olur.
En sonunda da senin formül ile birleştirir bir değişkene atarım. Rakamsal olarak dijital pota gider.
C:
u8g2.setCursor(sayi1 koordinatı);
u8g2.print(sayi1);
u8g2.setCursor(sayi2 koordinatı);
u8g2.print(sayi2);
u8g2.setCursor(nokta koordinatı);
u8g2.print(".");
u8g2.setCursor(sayi3 koordinatı);
u8g2.print(sayi3);
u8g2.setCursor(sayi4 koordinatı);
u8g2.print(sayi4);
 
En mantıklısı işlemleri float olarak yapmak. İşlemler bittikten sonra da sonucu sprintf ile string'e dönüştürüp formatladıktan ekrana yazmak. Kürsör işlerini string üzerinde yapma, bu çok abuk bir kod olur.

Onun yerine şu mantık daha iyi iş görür. Voltaj değeri float olarak V olsun. Eğer kürsör en sağda ise, encoder döndüğünde 0.01 toplayacaksın veya çıkaracaksın. Kürsör bir solda ise 0.1 toplayıp çıkaracaksın. Bir sonraki pozisyon için 1 toplayıp çıkaracaksın. Kürsör en solda ise 10 toplayıp çıkaracaksın. Bu kadar basit.
 
En mantıklısı işlemleri float olarak yapmak. İşlemler bittikten sonra da sonucu sprintf ile string'e dönüştürüp formatladıktan ekrana yazmak. Kürsör işlerini string üzerinde yapma, bu çok abuk bir kod olur.

Onun yerine şu mantık daha iyi iş görür. Voltaj değeri float olarak V olsun. Eğer kürsör en sağda ise, encoder döndüğünde 0.01 toplayacaksın veya çıkaracaksın. Kürsör bir solda ise 0.1 toplayıp çıkaracaksın. Bir sonraki pozisyon için 1 toplayıp çıkaracaksın. Kürsör en solda ise 10 toplayıp çıkaracaksın. Bu kadar basit.
O zaman kürsörün koordinatina göre işlem yaptıracağız. Buna göre kürsör için bir değişken oluşturup koordinat atayacağız.
Tam yazmadım, telefondan zor oluyor ama aşağı yukarı şöyle bir şey;

C:
int kursor = 0;
İf(button) {
kursor = "bir_bsmk";
button++
}


if(kursor == "bir_bsmk" ) {
V = V + 0.01;
}else if(kursor == "iki_bsmk" ) {
V = V + 0.1;
}
 
ife gerek yok. Kürsör pozisyonunu sağdan sola 0 .. 3 ise, bunu -2 ile +1 arasına getireceksin. Sonra da bunu doğrudan 10'un kuvveti yapacaksın, o kadar.

C++:
unsigned int ekran_kursor; /* 0 .. 3 arasinda oldugu garantilenmis */
unsigned int voltaj;

void loop()
{
    numerik_kursor = ekran_kursor - 2;
    
    if (enkoder_sola_dondu)
    {
        unsigned int yeni_voltaj = voltaj - 10^numerik_kursor;

        if (yeni_voltaj >= 0)
        {
            voltaj = yeni_voltaj;
            ekrana_yaz(voltaj);
        }
    }
    else if (enkoder_saga_dondu)
    {
        unsigned int yeni_voltaj = voltaj + 10^numerik_kursor;

        if (yeni_voltaj <= MAX_VOLTAJ)
        {
            voltaj = yeni_voltaj;
            ekrana_yaz(voltaj);
        }
    }
}
 
Öğrenmeye devam etmek önemli. Yaptığım hiçbir proje bir öncekinin aynısı değil, ben de bunu yapıyorum.
Bana da bir yaptığını bir daha yap desen yapamam. Kodlama kısmında çok ortadan başladım. Baştan iyi eğitim almak lazımdı. Artık sadece işine geleni alıyor kafa. İşi bitince de unutuyor. Ama azimliyim. Bu işleri öğreneyim derken ölüp gideceğim gibi görünüyor.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,839
Mesajlar
99,583
Üyeler
2,479
Son üye
yiyehuoxing32

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
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)
Back
Top