#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
// Definição dos pinos de controle do display
#define TFT_DC 2
#define TFT_CS 3
Adafruit_ILI9341 tft(TFT_CS, TFT_DC);
// Definição dos pinos dos botões
#define BTN_UP 4
#define BTN_DOWN 5
#define BTN_LEFT 6
#define BTN_RIGHT 7
// Posição inicial do bitmap na tela
int posX = 120;
int posY = 160;
// Delay entre movimentos (em milissegundos)
const int moveDelay = 50;
unsigned long lastMoveTime = 0;
// Dimensões do bitmap
const int bmpWidth = 16;
const int bmpHeight = 16;
// Bitmap de um smiley face 16x16
const uint8_t smiley[] PROGMEM = {
0b00000011, 0b11000000,
0b00001111, 0b11110000,
0b00011100, 0b00111000,
0b00110000, 0b00001100,
0b01100000, 0b00000110,
0b01100011, 0b11000110,
0b11000111, 0b11100011,
0b11001100, 0b00110011,
0b11001100, 0b00110011,
0b11000111, 0b11100011,
0b01100011, 0b11000110,
0b01100000, 0b00000110,
0b00110000, 0b00001100,
0b00011100, 0b00111000,
0b00001111, 0b11110000,
0b00000011, 0b11000000
};
void setup() {
tft.begin(); // Inicializa o display
tft.fillScreen(ILI9341_BLACK); // Limpa a tela com a cor preta
// Configura os pinos dos botões como entrada
pinMode(BTN_UP, INPUT);
pinMode(BTN_DOWN, INPUT);
pinMode(BTN_LEFT, INPUT);
pinMode(BTN_RIGHT, INPUT);
drawBitmap(); // Desenha o bitmap inicial
}
void loop() {
unsigned long now = millis();
// Verifica se o tempo desde o último movimento excede o delay definido
if (now - lastMoveTime > moveDelay) {
bool moved = false;
// Verifica se o botão "CIMA" está pressionado e se é possível mover para cima
if (digitalRead(BTN_UP) == HIGH && posY > 0) {
posY -= 100; // Move para cima
moved = true;
}
// Verifica se o botão "BAIXO" está pressionado e se é possível mover para baixo
if (digitalRead(BTN_DOWN) == HIGH && posY < (tft.height() - bmpHeight)) {
posY += 100; // Move para baixo
moved = true;
}
// Verifica se o botão "ESQUERDA" está pressionado e se é possível mover para a esquerda
if (digitalRead(BTN_LEFT) == HIGH && posX > 0) {
posX -= 100; // Move para a esquerda
moved = true;
}
// Verifica se o botão "DIREITA" está pressionado e se é possível mover para a direita
if (digitalRead(BTN_RIGHT) == HIGH && posX < (tft.width() - bmpWidth)) {
posX += 100; // Move para a direita
moved = true;
}
// Se houve movimento, atualiza o bitmap na tela
if (moved) {
drawBitmap();
lastMoveTime = now; // Atualiza o tempo do último movimento
}
}
}
// Função para desenhar o bitmap na posição atual
void drawBitmap() {
tft.fillScreen(ILI9341_BLACK); // Limpa a tela
tft.drawBitmap(posX, posY, smiley, bmpWidth, bmpHeight, ILI9341_YELLOW); // Desenha o bitmap
}