Buzz Wire Game: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
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 | 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> | |||
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); | |||
int | 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--; | |||
} | |||
</source></tab> | |||
</tabs> | |||
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]] | |||
[[Category:AVR]] [[Category:DTV]] | [[Category:AVR]] [[Category:DTV]] |
Verzia z 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.
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.
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).
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č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:
Ď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:
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