İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
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
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
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
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
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
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.