Ευκαιρία λοιπόν βρήκα να χρησιμοποιήσω μια "νεόφερτη" οθόνη TFT με touchscreen στις 4.3" και επίσης έναν Arduino DUE
που τα πήρα πιο πολύ για πειραματισμό και εξοικείωση. Αυτό δε που παρατήρησα, ήταν πως υπάρχουν πολύ καλές βιβλιοθήκες
για να οδηγήσει κάποιος εύκολα μια οθόνη τέτοιου τύπου αλλά και τον touch controller της.
Το παιχνίδι είναι η κλασσική τρίλιζα (με τα Χ και Ο) που παίζαμε μικροί. Έβαλα τους δύο παίχτες με τα ονόματά μας (Άγγελος και
μπαμπάς!), έναν πίνακα για το σκόρ και τα δύο κουμπιά του μηδενισμού του σκόρ και του about...
Ο κώδικας προτρέπει κάθε παίχτη με τη σειρά του να παίξει αλλάζοντας χρώμα για τον καθέναν απο αυτούς. Η βαθμολογία
ανεβαίνει ως το 99 και μηδενίζεται με το reset (αν δεν νευριάσει ο μικρός και το σβήσει πριν την ώρα του!).
Χρησιμοποιήθηκαν οι βιβλιοθήκες του Henning Karlsen,
http://www.henningkarlsen.com/electroni ... f=UTFT.rar και http://www.henningkarlsen.com/electroni ... 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);
}
//============================================================================================================
extern στην αρχή του προγράμματος και τις αποθηκεύετε ως .c στο φάκελο της βιβλιοθήκης UTFT που θα κατεβάσετε.
Προς το παρόν, ο τύπος έχει αυτές. Προσπαθώ να φτιάξω και ελληνικά, αλλά το βοήθημα που παρέχει δεν δουλεύει.
Για την οδήγηση της οθόνης απο τον DUE, χρησιμοποιήθηκε ένας ενδιάμεσος προσαρμογέας σε μορφή shield που έχει και ενσωματωμένη
SD card socket για χρήση τέτοιας κάρτας.