This is an old revision of the document!
Proiectul constă într-un joc de tip arcade în care jucătorul trebuie să marcheze cât mai multe puncte într-o anumită perioadă de timp(60s).
Proiectul utilizează un senzor ultrasonic pentru a intercepta mișcarea mingii care trece prin coșul de baschet, numără punctele marcate și le afișează pe un display digital.
Ideea acestui proiect a pornit din pasiunea mea pentru baschet și din dorința de a crea ceva cu care îmi mai pot ocupa timpul liber la cămin.
Sub inelul coșului de baschet va fi atașat un senzor ultrasonic. După ce un coș va fi marcat, senzorul va înregistra mișcarea mingii de baschet și va transmite un semnal către placa Arduino Uno folosită, iar mai apoi scorul va fi actualizat pe un display digital. De asemenea după marcarea coșului, prin intermediul unui buzzer, jucătorii vor fi anunțați că au câștigat un punct prin emiterea unui sunet.
Pentru a face lucrurile mai interesante, jucătorii vor avea de marcat cât mai multe puncte într-o perioadă de 60 de secunde. Timpul rămas pentru efectuarea aruncărilor va fi afișat pe un display LCD dar va fi indicat și printr-un sistem de iluminare LED care își va schimba culoare în funcție de timpul rămas(între 60 și 40 de secunde ,verde, între 40 și 20 de secunde ,galben și între 20 și 0 secunde, roșu).
Componente folosite:
Pe partea de software a proiectului, am lucrat cu 3 librării din IDE-ul Arduino, acestea fiind: “LiquidCrystal_I2C”, “Adafruit_NeoPixel” și “Wire.h”.
Sistemul înregistrează mișcarea prin intermediul senzorului ultrasonic care transimte un semnal către Arduino. După ce semnalul este interceptat, un contor numără coșurile marcate și scorul este permanent actualizat pe display-ul LCD pe care este afișat și timpul rămas pentru marcarea punctelor.
În codul folosit există și o funcție care modifică culoarea benzii LED în funcție de timpul rămas. După ce timpul expiră, banda LED se va opri.
#include <LiquidCrystal_I2C.h> #include <Wire.h> #include <Adafruit_NeoPixel.h> #define LED_PIN 2 #define LED_COUNT 6 const int triggerPin = 7; const int echoPin = 6; const int buzzerPin = 9; LiquidCrystal_I2C lcd(0x27, 16, 2); Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); int score = 0; long minute = 0, second = 59; long countdown_time = minute * 60 + second; void setup() { pinMode(triggerPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(buzzerPin, OUTPUT); lcd.init(); lcd.backlight(); lcd.setCursor(4, 0); lcd.print("score:"); lcd.setCursor(11, 0); lcd.print(score); strip.begin(); strip.show(); // Initialize all pixels to off } void loop() { long duration; int distance; digitalWrite(triggerPin, LOW); delayMicroseconds(2); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; if (distance < 10) { score++; lcd.setCursor(11,0); lcd.print(score); } long countdowntime_seconds = countdown_time - (millis() / 1000); if (countdowntime_seconds >= 0) { long countdown_minute = ((countdowntime_seconds / 60) % 60); long countdown_sec = countdowntime_seconds % 60; lcd.setCursor(4, 1); if (countdown_minute < 10) { lcd.print("0"); } lcd.print(countdown_minute); lcd.print(":"); if (countdown_sec < 10) { lcd.print("0"); } lcd.print(countdown_sec); // Control LED strip based on timer value if (countdowntime_seconds <= 60 && countdowntime_seconds > 40) { setColor(strip.Color(0, 255, 0)); // Green } else if (countdowntime_seconds <= 40 && countdowntime_seconds > 20) { setColor(strip.Color(255, 255, 0)); // Yellow } else if (countdowntime_seconds <= 20 && countdowntime_seconds > 0) { setColor(strip.Color(255, 0, 0)); // Red } else { strip.clear(); // Turn off LED strip strip.show(); } if (countdowntime_seconds == 0) { lcd.setCursor(4, 1); lcd.print("Time's up"); strip.clear(); // Turn off LED strip strip.show(); } } delay(500); } void setColor(uint32_t color) { for (int i = 0; i < LED_COUNT; i++) { strip.setPixelColor(i, color); } strip.show(); } void playSound() { tone(buzzerPin, 1000, 100); delay(100); noTone(buzzerPin); }
1. Coșul de baschet finalizat.
2. Sistemul de afișaj al coșului.
3. Coșul de baschet în primele 20 de secunde.
4. Coșul de baschet între 40 și 20 de secunde.
5. Coșul de baschet în ultimele 20 de secunde.
6. Afișajul după oprire + LED-urile oprite.
7. Afișajul cu puncte.
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.