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
5,841
Mesajlar
99,621
Üyeler
2,480
Son üye
mozcelikors

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