Lista de piese (Bill of Materials):
Conexiunile hardware finale sunt urmatoarele:
| Componenta | Pin componenta | Conectare |
|---|---|---|
| OLED SSD1306 | VCC | VCC microcontroller |
| OLED SSD1306 | GND | GND microcontroller |
| OLED SSD1306 | SDA | PC4 microcontroller |
| OLED SSD1306 | SCL | PC5 microcontroller |
| Componenta | Pin componenta | Conectare |
|---|---|---|
| Buton P1_UP KY-004 | S | D2 microcontroller |
| Buton P1_DOWN KY-004 | S | D3 microcontroller |
| Buton P2_UP KY-004 | S | D4 microcontroller |
| Buton P2_DOWN KY-004 | S | D5 microcontroller |
| Toate butoanele KY-004 | - | GND breadboard |
| Toate butoanele KY-004 | pin mijloc | neconectat |
| Componenta | Pin componenta | Conectare |
|---|---|---|
| Buzzer pasiv KY-006 | S | D6 microcontroller |
| Buzzer pasiv KY-006 | minus | GND breadboard |
| Componenta | Pin componenta | Conectare |
|---|---|---|
| Modul LED Player 1 | R | D7 microcontroller |
| Modul LED Player 1 | Y | D8 microcontroller |
| Modul LED Player 1 | G | D9 microcontroller |
| Modul LED Player 1 | GND | GND breadboard |
| Modul LED Player 2 | R | D10 microcontroller |
| Modul LED Player 2 | Y | D11 microcontroller |
| Modul LED Player 2 | G | D12 microcontroller |
| Modul LED Player 2 | GND | GND breadboard |
| Componenta | Conectare |
|---|---|
| Breadboard | GND microcontroller → bara GND breadboard |
Breadboard-ul este folosit pentru distribuirea conexiunii de masa catre butoane, buzzer si modulele LED. Display-ul OLED este conectat direct la microcontroller deoarece foloseste interfata I2C, prin pinii PC4 si PC5. Butoanele sunt configurate in cod cu INPUT_PULLUP, motiv pentru care pinul de mijloc al modulelor KY-004 ramane neconectat, iar apasarea butonului conecteaza pinul de semnal la GND.
Proiectul a fost dezvoltat in PlatformIO, folosind framework-ul Arduino pentru placa ATmega328P Xplained Mini. Codul este scris in C++ si foloseste functii specifice Arduino pentru citirea butoanelor, controlul LED-urilor, controlul buzzerului, comunicatia I2C cu display-ul OLED si comunicatia UART prin Serial Monitor.
Functii principale implementate:
| Functie | Rol |
|---|---|
| setup() | Initializeaza pinii pentru butoane, buzzer si LED-uri, porneste comunicatia I2C, initializeaza display-ul OLED si pregateste ecranul initial al jocului. |
| loop() | Reprezinta bucla principala a jocului. Verifica daca jocul a inceput, citeste input-ul jucatorilor, actualizeaza pozitia mingii, verifica coliziunile, scorul si redeseneaza ecranul. |
| readPaddles() | Citeste cele patru butoane si modifica pozitia paletelor pentru Player 1 si Player 2. |
| drawGame() | Deseneaza pe OLED scorul, viteza bilei, terenul, paletele si mingea. |
| drawStartScreen() | Afiseaza ecranul initial, cu mesajul PONG si instructiunea de apasare a unui buton. |
| drawCountdownGameScreen() | Afiseaza ecranul de pregatire inainte de inceperea meciului, pastrand vizibile paletele si mingea. |
| drawWinScreen() | Afiseaza castigatorul meciului: P1 WINS sau P2 WINS. |
| startCountdown() | Porneste secventa de pregatire inainte de meci, folosind LED-urile rosu, galben si verde. |
| checkWallCollision() | Verifica daca mingea atinge bara de sus sau de jos si inverseaza directia pe axa Y. |
| checkPaddleCollision() | Verifica daca mingea loveste una dintre palete si recalculeaza directia de ricosare in functie de zona lovita. |
| checkScore() | Verifica daca mingea a iesit din teren prin stanga sau dreapta si actualizeaza scorul. |
| handleWin() | Verifica daca un jucator a ajuns la scorul maxim si afiseaza castigatorul. |
| goalFlash() | Controleaza LED-urile dupa marcarea unui punct: verde pentru jucatorul care a marcat si rosu pentru cel care a primit punctul. |
| winLEDAnimation() | Controleaza animatia LED-urilor la finalul meciului. |
| beep() | Genereaza sunete pe buzzer folosind functia tone(). |
| increaseBallSpeed() | Creste viteza bilei treptat, pana la o limita maxima. |
| resetBallRandom() | Reseteaza mingea in centru si alege aleator directia initiala. |
| resetBallToDirection() | Reseteaza mingea in centru si seteaza directia catre un anumit jucator. |
| printRoundResult() | Afiseaza in Serial Monitor castigatorul rundei si viteza initiala/maxima a bilei. |
Biblioteci folosite:
| Biblioteca | Rol |
|---|---|
| Arduino.h | Functii de baza Arduino: GPIO, timere, delay, millis |
| Wire.h | Comunicare I2C cu display-ul OLED |
| Adafruit_GFX.h | Functii grafice pentru desenarea elementelor pe display |
| Adafruit_SSD1306.h | Controlul display-ului OLED SSD1306 |
| math.h | Functii matematice pentru calculul directiei bilei |