This is an old revision of the document!
Realizat de Bolozan Andrei
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.
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.
* Lista cu componentele folosite:
Pini piese | Pini Arduino UNO |
---|---|
RS | 11 |
EN | 10 |
D4 | 5 |
D5 | 4 |
D6 | 3 |
D7 | 2 |
Button | 6 |
Echo | 8 |
Trig | 7 |
Buzzer | 9 |
LED Rosu | 12 |
LED Verde | 13 |
* Librarii folosite
* Implementare cod
* Codul:
#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); }
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.
Link-uri: