This is an old revision of the document!


Distance Game

Realizat de Bolozan Andrei

Introducere

Proiectul acesta reprezinta un joc in care omul (sau palma acestuia) trebuie sa se pozitioneze la o distanta indicate de arduino. In cazul in care el reuseste se aprinde un led verde si se trece la nivelul urmator (se scade timpul cu 2 secunde). In cazul in care el nu reuseste se aprinde un led rosu si se afiseaza scorul final(numarul de nivele trecute).In ambele cazuri se produce un sunet.

Descriere generală

Hardware Design

* Lista cu componentele folosite:

  • Arduino Uno
  • Ecran LCD 16×2
  • Potentiometru
  • Buton
  • Senzor Distanta
  • Diferite Rezistente
  • Materiale constructii(placa PCB, fire)
Pini piese Pini Arduino UNO
RS 11
EN 10
D4 5
D5 4
D6 3
D7 2
Button 6
Echo8
Trig7
Buzzer9
LED Rosu12
LED Verde13

Software Design

* Librarii folosite

  • Am folosit libraria LiquidCrystal.h

* Implementare cod

  • Am definit un LCD .
  • In functie setup am initializat un LCD (16 x 2).
  • Am initializat pini folositi.
  • Cu ajutorul variabilei globale sceneManager prezentam scena dorita:
    • 0 → openingFrame(este prezentat titlul jocului).
    • 1 → mainMenu(se prezinta instructiunile si se astepta apasarea butonului).
    • 2 → mainGame(rularea jocul).
  • openingFrame: Cu ajutorul LCD-ului afisez titlul jocului sit rec la scena urmatoare.
  • mainMenu : Cu ajutorul LCD-ului afisez instructiunile jocului si astept ca pe pinul butonului sa se citeasca 1 logic(butonul sa fie apasat). In caz ca da atunci se trece la scena urmatoare.
  • 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:

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);
}

Rezultate Obţinute

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.

Download

Fisierul cu codul se afla in sectiunea SoftWare Design.

Bibliografie/Resurse

pm/prj2022/agmocanu/distancegame.1653504477.txt.gz · Last modified: 2022/05/25 21:47 by andrei.bolozan
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