This is an old revision of the document!


Fire Tetris

Introducere

Fire Tetris implementează jocul clasic Tetris pe o placă ATmega328P Xplained Mini, cu un element inovator: viteza de cădere a pieselor este controlată în timp real de temperatura ambiantă, citită de un senzor analogic LM35. Feedback-ul sonor este asigurat de un buzzer pasiv, iar afișarea jocului se face pe un ecran OLED 0.96” prin I2C.

Conceptul de bază — Thermal Difficulty Scaling — transformă temperatura mediului într-un parametru de dificultate: cu cât temperatura crește, cu atât piesele cad mai repede. Aceasta face jocul util nu doar ca divertisment, ci și ca o metodă intuitivă (gamificată) de monitorizare a temperaturii în medii casnice sau industriale.

Utilitate:

  • Gamificarea monitorizării temperaturii: utilizatorul percepe instinctiv creșterea temperaturii prin creșterea dificultății jocului.
  • Proiect educațional complet, acoperind GPIO, ADC, I2C, Timere și PWM pe un microcontroler AVR.

Descriere generală

Proiectul are o componentă fizică importanta: dispozitivul embedded pe ATmega328P. Intrări:

  • 3 butoane tactile (Stânga, Dreapta, Rotație) — citite prin întreruperi externe
  • Senzor de temperatură LM35 — citit prin ADC (semnal analogic 0–1V)

Ieșiri:

  • Ecran OLED SSD1306 0.96 — afișarea câmpului de joc, scorului și temperaturii (I2C)
  • Buzzer pasiv — melodii și efecte sonore (PWM)

Modul în care interacționează modulele:

Modul Interfață Rol în sistem
Butoane tactile GPIO / INT Control direcție și rotație piese
Senzor LM35 ADC (analogic) Citirea temperaturii, scalarea vitezei
Ecran OLED SSD1306 I2C Afișarea jocului, scorului, temperaturii
Buzzer pasiv PWM (Timer) Muzică de fundal și efecte sonore
Timer1 (AVR intern) Întrerupere periodică Gravity — căderea pieselor

Concepte din laboratoare utilizate:

  • Lab 0 – GPIO: citirea butoanelor de control (Stânga, Dreapta, Rotație) cu rezistențe pull-up interne
  • Lab 1 – UART: log-uri seriale pentru debugging în timpul dezvoltării (afișarea valorilor ADC și stării jocului)
  • Lab 3 – Timere / Întreruperi: Timer1 în mod CTC generează întreruperea periodică de “gravity” (căderea pieselor); întreruperi externe INT0/INT1/PCINT pentru butoane, latență garantată sub 50 ms
  • Lab 4 – ADC: citirea tensiunii de ieșire a senzorului LM35 (10 mV/°C), convertită în temperatură și mapată la intervalul de viteză al jocului
  • Lab 6 – I2C: comunicarea cu ecranul OLED SSD1306 prin magistrala TWI a ATmega328P (adresă 0x3C, 400 kHz)
  • PWM: generarea tonurilor pe buzzer prin modularea frecvenței unui timer în mod Fast PWM

Element de noutate — Thermal Difficulty Scaling:

Mecanismul citește temperatura la fiecare 500 ms prin ADC și recalculează perioada Timer1. Formula de mapare:

perioadă_gravity (ms) = MAX_PERIOD - ((temperatura - TEMP_MIN) / (TEMP_MAX - TEMP_MIN)) * (MAX_PERIOD - MIN_PERIOD)

Exemplu: TEMP_MIN=15°C → 800ms/tick | TEMP_MAX=40°C → 150ms/tick

Astfel, la temperaturi ridicate, jocul devine semnificativ mai dificil, fără nicio interacțiune din partea utilizatorului.

Hardware Design

Listă de componente:

Componentă Cantitate Rol
ATmega328P Xplained Mini 1 Microcontroler principal
Ecran OLED SSD1306 0.96” 1 Afișarea jocului (I2C)
Senzor temperatură LM35 1 Citire temperatură ambiantă (ADC)
Buzzer pasiv 1 Efecte sonore și muzică (PWM)
Butoane tactile 6mm 3 Control: Stânga, Dreapta, Rotație
Rezistențe 10kΩ 3 Pull-up extern pentru butoane (opțional, se pot folosi cele interne)
Rezistență 100Ω 1 Protecție buzzer
Breadboard + fire dupont Interconectare
Cablu USB 1 Alimentare și programare

Conexiuni principale:

Semnal Pin ATmega328P Observații
OLED SDA PC4 (SDA) I2C, adresă 0x3C
OLED SCL PC5 (SCL) I2C, 400 kHz
LM35 OUT PC0 (ADC0) Semnal analogic 0–500 mV
Buzzer PB1 (OC1A) PWM Timer1, rezistență serie 100Ω
Buton Stânga PD2 (INT0) Întrerupere externă, pull-up intern
Buton Dreapta PD3 (INT1) Întrerupere externă, pull-up intern
Buton Rotație PB0 (PCINT0) Pin Change Interrupt

Alimentare: 5V prin USB (ATmega328P Xplained Mini); OLED-ul acceptă 3.3V–5V.

Software Design

Firmware-ul este scris în C pur, compilat cu avr-gcc și flashat cu avr-dude prin interfața EDBG a plăcii Xplained Mini. Editarea se face în VS Code cu extensia AVR.

Librării și surse third-party:

  • ssd1306 (lexus2k) — driver I2C pentru OLED, portată și adaptată pentru AVR
  • Rutine ADC și Timer proprii, scrise direct pe registre AVR (fără Arduino HAL)

Structura modulară a codului:

fire_tetris/
├── main.c           — inițializare și buclă principală
├── tetris.c / .h    — logica jocului (piese, coliziuni, linii complete)
├── display.c / .h   — randarea câmpului pe OLED prin driver SSD1306
├── adc.c / .h       — citire LM35, conversie în temperatură, mapare viteză
├── timer.c / .h     — configurare Timer1 (gravity), Timer2 (PWM buzzer)
├── buttons.c / .h   — configurare întreruperi INT0, INT1, PCINT0
└── music.c / .h     — tabele de note și redare melodii pe buzzer

Algoritmi cheie:

  • Logica Tetris: reprezentarea câmpului ca matrice uint8_t[20][10]; detecție coliziuni bit cu bit; rotație piese prin matrici precalculate (4 orientări × 7 piese).
  • Gravity prin Timer1 (CTC): la fiecare overflow ISR, piesa curentă coboară un rând. Perioada se recalculează după fiecare citire ADC.
  • Citire ADC cu oversamplig: media a 8 conversii consecutive → reducerea zgomotului la ±0.5°C.
  • PWM buzzer: Timer2 în Fast PWM, frecvența modificată prin registrul OCR2A pentru fiecare notă; durata notelor controlată de Timer0.

Utilizarea registrelor pentru performanță:

Toate configurările periferice se fac direct pe registre (TCCR1B, ADMUX, TWBR etc.) — fără overhead de librărie. ISR-urile sunt minimale: setează un flag atomic, logica se execută în bucla principală (pattern producer–consumer).

Metrici de performanță țintă:

Metrică Țintă Metodă de măsurare
Latența buton → reacție piesă < 50 ms Osciloscop pe pin GPIO + log UART
Precizia citirii temperaturii ± 1°C Comparație cu termometru de referință
Timp randare cadru OLED < 30 ms Timestamp UART înainte/după transfer I2C
Perioadă gravity minimă 150 ms Verificare cu osciloscop pe pin debug
Consum memorie SRAM < 1.5 KB Raport avr-size după compilare

Rezultate Obținute

Secțiunea va fi completată după finalizarea și testarea hardware-ului. Vor fi incluse: capturi video ale jocului funcțional, grafice ale răspunsului termic, măsurători de latență și precizie ADC.

Stadiu curent:

  • Logica jocului Tetris — implementată și testată în simulator
  • Driver OLED I2C — funcțional, randare la ~28 ms/cadru (măsurat prin UART)
  • Citire ADC LM35 — funcțional, precizie ±1.2°C față de referință
  • Integrare Thermal Difficulty Scaling — în curs de testare pe hardware

Concluzii

Concluziile vor fi redactate după finalizarea proiectului și a testelor complete.

Proiectul demonstrează că un microcontroler AVR de complexitate medie (ATmega328P) poate rula un joc cu logică non-trivială, grafică pe OLED și feedback termic în timp real, folosind exclusiv periferice hardware (timere, ADC, I2C, PWM) fără sistem de operare. Mecanismul Thermal Difficulty Scaling reprezintă un exemplu concret de îmbinare a senzorilor analogici cu logica aplicației.

Download

Codul sursă, schemele electrice și resursele proiectului sunt disponibile pe GitLab. Repository-ul include un fișier README cu instrucțiuni de compilare și flashare, un ChangeLog cu evoluția proiectului și un Makefile pentru build automat cu avr-gcc + avr-dude.

Jurnal

Intrări jurnal:

  • 5 aprilie 2026 — comandă componente (OLED, LM35, butoane, buzzer)
  • 4 mai 2026 — scris functionalitate docuwiki

Bibliografie/Resurse

Resurse Hardware:

Resurse Software:

Export to PDF

pm/prj2026/theodor_ioan.buliga/ioan.sabou.1777894254.txt.gz · Last modified: 2026/05/04 14:30 by ioan.sabou
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0