This shows you the differences between two versions of the page.
|
pm:prj2022:agmocanu:distancegame [2022/05/26 23:07] andrei.bolozan [Descriere generală] |
pm:prj2022:agmocanu:distancegame [2022/05/27 22:47] (current) andrei.bolozan [Software Design] |
||
|---|---|---|---|
| Line 9: | Line 9: | ||
| {{mspaint_aKfOL7oSMD.jpeg?700}} | {{mspaint_aKfOL7oSMD.jpeg?700}} | ||
| + | Senzorul distanta trimite prin unul dintre cei 2 "ochi" o raza. Pe celalalt ochi primeste acea raza trimisa mai devreme. Astfel Arduino-ul calculeaza timpul de propagare a razei. Si folosind timpul putem sa calculam distanta. Arduino-ul trimite un semnal la buzzer atunci cand este nevoie. Folosind pini definiti mai jos pentru LCD, Arduino-ul comunica cu acesta pentru a printa diferite mesaje. | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| * Lista cu componentele folosite: | * Lista cu componentele folosite: | ||
| Line 34: | Line 35: | ||
| {{chrome_6GqHxz4T4S.jpeg?800}} | {{chrome_6GqHxz4T4S.jpeg?800}} | ||
| + | |||
| + | <note tip> | ||
| + | Deoarece in tinkerCAD nu exista Arduino Nano, Arduino-ul Uno prezentat in imaginea de mai sus este o reprezentare a Arduino-ului folosit de mine. Legaturile dintre pini sunt aceleasi. | ||
| + | </note> | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| Line 52: | Line 57: | ||
| * mainGame :Initial numarul de secunde alocate primului nivel sunt 15. Cu ajutorul unui for inceracm sa imitam trecerea celor 15 secunde(forul itereaza de la 0 pana la t*10 si de cate ori iterezeaza aplica un delay de 100 de secunde). In acest for citim distanta jucatorului fata de aparat si o afisam alaturi de distanta pe care trb sa o indeplineasca( aceasta este alesa la intamplare la inceputul jocului). Cand se iese din for inseamna ca s-a terminat jocu si verificam ce la ce distanta se afla jucatorul. Daca acesta a reusit sa se plaseze la distanta corecta(+- o variatie deltaDist) atunci afisam un mesaj “Good Job!” pornim buzzer ul si ledul verde pentru 1 secunda si trecem la urmatorul nivel(incrementam score si decrementam timpul de asteptare). Daca acesta nu a reusit atunci aratam pe LCD mesajul “Fail ☹” arata m scorul current pornim buzzerul si ledul rosu pentru 1 secunda si trecem la scena mainGame. In cazul in care jucatorul este bun si ajuns la un nivel in care timpul de reactie este mai mic fata de 7 atunci se afiseaza mesajul “ You win” si se aprind ledurile alternativ si se trece la scena cu mainMenu.\\ | * mainGame :Initial numarul de secunde alocate primului nivel sunt 15. Cu ajutorul unui for inceracm sa imitam trecerea celor 15 secunde(forul itereaza de la 0 pana la t*10 si de cate ori iterezeaza aplica un delay de 100 de secunde). In acest for citim distanta jucatorului fata de aparat si o afisam alaturi de distanta pe care trb sa o indeplineasca( aceasta este alesa la intamplare la inceputul jocului). Cand se iese din for inseamna ca s-a terminat jocu si verificam ce la ce distanta se afla jucatorul. Daca acesta a reusit sa se plaseze la distanta corecta(+- o variatie deltaDist) atunci afisam un mesaj “Good Job!” pornim buzzer ul si ledul verde pentru 1 secunda si trecem la urmatorul nivel(incrementam score si decrementam timpul de asteptare). Daca acesta nu a reusit atunci aratam pe LCD mesajul “Fail ☹” arata m scorul current pornim buzzerul si ledul rosu pentru 1 secunda si trecem la scena mainGame. In cazul in care jucatorul este bun si ajuns la un nivel in care timpul de reactie este mai mic fata de 7 atunci se afiseaza mesajul “ You win” si se aprind ledurile alternativ si se trece la scena cu mainMenu.\\ | ||
| - | * Codul: | + | *Codul: |
| - | + | *Se afla in sectiunea de Download a paginii. | |
| - | <file cpp DistanceGame.ino> | + | |
| - | #include <LiquidCrystal.h> | + | |
| - | + | ||
| - | // initialize the library by associating any needed LCD interface pin | + | |
| - | // with the arduino pin number it is connected to | + | |
| - | const int rs = 11, en = 10, d4 = 5, d5 = 4, d6 = 3, d7 = 2; | + | |
| - | const int echo = 8, trig = 7, but = 6; | + | |
| - | const int buz = 9; | + | |
| - | const int rLED = 12, gLED = 13; | + | |
| - | LiquidCrystal lcd(rs, en, d4, d5, d6, d7); | + | |
| - | + | ||
| - | int sceneManager = 0; | + | |
| - | int t = 15; | + | |
| - | long lowDist = 20, highDist = 40; | + | |
| - | long deltaDist = 3; | + | |
| - | int score = 0; | + | |
| - | + | ||
| - | void setup() { | + | |
| - | Serial.begin(9600); | + | |
| - | lcd.begin(16, 2); | + | |
| - | + | ||
| - | pinMode(but, INPUT); | + | |
| - | pinMode(buz, OUTPUT); | + | |
| - | pinMode(rLED, OUTPUT); | + | |
| - | pinMode(gLED, OUTPUT); | + | |
| - | + | ||
| - | digitalWrite(rLED, LOW); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | } | + | |
| - | + | ||
| - | void loop(){ | + | |
| - | switchScene(); | + | |
| - | } | + | |
| - | + | ||
| - | void switchScene(){ | + | |
| - | switch(sceneManager){ | + | |
| - | case 0: | + | |
| - | openingFrame(); | + | |
| - | break; | + | |
| - | case 1: | + | |
| - | mainMenu(); | + | |
| - | break; | + | |
| - | case 2: | + | |
| - | mainGame(); | + | |
| - | break; | + | |
| - | default: | + | |
| - | lcd.clear(); | + | |
| - | break; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | void openingFrame(){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Distance game!"); | + | |
| - | delay(2000); | + | |
| - | sceneManager = 1; | + | |
| - | } | + | |
| - | + | ||
| - | void mainMenu(){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Match the dist!"); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("But to start"); | + | |
| - | Serial.println(digitalRead(but)); | + | |
| - | if(digitalRead(but)){ | + | |
| - | sceneManager = 2; | + | |
| - | delay(200); | + | |
| - | } | + | |
| - | delay(500); | + | |
| - | } | + | |
| - | + | ||
| - | void mainGame(){ | + | |
| - | int localT = t; | + | |
| - | score = 0; | + | |
| - | while(1){ | + | |
| - | long trigDist = newrandom(lowDist, highDist); | + | |
| - | long dist = -1; | + | |
| - | for(int i = 0;i <= localT * 10;i++){ | + | |
| - | delay(100); | + | |
| - | lcd.clear(); | + | |
| - | dist = readDistanceSenzorData(trig, echo); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Your dist:");lcd.print(dist);lcd.print(" cm"); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("Thr dist:");lcd.print(trigDist);lcd.print(" cm"); | + | |
| - | Serial.println(digitalRead(but)); | + | |
| - | + | ||
| - | } | + | |
| - | if((trigDist - deltaDist <= dist) && (dist < trigDist + deltaDist)){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Good job!"); | + | |
| - | tone(buz, 1000); | + | |
| - | digitalWrite(gLED, HIGH); | + | |
| - | score++; | + | |
| - | localT -= 2; | + | |
| - | delay(1000); | + | |
| - | noTone(buz); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | if(t <= 7){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("You win"); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("Score: "); lcd.print(score); | + | |
| - | for(int i = 0;i < 3;i++){ | + | |
| - | digitalWrite(rLED, HIGH); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | delay(250); | + | |
| - | digitalWrite(rLED, LOW); | + | |
| - | digitalWrite(gLED, HIGH); | + | |
| - | delay(250); | + | |
| - | } | + | |
| - | digitalWrite(rLED, LOW); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | sceneManager = 1; | + | |
| - | break; | + | |
| - | } | + | |
| - | } else { | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Fail :("); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("Score: "); lcd.print(score); | + | |
| - | sceneManager = 1; | + | |
| - | digitalWrite(rLED, HIGH); | + | |
| - | tone(buz, 500); | + | |
| - | delay(1000); | + | |
| - | noTone(buz); | + | |
| - | digitalWrite(rLED, LOW); | + | |
| - | break; | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | long readDistanceSenzorData(int ping, int echo){ | + | |
| - | long duration, inches, cm, distance; | + | |
| - | pinMode(ping, OUTPUT); | + | |
| - | digitalWrite(ping, LOW); | + | |
| - | delayMicroseconds(2); | + | |
| - | digitalWrite(ping, HIGH); | + | |
| - | delayMicroseconds(10); | + | |
| - | digitalWrite(ping, LOW); | + | |
| - | pinMode(echo, INPUT); | + | |
| - | duration = pulseIn(echo, HIGH); | + | |
| - | return duration / 29 / 2; | + | |
| - | } | + | |
| - | + | ||
| - | unsigned long newrandom(unsigned long howsmall, unsigned long howbig) | + | |
| - | { | + | |
| - | return howsmall + random() % (howbig - howsmall); | + | |
| - | } | + | |
| - | + | ||
| - | </file> | + | |
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| Line 215: | Line 64: | ||
| In urma acestui proiect am obtinut un joc competitiv care se poate juca singur sau cu mai multi. Am invatat cum sa lipesc diferite fire cu ciocanul de lipit. | In urma acestui proiect am obtinut un joc competitiv care se poate juca singur sau cu mai multi. Am invatat cum sa lipesc diferite fire cu ciocanul de lipit. | ||
| + | {{Distance_Game_poza1.jpeg?350}} | ||
| + | {{Distance_Game_poza2.jpeg?350}} | ||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | + | Repo github: |
| - | Fisierul cu codul se afla in sectiunea Software Design. | + | https://github.com/AndreiSlaShh/Distance_Game_v2 |
| - | </note> | + | |
| Line 230: | Line 80: | ||
| - LCD:https://core-electronics.com.au/guides/use-lcd-arduino-uno/#:~:text=Insert%20your%20LCD%20screen%20into,ground%20your%20Backlight%20and%20LCD. | - LCD:https://core-electronics.com.au/guides/use-lcd-arduino-uno/#:~:text=Insert%20your%20LCD%20screen%20into,ground%20your%20Backlight%20and%20LCD. | ||
| - Buton:https://create.arduino.cc/projecthub/muhammad-aqib/arduino-button-tutorial-using-arduino-digitalread-function-08adb5 | - Buton:https://create.arduino.cc/projecthub/muhammad-aqib/arduino-button-tutorial-using-arduino-digitalread-function-08adb5 | ||
| - | |||
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||