#include <Arduino.h>
#include <SPI.h>
const int DC=10, RST=2, MOSI_PIN=6, SCK_PIN=7;
const int JOY_X=0, JOY_Y=1, JOY_CLICK=3, BUTTON_A=5, BUTTON_B=4;
const int JOY_X_SIGN=-1, JOY_Y_SIGN=-1;
int cx=2048,cy=2048,oldX=-1,oldY=-1;
uint32_t lastReport=0;
void cmd(uint8_t c){ digitalWrite(DC,LOW); SPI.transfer(c); digitalWrite(DC,HIGH); }
void write16(uint16_t v){ SPI.transfer(v>>8); SPI.transfer(v&255); }
void rect(int x,int y,int w,int h,uint16_t color){
cmd(0x2a);write16(x);write16(x+w-1);cmd(0x2b);write16(y);write16(y+h-1);cmd(0x2c);
for(int i=0;i<w*h;i++) write16(color);
}
void setup(){
Serial0.begin(115200);
pinMode(DC,OUTPUT);pinMode(RST,OUTPUT);
pinMode(BUTTON_A,INPUT_PULLUP);pinMode(BUTTON_B,INPUT_PULLUP);pinMode(JOY_CLICK,INPUT_PULLUP);
analogReadResolution(12);
SPI.begin(SCK_PIN,-1,MOSI_PIN,-1);SPI.beginTransaction(SPISettings(8000000,MSBFIRST,SPI_MODE0));
digitalWrite(RST,LOW);delay(20);digitalWrite(RST,HIGH);delay(120);
cmd(0x01);delay(150);cmd(0x11);delay(120);cmd(0x3a);SPI.transfer(0x55);
cmd(0x36);SPI.transfer(0x08);cmd(0x21);cmd(0x29);delay(20);
rect(0,0,240,240,0);rect(0,0,80,22,0xf800);rect(80,0,80,22,0x07e0);rect(160,0,80,22,0x001f);
long sx=0,sy=0;
for(int i=0;i<32;i++){sx+=analogRead(JOY_X);sy+=analogRead(JOY_Y);delay(5);}
cx=sx/32;cy=sy/32;
Serial0.println("RETRO_ARCADE_READY ST7789 240x240; A=5 B=4 J=3; audio OFF");
Serial0.println("Keep joystick centered at boot. Crosshair=axes, bottom squares=A B J.");
}
void loop(){
int rx=analogRead(JOY_X),ry=analogRead(JOY_Y);
int x=constrain(120+JOY_X_SIGN*(rx-cx)/22,10,230);
int y=constrain(110+JOY_Y_SIGN*(ry-cy)/30,32,184);
bool a=!digitalRead(BUTTON_A),b=!digitalRead(BUTTON_B),j=!digitalRead(JOY_CLICK);
if(x!=oldX||y!=oldY){
if(oldX>=0){rect(oldX-3,oldY-3,7,7,0);}
rect(119,28,1,162,0x4208);rect(5,109,230,1,0x4208);
rect(x-3,y-3,7,7,0xffff);oldX=x;oldY=y;
}
rect(10,204,60,26,a?0x07e0:0x4208);rect(90,204,60,26,b?0x07e0:0x4208);rect(170,204,60,26,j?0x07e0:0x4208);
if(millis()-lastReport>=250){
Serial0.printf("X=%d Y=%d DX=%d DY=%d A=%d B=%d J=%d\n",rx,ry,JOY_X_SIGN*(rx-cx),JOY_Y_SIGN*(ry-cy),a,b,j);
lastReport=millis();
}
delay(30);
}
Loading
aitewinrobot-esp32c3-supermini
aitewinrobot-esp32c3-supermini
Loading
st7789
st7789
RETRO ARCADE · монтаж + тест
Лінії перетинаються без пайки. Пайка — лише у S1 / S2 / S3.
S1 · GND — 5 дротів
ESP + TFT + джойстик + S3 + OUT−
S2 · 3V3
ESP + джойстик
TFT VCC/BL — лише симуляція*
S3 · земля кнопок
A + B + провід до S1 = 3 дроти
ЖИВЛЕННЯ — МОНТАЖНІ ПОЗНАЧЕННЯ, НЕ СИМУЛЯЦІЯ
HW-373: R3 → 3,3 кОм ДО монтажу
B− ≠ OUT−: не обходити захист
Вимикач: OUT+ → SW+
Третій контакт символу не використано
SW+ → 5V/VIN ESP — ПІСЛЯ
перевірки стабілізатора та USB-розв’язки.
Зараз залишити ізольованим. НЕ до 3V3.
* TFT VCC/BL та CS→GND тут потрібні моделі Wokwi.
На реальному 7-pin TFT CS немає; VCC/BLK потребують перевірки модуля.
АКБ підключити останнім. Заряджати з вимикачем OFF. Зумер не підключено.
S1/S2/S3 — спаяти кінці разом та ізолювати; це НЕ додаткові мікросхеми.