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 personel

Forum istatistikleri

Konular
6,948
Mesajlar
118,704
Üyeler
2,822
Son üye
lalemasall

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top