Šach: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(62 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
Záverečný projekt predmetu DTV / LS2023 - '''Peter Marosi, Botond Csóka Botond''' | Záverečný projekt predmetu DTV / LS2023 - '''Peter Marosi, Botond Csóka Botond''' | ||
[[Obrázok:Chess fullset.jpg|400px|thumb|right|Šachovnica a figúrky]] | |||
[[Obrázok:Timer.jpg|400px|thumb|right|Časovač]] | |||
[[Súbor:Board corner.jpg|400px|thumb|right|Šachovnica]] | |||
__TOC__ | |||
== Zadanie == | == Zadanie == | ||
Cieľom tohto projektu bolo vytvoriť kompletný súpravu pre hru šachy, ktorá by spájala estetiku, funkčnosť a jednoduché ovládanie. Táto dokumentácia bude slúžiť ako podrobný záznam nášho postupu a výsledkov, a poskytne podklady pre ďalšie vylepšenia a použitie projektu. | |||
'''Literatúra:''' | '''Literatúra:''' | ||
Riadok 13: | Riadok 16: | ||
== Šachovnica == | |||
Naším hlavným cieľom pri vytváraní šachovnice bolo navrhnúť a vyrobiť vizuálne atraktívnu a funkčnú hernú plochu. Pri vytváraní našej šachovnice sme sa rozhodli použiť plexisklo, pretože sme mali pocit, že je to ideálny materiál na vytvorenie vizuálne príjemnej šachovnice. Na vytvorenie návrhu šachovnice sme využili softvér Inkscape. Nakoniec sme na samotnú výrobu šachovnice použili laserovú rezačku. | |||
[[Obrázok:Boardsvg.png|500px|thumb|center|SVG File]] | |||
== Figúrky == | |||
Pre figúrky sme si stanovili cieľ vytvoriť ich pomocou 3D tlačiarne. | |||
[[Súbor:lineup.jpg|400px|thumb|left| ]] | |||
[[Súbor:lineup2.jpg|400px|thumb|center| ]] | |||
== Časovač == | |||
Naším cieľom bolo vytvoriť časovač, ktorý by sa ľahko používal a zobrazoval čas hry. Použili sme Arduino, tlačidlá, LCD displej a naprogramovali sme zariadenie tak, aby sme dosiahli požadovanú funkčnosť časovača. | |||
[[Súbor:cables_timer.png|600px|thumb|center|Schéma zapojenia.]] | |||
=== | === Funkcionalita === | ||
- '''Menu:''' Môžete si vybrať čas. T1 nastavuje čas, T2 je štart. | |||
- '''Štart:''' Začne sa odpočítavať čas prvým hráčom. Ak prvý hráč stlačí svoje tlačidlo, začne sa odpočítavať čas druhého hráča. | |||
- '''Hra:''' Predchádzajúci bod pokračuje, kým nevyprší čas jedného hráča. | |||
- '''Stop:''' Ak sú obe tlačidlá súčasne stlačené, vráti sa späť do menu. | |||
<tab name="Arduino Code"><source lang="c++" style="background: LightYellow;"> | <tab name="Arduino Code"><source lang="c++" style="background: LightYellow;"> | ||
#include <LiquidCrystal.h> | #include <LiquidCrystal.h> | ||
Riadok 58: | Riadok 75: | ||
void loop() { | void loop() { | ||
if (isInMenu) { | if (isInMenu) { // Menu | ||
if (isondisplay==0){ | if (isondisplay==0){ | ||
Riadok 72: | Riadok 89: | ||
} | } | ||
if (buttonState != digitalRead(buttonPin)) { | if (buttonState != digitalRead(buttonPin)) { | ||
// BTN 1, change time intervals | |||
isondisplay=0; | isondisplay=0; | ||
buttonState = !buttonState; | buttonState = !buttonState; | ||
Riadok 82: | Riadok 99: | ||
if (buttonState2 != digitalRead(buttonPin2)) { | if (buttonState2 != digitalRead(buttonPin2)) { | ||
// BTN 2, Start | |||
buttonState2 = !buttonState2; | buttonState2 = !buttonState2; | ||
if (buttonState2 == LOW) { | if (buttonState2 == LOW) { | ||
Riadok 91: | Riadok 108: | ||
lcd.clear(); | lcd.clear(); | ||
lcd.print("Player 1"); | lcd.print("Player 1"); | ||
delay(1000); | delay(1000); // Delay to display the message | ||
} | } | ||
} | } | ||
Riadok 97: | Riadok 114: | ||
else { | else { | ||
isondisplay=0; | isondisplay=0; | ||
// Game mode | |||
if (currentPlayer == 0) { | if (currentPlayer == 0) { | ||
// Current P0 | |||
unsigned long currentTime = millis(); | unsigned long currentTime = millis(); | ||
elapsedTime += currentTime - startTime; | elapsedTime += currentTime - startTime; | ||
Riadok 105: | Riadok 122: | ||
remainingTime = (gameTimes[gameTimeIndex] * 60 - elapsedTime / 1000) * 1000; | remainingTime = (gameTimes[gameTimeIndex] * 60 - elapsedTime / 1000) * 1000; | ||
} else { | } else { | ||
// Current P1 | |||
player2ElapsedTime += currentTime - startTime; | player2ElapsedTime += currentTime - startTime; | ||
startTime = currentTime; | startTime = currentTime; | ||
Riadok 114: | Riadok 131: | ||
if (remainingTime <= 0) { | if (remainingTime <= 0) { // Time's up | ||
lcd.clear(); | lcd.clear(); | ||
Riadok 125: | Riadok 142: | ||
lcd.setCursor(0, 1); | lcd.setCursor(0, 1); | ||
lcd.print("Time's Up"); | lcd.print("Time's Up"); | ||
delay(1000); | delay(1000); // Delay to display the message | ||
while (digitalRead(buttonPin) == LOW && digitalRead(buttonPin2) == LOW) { } | while (digitalRead(buttonPin) == LOW && digitalRead(buttonPin2) == LOW) { } | ||
// Waiting for button press | |||
delay(320); | delay(320); | ||
isInMenu = true; | isInMenu = true; | ||
Riadok 137: | Riadok 154: | ||
} | } | ||
else { | else { | ||
// Display Time | |||
lcd.setCursor(0, 1); | lcd.setCursor(0, 1); | ||
Riadok 154: | Riadok 171: | ||
if (buttonState != digitalRead(buttonPin) && buttonState2 != digitalRead(buttonPin2)) { | if (buttonState != digitalRead(buttonPin) && buttonState2 != digitalRead(buttonPin2)) { | ||
// BTN1 & BTN2 pressed, back to menu | |||
buttonState = !buttonState; | buttonState = !buttonState; | ||
buttonState2 = !buttonState2; | buttonState2 = !buttonState2; | ||
Riadok 164: | Riadok 181: | ||
if (buttonState2 != digitalRead(buttonPin2) && currentPlayer==0) { | if (buttonState2 != digitalRead(buttonPin2) && currentPlayer==0) { | ||
// BTN2, change players | |||
buttonState2 = !buttonState2; | buttonState2 = !buttonState2; | ||
if (buttonState2 == LOW) { | if (buttonState2 == LOW) { | ||
Riadok 175: | Riadok 192: | ||
if (buttonState != digitalRead(buttonPin) && currentPlayer == 1) { | if (buttonState != digitalRead(buttonPin) && currentPlayer == 1) { | ||
// BTN1, change players | |||
buttonState = !buttonState; | buttonState = !buttonState; | ||
if (buttonState == LOW) { | if (buttonState == LOW) { | ||
Riadok 188: | Riadok 205: | ||
</source></tab> | </source></tab> | ||
[[ | Zdrojový kód: [[Médiá:Zdrojaksach.zip.zip|zdrojaksach.zip]] | ||
[[Súbor:Casovac.jpg|600px|thumb|center|Timer.]] | |||
[[Category:DTV]][[Category:DTV2023]] | [[Category:DTV]][[Category:DTV2023]] |
Aktuálna revízia z 14:49, 14. jún 2023
Záverečný projekt predmetu DTV / LS2023 - Peter Marosi, Botond Csóka Botond
Zadanie
Cieľom tohto projektu bolo vytvoriť kompletný súpravu pre hru šachy, ktorá by spájala estetiku, funkčnosť a jednoduché ovládanie. Táto dokumentácia bude slúžiť ako podrobný záznam nášho postupu a výsledkov, a poskytne podklady pre ďalšie vylepšenia a použitie projektu.
Literatúra:
Šachovnica
Naším hlavným cieľom pri vytváraní šachovnice bolo navrhnúť a vyrobiť vizuálne atraktívnu a funkčnú hernú plochu. Pri vytváraní našej šachovnice sme sa rozhodli použiť plexisklo, pretože sme mali pocit, že je to ideálny materiál na vytvorenie vizuálne príjemnej šachovnice. Na vytvorenie návrhu šachovnice sme využili softvér Inkscape. Nakoniec sme na samotnú výrobu šachovnice použili laserovú rezačku.
Figúrky
Pre figúrky sme si stanovili cieľ vytvoriť ich pomocou 3D tlačiarne.
Časovač
Naším cieľom bolo vytvoriť časovač, ktorý by sa ľahko používal a zobrazoval čas hry. Použili sme Arduino, tlačidlá, LCD displej a naprogramovali sme zariadenie tak, aby sme dosiahli požadovanú funkčnosť časovača.
Funkcionalita
- Menu: Môžete si vybrať čas. T1 nastavuje čas, T2 je štart.
- Štart: Začne sa odpočítavať čas prvým hráčom. Ak prvý hráč stlačí svoje tlačidlo, začne sa odpočítavať čas druhého hráča.
- Hra: Predchádzajúci bod pokračuje, kým nevyprší čas jedného hráča.
- Stop: Ak sú obe tlačidlá súčasne stlačené, vráti sa späť do menu.
#include <LiquidCrystal.h>
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
const int buttonPin = 9;
const int buttonPin2 = 10;
int buttonState = 0;
int buttonState2 = 0;
int gameTimeIndex = 0;
float gameTimes[] = {3, 5, 15, 60}; // Time in minutes
int currentPlayer = 0; // Current player 0/1
unsigned long startTime = 0; // Start Time
unsigned long elapsedTime = 0; // Elapsed Time
bool isInMenu = true;
unsigned long player1ElapsedTime = 0;
unsigned long player2ElapsedTime = 0;
unsigned long remainingTime=0;
unsigned long isondisplay=0;
void setup() {
lcd.begin(16, 2);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
}
void loop() {
if (isInMenu) { // Menu
if (isondisplay==0){
lcd.clear();
lcd.print("Choose time");
lcd.setCursor(0, 1);
if (gameTimes[gameTimeIndex] < 10) {
lcd.print("0");
}
lcd.print(gameTimes[gameTimeIndex]);
lcd.print(":00");
isondisplay=1;
}
if (buttonState != digitalRead(buttonPin)) {
// BTN 1, change time intervals
isondisplay=0;
buttonState = !buttonState;
if (buttonState == LOW) {
gameTimeIndex = (gameTimeIndex + 1) % (sizeof(gameTimes) / sizeof(gameTimes[0]));
delay(500); // Delay to prevent rebounce
}
}
if (buttonState2 != digitalRead(buttonPin2)) {
// BTN 2, Start
buttonState2 = !buttonState2;
if (buttonState2 == LOW) {
currentPlayer = 0;
elapsedTime = 0;
startTime = millis();
isInMenu = false;
lcd.clear();
lcd.print("Player 1");
delay(1000); // Delay to display the message
}
}
}
else {
isondisplay=0;
// Game mode
if (currentPlayer == 0) {
// Current P0
unsigned long currentTime = millis();
elapsedTime += currentTime - startTime;
startTime = currentTime;
remainingTime = (gameTimes[gameTimeIndex] * 60 - elapsedTime / 1000) * 1000;
} else {
// Current P1
player2ElapsedTime += currentTime - startTime;
startTime = currentTime;
remainingTime = (gameTimes[gameTimeIndex] * 60 - player2ElapsedTime / 1000) * 1000;
}
if (remainingTime <= 0) { // Time's up
lcd.clear();
if(currentPlayer==0){
lcd.print("Player 1");
}
else{
lcd.print("Player 2");
}
lcd.setCursor(0, 1);
lcd.print("Time's Up");
delay(1000); // Delay to display the message
while (digitalRead(buttonPin) == LOW && digitalRead(buttonPin2) == LOW) { }
// Waiting for button press
delay(320);
isInMenu = true;
lcd.clear();
return;
}
else {
// Display Time
lcd.setCursor(0, 1);
lcd.print("Time: ");
if (remainingTime / 1000 / 60 < 10) {
lcd.print("0");
}
lcd.print(remainingTime / 1000 / 60);
lcd.print(":");
if ((remainingTime / 1000) % 60 < 10) {
lcd.print("0");
}
lcd.print((remainingTime / 1000) % 60);
}
if (buttonState != digitalRead(buttonPin) && buttonState2 != digitalRead(buttonPin2)) {
// BTN1 & BTN2 pressed, back to menu
buttonState = !buttonState;
buttonState2 = !buttonState2;
if (buttonState == LOW && buttonState2 == LOW) {
isInMenu = true;
lcd.clear();
}
}
if (buttonState2 != digitalRead(buttonPin2) && currentPlayer==0) {
// BTN2, change players
buttonState2 = !buttonState2;
if (buttonState2 == LOW) {
currentPlayer = 1;
startTime = millis();
lcd.setCursor(0, 0);
lcd.print("Player 2 "); // Player 2 text
}
}
if (buttonState != digitalRead(buttonPin) && currentPlayer == 1) {
// BTN1, change players
buttonState = !buttonState;
if (buttonState == LOW) {
currentPlayer = 0;
startTime = millis();
lcd.setCursor(0, 0);
lcd.print("Player 1 "); // Player 1 text
}
}
}
}
Zdrojový kód: zdrojaksach.zip