Simon Game - The Ultimate Challenge

Introducere

Simon Game - The Ultimate Challenge este un joc care iti testeaza memoria si rapiditatea. Jocul iti prezinta o secventa de culori care trebuie reproduse in aceeasi ordine. Ideea de la care am pornit este jocul clasic Simon Game. Doresc ca scorul fiecarui jucator sa fie salvat intr-un leaderboard. Cred ca este util pentru ca este un joc distractiv care, in acelasi timp, antreneaza memoria.

Prezentare video: https://drive.google.com/file/d/149ZZ9S1_3bnUzwnpzxQyYRMXrMRTvXsE/view?usp=sharing

Descriere generală

Implementare joc Simon Game pe un LCD.

Placa de dezvoltare folosita este compatibila cu Arduino UNO R3. Acesta va canta o muzica pe un buzzer si va lua input de la butoane si joystick, care va fi folosit pentru a parcurge leaderboard-ul. Ecranul va afisa atat culorile care trebuiesc apasate, cat si scorul jucatorilor intr-un leaderboard. Informatiile despre scor vor fi salvate pe un card SD.

Hardware Design

Lista de piese:

  • 4 butoane
  • 4 rezistente de 220 Ohm
  • Modul de afisare LCD TFT - ST7735S
  • Buzzer pasiv
  • Placa de dezvoltare compatibila cu Arduino Uno R3
  • Joystick
  • Modul adaptor microSD

Software Design

* mediu de dezvoltare - Visual Studio Code - PlatformIO

* biblioteci utilizate:

  • <Arduino.h>
  • <Adafruit_GFX.h>
  • <Adafruit_ST7735.h>
  • <EEPROM.h>
  • <SPI.h>

* Laboratoare utilizate:

  • Laborator 0: GPIO - joystick
  • Laborator 1: UART - debugging
  • Laborator 2: Intreruperi - butoane
  • Laborator 5: SPI - LCD TFT

* structuri implementare:

  • Lista inlantuita pentru pastrarea in ordine a scorurilor.

Sunt salvate doar cele mai bune 10 scoruri. La introducerea unui scor nou se introduce in ordine, iar cel mai prost scor este sters.

* functii implementate:

  • void initializeEEPROMWithDefaultScores()
    • Initializeaza memoria EEPROM cu scorurile “000 - AAAAAAAAAA”
  • void saveScoresToEEPROM(node_t *head)
    • Functie de test. Salveaza toate scorurile curente in EEPROM.
  • void readAllScoresFromEEPROM()
    • Functie de test. Citeste toate scorurile din EEPROM si le afiseaza in Serial Monitor
  • int getLowestIdxFromEEPROM()
    • Cauta indexul celui mai mic scor salvat in EEPROM.
  • void loadAllScoresFromEEPROM()
    • Incarca in memorie toate datele din EEPROM, intr-o lista inlantuita.
  • void printScore()
    • Se ocupa cu afisarea scorurilor din lista inlantuita pe ecranul LED.
  • void addNode(node_t ◌◌list_head, char *player_data)
    • Adauga un nod nou in lista inlantuita
  • node_t* createNode(char *player_data)
    • Functie auxiliara. Se ocupa cu crearea de noduri noi pentru lista
  • void freeList(node_t ◌◌list_head)
    • Functie de eliberare a listei. Nu a fost folosita
  • void drawKeyboard()
    • Afiseaza pe ecranul LED o tastatura.
  • void MakeChoice(unsigned long currentMillis)
    • Inregistreaza culoarea butonului apasat de jucator.
  • void ShowColors(unsigned long currentMillis)
    • Afiseaza pattern-ul de culori pe display.
  • void PickNewColor(unsigned long currentMillis)
    • Alege aleator o noua culoare pentru a fi adaugata in pattern.
  • void DrawColor(unsigned int choice)
    • Deseneaza un cerc colorat in functie de choice.
  • void PlayMusic(unsigned long currentMillis)
    • Se ocupa cu redarea muzicii.

Rezultate Obţinute

Am obtinut un joculet functional si experienta in lucrul cu microcontrolere.

Download

Jurnal

Am inceput proiectul prin a ma juca putin cu placuta de dezvoltare. Am conectat butoanele, buzzer-ul, un modul led rgb si un ecran LCD. Am observat ca incep sa raman fara pini disponibili, asa ca am decis sa nu mai folosesc modulul rgb si in schimb sa introduc un joystick si un modul microSD. Asa ca, in loc sa folosesc led-ul pentru a arata secventa de culori o sa folosesc ecranul LCD.

Am incercat sa conectez doua dispozitive prin comunicare SPI (SPI ST7735S si MicroSD Module Adapter), dar am vazut ca MicroSD-ul esua la initializare. Am incercat sa pun si rezintente de pull-up pentru chip select, dar problema a persistat. Din cate am vazut pe internet modulul microSD are un level shifter si ar putea cauza probleme in pereche cu ST7735S-ul. Am incercat sa caut toate videoclipurile posibile si imposibile de pe internet sa vad ceva ce m-ar putea ajuta, nu a ajutat. Am incercat sa mut piesele in toate combinatiile posibile cam o saptamana, nu a mers. Am pierdut cel putin trei ore pe cele mai indepartate forumuri de pe internet, am descoperit pe cineva care a avut aceeasi problema si a optat sa foloseasca software SPI. Am decis sa trec pe Software SPI pentru microSD. A mers foarte bine la inceput, super, dar dupa ce am mai scris cod iar nu a mai mers, fir-ar. Cel mai posibil am avut aceasta problema din cauza ca am ramas fara memorie RAM datorita unor alocari pe parcursul rularii. Intr-un final am decis sa salvez date despre leaderboard pe EEPROM, facand modificari doar cand este necesar. A mers, aleluia. Mi-a mancat zilele cititorul ala de microSD-uri, asa ca l-am vandut altcuiva, numai sa scap de el odata.

Un ultim lucru. Am descoperit ca este usor sa faci stack overflow si sa nu iti dai seama.

pm/prj2025/rnedelcu/marius.jugaru.txt · Last modified: 2025/05/28 23:58 by marius.jugaru
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