İçindekiler:

Tek Pinli 4×4 Tuş Takımı: 10 Adım
Tek Pinli 4×4 Tuş Takımı: 10 Adım

Video: Tek Pinli 4×4 Tuş Takımı: 10 Adım

Video: Tek Pinli 4×4 Tuş Takımı: 10 Adım
Video: Şifre ve Kart Tanımlama Nasıl Yapılır? 2024, Aralık
Anonim
Tek Pinli 4×4 Tuş Takımı
Tek Pinli 4×4 Tuş Takımı

Ne zaman bir tuş takımı görsem, bir sürü pin ile geliyor, bu Arduino pinlerinizin büyük bir israfı, yani bir tuş takımını tek pinli çalıştırabilir miyiz?. Cevap burada.

Adım 1: Malzeme Listesi

Malzeme Listesi
Malzeme Listesi

Donanım:

01 Arduino UNO

02 Ekmek Tahtaları

I2C ile 01 LCD

16 Basmalı düğmeler

04 direnç 1.5 kΩ

04 direnç 620 Ω

04 direnç 220 Ω

08 direnç 100 Ω

01 direnç 1 kΩ

07 Atlama telleri

Yazılım:

PC'nizde kurulu Arduino IDE

Adım 2: Şematik ve Cicruit

Şematik ve Cicruit
Şematik ve Cicruit
Şematik ve Cicruit
Şematik ve Cicruit

Tüm fikir, sağdaki kabloyla toprağa dikey olarak ve diğer kabloyla (düğme kablosu) yatay olarak bağlanan 4 * 4 basma düğme matrisine ve 1.5 kΩ, 620Ω, 220Ω ve 100Ω dirençlerine sahip olmamızdır. 4 sıra, şematik olarak gösterildiği gibi dört adet 100Ω direnç ile bağlanır.

Bir düğmeye her bastığınızda devreyi kapatırsınız ve akım farklı bir yoldan ve farklı direnç zincirlerinden geçer, bu nedenle pim A0 her basma düğmesi için farklı bir analog okuma alır. Şimdi ihtiyacınız olan tek şey kodlama.

Adım 3: Kod

#Dahil etmek

#Dahil etmek

LiquidCrystal_I2C lcd(0x3f, 20, 4);

int Düğme = A0;

int okuma değeri;

geçersiz kurulum()

{

Seri.başla(9600);

lcd.begin();

pinMode(Düğme, GİRİŞ);

lcd.backlight();

lcd.print("Merhaba Dünya");

gecikme(2000);

lcd.clear();

lcd.print("Tek pinli 4*4 tuş takımı");

gecikme(2000); }

boşluk döngüsü()

{

okuma değeri = analogRead(Button);

Serial.println(okuma değeri);

if (readvalue==852){lcd.clear();lcd.print("A");}

else{ if (readvalue==763){lcd.clear();lcd.print("B");}

else{ if (readvalue==685){lcd.clear();lcd.print("C");}

else{ if (readvalue==965){lcd.clear();lcd.print("D");}

else{ if (readvalue==565){lcd.clear();lcd.print("9");}

else{ if (readvalue==614){lcd.clear();lcd.print("6");}

else{ if (readvalue==360){lcd.clear();lcd.print("3");}

else{ if (readvalue==335){lcd.clear();lcd.print("#");}

else{ if (readvalue==396){lcd.clear();lcd.print("8");}

else{ if (readvalue==349){lcd.clear();lcd.print("5");}

else{ if (readvalue==235){lcd.clear();lcd.print("2");}

else{ if (readvalue==279){lcd.clear();lcd.print("0");}

else{ if (readvalue==452){lcd.clear();lcd.print("7");}

else{ if (readvalue==271){lcd.clear();lcd.print("4");}

else{ if (readvalue==170){lcd.clear();lcd.print("1");}

else{ if (readvalue==92){lcd.clear();lcd.print("*");}else{}}}}}}}}}}}}}}}} }

Adım 4: Değerlerin Düzeltilmesi

Değerlerin Düzeltilmesi
Değerlerin Düzeltilmesi

Seri monitörü açtığınızda 1023 değerini gösterecek, bir düğmeye basarsanız size başka bir okuma verecektir, bu değerleri alıp kodda bazı değişiklikler yapmanız gerekir.

Adım 5: Eleştiri ve İncelemeden Sonra Proje

Eleştiri ve İnceleme Sonrası Proje
Eleştiri ve İnceleme Sonrası Proje

Hepimizin bilgimizi öğrenmek ve paylaşmak için burada olduğumuza şüphe yok, topluluktan bazı kişilerin çok yardımcı olan bazı yorumları sayesinde, projemde bazı ayarlamalar ve iyileştirmeler yapmaya karar verdim:

donanım:

Breadboard'larda kötü bağlantı sorununu önlemek için tüm bileşenleri bir PCB'de lehimlemeye karar verdim.

kod:

Bir arkadaşım bana bir yazılım geri tepme kullanmamı tavsiye etti ve programın bir okuma seçmesi biraz zaman almak için sadece bir döngü (örneğin "for" döngüsü), bu, çok fazla okuma yaptığı anlamına gelir (örneğimde 500) ancak sürer sadece sonuncusu.

for (i=1; i<= 500; i++) { // sadece 500'üncü analoğu alın

değer = analogRead(Button);} // bu biraz zaman ayırmaya ve kötü okumalardan kaçınmaya yardımcı olur

Onun sayesinde başka bir arkadaşım bana "okunan değeri" bir değil bir dizi değerle karşılaştırmamı tavsiye etti çünkü "okunan değer" aynı buton için çok fazla değer alıyor. Örneğin "A": 849, 850, 851 852, 853, 854, 855 yani 7 değer aralığıdır: bir eşik (852) ve sol ve sağ 3 değer. burada yapmamız gereken "readvalue" ile "852" ile "3" arasındaki farkın mutlak değerini karşılaştırmaktır.

if(abs(readvalue-852)<=8){lcd.clear();lcd.print("A");}

Adım 6: Bazı Lehimleme İşlerinden Sonra

Bazı Lehimleme İşlerinden Sonra
Bazı Lehimleme İşlerinden Sonra
Bazı Lehimleme İşlerinden Sonra
Bazı Lehimleme İşlerinden Sonra
Bazı Lehimleme İşlerinden Sonra
Bazı Lehimleme İşlerinden Sonra

7. Adım: Gerçek Anı

Gördüğünüz gibi program bazen düğmeleri karıştırıyor ama yine de çalışıyor, teoride devrede yanlış bir şey yok ama kodun daha fazla kalibrasyona ihtiyacı var.

8. Adım: Son

Umarım bu projeyi beğenirsiniz ve yapmaya çalışırsınız, belki benden daha iyisini yaparsınız.

Sorularınız varsa bana sorun, yorum bırakın ve beğendiyseniz bana oy vermeyi unutmayın.

Önerilen: