Raspberry Pico ile Keypad Kullanımı

@taydin abi bu güne kadar bu mesleğin içindeki kime sorduysam yanlış düşündüğümü söyledi birde sana sormak istiyorum.

Benim fikrimce işlemci programlayacak birinin ileri düzey bir elektronik bilgisi olması gerekiyor. Neden mi?
Bir 2WD araba yaptığımızı düşünelim bu araba(hc05-l298-arduino nano) bunlardan oluşuyor olsun.
Normal bir kullanıcı olarak bu arabaya hız kontrolü yapmak için 4 adet pwm destekli pin kullanmalısınız.
Ama bir elektronikçi olabildiğince tasarruf etmelidir hem işlemci hafızasından hem yapılan işlemden hemde i/o'dan
2 adet pwm destekli pin kullanıp birde "74HC04" kullanarak kontrol yapabiliriz. Bu yöntem ile hem 2 i/o tasarruf hem hafızadan hemde yapılan işlemden tasarruf.

Bu görüşümü kime söylesem program yazan devreyi de kurar abartma diye karşılık alıyorum yanlış mı düşünüyorum acaba.
Düzenleme: Bu düşüncem nedeniyle devamlı entegre öğrenmeye çalışıyorum işlemci olmadan kapıları shift register'ları kullanarak projeler yapmaya çalışıyorum.
 
Firmware ile uğraşan birisinin kesinlikle elektronik biliyor olması lazım. Bu oluşacak problemlerin kısa zamanda anlaşılması ve çözümlenmesi için çok önemli. Onun dışında elektronik tasarımını yapan mühendisin koyduğu devreyi anlayıp o devreye uygun kod yazabilmesi için de gerekli. O yüzden gömülü sistemler için firmware geliştirenler genelde elektronik mühendisi oluyor zaten.

Bilgisayar mühendislerine bu ayrıntılar öğretilmez. Onlar, program yazdıkları donanımın kusursuz çalıştığını varsayabiliyorlar. Ama bana gelen kart, yapılmış olan bir tasarımın ilk prototipi oluyor. Hardware'de mutlaka sorunlar oluyor. Firmware'de de buglar oluyor. O yüzden gereken seviyede çalışan bir sistem elde etmek çok daha zorlaşıyor.
 
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]
Bu doğru bir yazım şekli mi? Sonuç yanlış çıkıyor da.

Kod:
/// 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;
      }else if(tur == 1){
        sayi2 = sayi;
      }else if(tur == 2){
        sayi3 = sayi;
      }else if(tur == 3){
        sayi4 = sayi;
          tur = -1;
      }
      tur++;
      voltaj = sayi1 * 10^1 + sayi2 * 10^0 + sayi3 * 10^-1 + sayi4 * 10^-2;
      Serial.print("voltaj: ");
      Serial.println(voltaj);
 
Gökhan kod parçası koyarken veri tiplerini de dahil et. Yoksa sırf koda bakarak doğru çalışıp çalışmadığını söylemek mümkün değil. Bir de tur değişkeni nedir?
 
Gökhan kod parçası koyarken veri tiplerini de dahil et. Yoksa sırf koda bakarak doğru çalışıp çalışmadığını söylemek mümkün değil. Bir de tur değişkeni nedir?
Abi tur değişkeni dört tane sayı değişkenini tuşladıktan sonra sıfırlayarak başa dönüyor. 4 de sıfırlamazsam sayıya bas basabildiğin kadar. Acemi işi işte takılma :D

Kod:
    int sayi1 = 0;
    int sayi2 = 0;
    int sayi3 = 0;
    int sayi4 = 0;
    int tur = 0;
    float voltaj = 0.0;
 
sayi1, 2, 3, 4 ü float yap. 10'ları da 10.0 yap, böylece işlem tamamen fload olarak yürüsün. Şu anda işlem int olarak yapılıyor ve sonuç tamamen yanlış çıkar.
 
sayi1, 2, 3, 4 ü float yap. 10'ları da 10.0 yap, böylece işlem tamamen fload olarak yürüsün. Şu anda işlem int olarak yapılıyor ve sonuç tamamen yanlış çıkar.
Yarın gündüz bakayım. Kafa doldu akşama kadar. Basmıyor artık :)
 
sayi1, 2, 3, 4 ü float yap. 10'ları da 10.0 yap, böylece işlem tamamen fload olarak yürüsün. Şu anda işlem int olarak yapılıyor ve sonuç tamamen yanlış çıkar.
Değişkenleri float yapınca ^ operatörünü kabul etmiyor.

üst_operatör.png
 
"&,^,|,~,<<,>>%" bu operatörler "int" için geçerliymiş. Float da çalışmıyormuş.
Yani bunları sadece tam sayılarda kullanabiliyormuşuz.
 
Şöyle bir şey buldum deniyorum;

float e3.png
 
Onlar sabit sayı yav, neden her seferinde hesaplatıyorsun?

10[SUP]1[/SUP] = 10.0
10[SUP]0[/SUP] = 1.0
10[SUP]-1[/SUP] = 0.1
10[SUP]-2[/SUP] = 0.01
:D Çok mantıklı. Ama bu sayede float değişkeni için de ^ operatörünün kullanılmadığını, onun yerine "e" harfinin kullanıldığını öğrenmiş oldum.
Bana +1 yazın :D

Yalnız noktayı 3 basamaktan sonra koyuyor. Matematiksel bir hata var sarınırım.

float e3çalıştı.png
 
Şuanda herşey yolunda gibi.
Voltaj 30v dan fazla tuşlanmasın diye bir kaç önlem ekledim.
Küçük bir sıkıntı var. 00.00 yerine 0.00 görüyorum.
Mesela 5v ayarlamak istediğimde 05.00 şeklinde tuşluyorum ama baştaki eleman etkisiz olunca yazmıyor ekrana.
Keypad ile kullanım bakımından hiç bir sıkıntı yok ama bunu enkoder ile ayarlamak istediğimizde oradaki sıfırı görebilmemiz lazım.

20220327_114031.jpg


Kod:
float sayi1 = 0;
float sayi2 = 0;
float sayi3 = 0;
float sayi4 = 0;
int tur = 0;
float voltaj = 00.00;

if ( isdigit(kidx) ) {
    uint8_t sayi = kidx - '0';
    if (tur == 0) {
      if (sayi <= 3) {
        sayi1 = sayi;
      }else{
      tur = -1;
      }
    } else if (tur == 1) {
      if(sayi1 != 3){
      sayi2 = sayi;
      }else{
        tur = 0;
      }
    } else if (tur == 2) {
      sayi3 = sayi;
    } else if (tur == 3) {
      sayi4 = sayi;
      tur = -1;
    }
    tur++;
    voltaj = sayi1 * 10.0 + sayi2 * 1.0 + sayi3 * 0.1 + sayi4 * 0.01;
    Serial.print("voltaj: ");
    Serial.println(voltaj);
 
Tamam dır sprintf komutuyla o işide çözdüm.
Artık burada yapacak iş kalmadı sanırım.
Şimdi aynı ayarları akım sayfası içinde yaptıktan sonra Rotary Encoder ayarlamaları için çalışmaya başlayabilirim.

20220327_124329.jpg


Kod:
    ival = voltaj * 100;
      sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
    u8g2.setCursor(50, 40);
    u8g2.print(buffer);
 

Forum istatistikleri

Konular
7,234
Mesajlar
122,412
Üyeler
2,923
Son üye
birisim

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top