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.

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;
      }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

C++:
    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?

101 = 10.0
100 = 1.0
10-1 = 0.1
10-2 = 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


C++:
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);
 

Ç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