This is an old revision of the document!
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:
Proiectul are o componentă fizică importanta: dispozitivul embedded pe ATmega328P. Intrări:
Ieșiri:
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:
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.
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.
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:
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:
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 |
Stadiu curent:
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.
Intrări jurnal:
Resurse Hardware:
Resurse Software: