İçindekiler:

Arduino Dokunmatik Ekran Hesap Makinesi: 7 Adım
Arduino Dokunmatik Ekran Hesap Makinesi: 7 Adım

Video: Arduino Dokunmatik Ekran Hesap Makinesi: 7 Adım

Video: Arduino Dokunmatik Ekran Hesap Makinesi: 7 Adım
Video: Yazılımcıyım Dediğimde Çevrem vs Aslında Olan 😂 2024, Temmuz
Anonim
Arduino Dokunmatik Hesap Makinesi
Arduino Dokunmatik Hesap Makinesi

Merhaba! Bu, bir Arduino Uno ve bir TFT LCD kalkan kullanarak bir dokunmatik ekranlı hesap makinesi yapma projesidir. Evde programlama dersim için bir konsept buldum ve bu projeyi inşa etme deneyimim çok ilginçti. Bu hesap makinesi dört basit matematiksel işlemi (toplama, çıkarma, çarpma ve bölme) yapabilir. Ayrıca, bunlara sahip olan bölme yanıtları için en fazla iki ondalık nokta görüntüler. Hemen dalalım! Bu proje için gerekli malzemeler aşağıda listelenmiştir.

Gereçler

-Arduino Uno

- 2.4 TFT LCD Shield (burada satın aldım:

- USB A - B kablosu (Arduino'yu bilgisayara bağlamak için kablo)

- Arduino IDE'nin kurulu olduğu bilgisayar

- Ayrıca iki kitaplık indirmeniz gerekecek: MCUFRIEND_kbv ve Dokunmatik Ekran. İlkini github'da bulabilirsin (bağlantı: https://github.com/prenticedavid/MCUFRIEND_kbv) veya aşağıda eklediğim kitaplık zip dosyasını kullanabilirsiniz. İkincisi, kurulum için Arduino Kütüphanesi yöneticisindedir.

Adım 1: Donanım Bağlantıları

Donanım Bağlantıları
Donanım Bağlantıları
Donanım Bağlantıları
Donanım Bağlantıları
Donanım Bağlantıları
Donanım Bağlantıları

Dokunmatik ekran kalkanının Arduino Uno'ya bağlantısı basit ve hızlıdır. Yapmanız gereken tek şey shield üzerindeki en alttaki pinleri Arduino'daki en alttaki pinlerle hizalamak ve shield'ı pinlerin içine itmek. Güç tarafındaki en üstteki 5V pin ve etiketsiz pin, kartın diğer tarafındaki SCL ve SDA etiketli pinler için geçerli olan aynı parametrelerle birlikte ekrandan pinlere sahip olmamalıdır. Artık kodlamaya hazırız!

Adım 2: Kod: Genel Tanımlar ve Kurulum

#Dahil etmek

MCUFRIEND_kbv tft; // zaten UNO kalkanları için kablolu

#Dahil etmek

#define YP A3

#define XM A2

#define YM 9

#define XP 8

Dokunmatik Ekran ts = Dokunmatik Ekran(XP, YP, XM, YM, 300);

#define MINBASINÇ 10

Bu, kütüphaneleri (MCUFRIEND_kbv & Touchscreen) dahil ettiğimiz, X ve Y pinlerini tanımladığımız, dokunmatik ekran parametrelerini ayarladığımız ve Arduino'nun bir kullanıcı basınını kaydetmesi için gereken minimum basıncı tanımladığımız kodun başlangıcıdır.

int kimliği;

int kullanıcı_seçimi;

float save_number = 0;

kayan terim1;

int işlem_sayısı;

yüzer sonuç;

int imleçLocX = 5;

int imleçLocY = 20;

Kurulumdan hemen önce, bazı global değişkenleri ayarlamamız gerekiyor. Kimlik, dokunmatik ekranı çalıştırmaya ve çalıştırmaya yardımcı olur. user_selection, kullanıcının dokunmatik ekrana basarken seçtiği tuşa karşılık gelen bir sayıyı tutar. save_number, bir kullanıcı girişinden sonra ekrana yazdırdığımız değişkendir (bu konuda döngüde daha fazlası). Tamsayıların yanı sıra ondalık sayıları da tutabilmesi için bir şamandıradır. terim1, bir işlenen seçildikten sonra denklemin ilk numarasının kaydedildiği değişkendir. op_num işleneni bir sayı olarak kaydeder (1 toplama için, 2 çıkarma için, 3 çarpma için ve 4 bölme için). sonuç, kullanıcı eşittir işaretine bastıktan sonra ekrana yazdırılan değişkendir. Aynı zamanda bir şamandıradır. imleçLocX ve imleçLocY, dokunmatik ekranda imlecin birden çok kez ayarlandığı eşleme noktalarıdır (üstteki gri çubukta bulunur, aksi takdirde sonuç alanı olarak bilinir).

geçersiz kurulum(){

tft.reset();

Kimlik = tft.readID();

tft.begin(ID);

tft.setRotation(0);

tft.fillScreen(TFT_DARKGREY);

kareler();

sayılar();

tft.setTextSize(3);

tft.setTextColor(TFT_BLUE, TFT_DARKGREY);

}

Kurulum fonksiyonumuz ilk olarak dokunmatik ekran kalkanının (satır 1-3) başlatılmasını içerir. Kalkanın yönü, 0 dik olacak şekilde tft.setRotation() komutu kullanılarak ayarlanır. Tüm ekran, üstüne yazacağımız tft.fillScreen() komutuyla (sonuçlar alanı hariç) koyu gri renktedir. kareler() ve sayılar() işlevleri, hesap makinesinin karelerini çizer, kareleri bir dama tahtası deseninde siyah ve beyaz renklendirir ve karelere mavi renkle sayılar/işlenenler yazar. Bir sonraki adımda bunlara geleceğiz. tft.setTextSize() komutu, sonuçlar alanının metin boyutunu orta bir yazı tipi olan 3'e ayarlar. tft.setTextColor() komutu, sonuçlar alanının metin rengini koyu gri alan üzerine yazılan maviye ayarlar.

Adım 3: Kod: Döngü

geçersiz döngü() { sayıSelect();

gecikme(100);

if (user_selection == 16){

;

}Başka{

if (user_selection < 10){

save_number = save_number * 10 + user_selection;

tft.setCursor(cursorLocX, imleçLocY);

tft.print(kayıtlı_numara);

}else if (user_selection > 10){

geçiş (user_selection){

durum 11:

işlem_sayısı = 1;

tft.setCursor(cursorLocX, imleçLocY);

tft.print("+");

terim1 = kayıtlı_sayı;

save_number = 0;

kırmak;

durum 12:

işlem_sayısı = 2;

tft.setCursor(cursorLocX, imleçLocY);

tft.print("-");

terim1 = kayıtlı_sayı;

save_number = 0;

kırmak;

durum 13:

işlem_sayısı = 3;

tft.setCursor(cursorLocX, imleçLocY);

tft.print("X");

terim1 = kayıtlı_sayı;

save_number = 0;

kırmak;

durum 14:

işlem_sayısı = 4;

tft.setCursor(cursorLocX, imleçLocY);

tft.print("/");

terim1 = kayıtlı_sayı;

save_number = 0;

kırmak;

durum 15:

save_number = 0;

terim1 = 0;

işlem_sayısı = 0;

tft.setCursor(cursorLocX, imleçLocY);

tft.print(" ");

kırmak;

}

tft.setCursor(cursorLocX, imleçLocY);

Bu çiğnemek için çok fazla, bu yüzden yukarıda ne olduğunu açıklayacağım. Dokunmatik ekrandaki her kareye bir sayı atayan numberSelect() işlevini çağırarak başlıyoruz. Bir kullanıcı bu karelerden birine bastığında, fonksiyon user_selection değişkenini karenin numarasına ayarlar. İlk if ifadesi, yalnızca geçerli bir kullanıcı seçimi yapılmışsa döngüden geçmek içindir. Eğer öyleyse, bir sonraki if deyimi, user_selection'da kayıtlı 10'dan küçük bir sayıya sahip olup olmadığını sorar (0-9 sayıları). Varsa, kaydedilen_sayı 10 ile çarpılır ve user_selection içindeki sayı, dokunmatik ekrandaki sonuçlar alanında yazdırılan kayıtlı_numaraya eklenir. Olmazsa, bir sonraki if ifadesi user_selection'da kayıtlı 10'dan büyük bir sayı olup olmadığını sorar (işlenen sayılar: + için 11, - için 12, X için 13, / için 14 ve net ekran karesi için 15). Her durumla bir anahtar işlevi ilgilenir (user_selection tarafından belirlenir). op_num değişkenine, seçilen işlenene karşılık gelen bir sayı verilir (+ için 1, - için 2, X için 3 ve / için 4). save_number içindeki değer term1 değişkenine kaydedilir, böylece save_number değişkeni denklemin ikinci yarısı için kullanılabilir. İşlenen sembolü, sonuçlar alanındaki herhangi bir sayının silinmesiyle birlikte ekrana yazdırılır. Tek istisna, tüm hesaplama değişkenlerini sıfırlayan ve sonuç alanını üzerindeki herhangi bir şeyden temizleyen net ekran karesidir.

}Başka{

geçiş(op_num){

dava 1:

sonuç = terim1 + kaydedilen_sayı;

tft.setCursor(cursorLocX, imleçLocY);

tft.print(çift(sonuç));

kırmak;

durum 2:

sonuç = terim1 - kaydedilen_sayı;

tft.setCursor(cursorLocX, imleçLocY);

tft.print(çift(sonuç));

kırmak;

durum 3:

sonuç = terim1 * kayıtlı_sayı;

tft.setCursor(cursorLocX, imleçLocY);

tft.print(çift(sonuç));

kırmak;

durum 4:

sonuç = kayan nokta(terim1) / kayan nokta(kaydedilen_sayı);

tft.setCursor(cursorLocX, imleçLocY);

tft.print(sonuç);

kırmak;

}

tft.setCursor(cursorLocX, imleçLocY);

save_number = sonuç;

terim1 = 0;

işlem_sayısı = 0;

gecikme(1000);

}

}

}

Döngünün son kısmı, kullanıcının eşittir işaretini seçmesi olayıyla ilgilidir (user_selection == 10). Başka bir geçiş işlevi, dört matematiksel işlev (op_num tarafından belirlenir) aracılığıyla çalışır. Toplama durumu (durum 1), terim1 ve kaydedilen_sayıyı birlikte ekler ve sayıyı sonuç değişkenine kaydeder. Sonuç, sonuç alanına çift olarak yazdırılır. Çıkarma durumu (durum 2), kaydedilen_sayıyı terim1'den çıkarır ve sayıyı sonuç değişkenine kaydeder. Sonuç, sonuç alanına çift olarak yazdırılır. Çarpma durumu (durum 3), terim1'i kayıtlı_sayı ile çarpar ve sayıyı sonuç değişkenine kaydeder. Sonuç, sonuç alanına bir çift olarak yazdırılır. Bölme durumu (durum 4), terim1'i kayıtlı_sayı ile birlikte böler ve sayıyı sonuç değişkenine kaydeder. Sonuç, sonuç alanına bir kayan nokta olarak yazdırılır (çünkü bölme yanıtları ondalık sayılar olabilir). Ekrana bir sayı, işlenen veya sonuç yazdırıldıktan sonra imleç sıfırlanır, kaydedilen_sayı önceki sonuca ayarlanır ve terim1 ve işlem_sayısı sıfırlanır.

Birkaç not: Kullanıcı, ondalık nokta karesi olmadığı için hesap makinesine ondalık sayılar giremez. Ayrıca, kullanıcı aynı anda yalnızca bir denklem yapabilir. Bir sonucu hesaplayıp bu sonucu toplayamaz/çıkartamaz/çarpamaz/bölemezsiniz. numberSelect() işlevinde, bir kullanıcı başka bir kareye bastığında bir sonuç yazdırıldıktan sonra ekranı temizleyen bir işlev vardır.

Adım 4: Kod: Kareler İşlevi

boşluk kareler (){

// her satırda siyah ve beyaz kareler dönüşümlü olarak ve birinci ve üçüncü satırlar, ikinci ve dördüncü satırlardan zıt bir desene sahip

tft.fillRect(0, 60, 60, 65, TFT_BLACK); // karelerin ilk satırı başlar, siyahtan beyaza tft.fillRect(60, 60, 60, 65, TFT_WHITE);

tft.fillRect(120, 60, 60, 65, TFT_BLACK);

tft.fillRect(180, 60, 60, 65, TFT_WHITE); // karelerin ilk satırı biter

tft.fillRect(0, 125, 60, 65, TFT_WHITE); // ikinci kare sırası başlar, beyazdan siyaha tft.fillRect(60, 125, 60, 65, TFT_BLACK);

tft.fillRect(120, 125, 60, 65, TFT_WHITE);

tft.fillRect(180, 125, 60, 65, TFT_BLACK); // ikinci sıra kareler biter

tft.fillRect(0, 190, 60, 65, TFT_BLACK); // üçüncü kare sırası başlar, siyahtan beyaza tft.fillRect(60, 190, 60, 65, TFT_WHITE);

tft.fillRect(120, 190, 60, 65, TFT_BLACK);

tft.fillRect(180, 190, 60, 65, TFT_WHITE); // üçüncü sıra kareler biter

tft.fillRect(0, 255, 60, 65, TFT_WHITE); // dördüncü satır kareler başlar, beyazdan siyaha tft.fillRect(60, 255, 60, 65, TFT_BLACK);

tft.fillRect(120, 255, 60, 65, TFT_WHITE);

tft.fillRect(180, 255, 60, 65, TFT_BLACK); // dördüncü sıra kareler biter

}

squares() işlevi oldukça basittir. tft.fillRect(X1, Y1, X2, Y2, TFT_COLOR) komutu, kendisine iletilen parametrelere göre x ve y'nin birinci konumları, x ve y'nin ikinci konumları ve dikdörtgenin doldurulduğu renge göre bir dikdörtgen çizer.. Bu işlev, dört sıra karenin tümünü (teknik olarak dikdörtgenler) çizer ve her kareyi kendisine iletilen renkle doldurur.

Adım 5: Kod: Sayılar İşlevi

boş sayılar (){

tft.setTextColor(TFT_BLUE); // sayı/karakter rengini mavi yapar

tft.setTextSize(5); // sayı/karakter boyutunu 5 olarak ayarlar

tft.setCursor(18, 75); // imleci sayıların/karakterlerin ilk satırı için ayarlar

tft.print("7 8 9 /"); // sayıların/karakterlerin ilk satırını yazdırır

tft.setCursor(18, 140); // imleci ikinci sayı/karakter satırı için ayarlar

tft.print("4 5 6 X"); // sayıların/karakterlerin ikinci satırını yazdırır

tft.setCursor(18, 205); // imleci sayıların/karakterlerin üçüncü satırı için ayarlar

tft.print("1 2 3 -"); // sayıların/karakterlerin üçüncü satırını yazdırır

tft.setCursor(18, 270); // imleci dördüncü sayı/karakter satırı için ayarlar

tft.print("C0 = +"); // sayıların/karakterlerin dördüncü satırını yazdırır

}

Number() işlevi de basittir. İlk iki satır, metin boyutunu daha büyük ve rengi mavi olarak ayarlar. tft.setCursor() komutu, imleci, sayıların yazılmasının başladığı her satırdaki konuma ayarlar. Ardından tft.print() komutu sayıları/karakterleri karelerin üzerine yazdırır.

Adım 6: Kod: NumberSelect İşlevi

geçersiz sayıSelect(){

TSPoint p = ts.getPoint();

pinMode(XM, ÇIKIŞ);

pinMode(YP, ÇIKIŞ);

if (p.z > MINBASINÇ){

p.x = harita(p.x, 250, 845, 0, 239);

p.y = harita(p.y, 245, 860, 0, 319);

if (sonuç != 0){

sonuç = 0;

save_number = 0;

tft.print("DEĞERLERİ TEMİZLE");

gecikme(500);

tft.setCursor(cursorLocX, imleçLocY);

tft.print(" ");

tft.setCursor(cursorLocX, imleçLocY);

}

numberSelect() işlevini başlatmak için dokunmatik ekrandan ts.getPoint() komutuyla kullanıcı girişi istiyoruz. Bu veriler toplandıktan sonra, minimum basıncın aşılıp aşılmadığını (veya başka bir deyişle, kullanıcının dokunmatik ekranda bir yere basıp basmadığını) kontrol ederiz. Eğer öyleyse, x ve y koordinatları Kartezyen koordinatlardan dokunmatik ekrana özel koordinatlara eşlenir. (0, 0) dokunmatik ekranın sol üst köşesidir, x ekseni karşıdan ve y ekseni aşağı iner. Sonraki kısım, sonuçta kaydedilen bir sayı olup olmadığını kontrol eder. Varsa, sonuç ve kayıtlı_sayı 0'a sıfırlanır. Sonuçlar alanına "DEĞERLERİ TEMİZLE" mesajı yazdırılır ve imleç başlangıç konumuna geri döndürülerek ekran temizlenir.

if (p.y 60){ // karelerin ilk satırı

eğer (p.x < 60)

user_selection = 7;

başka ise (p.x < 120)

user_selection = 8;

else if (p.x < 180)

user_selection = 9;

başka user_selection = 14;

}else if (p.y 125){ // ikinci satır kareler

eğer (p.x < 60)

user_selection = 4;

başka ise (p.x < 120)

user_selection = 5;

else if (p.x < 180)

user_selection = 6;

başka user_selection = 13;

}else if (p.y 190){ // üçüncü kareler satırı

eğer (p.x < 60)

user_selection = 1;

başka ise (p.x < 120)

user_selection = 2;

else if (p.x < 180)

user_selection = 3;

başka user_selection = 12;

}else if (p.y > 255){ // dördüncü satır kareler

eğer (p.x < 60)

user_selection = 15;

başka ise (p.x < 120)

user_selection = 0;

else if (p.x < 180)

user_selection = 10;

başka user_selection = 11;

}

}Başka{

user_selection = 16; // user_selection 16'ya ayarlandı (değişken yok)

}

}

Bu, hangi butonun seçildiğini belirleyen kısımdır. Arduino, en üstteki kareler ile başlayıp en alt sıra ile biten ekranın gerçekte nereye basıldığını arar. Daha sonra kareye bir sayı atar ve bu sayıyı user_selection içine kaydeder. 0-9 sayıları sayı karelerine, 11-15 sayıları işlenen karelere ve net kareye ve 10 sayısı eşittir işareti karesine karşılık gelir. Herhangi bir kare seçilmemişse, kullanıcı_seçimi 16'ya ayarlanır, bu da döngünün yeniden başlamasını sağlar (döngü işlevine bakın).

Adım 7: Biten Projenizin Keyfini Çıkarın

İşte aldın! Artık toplama, çıkarma, çarpma ve bölme yapabilen dokunmatik ekranlı bir hesap makineniz var. Bu proje, bir hesap makinesinin işe yaradığını düşündüğüm yolu tamamen değiştirdi. Bu proje üzerinde çalışırken derste hocama "Bir daha asla hesap makinesine aynı gözle bakmayacağım!" dediğimi hatırlıyorum. Bir kullanıcı olarak sizin kolay olduğunu düşündüğünüz işlevler, fikrinizi taklit etmeye çalışan bilgisayarın arkasında olduğunuzda biraz zordur. Umarım projeyi beğenmişsinizdir ve umarım bir hesap makinesinin nasıl çalıştığına dair zihniyetiniz de değişmiştir!

İşte size kolaylık sağlamak için kodun tamamı. Yorumlarla doludur, bu nedenle herhangi bir sorununuz varsa, her satırın ne yaptığını size göstermeleri gerekir.

Önerilen: