Proiectul Electronic Chess își propune realizarea unei table de șah electronice capabile să detecteze și să înregistreze automat mutările efectuate de jucători în timpul unei partide. Scopul principal este digitalizarea jocului fizic de șah pentru a facilita analiza ulterioară a jocurilor, oferind astfel o unealtă utilă pentru pasionații de șah care vor să își îmbunătățească strategia și stilul de joc.
Această platformă vine în sprijinul jucătorilor amatori și profesioniști care doresc să revadă și să analizeze partidele jucate și să identifice greșelile comise.
Laboratoare folosite: GPIO, Întreruperi, Timere, I2C.
Pin | Pin ESP32 | Descriere |
---|---|---|
VCC | 3V3 | Alimentare |
GND | GND | Ground |
EN | GND | Enambel mux |
SIG | GPIO4 | Outputul MUX-ului |
S0 | GPIO5 | Selectie |
S1 | GPIO8 | Selectie |
S2 | GPIO27 | Selectie |
S3 | GPIO28 | Selectie |
Pin | Pin ESP32 | Descriere |
---|---|---|
VCC | 3V3 | Alimentare ecran |
GND | GND | GND pentru ecran |
SDA | GPIO7 | Linia de date |
SCL | GPIO14 | Linia ceasului |
Mediu de dezvoltare: PlatformIO, Android Studio
Biblioteci:
Funcționalități din laborator:
Funcționalități implementate pe ESP32:
Scanarea tablei:
Detectarea mutărilor:
Confirmarea mutării:
Comunicarea cu aplicația Android:
Afișarea informațiilor pe LCD:
Gestionarea timpului (timer digital):
Funcționalități aplicație Android:
Comunicare Bluetooth:
Istoric mutări:
Notificări și feedback:
Citire canal multiplexor:
int readMuxChannel(int channel) { // Set the address lines (S0 to S3) for (int i = 0; i < 4; i++) { digitalWrite(selectPins[i], (channel >> i) & 0x01); } delayMicroseconds(10); // Small delay to allow settling // Read the value from the selected MUX channel return digitalRead(sigPin); }
Timer:
volatile int timeRemaining = 0; // Init when game starts volatile bool updateLCD = false; void tick() { if (timeRemaining > 0) { timeRemaining--; updateLCD = true; } } void startTimer(int secunde) { timeRemaining = secunde; timerTicker.attach(1.0, tick); } void stopTimer() { timerTicker.detach(); timeRemaining = 0; updateLCD = true; }
Comunicare prin bluetooth:
if (SerialBT.available()) { String mesaj = SerialBT.readStringUntil('\n'); mesaj.trim(); mesaj.toLowerCase(); if (mesaj == "start") { startTimer(5 * 60); // 5 minute SerialBT.println("Timer pornit"); } else if (mesaj == "reset") { stopTimer(); SerialBT.println("Timer oprit/resetat"); } else { SerialBT.println("Comanda necunoscuta"); } }
Funcționalități implementate cu succes:
Limitări:
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.