This shows you the differences between two versions of the page.
pm:prj2022:agmocanu:distancegame [2022/05/25 21:47] andrei.bolozan |
pm:prj2022:agmocanu:distancegame [2022/05/27 22:47] (current) andrei.bolozan [Software Design] |
||
---|---|---|---|
Line 7: | Line 7: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | {{mspaint_yYXcHJZ3qV.png?800}} | + | {{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 32: | Line 33: | ||
|LED Rosu|12| | |LED Rosu|12| | ||
|LED Verde|13| | |LED Verde|13| | ||
+ | |||
+ | {{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 49: | 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 212: | 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 225: | Line 78: | ||
- Senzor distanta : https://create.arduino.cc/projecthub/abdularbi17/ultrasonic-sensor-hc-sr04-with-arduino-tutorial-327ff6 | - Senzor distanta : https://create.arduino.cc/projecthub/abdularbi17/ultrasonic-sensor-hc-sr04-with-arduino-tutorial-327ff6 | ||
- Buzzer : https://www.ardumotive.com/how-to-use-a-buzzer-en.html | - Buzzer : https://www.ardumotive.com/how-to-use-a-buzzer-en.html | ||
- | - 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> | ||