/*
ESP32 Rotate Bitmap Example
Copyright (C) 2023, AMU
*/
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define DEG2RAD 0.0174532925
// https://mischianti.org/images-to-byte-array-online-converter-cpp-arduino/
static const uint8_t JD510_SIDE [] = {
64, 64,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xff,
0xff, 0xf8, 0x00, 0x00, 0x1c, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xd8, 0x7f, 0xff, 0xff,
0xff, 0xf9, 0xf7, 0xff, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf7, 0xff, 0xd1, 0xff, 0xff, 0xff,
0xff, 0xf9, 0xf7, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf7, 0xff, 0xd3, 0xff, 0xff, 0xff,
0xff, 0xf9, 0xf7, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xfe, 0xd3, 0xff, 0xff, 0xff,
0xff, 0xfb, 0xe7, 0xfc, 0x80, 0x00, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xf9, 0x10, 0x00, 0x07, 0xff,
0xff, 0xfb, 0xe7, 0xff, 0x11, 0xff, 0xe1, 0xff, 0xfe, 0x18, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x7f,
0xfe, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x01, 0xff,
0xfc, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x7f,
0xfc, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x7f,
0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
0xf0, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f,
0xf0, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x07,
0xc0, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x7e, 0x07,
0xe0, 0xfb, 0x7e, 0x00, 0x00, 0x00, 0xff, 0x81, 0xc0, 0xfb, 0xfe, 0x07, 0xff, 0xc0, 0xdf, 0x83,
0xe0, 0xff, 0x3e, 0x0f, 0xff, 0xc1, 0xff, 0xc3, 0xe0, 0xff, 0xfc, 0x1f, 0xff, 0x81, 0xdd, 0xc0,
0xc0, 0xff, 0xfc, 0x0f, 0xff, 0xc1, 0xdd, 0xc1, 0xe0, 0x7f, 0xf8, 0x0f, 0xff, 0xc1, 0xeb, 0xc3,
0xf0, 0x3f, 0xf8, 0x1f, 0xff, 0xc0, 0xf7, 0x81, 0xf0, 0x1f, 0xf0, 0x1f, 0xff, 0xc0, 0xff, 0x01,
0xf0, 0x07, 0xc0, 0x1f, 0xff, 0xe0, 0x3e, 0x07, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x07,
0xf8, 0x00, 0x00, 0x7f, 0xff, 0xe0, 0x00, 0x07, 0xff, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x1f,
0xff, 0x00, 0x03, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0x00, 0xff,
0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
static const uint8_t PROGMEM JD510_BACK [] = {
64, 64,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xf4, 0x00, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff,
0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff,
0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0x7f, 0xff, 0xff, 0xfe, 0x1f, 0x67, 0xff, 0xda, 0x61, 0xff,
0xff, 0xfe, 0x1f, 0x6f, 0xff, 0xda, 0x60, 0xff, 0xff, 0xfe, 0x0f, 0x6f, 0xff, 0xc8, 0x40, 0xff,
0xff, 0xfe, 0x1b, 0x6f, 0xff, 0xcc, 0x20, 0xff, 0xff, 0xfe, 0x1f, 0x6f, 0xff, 0xc8, 0x60, 0xff,
0xff, 0xfe, 0x1f, 0x6f, 0xff, 0xcc, 0x60, 0xff, 0xff, 0xfe, 0x1f, 0x6f, 0xff, 0xcc, 0x60, 0xff,
0xff, 0xfe, 0x1f, 0x7f, 0xff, 0xec, 0x60, 0xff, 0xff, 0xfe, 0x1f, 0x5f, 0xff, 0xec, 0x61, 0xff,
0xff, 0xff, 0xff, 0x5f, 0xff, 0xec, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x7f, 0xff,
0xff, 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x5f, 0xff, 0xf4, 0x7f, 0xff,
0xff, 0xff, 0xf0, 0x58, 0x00, 0x74, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x50, 0x00, 0x34, 0x1f, 0xff,
0xff, 0xff, 0x00, 0x30, 0x00, 0x34, 0x03, 0xff, 0xff, 0xfe, 0x00, 0x30, 0x00, 0x34, 0x01, 0xff,
0xff, 0xfe, 0x00, 0x30, 0x00, 0x38, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x30, 0x00, 0x38, 0x01, 0xff,
0xff, 0xfe, 0x00, 0x30, 0x00, 0x38, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x30, 0x00, 0x38, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x30, 0x00, 0x38, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x70, 0x00, 0x38, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x70, 0x00, 0x38, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x70, 0x00, 0x3c, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x10, 0x00, 0x30, 0x00, 0xff, 0xff, 0xfd, 0x3e, 0x30, 0x00, 0x31, 0xb8, 0xff,
0xff, 0xfd, 0x00, 0x40, 0x00, 0x00, 0x02, 0xff, 0xff, 0xfc, 0x00, 0x40, 0x00, 0x00, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x78, 0x00, 0x70, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x38, 0x00, 0x70, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x40, 0x00, 0x08, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x12, 0x00, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x01, 0x12, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x23, 0x33, 0x10, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xff,
0xff, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xf8, 0x01, 0xff,
0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
#define BTN_PIN 5
#define TFT_DC 2
#define TFT_CS 15
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
int angle = 0;
void setup() {
pinMode(BTN_PIN, INPUT_PULLUP);
tft.begin();
tft.setRotation(1);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("### Rotate bitmap demo ###");
}
void drawRotatedBitmap(int16_t x, int16_t y, const uint8_t *bitmap, uint16_t angle) {
//uint8_t w = pgm_read_byte(bitmap++);
//uint8_t h = pgm_read_byte(bitmap++);
int offset = 0;
uint8_t w = bitmap[offset++];
uint8_t h = bitmap[offset++];
int16_t newx, newy;
uint8_t data = 0;
float cosa = cos(angle * DEG2RAD), sina = sin(angle * DEG2RAD);
x = x - ((w * cosa / 2) - (h * sina / 2));
y = y - ((h * cosa / 2) + (w * sina / 2));
for (int16_t j = 0; j < h; j++) {
for (int16_t i = 0; i < w; i++ ) {
if ((j * w + i) & 7) data <<= 1;
else data = bitmap[offset++]; // data = pgm_read_byte(bitmap++);
newx = 0.5 + x + ((i * cosa) - (j * sina));
newy = 0.5 + y + ((j * cosa) + (i * sina));
if (!(data & 0x80)) tft.drawPixel(newx, newy, 0xff00);
}
}
}
void loop() {
angle += 10;
angle = angle>=360 ? angle = 0 : angle;
tft.fillCircle(64,64,40,0);
tft.fillCircle(64,160,40,0);
drawRotatedBitmap(64, 64, JD510_SIDE, angle);
drawRotatedBitmap(64, 160, JD510_BACK, angle);
delay(2000);
}