I am trying to make a mp3 player using DFPlayer Mini module and a TFT LCD 2.4inch 240x320p, I am trying to make 4 buttons on the LCD for the player ( play , pause, next and previous). After I press any button (that works) the second time I am trying to press a button to do a specific instruction, the screen freezes. I will post below the code that I am using:
#include <DFRobotDFPlayerMini.h>
#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <SoftwareSerial.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#include <FreeDefaultFonts.h>
#define MINPRESSURE 200
#define MAXPRESSURE 1000
const int XP=8,XM=A2,YP=A3,YM=9; //240x320 ID=0x9595
const int TS_LEFT=876,TS_RT=139,TS_TOP=390,TS_BOT=769;
static const uint8_t PIN_MP3_TX = 19; // Connects to module's RX
static const uint8_t PIN_MP3_RX = 18; // Connects to module's TX
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Adafruit_GFX_Button play_button;
Adafruit_GFX_Button pause_button;
Adafruit_GFX_Button next_button;
Adafruit_GFX_Button prev_button;
DFRobotDFPlayerMini player;
int Cursor_X, Cursor_Y;
bool Touch_getXY(void)
{
TSPoint p = ts.getPoint();
pinMode(YP, OUTPUT); //restore shared pins
pinMode(XM, OUTPUT);
digitalWrite(YP, HIGH); //because TFT control pins
digitalWrite(XM, HIGH);
bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
if (pressed) {
Cursor_X = map(p.y, 130, 937, 0, 320);
Cursor_Y = map(p.x, 920, 118, 0, 240);
}
return pressed;
}
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
void setup(void)
{
Serial.begin(9600);
softwareSerial.begin(9600);
if (player.begin(softwareSerial))
{
Serial.println("OK");
}
else {
Serial.println("Connecting to DFPlayer Mini failed!");
}
player.volume(2);
uint16_t ID = tft.readID();
Serial.print("TFT ID = 0x");
Serial.println(ID, HEX);
Serial.println("Calibrate for your Touch Panel");
if (ID == 0xD3D3) ID = 0x9486; // write-only shield
tft.begin(ID);
tft.setRotation(1); //LANDSCAPE
tft.fillScreen(BLACK);
prev_button.initButton(&tft,50,220,60,40,WHITE, RED, WHITE, "PREV", 2);
prev_button.drawButton();
play_button.initButton(&tft, 260,220,60,40,WHITE, RED, WHITE,"PLAY", 2);
play_button.drawButton();
pause_button.initButton(&tft,120,220,60,40,WHITE, RED, WHITE, "PAUSE", 2);
pause_button.drawButton();
next_button.initButton(&tft,190,220,60,40,WHITE, RED, WHITE, "NEXT", 2);
next_button.drawButton();
}
void loop()
{
int var=0;
bool down = Touch_getXY();
prev_button.press(down && prev_button.contains(Cursor_X, Cursor_Y));
play_button.press(down && play_button.contains(Cursor_X, Cursor_Y));
pause_button.press(down && pause_button.contains(Cursor_X, Cursor_Y));
next_button.press(down && next_button.contains(Cursor_X, Cursor_Y));
if (prev_button.justReleased())
prev_button.drawButton();
if (play_button.justReleased())
play_button.drawButton();
if (pause_button.justReleased())
pause_button.drawButton();
if (next_button.justReleased())
next_button.drawButton();
if (prev_button.justPressed())
{
var = 1 ;
}
else if (play_button.justPressed())
{
var = 2 ;
}
else if (pause_button.justPressed())
{
var = 3 ;
}
else if (next_button.justPressed())
{
var = 4 ;
}
switch (var)
{
case 1:
{
prev_button.drawButton(true);
player.previous();
if (prev_button.justReleased())
prev_button.drawButton();
}
break;
case 2:
{
play_button.drawButton(true);
player.start();
if (play_button.justReleased())
play_button.drawButton();
}
break;
case 3:
{
pause_button.drawButton(true);
player.pause();
if (pause_button.justReleased())
pause_button.drawButton();
}
break;
case 4:
{
next_button.drawButton(true);
player.next();
if (next_button.justReleased())
next_button.drawButton();
}
break;
default:
{
Serial.println("default");
if (prev_button.justReleased())
prev_button.drawButton();
if (play_button.justReleased())
play_button.drawButton();
if (pause_button.justReleased())
pause_button.drawButton();
if (next_button.justReleased())
next_button.drawButton();
}
}
}