Operácie

Buzz Wire Game: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDTV (diskusia | príspevky)
Bez shrnutí editace
StudentDTV (diskusia | príspevky)
Bez shrnutí editace
Riadok 187: Riadok 187:
</tabs>
</tabs>


Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
Zdrojový kód: [[Médiá:Buzz_wire_game.zip|Buzz_wire_game_program.zip]]


[[Category:AVR]] [[Category:DTV]]
[[Category:AVR]] [[Category:DTV]]

Verzia z 14:00, 23. jún 2023

Záverečný projekt predmetu DTV / LS2023 - Angelika Loduhová


Zadanie

Cieľom tohto projektu bolo vytvoriť hru, ktorej cieľom je sledovať drôtik (cestu) slučkou, pričom sa slučkou nesmiete dotknúť drôtiku na doske. Ak sa slučka a drôtik dotknú, obvod sa dokončí a zaznie bzučiak.

Arduino Buzz Wire Game


Literatúra:


Analýza a opis riešenia

Podstava (stolček)

Ako prvé budeme potrebovať malý stolček, na ktorom bude stáť celá hra. Skladať sa bude z troch dosiek: jednej väčšej, do ktorej vyvŕtame dve dierky a bude slúžiť ako vrch stolčeka a dve menšie dosky, ktoré budú slúžiť ako nohy stolčeka. Dosky som najskôr obrúsila a prišrobovala k sebe. Na nasledujúcom obrázku je hotový celý stolček.

Stolček

Drôtik a slučka

Ako druhé budeme potrebovať drôtik a slučku z drôtiku, čo bude tvoriť podstatu celej hry. Drôtik zohneme do rôzneho tvaru, tak aby vznikla cesta ako napríklad na nasledujúcom obrázku. Cesta by nemala byť príliš náročná ani príliš ľahká. Dôležitým detailom je spraviť cestu tak, aby pretŕčala zospodu stolčeka. Potom cestu vložíme do vyvŕtaných dierok stolčeka. Následne drôtik zaizolujeme napríklad elektrikárskou páskou asi centimeter nad stolčekom na oboch koncoch (aby sme mali kam odložiť slučku).

Drôtik (cesta)


Slučku tiež vytvoríme z drôtiku. Je to len rovný drôtik, ktorý je zakrivený na konci tak, aby tvoril slučku. Drôtik aj slučku je dobré predtým ošmirgľovať šmirgľovým papierom na zaistenie dobrého vedenia, inak hra nebude fungovať (naozaj odporúčam tento krok nepreskočiť). Potom vytvoríme rúčku slučky. Ja som na rúčku slučky použila tavnú pištoľ, ale môže sa vytvoriť napríklad aj z dreva. Rúčka by tiež mala byť nevodivá, preto som svoju oblepila elektrikárskou páskou. Opäť by sme mali nechať koniec slučky nezaizolovaný, budeme to potrebovať.

Slučka s rúčkou


Slučku napojíme na cestu. Cestu so slučkou upevníme v stolčeku, aby sa nehýbala. Opäť som na to použila tavnú pištoľ. Výsledok doterajšej práce by mohol vyzerať nejako takto:

Stolček s cestou a slučkou

Ďalším krokom bude pozapájať obvod a vytvoriť niečo ako krabičku na celú elektroniku.

Schéma zapojenia

V tomto kroku vytvoríme obvod našej hry. Všetky súčiastky som našla vo svojej Arduino súprave. Hlavnými súčiastkami, ktoré budeme potrebovať sú: Arduino Uno, I2C LCD displej, Breadboard, tlačidlá, vodiče, bzučiak a rezistory. Schéma zapojenia bude vyzerať približne nasledovne:

Schéma zapojenia

Vývod "Na drôtik" prispájkujeme zospodu stolčeka k ceste a vývod "Na slučku" prispájkujeme ku koncu slučky, ktorý následne zaizolujeme.

Algoritmus a program

Algoritmus programu je....

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

char freePlay[] = "FREE PLAY";
char challenge[] = "CHALLENGE MODE";
char motivation[] = "you can do it!";
char gameOver[] = "GAME OVER";
char youWon[] = "** YOU WON! **";
byte heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000,
  0b00000
};

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int buzzer = 10;
const int circuit = 9;
const int changeButton = 2;
int mode = 1;
int showTimer = 20;
int timerTime = showTimer;
const int stopCountdown = 3;
bool countdown = false;

unsigned long previousMillis = 0;
const long interval = 1000;
int buzzed = 0;

void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();
  pinMode(buzzer, OUTPUT);
  pinMode(circuit, INPUT);
  pinMode(changeButton, INPUT);
  pinMode(stopCountdown, INPUT);
  showFreePlay();
  lcd.createChar(0, heart);
}

void loop() {
  // put your main code here, to run repeatedly:

  if (digitalRead(circuit) == HIGH) {
    digitalWrite(buzzer, HIGH);
  } else {
    digitalWrite(buzzer, LOW);
  }

  if (digitalRead(changeButton) == HIGH) {
    changeMode();
    delay(500);
  }

  unsigned long currentMillis = millis();
  if (mode == 2) {
    if (currentMillis - previousMillis >= interval && countdown == true) {
      previousMillis = currentMillis;
      if (showTimer > 0) {
        showCountdown();
      } else {
        lcd.setCursor(3, 1);
        lcd.print(gameOver);
        if (buzzed == 0) {
          digitalWrite(buzzer, HIGH);
          delay(1500);
          digitalWrite(buzzer, LOW);
          buzzed = 1;
        }
      }
    }
    if (digitalRead(stopCountdown) == HIGH) {
      countdown = false;
      lcd.clear();
      lcd.setCursor(1,1);
      lcd.print(youWon);
    }
  }
}

void showFreePlay() {
  lcd.setCursor(3, 0);
  lcd.print(freePlay);
  lcd.setCursor(0, 1);
  lcd.print(motivation);
  lcd.write((byte)0);
  showTimer = timerTime;
}

void showChallenge() {
  lcd.setCursor(1, 0);
  lcd.print(challenge);
}

void changeMode() {
  if (mode == 1) {
    mode = 2;
    lcd.clear();
    buzzed = 0;
    countdown = true;
    showChallenge();
  } else {
    mode = 1;
    lcd.clear();
    showFreePlay();
  }
}

void showCountdown() {
  if (showTimer >= 10) {
    lcd.setCursor(7, 1);
    lcd.print("");
    lcd.print(showTimer);
  }
  if (showTimer < 10) {
    lcd.setCursor(7, 1);
    lcd.print("  ");
    lcd.setCursor(8, 1);
    lcd.print(showTimer);
  }
  showTimer--;
}

Zdrojový kód: Buzz_wire_game_program.zip