This is an old revision of the document!
Sudoku
Introducere
Proiectul propune implementarea jocului Sudoku pe un microcontroller Arduino, redat pe un display LCD. Jucatorul se va putea misca intre celule folosind un joystick, iar cifrele vor fi introduse folosind o tastatura numerica.
Scopul proiectului este de a imbina cunostinte hardware si software, dar si de a crea un joc lejer, de tip puzzle care iti testeaza abilitatile logice.
Descriere generală
Jocul de Sudoku, in forma clasica, are urmatoarele reguli:
Tabla de joc este o grila de 9×9 celule, impartita in subgrile de 3×3.
O celula poate tine o cifra de la 1 la 9.
Toate cifrele dintr-o subgrila trebuie sa fie distincte.
Toate cifrele de pe un rand trebuie sa fie distincte.
Toate cifrele de pe o coloana trebuie sa fie distincte.
Initial, jocul pleaca de la o grila completata partial (anumite celule contin deja cifre) iar jucatorul nu le poate schimba pe acestea.
Un Sudoku este considerat complet atunci cand toate celulele contin cate o cifra si toate regulile jocului sunt respectate.
Jucatorul va naviga intre celule folosind joystick-ul si le va scrie o cifra in celula folosind tastatura numerica. Pe ecranul LCD se va afisa grila jocului.
Hardware Design
Lista de piese
Microcontroller Arduino Nano (ATmega328P).
Ecran 1.8” LCD (128×160).
Joystick.
Tastatura numerica 4×4.
Breadboard, rezistori, fire.
Schema electrica
Decizii luate
Software Design
Diagrama de Flux
Implementare
Ca mediu de dezvoltare, am lucrat in Arduino IDE.
Pentru a controla mai usor functionalitatile perifericelor, am folosit bibliotecile 3rd-party TFT.h, SPI.h pentru ecranul LCD si Keypad.h pentru tastatura numerica.
Pentru a reda grafici pe ecran, am scris functiile draw_start_menu, draw_grid, draw_subgrids, draw_cursor care deseneaza meniul de start, grila principala de 3×3, celulele si respectiv cursorul.
Functia select_board copiaza in tabla activa, o tabla dintr-o lista predefinita. Am ales sa pun si o tabla suplimentara care are doar doua celule libere, pentru a testa functiile scrise.
Functia read_joystick citeste valorile trimise de joystick si muta cursorul in directia specificata cat timp nu iese din tabla de joc.
Functia write_digit scrie in tabla de joc activa cifra care a fost introdusa de jucator. Tasta '0' sterge o cifra dintr-o celula care nu este fixa.
In final, check_board verifica daca tabla de joc activa este completa si respecta toate regulile jocului.
Pentru a cronometra timpul de la inceputul jocului si pana la castigarea acestuia, am folosit timer-ul intern al microcontroller-ului. Prin functia millis am calculat diferenta de timp intre fiecare executie a functiei loop iar la final am scazut momentul de start din momentul curent, pentru a calcula durata totala.
Download
Rezultate Obţinute
Care au fost rezultatele obţinute în urma realizării proiectului vostru.
Concluzii
Download
O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună

.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
Jurnal
22/04/2024 - Alegerea proiectului, aprobare.
23/04/2024 - Comandarea componentelor.
29/04/2024 - Pagina de wiki initiala.
09/05/2024 - Hardware design.
16/05/2024 - Software design.
Bibliografie/Resurse