This shows you the differences between two versions of the page.
pm:prj2024:azamfir:ana_maria.toader02 [2024/05/27 01:50] ana_maria.toader02 [Hardware Design] |
pm:prj2024:azamfir:ana_maria.toader02 [2024/05/27 03:27] (current) ana_maria.toader02 [Rezultate Obţinute] |
||
---|---|---|---|
Line 10: | Line 10: | ||
* un board (solvable) randomizat este generat pentru fiecare nou joc | * un board (solvable) randomizat este generat pentru fiecare nou joc | ||
* un buzzer emite sunete la realizarea unei mișcări greșite sau la câștigarea jocului | * un buzzer emite sunete la realizarea unei mișcări greșite sau la câștigarea jocului | ||
+ | * fiecare joc are o limită de timp de 5 minute; la expirarea timpului, jocul este pierdut | ||
Scopul proiectului este realizarea unui joc entertaining. | Scopul proiectului este realizarea unui joc entertaining. | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
Line 68: | Line 69: | ||
* emiterea unor sunete distinctive acționând buzzer-ul | * emiterea unor sunete distinctive acționând buzzer-ul | ||
* la finalul jocului singura acțiune care mai este responsive este apăsarea switch-ului de pe joystick care duce la începerea unui joc nou | * la finalul jocului singura acțiune care mai este responsive este apăsarea switch-ului de pe joystick care duce la începerea unui joc nou | ||
+ | \\ | ||
**Grafică**\\ | **Grafică**\\ | ||
Pentru a crea imaginile distinctive jocului pentru fiecare celulă posibilă am desenat imagini de 20x20px pe care le-am convertit folosind un [[https://javl.github.io/image2cpp/|tool]] online în bitmap-uri grayscale de 8biți per pixel. Le-am afișat la poziții corespunzătoare pe ecran folosind funcția ''**void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color)**'' din biblioteca **Adafruit_GFX**. Am adăugat culori prin setarea //foreground color//. \\ | Pentru a crea imaginile distinctive jocului pentru fiecare celulă posibilă am desenat imagini de 20x20px pe care le-am convertit folosind un [[https://javl.github.io/image2cpp/|tool]] online în bitmap-uri grayscale de 8biți per pixel. Le-am afișat la poziții corespunzătoare pe ecran folosind funcția ''**void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color)**'' din biblioteca **Adafruit_GFX**. Am adăugat culori prin setarea //foreground color//. \\ | ||
Line 80: | Line 81: | ||
}; | }; | ||
</code> | </code> | ||
+ | \\ | ||
+ | **Buzzer**\\ | ||
+ | La sfârșitul jocului, buzzer-ul emite sunete distinctive. Am ales două melodii din [[https://github.com/robsoncouto/arduino-songs|arduino-songs]] pentru cazurile de victorie / înfrângere.\\ | ||
+ | \\ | ||
**Timer**\\ | **Timer**\\ | ||
Microcontroller-ul **//ATmega328p//** conține 3 unități de timer, două pe 8 biți (//Timer0// și //Timer2//) și unul pe 16 biți (//Timer1//). \\ | Microcontroller-ul **//ATmega328p//** conține 3 unități de timer, două pe 8 biți (//Timer0// și //Timer2//) și unul pe 16 biți (//Timer1//). \\ | ||
Line 159: | Line 163: | ||
digitalWrite(JOYSTICK_INTERRUPT, HIGH); | digitalWrite(JOYSTICK_INTERRUPT, HIGH); | ||
attachInterrupt(digitalPinToInterrupt(JOYSTICK_INTERRUPT), ISR_joystick, RISING); | attachInterrupt(digitalPinToInterrupt(JOYSTICK_INTERRUPT), ISR_joystick, RISING); | ||
+ | </code> | ||
+ | |||
+ | Toate variabilele care vor fi modificate într-o rutină de tratare a întreruperilor trebuie marcate ca **''volatile''** pentru a indica compilatorului să nu treacă variabila prin cache. Orice acces la o variabilă **''volatile''** se va face prin RAM. | ||
+ | <code c> | ||
+ | /* Initialize volatile variables used with button interrupts */ | ||
+ | volatile bool blueButtonFlag = false; | ||
+ | volatile bool redButtonFlag = false; | ||
+ | |||
+ | volatile unsigned long lastPressRed = 0; | ||
+ | volatile unsigned long lastPressBlue = 0; | ||
+ | |||
+ | volatile bool joystickButtonFlag = false; | ||
</code> | </code> | ||
Line 193: | Line 209: | ||
Parametrul **TIMER1_COMPA_vect** indică faptul că se face Compare Match cu pragul A al timerului. | Parametrul **TIMER1_COMPA_vect** indică faptul că se face Compare Match cu pragul A al timerului. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | * inițializarea jocului, cu setarea timer-ului la 5 minute | ||
+ | {{:pm:prj2024:azamfir:ana_maria.toader02:init.gif?700|}} | ||
+ | |||
+ | * eliberarea unui grup de celule | ||
+ | {{:pm:prj2024:azamfir:ana_maria.toader02:clear_multiple_cells.gif?700|}} | ||
+ | |||
+ | * sfârșitul jocului | ||
+ | {{:pm:prj2024:azamfir:ana_maria.toader02:game_won.gif?700|}} | ||
+ | {{:pm:prj2024:azamfir:ana_maria.toader02:game_over.gif?700|}} | ||
+ | |||
+ | * resetarea jocului la apăsarea switch-ului de pe joystick, cu resetarea timer-ului la 5 minute | ||
+ | {{:pm:prj2024:azamfir:ana_maria.toader02:reset.gif?700|}} | ||
+ | |||
===== Concluzii ===== | ===== Concluzii ===== | ||
Un proiect interesant, mă bucur că am obținut ceva funcțional. | Un proiect interesant, mă bucur că am obținut ceva funcțional. |