Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XPT2046_Touchscreen not working with Adafruit_ILI9341 library #26

Open
sonastyle opened this issue Aug 12, 2019 · 7 comments
Open

XPT2046_Touchscreen not working with Adafruit_ILI9341 library #26

sonastyle opened this issue Aug 12, 2019 · 7 comments

Comments

@sonastyle
Copy link

sonastyle commented Aug 12, 2019

Description

Tft display stop responding after touch object spi begins, touch works perfectly but stops tft.

Steps To Reproduce Problem

Please give detailed instructions needed for anyone to attempt to reproduce the problem.

Hardware & Software

TFT - ILI9341
https://robu.in/product/2-8-inch-spi-touch-screen-module-tft-interface-240320/?gclid=EAIaIQobChMIzZr0vJT94wIVVHRgCh01Uwy6EAQYAyABEgKWUfD_BwE

Board - ESP32 wrrom node
Shields / modules used
Arduino IDE version 1.8.2
Version info & package name (from Tools > Boards > Board Manager) Arduino ESP32 1.0.2
Operating system & version Windows 7 64

Arduino Sketch

demonstrates the problem)
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <XPT2046_Touchscreen.h>

#define TS_MINX 400
#define TS_MINY 330
#define TS_MAXX 3875
#define TS_MAXY 3700

// For the Adafruit shield, these are the default.
#define TFT_DC 26
#define TFT_CS 5
#define TFT_MOSI 23
#define TFT_CLK 18
#define TFT_RST -1
#define TFT_MISO 19
#define Touch_CS 22
#define Touch_IRQ 21

#define YP TFT_RST // must be an analog pin, use "An" notation! Y+ //cs
#define XM TFT_RST // must be an analog pin, use "An" notation! X- //cd
//#define YP TFT_CS // must be an analog pin, use "An" notation! Y+ //cs
//#define XM TFT_DC // must be an analog pin, use "An" notation! X- //cd
#define YM 0 // can be a digital pin Y-
#define XP 0 // can be a digital pin X+

#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

const unsigned char circle[]PROGMEM = {
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x7f,0xff,0x80,0x0,0x0,0x0,
0x0,0x0,0x3,0xff,0xff,0xf0,0x0,0x0,0x0,
0x0,0x0,0xf,0xff,0xff,0xfc,0x0,0x0,0x0,
0x0,0x0,0x1f,0xff,0xff,0xfe,0x0,0x0,0x0,
0x0,0x0,0x7f,0xf0,0x3,0xff,0x80,0x0,0x0,
0x0,0x0,0xff,0x80,0x0,0x7f,0xc0,0x0,0x0,
0x0,0x1,0xfe,0x0,0x0,0x1f,0xe0,0x0,0x0,
0x0,0x3,0xf8,0x0,0x0,0x7,0xf0,0x0,0x0,
0x0,0x7,0xf0,0x0,0x0,0x3,0xf8,0x0,0x0,
0x0,0xf,0xe0,0x0,0x0,0x1,0xfc,0x0,0x0,
0x0,0xf,0xc0,0x0,0x0,0x0,0xfc,0x0,0x0,
0x0,0x1f,0x80,0x0,0x0,0x0,0x7e,0x0,0x0,
0x0,0x3f,0x0,0x0,0x0,0x0,0x3f,0x0,0x0,
0x0,0x3e,0x0,0x0,0x0,0x0,0x1f,0x0,0x0,
0x0,0x7e,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,
0x0,0x7c,0x0,0x0,0x0,0x0,0xf,0x80,0x0,
0x0,0x7c,0x0,0x0,0x0,0x0,0xf,0x80,0x0,
0x0,0xf8,0x0,0x0,0x0,0x0,0x7,0xc0,0x0,
0x0,0xf8,0x0,0x0,0x0,0x0,0x7,0xc0,0x0,
0x0,0xf8,0x0,0x0,0x0,0x0,0x7,0xc0,0x0,
0x0,0xf0,0x0,0x0,0x0,0x0,0x3,0xc0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,
0x0,0xf0,0x0,0x0,0x0,0x0,0x3,0xc0,0x0,
0x0,0xf8,0x0,0x0,0x0,0x0,0x7,0xc0,0x0,
0x0,0xf8,0x0,0x0,0x0,0x0,0x7,0xc0,0x0,
0x0,0xf8,0x0,0x0,0x0,0x0,0x7,0xc0,0x0,
0x0,0x7c,0x0,0x0,0x0,0x0,0xf,0x80,0x0,
0x0,0x7c,0x0,0x0,0x0,0x0,0xf,0x80,0x0,
0x0,0x7e,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,
0x0,0x3e,0x0,0x0,0x0,0x0,0x1f,0x0,0x0,
0x0,0x3f,0x0,0x0,0x0,0x0,0x3f,0x0,0x0,
0x0,0x1f,0x80,0x0,0x0,0x0,0x7e,0x0,0x0,
0x0,0xf,0xc0,0x0,0x0,0x0,0xfc,0x0,0x0,
0x0,0xf,0xe0,0x0,0x0,0x1,0xfc,0x0,0x0,
0x0,0x7,0xf0,0x0,0x0,0x3,0xf8,0x0,0x0,
0x0,0x3,0xf8,0x0,0x0,0x7,0xf0,0x0,0x0,
0x0,0x1,0xfe,0x0,0x0,0x1f,0xe0,0x0,0x0,
0x0,0x0,0xff,0x80,0x0,0x7f,0xc0,0x0,0x0,
0x0,0x0,0x7f,0xf0,0x3,0xff,0x80,0x0,0x0,
0x0,0x0,0x1f,0xff,0xff,0xfe,0x0,0x0,0x0,
0x0,0x0,0xf,0xff,0xff,0xfc,0x0,0x0,0x0,
0x0,0x0,0x3,0xff,0xff,0xf0,0x0,0x0,0x0,
0x0,0x0,0x0,0x7f,0xff,0x80,0x0,0x0,0x0,
0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

const unsigned char x_bitmap[]PROGMEM = {
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x3,0xff,0xff,0xc0,0x1,0xff,0xff,0xe0,0x0,
0x1,0xff,0xff,0xe0,0x1,0xff,0xff,0xc0,0x0,
0x1,0xff,0xff,0xf0,0x3,0xff,0xff,0xc0,0x0,
0x0,0xff,0xff,0xf0,0x7,0xff,0xff,0x80,0x0,
0x0,0xff,0xff,0xf8,0x7,0xff,0xff,0x80,0x0,
0x0,0x7f,0xff,0xf8,0xf,0xff,0xff,0x0,0x0,
0x0,0x3f,0xff,0xfc,0xf,0xff,0xfe,0x0,0x0,
0x0,0x3f,0xff,0xfe,0x1f,0xff,0xfe,0x0,0x0,
0x0,0x1f,0xff,0xfe,0x1f,0xff,0xfc,0x0,0x0,
0x0,0x1f,0xff,0xff,0x3f,0xff,0xfc,0x0,0x0,
0x0,0xf,0xff,0xff,0x7f,0xff,0xf8,0x0,0x0,
0x0,0xf,0xff,0xff,0xff,0xff,0xf8,0x0,0x0,
0x0,0x7,0xff,0xff,0xff,0xff,0xf0,0x0,0x0,
0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,
0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,
0x0,0x1,0xff,0xff,0xff,0xff,0xc0,0x0,0x0,
0x0,0x1,0xff,0xff,0xff,0xff,0xc0,0x0,0x0,
0x0,0x0,0xff,0xff,0xff,0xff,0x80,0x0,0x0,
0x0,0x0,0xff,0xff,0xff,0xff,0x80,0x0,0x0,
0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,
0x0,0x0,0x3f,0xff,0xff,0xfe,0x0,0x0,0x0,
0x0,0x0,0x3f,0xff,0xff,0xfe,0x0,0x0,0x0,
0x0,0x0,0x1f,0xff,0xff,0xfc,0x0,0x0,0x0,
0x0,0x0,0x1f,0xff,0xff,0xfc,0x0,0x0,0x0,
0x0,0x0,0x1f,0xff,0xff,0xfc,0x0,0x0,0x0,
0x0,0x0,0x3f,0xff,0xff,0xfe,0x0,0x0,0x0,
0x0,0x0,0x3f,0xff,0xff,0xfe,0x0,0x0,0x0,
0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,
0x0,0x0,0xff,0xff,0xff,0xff,0x80,0x0,0x0,
0x0,0x0,0xff,0xff,0xff,0xff,0x80,0x0,0x0,
0x0,0x1,0xff,0xff,0xff,0xff,0xc0,0x0,0x0,
0x0,0x1,0xff,0xff,0xff,0xff,0xc0,0x0,0x0,
0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,
0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,
0x0,0x7,0xff,0xff,0xff,0xff,0xf0,0x0,0x0,
0x0,0xf,0xff,0xff,0xff,0xff,0xf8,0x0,0x0,
0x0,0xf,0xff,0xff,0xff,0xff,0xf8,0x0,0x0,
0x0,0x1f,0xff,0xff,0x7f,0xff,0xfc,0x0,0x0,
0x0,0x1f,0xff,0xfe,0x3f,0xff,0xfc,0x0,0x0,
0x0,0x3f,0xff,0xfc,0x3f,0xff,0xfe,0x0,0x0,
0x0,0x3f,0xff,0xfc,0x1f,0xff,0xfe,0x0,0x0,
0x0,0x7f,0xff,0xf8,0x1f,0xff,0xff,0x0,0x0,
0x0,0xff,0xff,0xf8,0xf,0xff,0xff,0x80,0x0,
0x0,0xff,0xff,0xf0,0x7,0xff,0xff,0x80,0x0,
0x1,0xff,0xff,0xe0,0x7,0xff,0xff,0xc0,0x0,
0x1,0xff,0xff,0xe0,0x3,0xff,0xff,0xc0,0x0,
0x3,0xff,0xff,0xc0,0x3,0xff,0xff,0xe0,0x0,
0x3,0xff,0xff,0xc0,0x1,0xff,0xff,0xe0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired

//Adafruit_TFTLCD tft = Adafruit_TFTLCD(TFT_CS,TFT_DC,TFT_MOSI,TFT_MISO,TFT_RST);
//TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC,TFT_RST);
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
XPT2046_Touchscreen ts(Touch_CS,Touch_IRQ);

int gameScreen = 1;
int moves = 1;

int winner = 0; //0 = Draw, 1 = Human, 2 = CPU

boolean buttonEnabled = true;

int board[] = { 0,0,0,0,0,0,0,0,0 };// holds position data 0 is blank, 1 human, 2 is computer

void setup() {
Serial.begin(115200);
Serial.print("Starting...");
randomSeed(analogRead(0));

initDisplay();
drawStartScreen();
ts.begin();
ts.setRotation(1);

}

//touch main loop
bool test = false;

void loop()
{
TS_Point p = ts.getPoint(); //Get touch point

if (gameScreen == 3)
{
buttonEnabled = true;
}

if (p.z > ts.pressureThreshhold) {

Serial.print("RAW X = "); Serial.print(p.x);
Serial.print("\tRAW Y = "); Serial.print(p.y);

p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);

Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print("\n");

if (p.x>60 && p.x<260 && p.y>180 && p.y<220 && buttonEnabled)// The user has pressed inside the red rectangle
{
buttonEnabled = false; //Disable button
Serial.println("Button Pressed");
resetGame();
//This is important, because the libraries are sharing pins
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);

drawGameScreen();
playGame();

}
if (!test) {
drawGameScreen();
test = true;
}

delay(10);
}

}

void resetGame()
{
buttonEnabled = false;
for (int i = 0; i<9; i++)
{
board[i] = 0;
}
moves = 1;
winner = 0;
gameScreen = 2;
}

void drawStartScreen()
{

tft.fillScreen(BLACK);

//Draw white frame
tft.drawRect(0, 0, 319, 240, WHITE);

//Print "Tic Tac Toe" Text
tft.setCursor(30, 100);
tft.setTextColor(WHITE);
tft.setTextSize(4);
tft.print("Tic Tac Toe");

//Print "YouTube!" text
tft.setCursor(80, 30);
tft.setTextColor(GREEN);
tft.setTextSize(4);
tft.print("Arduino");

createStartButton();

}

void createStartButton()
{
//Create Red Button
tft.fillRect(60, 180, 200, 40, RED);
tft.drawRect(60, 180, 200, 40, WHITE);
tft.setCursor(72, 188);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("Start Game");
}

void initDisplay()
{
//tft.reset();
tft.begin(0x9325);
tft.setRotation(1);
}

void drawGameScreen()
{

tft.fillScreen(BLACK);

//Draw frame
tft.drawRect(0, 0, 319, 240, WHITE);

drawVerticalLine(125);

drawVerticalLine(195);

drawHorizontalLine(80);

drawHorizontalLine(150);

}

void drawGameOverScreen()
{

tft.fillScreen(BLACK);

//Draw frame
tft.drawRect(0, 0, 319, 240, WHITE);

//Print "Game Over" Text
tft.setCursor(50, 30);
tft.setTextColor(WHITE);
tft.setTextSize(4);
tft.print("GAME OVER");

if (winner == 0)
{
//Print "DRAW!" text
tft.setCursor(110, 100);
tft.setTextColor(YELLOW);
tft.setTextSize(4);
tft.print("DRAW");
}
if (winner == 1)
{
//Print "HUMAN WINS!" text
tft.setCursor(40, 100);
tft.setTextColor(BLUE);
tft.setTextSize(4);
tft.print("HUMAN WINS");
}

if (winner == 2)
{
//Print "CPU WINS!" text
tft.setCursor(60, 100);
tft.setTextColor(RED);
tft.setTextSize(4);
tft.print("CPU WINS");
}

createPlayAgainButton();

pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);

}

void createPlayAgainButton()
{
//Create Red Button
tft.fillRect(60, 180, 200, 40, RED);
tft.drawRect(60, 180, 200, 40, WHITE);
tft.setCursor(72, 188);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("Play Again");
}

void drawHorizontalLine(int y)
{
int i = 0;
for (i = 0; i<7; i++)
{
tft.drawLine(60, y + i, 270, y + i, WHITE);
}
}

void drawVerticalLine(int x)
{
int i = 0;
for (i = 0; i<7; i++)
{
tft.drawLine(x + i, 20, x + i, 220, WHITE);
}
}

void playGame()
{
do
{
if (moves % 2 == 1)
{
arduinoMove();
printBoard();
checkWinner();
}
else
{
playerMove();
printBoard();
checkWinner();
}
moves++;
} while (winner == 0 && moves<10);
if (winner == 1)
{
Serial.println("HUMAN WINS");
delay(3000);
gameScreen = 3;
drawGameOverScreen();
}
else if (winner == 2)
{
Serial.println("CPU WINS");
delay(3000);
gameScreen = 3;
drawGameOverScreen();
}
else
{
Serial.println("DRAW");
delay(3000);
gameScreen = 3;
drawGameOverScreen();
}

}

// for touch ip
void playerMove()
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
TS_Point p;
boolean validMove = false;
Serial.print("\nPlayer Move:");
do
{
p = ts.getPoint(); //Get touch point
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);
Serial.println(p.x);
Serial.println(p.y);

if ((p.x<115) && (p.y >= 150)) //6
{
if (board[6] == 0)
{
Serial.println("Player Move: 6");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[6] = 1;
drawPlayerMove(6);
Serial.println("Drawing player move");
}
}
else if ((p.x>0 && p.x<115) && (p.y<150 && p.y>80)) //3
{

if (board[3] == 0)
{
Serial.println("Player Move: 3");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[3] = 1;
drawPlayerMove(3);
Serial.println("Drawing player move");
}
}
else if ((p.x<125) && (p.y<80)) //0
{
if (board[0] == 0)
{
Serial.println("Player Move: 0");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[0] = 1;
drawPlayerMove(0);
}
}

else if ((p.x>125 && p.x <= 195) && (p.y<80)) //1
{
if (board[1] == 0)
{
Serial.println("Player Move: 1");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[1] = 1;
drawPlayerMove(1);
}
}

else if ((p.x>195) && (p.y<80)) //2
{
if (board[2] == 0)
{
Serial.println("Player Move: 2");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[2] = 1;
drawPlayerMove(2);
}
}

else if ((p.x>125 && p.x <= 195) && (p.y<150 && p.y>80)) //4
{
if (board[4] == 0)
{
Serial.println("Player Move: 4");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[4] = 1;
drawPlayerMove(4);
}
}

else if ((p.x>195) && (p.y<150 && p.y>80)) //5
{
if (board[5] == 0)
{
Serial.println("Player Move: 5");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[5] = 1;
drawPlayerMove(5);
}
}

else if ((p.x>125 && p.x <= 195) && (p.y>150)) //7
{
if (board[7] == 0)
{
Serial.println("Player Move: 7");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[7] = 1;
drawPlayerMove(7);
}
}

else if ((p.x>195) && (p.y>150)) //8
{
if (board[8] == 0)
{
Serial.println("Player Move: 8");
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
board[8] = 1;
drawPlayerMove(8);
}
}

}
} while (p.z<ts.pressureThreshhold);
}

void printBoard()
{
int i = 0;
Serial.println("Board: [");
for (i = 0; i<9; i++)
{
Serial.print(board[i]);
Serial.print(",");
}
Serial.print("]");
}

int checkOpponent()
{
if (board[0] == 1 && board[1] == 1 && board[2] == 0)
return 2;
else if (board[0] == 1 && board[1] == 0 && board[2] == 1)
return 1;
else if (board[1] == 1 && board[2] == 1 && board[0] == 0)
return 0;
else if (board[3] == 1 && board[4] == 1 && board[5] == 0)
return 5;
else if (board[4] == 1 && board[5] == 1 && board[3] == 0)
return 3;
else if (board[3] == 1 && board[4] == 0 && board[5] == 1)
return 4;
else if (board[1] == 0 && board[4] == 1 && board[7] == 1)
return 1;
else
return 100;
}

void arduinoMove()
{
int b = 0;
int counter = 0;
int movesPlayed = 0;
Serial.print("\nArduino Move:");

int firstMoves[] = { 0,2,6,8 }; // will use these positions first

for (counter = 0; counter<4; counter++) //Count first moves played
{
if (board[firstMoves[counter]] != 0) // First move is played by someone
{
movesPlayed++;
}
}
do {
if (moves <= 2)
{
int randomMove = random(4);
int c = firstMoves[randomMove];

if (board[c] == 0)
{
delay(1000);
board[c] = 2;
Serial.print(firstMoves[randomMove]);
Serial.println();
drawCpuMove(firstMoves[randomMove]);
b = 1;
}

}
else
{
int nextMove = checkOpponent();
if (nextMove == 100)
{
if (movesPlayed == 4) //All first moves are played
{
int randomMove = random(9);
if (board[randomMove] == 0)
{
delay(1000);
board[randomMove] = 2;
Serial.print(randomMove);
Serial.println();
drawCpuMove(randomMove);
b = 1;
}
}
else
{
int randomMove = random(4);
int c = firstMoves[randomMove];

if (board[c] == 0)
{
delay(1000);
board[c] = 2;
Serial.print(firstMoves[randomMove]);
Serial.println();
drawCpuMove(firstMoves[randomMove]);
b = 1;
}
}
}
else
{
delay(1000);
board[nextMove] = 2;
drawCpuMove(nextMove);
b = 1;
}
}
} while (b<1);
}

void drawCircle(int x, int y)
{
drawBitmap(x, y, circle, 65, 65, RED);
}

void drawX(int x, int y)
{
drawBitmap(x, y, x_bitmap, 65, 65, BLUE);
}

void drawCpuMove(int move)
{
switch (move)
{
case 0: drawCircle(55, 15); break;
case 1: drawCircle(130, 15); break;
case 2: drawCircle(205, 15); break;
case 3: drawCircle(55, 85); break;
case 4: drawCircle(130, 85); break;
case 5: drawCircle(205, 85); break;
case 6: drawCircle(55, 155); break;
case 7: drawCircle(130, 155); break;
case 8: drawCircle(205, 155); break;
}
}

void drawPlayerMove(int move)
{
switch (move)
{
case 0: drawX(55, 15); break;
case 1: drawX(130, 15); break;
case 2: drawX(205, 15); break;
case 3: drawX(55, 85); break;
case 4: drawX(130, 85); break;
case 5: drawX(205, 85); break;
case 6: drawX(55, 155); break;
case 7: drawX(130, 155); break;
case 8: drawX(205, 155); break;
}
}

void checkWinner()
// checks board to see if there is a winner
// places result in the global variable 'winner'
{
int qq = 0;
// noughts win?
if (board[0] == 1 && board[1] == 1 && board[2] == 1) {
winner = 1;
}
if (board[3] == 1 && board[4] == 1 && board[5] == 1) {
winner = 1;
}
if (board[6] == 1 && board[7] == 1 && board[8] == 1) {
winner = 1;
}
if (board[0] == 1 && board[3] == 1 && board[6] == 1) {
winner = 1;
}
if (board[1] == 1 && board[4] == 1 && board[7] == 1) {
winner = 1;
}
if (board[2] == 1 && board[5] == 1 && board[8] == 1) {
winner = 1;
}
if (board[0] == 1 && board[4] == 1 && board[8] == 1) {
winner = 1;
}
if (board[2] == 1 && board[4] == 1 && board[6] == 1) {
winner = 1;
}
// crosses win?
if (board[0] == 2 && board[1] == 2 && board[2] == 2) {
winner = 2;
}
if (board[3] == 2 && board[4] == 2 && board[5] == 2) {
winner = 2;
}
if (board[6] == 2 && board[7] == 2 && board[8] == 2) {
winner = 2;
}
if (board[0] == 2 && board[3] == 2 && board[6] == 2) {
winner = 2;
}
if (board[1] == 2 && board[4] == 2 && board[7] == 2) {
winner = 2;
}
if (board[2] == 2 && board[5] == 2 && board[8] == 2) {
winner = 2;
}
if (board[0] == 2 && board[4] == 2 && board[8] == 2) {
winner = 2;
}
if (board[2] == 2 && board[4] == 2 && board[6] == 2) {
winner = 2;
}

}
void drawBitmap(int16_t x, int16_t y,
const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) {

int16_t i, j, byteWidth = (w + 7) / 8;
uint8_t byte;

for (j = 0; j<h; j++) {
for (i = 0; i<w; i++) {
if (i & 7) byte <<= 1;
else byte = pgm_read_byte(bitmap + j * byteWidth + i / 8);
if (byte & 0x80) tft.drawPixel(x + i, y + j, color);
}
}
}

#Hardware
ESP32 wroom chip with Arduino IDE 1.8.2 and ESP32 Arduino SDK 1.0.2

Errors or Incorrect Output

Display stops working after touch screen spi begin.

@sonastyle sonastyle changed the title XPT2046_Touchscreen not working with Adafruit_ILI9341 li XPT2046_Touchscreen not working with Adafruit_ILI9341 library Aug 12, 2019
@Querela
Copy link

Querela commented Nov 12, 2020

I still have the same problem. Maybe with a more canonical example: XPT2046_Calibrate library/example sketches. Same initialization as used above. Same hardware setup.

The touchscreen works until I call ts.begin() and then nothing. Before I can draw, afterwards I can only receive touch events. If I call tft.begin() after ts.begin() I still can't draw.
I would not think that it is an issue with different SPI Settings but anything else seems also unlikely? Alternatively, I can only use 3 more pins for separate SPI lines but that's only a stop-gap solution.

@PaulStoffregen
Copy link
Owner

Can you test with a non-ESP board?

We've had bug reports on Ethernet which only happen with ESP32. I'm starting to suspect their SPI library may have bugs...

@Querela
Copy link

Querela commented Nov 12, 2020

Mhh. Ok. I tested some other things.
I found that it works only if I do not specify the SPI pins in the Adafruit library (I used the defaults, but without specifying RESET it did not work, so I started with specifying all pins)

So what worked:

#define TFT_VCC -1 // 3.3V
#define TFT_GND -1 // opposite to 3.3V
#define TFT_CS 5 // Chip Select
#define TFT_RST 17 // RESET
#define TFT_DC 16
#define TFT_MOSI 23 // Master Out Slave In
#define TFT_CLK 18 // SCK (Clock)
#define TFT_LED -1 // 5V (Backlighting)
#define TFT_MISO 19 // Master In Slave Out

//#define T_CLK TFT_CLK
#define T_CS 26
//#define T_DIN TFT_MOSI
//#define T_DO TFT_MISO
#define T_IRQ 25

// -------------------------------------

/* TFT did not work as it did not have a correct RESET pin, I guess */
// Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
/* TFT worked, but not in combination with Touch; SPI-Pins are standard SPI pins on ESP32-devkit C */
// Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
/* this seems to work as it still uses the same SPI pins as above but implicitely somehow */
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

// Touch Calibration (is a fork of your library, essentially the same in how to connects via SPI)
XPT2046_Calibrated ts(T_CS, T_IRQ);

Before, I was thinking on extending your constructor to accept custom SPI pins ...

@wfdudley
Copy link

wfdudley commented Jun 15, 2021

I have a short test program, which, when compiled for and run on an Arduino Mega 2560,
exhibits this behaviour. With "#define TOUCH 1", tft writes fail to display on the TFT, though touch works correctly. When TOUCH is set to 0 (i.e. your library library disabled), tft writes work correctly.

Arduino version 1.8.13. Latest version of Adafruit_ILI9341 and Adafruit_GFX_Library (whatever they are). Example code is 109 lines including comments.
bug_9341_2046.zip

I found the only way to get the Adafruit tft library to work was to use the long form constructor, where I list every single pin:
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); The short form constructor never worked for me with the Arduino Mega 2560.

@alexmogavero
Copy link

Mhh. Ok. I tested some other things. I found that it works only if I do not specify the SPI pins in the Adafruit library (I used the defaults, but without specifying RESET it did not work, so I started with specifying all pins)

So what worked:

#define TFT_VCC -1 // 3.3V
#define TFT_GND -1 // opposite to 3.3V
#define TFT_CS 5 // Chip Select
#define TFT_RST 17 // RESET
#define TFT_DC 16
#define TFT_MOSI 23 // Master Out Slave In
#define TFT_CLK 18 // SCK (Clock)
#define TFT_LED -1 // 5V (Backlighting)
#define TFT_MISO 19 // Master In Slave Out

//#define T_CLK TFT_CLK
#define T_CS 26
//#define T_DIN TFT_MOSI
//#define T_DO TFT_MISO
#define T_IRQ 25

// -------------------------------------

/* TFT did not work as it did not have a correct RESET pin, I guess */
// Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
/* TFT worked, but not in combination with Touch; SPI-Pins are standard SPI pins on ESP32-devkit C */
// Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
/* this seems to work as it still uses the same SPI pins as above but implicitely somehow */
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

// Touch Calibration (is a fork of your library, essentially the same in how to connects via SPI)
XPT2046_Calibrated ts(T_CS, T_IRQ);

Before, I was thinking on extending your constructor to accept custom SPI pins ...

I can confirm this worked for me. I also tried to specify all the PINs, but despite the pin number has not changed, it was not working and now it is working. Very odd indeed!

@clutch2sft
Copy link

@Querela Saved my bacon! I had same behavoir on an M0 board. Could not get display to work using:

//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

Some sort of conflict creation happens using this:

Using This:

//ILI9341Display() : tft(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO) { }

Everything is happy using this:

ILI9341Display() : tft(TFT_CS, TFT_DC, TFT_RST) { }

Thank you for this thread!!! Maybe someone can figure out what happens to the SPI bus when you pass specific pins to ILI9341 driver.

@munakbi
Copy link

munakbi commented Aug 6, 2023

Thank you, you've saved my times. The trick is to use the simple constructor.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants