#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <math.h>
// ESP32-2432S028R TFT pins
#define TFT_CS 15
#define TFT_DC 2
#define TFT_MOSI 13
#define TFT_MISO 12
#define TFT_SCK 14
Adafruit_ILI9341 tft(TFT_CS, TFT_DC);
// RGB LED pins (active LOW)
#define LED_R 4
#define LED_G 16
#define LED_B 17
#define W 320
#define H 240
void setRGB(bool r, bool g, bool b) {
digitalWrite(LED_R, r ? LOW : HIGH);
digitalWrite(LED_G, g ? LOW : HIGH);
digitalWrite(LED_B, b ? LOW : HIGH);
}
uint16_t rainbowColor(int n) {
const uint16_t colors[] = {
ILI9341_RED, ILI9341_ORANGE, ILI9341_YELLOW,
ILI9341_GREEN, ILI9341_CYAN, ILI9341_BLUE,
ILI9341_MAGENTA, ILI9341_WHITE
};
return colors[n % 8];
}
void heading(const char* title, uint16_t color) {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2);
tft.setTextColor(color);
tft.setCursor(8, 8);
tft.println(title);
tft.drawFastHLine(8, 32, 304, color);
}
void artwork1() {
heading("1. RAINBOW", ILI9341_CYAN);
for (int r = 115; r >= 35; r -= 10) {
tft.drawCircle(160, 205, r, rainbowColor((115-r)/10));
}
tft.fillRect(0, 206, W, 34, ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(100, 215);
tft.print("RAINBOW");
}
void artwork2() {
heading("2. FLOWER", ILI9341_MAGENTA);
int cx = 160, cy = 135;
for (int i = 0; i < 12; i++) {
float a = i * 3.14159 / 6;
int x = cx + cos(a) * 48;
int y = cy + sin(a) * 48;
tft.fillCircle(x, y, 24, rainbowColor(i));
}
tft.fillCircle(cx, cy, 27, ILI9341_YELLOW);
tft.fillCircle(cx, cy, 12, ILI9341_ORANGE);
tft.drawLine(cx, 163, cx, 220, ILI9341_GREEN);
tft.fillCircle(143, 192, 13, ILI9341_GREEN);
tft.fillCircle(177, 205, 13, ILI9341_GREEN);
}
void artwork3() {
heading("3. SUNSET", ILI9341_ORANGE);
tft.fillCircle(160, 112, 48, ILI9341_YELLOW);
tft.fillCircle(160, 112, 38, ILI9341_ORANGE);
for (int y = 150; y < 232; y += 12) {
tft.drawFastHLine(15 + (y%4)*5, y, 290-(y%4)*10,
rainbowColor(y/12));
}
tft.drawLine(0, 174, 320, 174, ILI9341_CYAN);
tft.drawLine(0, 190, 320, 190, ILI9341_BLUE);
}
void artwork4() {
heading("4. STAR FIELD", ILI9341_YELLOW);
for (int i = 0; i < 70; i++) {
int x = (i * 47 + 23) % W;
int y = 42 + (i * 31 + 7) % 190;
tft.fillCircle(x, y, (i%3)+1, rainbowColor(i));
}
int x = 160, y = 135, R = 70, r = 30;
for (int i = 0; i < 10; i++) {
float a = -1.5708 + i * 3.14159 / 5;
int rad = (i%2 == 0) ? R : r;
int px = x + cos(a)*rad;
int py = y + sin(a)*rad;
if (i == 0) tft.drawPixel(px, py, ILI9341_YELLOW);
else {
float b = -1.5708 + (i-1)*3.14159/5;
int pr = ((i-1)%2 == 0) ? R : r;
tft.drawLine(x+cos(b)*pr, y+sin(b)*pr,
px, py, ILI9341_YELLOW);
}
}
}
void artwork5() {
heading("5. GEOMETRY", ILI9341_GREEN);
for (int i = 0; i < 9; i++) {
int inset = i * 14;
tft.drawRect(10+inset, 42+inset/2,
300-2*inset, 184-inset,
rainbowColor(i));
}
tft.drawLine(10, 42, 310, 226, ILI9341_WHITE);
tft.drawLine(310, 42, 10, 226, ILI9341_WHITE);
}
void artwork6() {
heading("6. SPIRAL", ILI9341_CYAN);
float lastX = 160, lastY = 140;
for (int i = 1; i < 700; i++) {
float a = i * 0.09;
float r = i * 0.13;
float x = 160 + cos(a)*r;
float y = 140 + sin(a)*r;
if (x >= 0 && x < W && y >= 38 && y < H) {
tft.drawLine(lastX, lastY, x, y, rainbowColor(i/12));
}
lastX = x;
lastY = y;
}
}
void artwork7() {
heading("7. COLOR WHEEL", ILI9341_MAGENTA);
for (int i = 0; i < 36; i++) {
float a = i * 3.14159 / 18;
int x = 160 + cos(a)*78;
int y = 140 + sin(a)*78;
tft.fillCircle(x, y, 15, rainbowColor(i/2));
}
tft.fillCircle(160, 140, 43, ILI9341_WHITE);
tft.fillCircle(160, 140, 31, ILI9341_BLUE);
tft.fillCircle(160, 140, 17, ILI9341_YELLOW);
}
void artwork8() {
heading("8. 3D CUBE", ILI9341_CYAN);
int x=105, y=95, s=75, d=40;
uint16_t c=ILI9341_CYAN;
tft.drawRect(x,y,s,s,c);
tft.drawRect(x+d,y-d,s,s,ILI9341_MAGENTA);
tft.drawLine(x,y,x+d,y-d,ILI9341_YELLOW);
tft.drawLine(x+s,y,x+s+d,y-d,ILI9341_YELLOW);
tft.drawLine(x,y+s,x+d,y+s-d,ILI9341_YELLOW);
tft.drawLine(x+s,y+s,x+s+d,y+s-d,ILI9341_YELLOW);
tft.drawLine(x+d,y-d,x+d,y+s-d,ILI9341_GREEN);
tft.drawLine(x+d,y+s-d,x+s+d,y+s-d,ILI9341_GREEN);
tft.drawLine(x+s+d,y-d,x+s+d,y+s-d,ILI9341_GREEN);
}
void artwork9() {
heading("9. CONCENTRIC", ILI9341_ORANGE);
for (int r = 95; r >= 5; r -= 6) {
tft.drawCircle(160, 140, r, rainbowColor(r/6));
}
for (int i = 0; i < 12; i++) {
float a = i * 3.14159 / 6;
tft.drawLine(160, 140,
160+cos(a)*100, 140+sin(a)*85,
rainbowColor(i));
}
}
void artwork10() {
heading("10. HAPPY ART", ILI9341_YELLOW);
tft.fillCircle(160, 135, 77, ILI9341_YELLOW);
tft.fillCircle(132, 115, 9, ILI9341_BLACK);
tft.fillCircle(188, 115, 9, ILI9341_BLACK);
tft.drawCircle(160, 142, 43, ILI9341_BLACK);
tft.fillRect(115, 140, 90, 28, ILI9341_YELLOW);
tft.drawLine(123, 155, 135, 172, ILI9341_BLACK);
tft.drawLine(135, 172, 160, 181, ILI9341_BLACK);
tft.drawLine(160, 181, 185, 172, ILI9341_BLACK);
tft.drawLine(185, 172, 197, 155, ILI9341_BLACK);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.setCursor(86, 215);
tft.print("KEEP SMILING!");
}
void setup() {
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
setRGB(false, false, false);
SPI.begin(TFT_SCK, TFT_MISO, TFT_MOSI, TFT_CS);
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
}
void loop() {
void (*artworks[])() = {
artwork1, artwork2, artwork3, artwork4, artwork5,
artwork6, artwork7, artwork8, artwork9, artwork10
};
const bool leds[10][3] = {
{1,0,0}, {0,1,0}, {0,0,1}, {1,1,0}, {0,1,1},
{1,0,1}, {1,1,1}, {0,1,0}, {1,0,0}, {0,0,1}
};
for (int i = 0; i < 10; i++) {
setRGB(leds[i][0], leds[i][1], leds[i][2]);
artworks[i]();
delay(3000);
}
}
Loading
esp32-2432s028r
esp32-2432s028r
https://wokwi.com/projects/478914240349949953