TFT LCD 4.3" τρίλιζα με Arduino DUE

Ψηφιακά κυκλώματα που δεν εντάσσονται στις παραπάνω κατηγορίες.
Άβαταρ μέλους
manolena
Δημοσιεύσεις: 43
Εγγραφή: 02 Φεβ 2014, 16:45
Ονομα: Μάνος
Επικοινωνία:

TFT LCD 4.3" τρίλιζα με Arduino DUE

Δημοσίευσηαπό manolena » 21 Φεβ 2015, 23:50

1.jpg
1.jpg (50 KiB) Προβλήθηκε 4957 φορές

Μια κατασκευή "στον αέρα", για χάρη του γιου μου που ήθελε να του φτιάξω ένα παιχνίδι.
Ευκαιρία λοιπόν βρήκα να χρησιμοποιήσω μια "νεόφερτη" οθόνη TFT με touchscreen στις 4.3" και επίσης έναν Arduino DUE
που τα πήρα πιο πολύ για πειραματισμό και εξοικείωση. Αυτό δε που παρατήρησα, ήταν πως υπάρχουν πολύ καλές βιβλιοθήκες
για να οδηγήσει κάποιος εύκολα μια οθόνη τέτοιου τύπου αλλά και τον touch controller της.

Το παιχνίδι είναι η κλασσική τρίλιζα (με τα Χ και Ο) που παίζαμε μικροί. Έβαλα τους δύο παίχτες με τα ονόματά μας (Άγγελος και
μπαμπάς!), έναν πίνακα για το σκόρ και τα δύο κουμπιά του μηδενισμού του σκόρ και του about...

2.jpg
2.jpg (61.63 KiB) Προβλήθηκε 4957 φορές



Ο κώδικας προτρέπει κάθε παίχτη με τη σειρά του να παίξει αλλάζοντας χρώμα για τον καθέναν απο αυτούς. Η βαθμολογία
ανεβαίνει ως το 99 και μηδενίζεται με το reset (αν δεν νευριάσει ο μικρός και το σβήσει πριν την ώρα του!).
Χρησιμοποιήθηκαν οι βιβλιοθήκες του Henning Karlsen,

http://www.henningkarlsen.com/electronics/download.php?f=UTFT.rar και http://www.henningkarlsen.com/electronics/download.php?f=UTouch.rar , ενώ ο κώδικας ακολουθεί για όποια χρήση. Βέβαια, εννοείται οτι δεν υπάρχει πάλι σχολιασμός (!!!)...

Κώδικας: Επιλογή όλων

#include <UTFT.h>
#include <UTouch.h>
//============================================================================================================
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t OCR_A_Extended_M[];
extern uint8_t Ubuntubold[];

//============================================================================================================
UTFT myGLCD(ITDB43, 25, 26, 27, 28);
UTouch  myTouch( 6, 5, 4, 3, 2);
//============================================================================================================
int x, y;
int upper_Left, upper_Center, upper_Right, middle_Left, middle_Center, middle_Right, lower_Left, lower_Center, lower_Right;
int turn, win_Case, numb_Turns;
byte score_1, score_2 = 0;
char s[11];
//============================================================================================================
void setup()
{
  Serial.begin(9600);
  myGLCD.InitLCD();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  myGLCD.clrScr();
}
//============================================================================================================
void loop()
{
  if ((numb_Turns == 0) || (numb_Turns == 2) || (numb_Turns == 4) || (numb_Turns == 6) || (numb_Turns == 8))
  {
    turn = 1;
  }
  else if ((numb_Turns == 1) || (numb_Turns == 3) || (numb_Turns == 5) || (numb_Turns == 7))
  {
    turn = 2;
  }

  myGLCD.setFont(OCR_A_Extended_M);

  myGLCD.setColor(255, 255, 255);
  myGLCD.fillRect(0, 60, 190, 65);
  myGLCD.fillRect(0, 125, 190, 130);
  myGLCD.fillRect(60, 0, 65, 190);
  myGLCD.fillRect(125, 0, 130, 190);

  if (turn == 1)
  {
    myGLCD.setColor(255, 0, 0);
    myGLCD.print("ANGEL, IT'S YOUR TURN!  ", LEFT, 210);
  }
  else if (turn == 2)
  {
    myGLCD.setColor(0, 255, 0);
    myGLCD.print("DADDY, IT'S YOUR TURN!   ", LEFT, 210);
  }
  myGLCD.setColor(255, 255, 0);
  myGLCD.print("SCORE:   ", RIGHT, 15);
  myGLCD.setColor(255, 0, 0);
  snprintf(s, 10, "ANGEL: %d ", score_1);
  myGLCD.print(s, RIGHT, 55);
  myGLCD.setColor(0, 255, 0);
  snprintf(s, 10, "DADDY: %d ", score_2);
  myGLCD.print(s, RIGHT, 95);

  myGLCD.setFont(BigFont);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect(210, 70, 310, 115);
  myGLCD.print("RESET", 220, 85);
  myGLCD.drawRoundRect(210, 135, 310, 180);
  myGLCD.print("INFO", 225, 150);

  if (myTouch.dataAvailable())
  {
    myTouch.read();
    x = myTouch.getX();
    y = myTouch.getY();

    myGLCD.setFont(Ubuntubold);
    if ((y >= 0) && (y <= 50))
    {
      if ((x >= 0) && (x <= 50))
      {
        if (upper_Left == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 20, 20);
            numb_Turns++;
            upper_Left = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 20, 20);
            numb_Turns++;
            upper_Left = 2;
          }
        }
      }
    }


    if ((y >= 0) && (y <= 50))
    {
      if ((x >= 80) && (x <= 110))
      {
        if (upper_Center == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 85, 20);
            numb_Turns++;
            upper_Center = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 85, 20);
            numb_Turns++;
            upper_Center = 2;
          }
        }
      }
    }


    if ((y >= 0) && (y <= 50))
    {
      if ((x >= 130) && (x <= 180))
      {
        if (upper_Right == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 150, 20);
            numb_Turns++;
            upper_Right = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 150, 20);
            numb_Turns++;
            upper_Right = 2;
          }
        }
      }
    }


    if ((y >= 70) && (y <= 115))
    {
      if ((x >= 0) && (x <= 50))
      {
        if (middle_Left == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 20, 85);
            numb_Turns++;
            middle_Left = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 20, 85);
            numb_Turns++;
            middle_Left = 2;
          }
        }
      }
    }


    if ((y >= 70) && (y <= 115))
    {
      if ((x >= 80) && (x <= 110))
      {
        if (middle_Center == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 85, 85);
            numb_Turns++;
            middle_Center = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 85, 85);
            numb_Turns++;
            middle_Center = 2;
          }
        }
      }
    }

    if ((y >= 70) && (y <= 115))
    {
      if ((x >= 130) && (x <= 180))
      {
        if (middle_Right == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 150, 85);
            numb_Turns++;
            middle_Right = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 150, 85);
            numb_Turns++;
            middle_Right = 2;
          }
        }
      }
    }

    if ((y >= 130) && (y <= 180))
    {
      if ((x >= 0) && (x <= 50))
      {
        if (lower_Left == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 20, 150);
            numb_Turns++;
            lower_Left = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 20, 150);
            numb_Turns++;
            lower_Left = 2;
          }
        }
      }
    }

    if ((y >= 130) && (y <= 180))
    {
      if ((x >= 80) && (x <= 110))
      {
        if (lower_Center == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 85, 150);
            numb_Turns++;
            lower_Center = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 85, 150);
            numb_Turns++;
            lower_Center = 2;
          }
        }
      }
    }

    if ((y >= 130) && (y <= 180))
    {
      if ((x >= 130) && (x <= 180))
      {
        if (lower_Right == 0)
        {
          delay(10);
          if (turn == 1)
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("X", 150, 150);
            numb_Turns++;
            lower_Right = 1;
          }
          if (turn == 2)
          {
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("O", 150, 150);
            numb_Turns++;
            lower_Right = 2;
          }
        }
      }
    }

    if ((y >= 70) && (y <= 115))
    {
      if ((x >= 210) && (x <= 310))
      {
        delay(10);
        upper_Left = 0;
        upper_Center = 0;
        upper_Right = 0;
        middle_Left = 0;
        middle_Center = 0;
        middle_Right = 0;
        lower_Left = 0;
        lower_Center = 0;
        lower_Right = 0;
        turn = 0;
        win_Case = 0;
        score_1 = 0;
        score_2 = 0;
        numb_Turns = 0;
        myGLCD.clrScr();
      }
    }

    if ((upper_Left == 0) && (upper_Center == 0) && (upper_Right == 0) && (middle_Left == 0) && (middle_Center == 0) && (middle_Right == 0) && (lower_Left == 0) && (lower_Center == 0) && (lower_Right == 0))
    {

      if ((y >= 135) && (y <= 180))
      {
        if ((x >= 210) && (y <= 310))
        {
          delay(10);
          myGLCD.clrScr();
          delay(500);
          myGLCD.setFont(OCR_A_Extended_M);
          myGLCD.setColor(0, 255, 0);
          myGLCD.print("TPILIZA ", CENTER, 50);
          myGLCD.setColor(0, 0, 255);
          myGLCD.print("MANOS MAR.", CENTER, 90);
          myGLCD.print("2015", CENTER, 130);
          myGLCD.setColor(255, 0, 0);
          myGLCD.print("HOW ARE YOU TODAY ANGEL?", CENTER, 180);
          delay(5000);
          myGLCD.clrScr();
        }
      }
    }

    if (((upper_Left == 1) && (upper_Center == 1) && (upper_Right == 1)) || ((middle_Left == 1) && (middle_Center == 1) && (middle_Right == 1)) || ((lower_Left == 1) && (lower_Center == 1) && (lower_Right == 1)) || ((upper_Left == 1) && (middle_Left == 1) && (lower_Left == 1)) || ((upper_Center == 1) && (middle_Center == 1) && (lower_Center == 1)) || ((upper_Right == 1) && (middle_Right == 1) && (lower_Right == 1)) || ((upper_Left == 1) && (middle_Center == 1) && ( lower_Right == 1)) || ((upper_Right == 1) && (middle_Center == 1) && (lower_Left == 1)))
    {
      myGLCD.setFont(OCR_A_Extended_M);
      myGLCD.setColor(255, 0, 0);
      myGLCD.print("ANGEL Wins!!            ", LEFT, 210);
      delay(2000);
      upper_Left = 0;
      upper_Center = 0;
      upper_Right = 0;
      middle_Left = 0;
      middle_Center = 0;
      middle_Right = 0;
      lower_Left = 0;
      lower_Center = 0;
      lower_Right = 0;
      turn = 0;
      numb_Turns = 0;
      myGLCD.clrScr();
      score_1++;
    }

    if (((upper_Left == 2) && (upper_Center == 2) && (upper_Right == 2)) || ((middle_Left == 2) && (middle_Center == 2) && (middle_Right == 2)) || ((lower_Left == 2) && (lower_Center == 2) && (lower_Right == 2)) || ((upper_Left == 2) && (middle_Left == 2) && (lower_Left == 2)) || ((upper_Center == 2) && (middle_Center == 2) && (lower_Center == 2)) || ((upper_Right == 2) && (middle_Right == 2) && (lower_Right == 2)) || ((upper_Left == 2) && (middle_Center == 2) && ( lower_Right == 2)) || ((upper_Right == 2) && (middle_Center == 2) && (lower_Left == 2)))
    {
      myGLCD.setFont(OCR_A_Extended_M);
      myGLCD.setColor(0, 255, 0);
      myGLCD.print("DADDY Wins!!             ", LEFT, 210);
      delay(2000);
      upper_Left = 0;
      upper_Center = 0;
      upper_Right = 0;
      middle_Left = 0;
      middle_Center = 0;
      middle_Right = 0;
      lower_Left = 0;
      lower_Center = 0;
      lower_Right = 0;
      turn = 0;
      numb_Turns = 0;
      myGLCD.clrScr();
      score_2++;
    }

    if (numb_Turns == 9)
    {
      myGLCD.setColor(0, 255, 0);
      myGLCD.print("END OF GAME!          ", LEFT, 210);
      delay(2000);
      upper_Left = 0;
      upper_Center = 0;
      upper_Right = 0;
      middle_Left = 0;
      middle_Center = 0;
      middle_Right = 0;
      lower_Left = 0;
      lower_Center = 0;
      lower_Right = 0;
      turn = 0;
      win_Case = 0;
      numb_Turns = 0;
      myGLCD.clrScr();
    }
  }
  delay (100);
}
//============================================================================================================


3.jpg
3.jpg (83.6 KiB) Προβλήθηκε 4957 φορές


Τις γραμματοσειρές μπορείτε να τις κατεβάσετε απο εδώ:http://www.henningkarlsen.com/electronics/r_fonts.php Απλά τις κάνετε
extern στην αρχή του προγράμματος και τις αποθηκεύετε ως .c στο φάκελο της βιβλιοθήκης UTFT που θα κατεβάσετε.
Προς το παρόν, ο τύπος έχει αυτές. Προσπαθώ να φτιάξω και ελληνικά, αλλά το βοήθημα που παρέχει δεν δουλεύει.

Για την οδήγηση της οθόνης απο τον DUE, χρησιμοποιήθηκε ένας ενδιάμεσος προσαρμογέας σε μορφή shield που έχει και ενσωματωμένη
SD card socket για χρήση τέτοιας κάρτας.
My way of learning is trial and error.

Άβαταρ μέλους
GeorgeVita
Διαχειριστής
Δημοσιεύσεις: 499
Εγγραφή: 04 Σεπ 2013, 21:51
Ονομα: Γιώργος
Επικοινωνία:

Re: TFT LCD 4.3" τρίλιζα με Arduino DUE

Δημοσίευσηαπό GeorgeVita » 22 Φεβ 2015, 09:42

Παιδιά=πηγή έμπνευσης!
Μού 'φτιαξες τη μέρα! Πληκτρολογώ με τα κλειδιά στο χέρι, πάμε για κούλουμα χωρίς internet, καλά να περάσετε και εσείς!
Σχόλια για το παιχνίδι την Τρίτη...

Άβαταρ μέλους
GeorgeVita
Διαχειριστής
Δημοσιεύσεις: 499
Εγγραφή: 04 Σεπ 2013, 21:51
Ονομα: Γιώργος
Επικοινωνία:

Re: TFT LCD 4.3" τρίλιζα με Arduino DUE

Δημοσίευσηαπό GeorgeVita » 24 Φεβ 2015, 12:44

Μάνο το ενδιαφέρον είναι η γρήγορη (όπως αναφέρεις) υλοποίηση της εφαρμογής με τη χρήση h/w και s/w modules.
Οσον αφορά την έλλειψη σχολιασμού εντός του κώδικα, σε άτομα με λίγη εμπειρία δεν είναι πρόβλημα. Εκτός αυτού, η προσπάθεια κατανόησης βοηθά στην απόκτηση της γνώσης, υπάρχει και η περιγραφή των βιβλιοθηκών.

Φαντάζομαι αναπτύσσεις το firmware στο τυπικό περιβάλλον "Arduino Software IDE".

Άβαταρ μέλους
manolena
Δημοσιεύσεις: 43
Εγγραφή: 02 Φεβ 2014, 16:45
Ονομα: Μάνος
Επικοινωνία:

Re: TFT LCD 4.3" τρίλιζα με Arduino DUE

Δημοσίευσηαπό manolena » 24 Φεβ 2015, 15:10

Καλή Σαρακοστή πια, Γιώργο!

Όπως τα λές, η ανάπτυξη γίνεται μέσα στο περιβάλλον του Arduino. Ο λόγος είναι απλός, υπάρχει αμεσότητα χωρίς πολλή εμβάθυνση σε επιμέρους ρυθμίσεις hardware του μ/Ε, μιας και αυτό γίνεται με μαγικό -αλλά μνημοβόρο, είναι η αλήθεια- τρόπο στις εκάστοτε βιβλιοθήκες. Είναι θέμα συνήθειας εν τω μεταξύ όπως κι εσύ καλύτερα γνωρίζεις, η προσαρμογή σε περιβάλλον ανάπτυξης που "βολεύει" τις ανάγκες του καθενός.
My way of learning is trial and error.


Επιστροφή σε “Λοιπά ψηφιακά κυκλώματα”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης