• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
bomba cs
#1
Witam
Jestem nowy na forum i w świecie ArduinoSmile
Proszę o pomocSmile 
Z racji tego, że bawię się w ASG, postanowiłem zrobić sobie prostą "bombę" na wzór tej z gier Counter Strike.
Doszedłem do momentu w którym zapala się dioda sygnalizująca uzbrojenie bomby. 
Problem polega na tym, że....dioda ma się świecić przez np 3minuty, po czym zapalić się kolejna sygnalizująca wybuch. 
Ale...w międzyczasie może zostać wciśnięty przycisk "rozbrajający", który po określonym czasie (ciągle wciśnięty) ma "rozbroić" bombę i zasygnalizować to wyłączeniem wszystkich diod. 
Proszę o pomocSmile i w miarę łopatologiczne przedstawienie tematu.
 
Odpowiedź
#2
Witamy i życzymy sukcesów w programowaniu Smile

Poprosimy o kod aby było o czym rozmawiać...

Pzdr.
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#3
Kod:
int guzik2 = 8;
int guzik1 = 9;
int redLed = 13;
int yellowLed = 11;
int greenLed = 10;
int blueLed = 12;
int guzik1State = 0;
int krokDiody = 0;
int Buzzer = 7;


void setup(){
  Serial.begin(9600);
  pinMode (guzik1, INPUT);
  pinMode (guzik2, INPUT);
  pinMode (redLed, OUTPUT);
  pinMode (greenLed, OUTPUT);
  pinMode (yellowLed, OUTPUT);
  pinMode (blueLed, OUTPUT);
  digitalWrite (guzik1, HIGH);
  digitalWrite (guzik2, HIGH);
  pinMode (Buzzer, OUTPUT);
  pinMode (Buzzer, LOW);
}

void loop(){

if (digitalRead(guzik1)== LOW and krokDiody==0 and digitalRead(yellowLed) == LOW) { //uzbrajanie pierwszej diody (żółta)
    digitalWrite(greenLed,HIGH);
    delay(5000);
    digitalWrite(greenLed, LOW);
    digitalWrite (yellowLed, HIGH);
    delay(500);
    krokDiody = +1;
    Serial.println(krokDiody);
}

if (digitalRead(guzik1) == LOW and krokDiody==1 and digitalRead(blueLed)==LOW) { //uzbrajanie drugiej diody (niebieska)
    krokDiody = krokDiody+1;
    digitalWrite (greenLed, HIGH);
    delay(5000);
    digitalWrite(greenLed, LOW);  
    tone (Buzzer,1000);
    digitalWrite (blueLed, HIGH);
    Serial.println(krokDiody);
  }
  if (digitalRead(guzik1) == LOW and krokDiody==2) { //uzbrajanie trzeciej diody (czerwona)
    digitalWrite (greenLed, HIGH);
    delay(5000);
    digitalWrite(greenLed, LOW);  
    digitalWrite (redLed, HIGH);
    krokDiody = krokDiody+1;
    Serial.println(krokDiody);
  }
  if (digitalRead(blueLed)== HIGH and digitalRead(yellowLed) == HIGH and digitalRead(guzik2)== LOW and krokDiody==2){ //rozbrajanie drugiej diody (niebieska)
    digitalWrite(greenLed, HIGH);
    delay(5000);
    digitalWrite(greenLed, LOW);
    digitalWrite(blueLed, LOW);
    krokDiody = krokDiody -1;
    Serial.println(krokDiody);
  }
  if (digitalRead(blueLed)== LOW and digitalRead(yellowLed) == HIGH and digitalRead(guzik2)== LOW and krokDiody==1){ //rozbrajanie pierwszej diody (żółta)
    digitalWrite(greenLed, HIGH);
    delay(5000);
    digitalWrite(greenLed, LOW);
    digitalWrite(yellowLed, LOW);
    krokDiody = krokDiody -1;
    Serial.println(krokDiody);
  }
}
 
Odpowiedź
#4
Rozpisz dokładnie algorytm bo jak na razie to program nie zgadza się z opisem z pierwszego postu(różne ilości przycisków i diod).
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
Opiszę, jak to w praktyce ma wyglądaćSmile na początku podałem tylko to czego mi brak.
Są dwie grupy. Jedna uzbraja bombę, po uzbrojeniu czeka na wybuch. Ponieważ uzbrajanie ma trwać jakiś czas zastosowałem kroki w postaci zapalania diod. Trzeba zapalić kolejne diody (przyciskiem nr1) aby uzbroić bombę (dioda czerwona), po określonym czasie (tutaj jeszcze dodam komunikat na wyświetlaczu, lub zapalę wszystkie diody) następuje wybuch.
Strona przeciwna ma nie dopuścić do wybuchu. Do momentu zapalenia diody czerwonej możliwe jest szybkie rozbrojenie bomby, poprzez skasowanie świecących diod (tak aby zajęło to chwilę), do tego celu używamy przycisku nr 2, który wyłącza po kolei diody.
Oczywiście w czasie trwania uzbrajania/rozbrajania dana osoba może zostać trafiona i "ginie" a procesy zostają zatrzymane do czasu aż ktoś następny będzie kontynuował czynności (czyli przyciskanie przełącznika nr 1 lub 2).
Czego mi brakuje:
Po zapaleniu diody czerwonej (redLed, uzbrajającej bombę) rusza czas, po upłynięciu którego następuje wybuch.
Uzbrojoną bombę można rozbroić poprzez wciśniećie (przez pewien czas) przycisku nr 2, który rozbroi bombę.
Czyli np.
redLed HIGH ---> czas do wybuchu startuje (np 5 minut),
kasowanie redLed guzikiem nr2,
czas potrzebny na rozbrojenie to 1,5 minuty,
czyli dopiero po 3,5 minuty nie można skasować redLed wciskając guzik2, ale kasujący nie wie w którym momencie wcisnął guzik.

Mam nadzieję, że zrozumiale to opisałem. Nie wiem jak opisać algorytm bardziej obrazowoSmile

Napiszę bardziej składnie może
int boom=0
If redLed High --> boomTime start
if boomTime >= 5000ms --> wybuchBomby and boom =1 (komunikat na wyświetlaczu i zakończenie programu)
if redLed HIGH and guzik2 LOW --> czasrozbrojenia start
if czasrozbrojenia = 1500ms and boom=0 --> rozbrojenieBomby ( komunikat na wyświetlaczu i zakończenie programu)
if czasrozbrojenia > 1500ms and boom=1 ---> wybuchBomby (j.w)
 
Odpowiedź
#6
Jasny i czytelny algorytm to połowa sukcesu.
Poczytaj "teorię": http://math.uni.lodz.pl/~atomasz/WDIad/r...%20rek.pdf, https://www.issi.uz.zgora.pl/pl/didactic...isd_01.pdf i zastosowanie w praktyce: http://ep.com.pl/files/1436.pdf a potem napisz/narysuj algorytm od początku z pominięciem niepotrzebnych komentarzy:
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#7
Sam algorytm nie będzie skomplikowany, choć, rzeczywiście, zgadzam się z namokiem.
Poczytaj też o funkcji millis();. Przy okazji, znajdziesz ją w przykładzie 'BlinkWithoutDelay' (w przykładach Arduino). Poprawnie wykorzystana, pozwoli Ci zastąpić funkcję delay();. Poza tym w jaki sposób chcesz zrealizować uzbrojenie/rozbrojenie bomby? Na razie wygląda to tak: ktoś wciska przycisk (guzik1), potem może go puścić. Następnie ktoś znów wciska przycisk, i znów może go puścić. Kilkukrotne wciśnięcie przycisku (w odstępach co najmniej, według kodu, pięciosekundowych) powoduje ostateczne uzbrojenie bomby. Czy tak to ma wyglądać?
Jeśli ma to wyglądać inaczej (np. przycisk trzeba trzymać przez cały czas uzbrajania lub rozbrajania bomby), spróbuj zrealizować układ diody sterowanej z Arduino za pomocą przycisku tak, że dioda świeci tylko wtedy, kiedy przycisk jest wciśnięty, NIE używając warunku if. Da się, wierz mi, a przy okazji może wskazać Ci być może rozwiązanie Twojego problemu.

Z osobistych uwag, jeśli mogę... popełniasz jeden z podstawowych błędów początkujących użytkowników Arduino: od razu rzucasz się na duży projekt. Pomysł jest ciekawy, ale... nie boisz się, że możesz utonąć?

Z innych jeszcze pomysłów... może warto rozważyć inny niż w cs sposób uzbrojenia/rozbrojenia bomby. Może być to kilkukrotne wciśnięcie przycisku tylko w momencie, kiedy dioda mruga (a ta mruga w losowych odstępach czasu, świecąc przez, powiedzmy, 0,3s). Rozgrywka stanie się trudniejsza z racji poświęcenia uwagi, co, w ogniu walki, może być wyzwaniem.
 
Odpowiedź
#8
Witam
Dzięki za propozycje i podpowiedzi.
Tak, wiem, że projekt nie jest najłatwiejszy, ale staram się go realizować małymi krokamiSmile nie odpuszczę, lubię się uczyć.
Dokładnie o to mi chodziło, że po zapaleniu ostatniej (czerwonej) diody, bomba jest uzbrojona. Pomysł z przyciskaniem w trakcie zapalania diody podoba mi się!! Dzięki za podpowiedź.
Problem w którym stanąłem to właśnie kwestia "dotarcia" programu do wybuchu. Czyli dokładnie problem z ewentualnym przerwaniem tego odliczania.
Czytam o funkcji millis(), podsuwa mi pewne rozwiązania. Jutro nad tym przysiądę i postaram się uprościć program i dołożyć coś więcej i zbliżyć się do końca.
Jedyne czego się obawiam to właśnie to jednoczesne odliczanie do wybuchu i odliczanie przy próbie rozbrojenia, ale chyba przykład z Blink Without Delay pomożeSmile


I właśnie wpadłem na pewien pomysł!!!Smile

P.S. Postaram się także ogarnąć bardziej graficzne rozwiązywanie algorytmów.
Pozdrawiam
I jeszcze raz dzięki za odpowiedzi. Udanego weekendu.
 
Odpowiedź
#9
Witam ponownieSmile
Panowie, postanowiłem pójść troszkę na skróty, ale i po części spróbować innego podejścia do "ogarnięcia tematu" nauki.
Nie wchodząc w szczegóły...
Znalazłem i pobrałem kod z linku poniżej
https://github.com/yinbot/Airsoft-BombPro

Połączyłem wszystkie elementy jak na grafice.
Z racji tego iż używam I2C do kodu dodałem właściwy adres dla wyświetlacza oraz dodałem

#define BACKLIGHT_PIN 3
LiquidCrystal_I2C lcd(0x3F,2, 1, 0, 4, 5, 6, 7);
w zakładce BombPro, na samym początku
oraz w void setup:
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);

Problem pojawia się w sytuacji kiedy wybieram w menu rozgrywki Search&Destroy oraz Sabotage opcję Sound ON. Wyświetlacz "świruje", nie pokazuje żadnych znaków, albo wychodzą jakieś krzaczki. Po wciśnięciu przycisku wyświetlacz działa ok.
Wrzucę na yt i podrzucę link.
Wyskakują mi także błędy tego typu:
C:\Users\Szymon\Desktop\bomba\Nowy folder\Airsoft-BombPro-master\code\BombPro_dobre\lang.ino:15:22: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char* CODE_ERROR = "Code Error!";


Prosze o pomocSmile

EDIT:
Mam błąd. Wyświetlacz podłączony bez I2C działa bezproblemowo, tak więc zostaje mi szukanie "błędu" w kodzie....jeśli mi się uda skumać gdzie nie haloSmile
 
Odpowiedź
#10
Witam ponownieSmile))
Znalazłem pewien błąd w kodzie który podałem wyżej.
W opcji SABOTAGE, która w skrócie polega na tym, że można wiele razy aktywować i dezaktywować bombę, w momencie kiedy (przykładowo!):
- czas do końca gry - 1minuta--->aktywacja bomby--->czas do wybuchu (2minuty)---> dezaktywujemy bombę---> po tym procesie wyświetla się jakiś nieskończony czas do zakończenia gry (tak jakby licznik przekręcił się od nowa).
Czyli jeśli uruchomiliśmy bombę i w momencie rozbrojenia czas do końca gry dobiegł do końca( =0 ) to zegar gry rusza od nowa.
Proszę o pomoc gdzie i jak można by to zablokować aby: jeśli czas do końca gry jest mniejszy od czasu rozbrojenia to bomba wybucha.
Problem chyba w tym, że czas do wybuchu nie powoduje wybuchu w momencie zakończenia czasu całej gry.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości