Operácie

Buzz Wire Game: Rozdiel medzi revíziami

Z SensorWiki

Riadok 30: Riadok 30:
  
  
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 nazaizolovaný ........
+
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ť.
  
 
[[Súbor:Slucka-buzz-wire.jpg|400px|thumb|center|Slučka s rúčkou]]
 
[[Súbor:Slucka-buzz-wire.jpg|400px|thumb|center|Slučka s rúčkou]]
Riadok 46: Riadok 46:
 
[[Súbor:Schema-zapojenia-buzz-wire.png|700px|thumb|center|Schéma zapojenia]]
 
[[Súbor:Schema-zapojenia-buzz-wire.png|700px|thumb|center|Schéma zapojenia]]
  
Vývod "Na drôtik" prispájkujeme zospodu stolčeka k  
+
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 a program ===
Riadok 52: Riadok 52:
 
Algoritmus programu je....
 
Algoritmus programu je....
  
 +
<tabs>
 +
<tab name="Kód v prostredí Arduino IDE"><source lang="c++" style="background: LightYellow;">
 +
#include <Wire.h>
 +
#include <LiquidCrystal_I2C.h>
  
<tabs>
+
char freePlay[] = "FREE PLAY";
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
+
char challenge[] = "CHALLENGE MODE";
#include <avr/io.h>
+
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);
  
int main(void)
+
const int buzzer = 10;
{
+
const int circuit = 9;
  unsigned int measuredValue;
+
const int changeButton = 2;
 +
int mode = 1;
 +
int showTimer = 20;
 +
int timerTime = showTimer;
 +
const int stopCountdown = 3;
 +
bool countdown = false;
  
  while (1)
+
unsigned long previousMillis = 0;
  {
+
const long interval = 1000;
    /*  relax  */ 
+
int buzzed = 0;
  }
 
  
   return(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);
 
}
 
}
  
</source></tab>
+
void loop() {
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
  // put your main code here, to run repeatedly:
#include <avr/io.h>
 
  
void adc_init(void);                                   // A/D converter initialization
+
  if (digitalRead(circuit) == HIGH) {
 +
    digitalWrite(buzzer, HIGH);
 +
  } else {
 +
    digitalWrite(buzzer, LOW);
 +
  }
  
unsigned int adc_read(char a_pin);
+
  if (digitalRead(changeButton) == HIGH) {
</source></tab>
+
    changeMode();
</tabs>
+
    delay(500);
 +
  }
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
+
  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);
 +
    }
 +
  }
 +
}
  
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
+
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);
 +
}
  
=== Overenie ===
+
void changeMode() {
 +
  if (mode == 1) {
 +
    mode = 2;
 +
    lcd.clear();
 +
    buzzed = 0;
 +
    countdown = true;
 +
    showChallenge();
 +
  } else {
 +
    mode = 1;
 +
    lcd.clear();
 +
    showFreePlay();
 +
  }
 +
}
  
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.  
+
void showCountdown() {
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.  
+
  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--;
 +
}
  
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
+
</source></tab>
  
'''Video:'''
+
</tabs>
<center><youtube>_l02MBu41n0</youtube></center>
 
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.  
+
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
  
 
[[Category:AVR]] [[Category:DTV]]
 
[[Category:AVR]] [[Category:DTV]]

Verzia zo dňa a času 13:55, 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: zdrojaky.zip