1000 TL Üzeri Alışverişlerde Ücretsiz Kargo ve Türkiye'nin Her Yerine 59,90₺

Arduino Dokunmatik LCD Hesap Makinesi Yapımı | Robocombo

Arduino Dokunmatik LCD Hesap Makinesi Yapımı | Robocombo
Merhaba arkadaşlar, bu yazımızda TFT LCD kullanarak Arduino ile Dokunmatik Hesap Makinesi Yapımı konusunu inceleyeceğiz. Hesap makinası hayatta her alanda ihtiyacımız olan bir araçtır. Arduino, projelerin kolayca oluşturulmasına ve daha çekici görünmelerine her zaman yardımcı olmuştur. LCD ekranın dokunmatik ekran seçeneğiyle programlanması karmaşık bir görev gibi gelebilir, ancak Arduino kütüphaneleri ve shield'lar bunu gerçekten çok kolay hale getirmiştir. Bu projede Toplama, Çıkarma, Bölme ve Çarpma gibi tüm temel hesaplamaları yapabilen kendi Arduino Dokunmatik Ekran hesap makinesi yapımı için 2.4 ”Arduino TFT LCD ekran kullanacağız.  

TFT LCD kullanarak Arduino Dokunmatik Hesap Makinesi Yapımı için Gerekli Malzemeler:

  1. Arduino Uno R3
  2. 2.4 inch TFT LCD Ekran Shield
  3. 9v Pil

 

TFT LCD Ekran Modülünü Tanıma:

Projeye gerçekten başlamadan önce, 2.4 inç TFT LCD Modülünün nasıl çalıştığını ve pinlerin neler olduğunu bilmek önemlidir.

Lcd ekran shield'ın Arduino Uno ve Arduino Mega ile uyumlu 28 pini vardır. Pin sınıflandırması aşağıdaki tabloda verilmektedir.

Pimler, LCD Komut Pimleri, LCD Veri Pimleri, SD Kart Pimleri ve Güç Pimleri olarak 4 bölümde sınıflandırılmıştır. Bu pimlerin ayrıntıları hakkında çok fazla bilgiye ihtiyacımız yok.

Lcd shield modülü üzerinde, bmp görüntü dosyalarını yükleyebilmek için bir SD kart yuvası mevcuttur ve yüklenen görüntüleri Arduino Programı kullanılarak TFT LCD ekranınızda görüntüleyebilirsiniz.

 

Dokunmatik Özelliği için TFT LCD Ekranı Kalibre Etme:

TFT LCD ekranın dokunmatik işlevini kullanabilmek için düzgün kalibre etmeniz gerekir. Kalibrasyonu olmayan bir LCD ekran dokunmatiği düzgün çalışmayabilir. Kalibrasyon ayarları her kart tipi için farklı olacaktır.

Kalibrasyon yapmanın en iyi yolu, kalibrasyon örnek programını (kütüphane ile birlikte gelir) kullanmak veya hatayı tespit etmek için ekranı test ederek kullanmaktır. Aşağıdaki programlama bölümü altında ekranınızı nasıl kalibre edebileceğinizi de açıklayacağız.

Arduino ile TFT LCD Bağlantıları:

2.4 ” TFT LCD ekran mükemmel bir Arduino Shield'dir. LCD ekran doğrudan Arduino Uno'nun üzerine takılabilir, pimlerle mükemmel bir şekilde eşleşir.

 

Arduino Uno R3, TFT LCD için Programlama:

Arduino hesap makinesi kodunu çalıştırmak için SPFD5408 Kütüphanesini kullanıyoruz. Bu Adafruit'in değiştirilmiş bir kütüphanesidir ve LCD TFT Modülümüzle sorunsuz bir şekilde çalışabilir. Programın tamamını bu makalenin sonunda kontrol edebilirsiniz.

Not: Bu kütüphaneyi Arduino IDE'nize kurmanız, programı hatasız derlemek için çok önemlidir.

Bu kütüphaneyi kurmak için, yukarıdaki bağlantıya tıklayın. Clone or Download butonuna tıklayın ve "Download ZIP" i seçin. Bir zip dosyası indirilecektir.

Şimdi, Arduino IDE'yi açın ve Taslak -> Library Ekle -> .ZIP kütüphanesi ekle'yi seçin. Bir tarayıcı penceresi açılarak ZIP dosyasına gidin ve “Tamam” a tıklayın. Başarılı olursa Arduino'nun sol alt köşesinde “Kütüphane eklendi” ifadesini görmelisiniz.

Şimdi, Arduino IDE'nizde aşağıdaki kodu kullanabilir ve Dokunmatik Ekran Hesap makinesinin çalışması için Arduino UNO'nuza yükleyebilirsiniz.

Bu programın çalışması için üç kütüphaneye ihtiyacımız var; bu üç kütüphane de yukarıda verilen bağlantıdan indirdiğiniz ZIP dosyasından ulaşabilirsiniz.

#include <SPFD5408_Adafruit_GFX.h>    // Core graphics library
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_TouchScreen.h>

Daha önce de belirtildiği gibi, LCD ekranı beklendiği gibi çalışması için kalibre etmemiz gerekiyor. Burada verilen değerler (TS_MINX, TS_MINY, TS_MAXX ve TS_MAXY değişkenleri) ekranın kalibrasyonuna karar verir.

#define TS_MINX 125
#define TS_MINY 85
#define TS_MAXX 965
#define TS_MAXY 905

TFT LCD ekranın çok fazla renk gösterebileceğini bildiğimiz için, tüm bu renklerin onaltılık değerde girilmesi gerekir.

 

#define WHITE   0x0000 //Black->White
#define YELLOW    0x001F //Blue->Yellow
#define CYAN     0xF800 //Red->Cyan
#define PINK   0x07E0 //Green-> Pink
#define RED    0x07FF //Cyan -> Red
#define GREEN 0xF81F //Pink -> Green
#define BLUE  0xFFE0 //Yellow->Blue
#define BLACK   0xFFFF //White-> Black

Şimdi programlama kısmına girebiliriz. Bu programa dahil olan üç bölüm vardır. Bunlardan biri, düğmeleri ve ekranı olan bir hesap makinesinin kullanıcı arayüzünü oluşturmaktır. Daha sonra, kullanıcıların dokunuşuna göre düğmeleri algılamak ve son olarak sonuçları hesaplamak ve görüntülemek.

 

Hesap Makinesi Kullanıcı Arayüzü Oluşturma

Hesap makinesinin Kullanıcı Arayüzü 16 düğme üzerine kurulu basit bir temel mantık ile oluşur. Eklenen kütüphaneler, Çizgiler, Dikdörtgen, Daireler, Karakterler, Dizeler ve çok daha fazla şeklin renklendirilmesine izin verecektir. Kullanılabilir işlevleri bu makaleden inceleyebilirsiniz.

Standart bir hesap makinesine benzetmek için her kutunun genişliği ve yüksekliği 60 pikseldir.

//Draw the Result Box
  tft.fillRect(0, 0, 240, 80, CYAN);

 //Draw First Column
  tft.fillRect  (0,260,60,60,RED);
  tft.fillRect  (0,200,60,60,BLACK);
  tft.fillRect  (0,140,60,60,BLACK);
  tft.fillRect  (0,80,60,60,BLACK);

 //Draw Third Column 
  tft.fillRect  (120,260,60,60,GREEN);
  tft.fillRect  (120,200,60,60,BLACK);
  tft.fillRect  (120,140,60,60,BLACK);
  tft.fillRect  (120,80,60,60,BLACK);

  //Draw Secound & Fourth Column 
  for (int b=260; b>=80; b-=60)
 { tft.fillRect  (180,b,60,60,BLUE);
   tft.fillRect  (60,b,60,60,BLACK);}

  //Draw Horizontal Lines
  for (int h=80; h<=320; h+=60)
  tft.drawFastHLine(0, h, 240, WHITE);

  //Draw Vertical Lines
  for (int v=0; v<=240; v+=60)
  tft.drawFastVLine(v, 80, 240, WHITE);

  //Display keypad lables
  for (int j=0;j<4;j++) {
    for (int i=0;i<4;i++) {
      tft.setCursor(22 + (60*i), 100 + (60*j));
      tft.setTextSize(3);
      tft.setTextColor(WHITE);
      tft.println(symbol[j][i]);

Düğmeleri Algılama

Bir başka zorlu görev, kullanıcının dokunuşunu tespit etmektir. Kullanıcı herhangi bir yere dokunduğunda, pikselin X ve Y konumlarına nasıl dokunduğunu öğrenebiliriz. Bu değer, aşağıda gösterildiği gibi Serial.println kullanılarak ekranda görüntülenebilir.

TSPoint p = waitTouch();
X = p.y; Y = p.x;
Serial.print(X); Serial.print(','); Serial.println(Y);// + " " + Y);

Her biri 60 piksel genişlik ve yüksekliğe sahip kutuyu 0,0 noktasından başlayan sütunlar ve satırlara tasarlıyoruz. Her kutunun konumu aşağıdaki resimde gösterildiği gibi olmalıdır.

Ancak kalibrasyon problemi nedeniyle beklenen ve gerçek değer arasında büyük bir fark olacaktır.

Bu nedenle, kutunun tam konumunu tahmin etmek için çizgiyi tıklamanız ve ekranda karşılık gelen konumunu kontrol etmeniz gerekir. Bu yöntem, kalibrasyon için en profesyonel yöntem olmayabilir, ancak yine de iş görecektir. Tüm çizgilerin konumunu ölçtük ve aşağıdaki değerleri elde ettik.

 

Şimdi, tüm kutuların konumunu bildiğimiz için. Bir kullanıcı herhangi bir yere dokunduğunda, (X, Y) değerlerini aşağıda gösterildiği gibi her bir kutunun değeri ile karşılaştırarak nereye dokunduğunu tahmin edebiliriz.

if (X<105 && X>50) //Detecting Buttons on Column 2
  {
    if (Y>0 && Y<85)
    {Serial.println ("Button 0"); //Button 0 is Pressed
    if (Number==0)
    Number=0;
    else
    Number = (Number*10) + 0; //Pressed twice
    }

   
     if (Y>85 && Y<140)
    {Serial.println ("Button 2");
     if (Number==0)
    Number=2;
    else
    Number = (Number*10) + 2; //Pressed twice
    }

Sayıları Görüntüleme ve Sonucu Hesaplama

Son adım sonucu hesaplamak ve TFT LCD Ekranda görüntülemek...  Arduino hesap makinesi sadece 2 sayılar ile işlem yapabilir. Bu iki sayı “Num1” ve “Num2” değişkenleri olarak adlandırılır. “Number” değişkeni Num1 ve Num2'den değer verir ve değer alır ve ayrıca sonucu taşır.

Bir düğmeye basıldığında, numaraya bir basamak eklenir. Başka bir düğmeye basıldığında, bir önceki rakam 10 ile çarpılır ve yeni rakam onunla eklenir. Örneğin, 8'e ve sonra 5'e ve sonra 7'ye basarsak, önce değişken 8 tutacaktır, sonra (8 * 10) + 5 = 85 sonra (85 * 10) +7 = 857 olacaktır.

if (Y>192 && Y<245)
    {Serial.println ("Button 8");
     if (Number==0)
    Number=8;
    else
    Number = (Number*10) + 8; //Pressed again
    } 

Toplama gibi herhangi bir işlem gerçekleştirdiğimizde, kullanıcılar toplama düğmesine bastığında Sayı'daki değer Num1'e aktarılacak ve daha sonra Sayı sıfırlanacak, böylece ikinci sayı girişi için veri almaya hazır hale gelecektir.

Eşittir tuşuna basıldığında Sayı'daki değer Num2'ye gönderilir ve ardından ilgili hesaplama yapılır ve sonuç tekrar “Sayı” değişkeninde saklanır.

Son olarak bu değer LCD ekranda görüntülenecektir.

Çalışma

Bu Arduino Dokunmatik Ekran Hesap Makinesi'nin çalışması basittir. Aşağıdaki kodu Arduino'nuza yüklemeniz ve çalıştırmanız gerekir. Hesap makinesini LCD ekranınızda görüntüleyebilirsiniz.

Artık herhangi bir sayı girebilir ve hesaplamalarınızı yapabilirsiniz. Şimdilik sadece iki basamaklı işlemler ile sınırlıdır. Ancak, kodu geliştirebilirsiniz.

Bir hesaplama yaptıktan sonra her seferinde ekrandaki değeri silmek için C ye basmanız gerekir.

Ayrıca aşağıdaki Videoya da göz atın.

 

Hesap Makinesi Yapımı için Arduino Kodu

/*______Import Libraries_______*/
#include <SPFD5408_Adafruit_GFX.h>    // Core graphics library
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_TouchScreen.h>
/*______End of Libraries_______*/

/*______Define LCD pins (I have asigned the default values)_______*/
#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
/*_______End of defanitions______*/

/*______Assign names to colors and pressure_______*/
#define WHITE   0x0000 //Black->White
#define YELLOW    0x001F //Blue->Yellow
#define CYAN     0xF800 //Red->Cyan
#define PINK   0x07E0 //Green-> Pink
#define RED    0x07FF //Cyan -> Red
#define GREEN 0xF81F //Pink -> Green 
#define BLUE  0xFFE0 //Yellow->Blue
#define BLACK   0xFFFF //White-> Black
#define MINPRESSURE 10
#define MAXPRESSURE 1000
/*_______Assigned______*/

/*____Calibrate TFT LCD_____*/
#define TS_MINX 125
#define TS_MINY 85
#define TS_MAXX 965
#define TS_MAXY 905
/*______End of Calibration______*/

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); //300 is the sensitivity
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Start communication with LCD

String symbol[4][4] = {
  { "7", "8", "9", "/" },
  { "4", "5", "6", "*" },
  { "1", "2", "3", "-" },
  { "C", "0", "=", "+" }
};
 int X,Y;
 long Num1,Num2,Number;
 char action;
 boolean result = false;

void setup() {
  Serial.begin(9600); //Use serial monitor for debugging
  tft.reset(); //Always reset at start
  tft.begin(0x9341); // My LCD uses LIL9341 Interface driver IC
  tft.setRotation(2); // I just roated so that the power jack faces up - optional
  tft.fillScreen(WHITE);

  IntroScreen();
  
  draw_BoxNButtons(); 
}

void loop() {
TSPoint p = waitTouch();
X = p.y; Y = p.x;
//  Serial.print(X); Serial.print(','); Serial.println(Y);// + " " + Y);

DetectButtons();

if (result==true)
CalculateResult();

DisplayResult();   

  delay(300);
}

TSPoint waitTouch() {
  TSPoint p;
  do {
    p = ts.getPoint(); 
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
  } while((p.z < MINPRESSURE )|| (p.z > MAXPRESSURE));
  p.x = map(p.x, TS_MINX, TS_MAXX, 0, 320);
  p.y = map(p.y, TS_MINY, TS_MAXY, 0, 240);;
  return p;
}

void DetectButtons()
{
  
  if (X<50 && X>0) //Detecting Buttons on Column 1
  {
    if (Y>0 && Y<85) //If cancel Button is pressed
    {Serial.println ("Button Cancel"); Number=Num1=Num2=0; result=false;}
    
     if (Y>85 && Y<140) //If Button 1 is pressed
    {Serial.println ("Button 1"); 
    if (Number==0)
    Number=1;
    else
    Number = (Number*10) + 1; //Pressed twice
    }
    
     if (Y>140 && Y<192) //If Button 4 is pressed
    {Serial.println ("Button 4"); 
    if (Number==0)
    Number=4;
    else
    Number = (Number*10) + 4; //Pressed twice
    }
    
     if (Y>192 && Y<245) //If Button 7 is pressed
    {Serial.println ("Button 7");
    if (Number==0)
    Number=7;
    else
    Number = (Number*10) + 7; //Pressed twice
    } 
  }

    if (X<105 && X>50) //Detecting Buttons on Column 2
  {
    if (Y>0 && Y<85)
    {Serial.println ("Button 0"); //Button 0 is Pressed
    if (Number==0)
    Number=0;
    else
    Number = (Number*10) + 0; //Pressed twice
    }
    
     if (Y>85 && Y<140)
    {Serial.println ("Button 2"); 
     if (Number==0)
    Number=2;
    else
    Number = (Number*10) + 2; //Pressed twice
    }
    
     if (Y>140 && Y<192)
    {Serial.println ("Button 5"); 
     if (Number==0)
    Number=5;
    else
    Number = (Number*10) + 5; //Pressed twic
    }
    
     if (Y>192 && Y<245)
    {Serial.println ("Button 8"); 
     if (Number==0)
    Number=8;
    else
    Number = (Number*10) + 8; //Pressed twic
    }   
  }

    if (X<165 && X>105) //Detecting Buttons on Column 3
  {
    if (Y>0 && Y<85)
    {Serial.println ("Button Equal"); 
    Num2=Number;
    result = true;
    }
    
     if (Y>85 && Y<140)
    {Serial.println ("Button 3"); 
     if (Number==0)
    Number=3;
    else
    Number = (Number*10) + 3; //Pressed twice
    }
    
     if (Y>140 && Y<192)
    {Serial.println ("Button 6"); 
    if (Number==0)
    Number=6;
    else
    Number = (Number*10) + 6; //Pressed twice
    }
    
     if (Y>192 && Y<245)
    {Serial.println ("Button 9");
    if (Number==0)
    Number=9;
    else
    Number = (Number*10) + 9; //Pressed twice
    }   
  }

      if (X<213 && X>165) //Detecting Buttons on Column 3
  {
    Num1 = Number;    
    Number =0;
    tft.setCursor(200, 20);
    tft.setTextColor(RED);
    if (Y>0 && Y<85)
    {Serial.println ("Addition"); action = 1; tft.println('+');}
     if (Y>85 && Y<140)
    {Serial.println ("Subtraction"); action = 2; tft.println('-');}
     if (Y>140 && Y<192)
    {Serial.println ("Multiplication"); action = 3; tft.println('*');}
     if (Y>192 && Y<245)
    {Serial.println ("Devesion"); action = 4; tft.println('/');}  

    delay(300);
  }  
}

void CalculateResult()
{
  if (action==1)
    Number = Num1+Num2;

  if (action==2)
    Number = Num1-Num2;

  if (action==3)
    Number = Num1*Num2;

  if (action==4)
    Number = Num1/Num2; 
}

void DisplayResult()
{
    tft.fillRect(0, 0, 240, 80, CYAN);  //clear result box
    tft.setCursor(10, 20);
    tft.setTextSize(4);
    tft.setTextColor(BLACK);
    tft.println(Number); //update new value
}

void IntroScreen()
{
  tft.setCursor (55, 120);
  tft.setTextSize (3);
  tft.setTextColor(RED);
  tft.println("ARDUINO");
  tft.setCursor (30, 160);
  tft.println("CALCULATOR");
  tft.setCursor (30, 220);
  tft.setTextSize (2);
  tft.setTextColor(BLUE);
  tft.println("-Circut Digest");
  delay(1800);
}

void draw_BoxNButtons()
{
  //Draw the Result Box
  tft.fillRect(0, 0, 240, 80, CYAN);

 //Draw First Column
  tft.fillRect  (0,260,60,60,RED);
  tft.fillRect  (0,200,60,60,BLACK);
  tft.fillRect  (0,140,60,60,BLACK);
  tft.fillRect  (0,80,60,60,BLACK);

 //Draw Third Column  
  tft.fillRect  (120,260,60,60,GREEN);
  tft.fillRect  (120,200,60,60,BLACK);
  tft.fillRect  (120,140,60,60,BLACK);
  tft.fillRect  (120,80,60,60,BLACK);

  //Draw Secound & Fourth Column  
  for (int b=260; b>=80; b-=60)
 { tft.fillRect  (180,b,60,60,BLUE); 
   tft.fillRect  (60,b,60,60,BLACK);}

  //Draw Horizontal Lines
  for (int h=80; h<=320; h+=60)
  tft.drawFastHLine(0, h, 240, WHITE);

  //Draw Vertical Lines
  for (int v=0; v<=240; v+=60)
  tft.drawFastVLine(v, 80, 240, WHITE);

  //Display keypad lables 
  for (int j=0;j<4;j++) {
    for (int i=0;i<4;i++) {
      tft.setCursor(22 + (60*i), 100 + (60*j));
      tft.setTextSize(3);
      tft.setTextColor(WHITE);
      tft.println(symbol[j][i]);
    }
  }
}

Etiketler: Arduino Dokunmatik LCD Hesap Makinesi Yapımı
Kasım 13, 2021
Listeye dön
cultureSettings.RegionId: 0 cultureSettings.LanguageCode: TR
Çerez Uyarısı

Alışveriş deneyiminizi iyileştirmek için yasal düzenlemelere uygun çerezler (cookies) kullanıyoruz. Detaylı bilgiye Gizlilik ve Çerez Politikası
sayfamızdan erişebilirsiniz.