Skocz do zawartości

Pomocna odpowiedź

Napisano

Dzień dobry, od niedawna próbuję stworzyć grę, chodzi o to że diody migają na lewo i prawo, a gracz ma wcisnąć przycisk aby miganie się zatrzymało. W zależności od tego na jakiej diodzie LED gracz zatrzyma, dostanie punkty (wyświetlane na LCD). I teraz chodzi o to że muszę w jednym kodzie sprawdzać czy przycisk nie został naciśnięty, i kontrolować miganie diod LED. Gdyby była opcja dwóch funkcji void loop to problem by był rozwiązany.

Więc, czy można w jednym kodzie mieć dwie funkcje loop? Jeśli tak to proszę powiedzieć jak tego użyć, a jeśli nie to jak wykorzystać jedną funkcję loop do tego co chcę zrobić.

Z góry dziękuję! 🙂

@BeeKeyPro nie potrzebujesz dwóch pętli (nie da się zrobić dwóch pętli loop)(od tego maszpetle for/while) zrób tak że migasz tymi lekami i za każda zmianą zapalonej LED ustalasz flagę (zmienną) w której zapamiętujesz która LED się świeci...po wciśnięciu guzika sprawdzasz która LED się aktualnie paliła i odpowiednio zapisujesz lub nie punkty jeśli trafiłeś...

  • Lubię! 1

@farmaceuta Tak, ale pomiędzy zmienieniem święcącej diody musi być delay(150); inaczej by diody migały za szybko, a podczas delay nie mogę sprawdzić czy przycisk został naciśnięty.

1 minutę temu, BeeKeyPro napisał:

@farmaceuta  delay(150); inaczej by diody migały za szybko

Pora pomyśleć o millis()...jest naprawdę prosty i co najważniejsze nie blokuje kodu...

if (millis() - last_time > 150UL) {
  // zmien stan diody
  // zapisz stan diody do flagi
  last_time = millis();
 }

 

  • Lubię! 1
19 minut temu, farmaceuta napisał:

Pora pomyśleć o millis()

Dokładnie, bez tego ciężko byłoby zbudować taki program. @BeeKeyPro potrenuj trochę te metody 

  • Lubię! 1

@_LM_ @farmaceuta Kurcza nie za bardzo rozumiem tego millis. Mogli byście pokazać mi jak byście zamienili delay na millis? (Jak coś to kod jest stary a gdzieś wyczytałem że powinno się zrobić void loop1() xd)

#include <Adafruit_LiquidCrystal.h>
Adafruit_LiquidCrystal lcd_1(0);

int time = 100;
int gameScore = 0;
int buttonState2 = 0;
int pointControl = 0;

void setup()
{
  lcd_1.begin(16, 2);
  lcd_1.setCursor(0, 0);
  lcd_1.print(0);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop(){
  while (buttonState2 == LOW) {
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    pointControl = 0;
    delay(time);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    pointControl = 1;
    delay(time);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    pointControl = 2;
    delay(time);
    digitalWrite(7, LOW);
    digitalWrite(6, HIGH);
    pointControl = 1;
    delay(time);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    pointControl = 0;
    delay(time);
  }
  if(pointControl = 0){
    gameScore = 0;
  }
  if(pointControl = 1){
    gameScore = gameScore + 1;
  }
  if(pointControl = 2){
    gameScore = gameScore + 5;
  }
  lcd_1.print(gameScore);
  delay(1000);
}

void loop1(){
  buttonState2 = digitalRead(2);
}

 

@BeeKeyPro generalnie millis w użyciu jest trudniejszy od delay...wymaga trochę więcej myślenia podczas konstruowania odpowiedniej logiki, ja gdybym to pisał to zaczął bym od pisania kodu na nowo bo ten ciężko będzie przerobić...prościej napisać od nowa 

No, niema wyjścia musisz przerobić kurs od podstaw bo już po tym kawałku widać że tego jeszcze nie zrobiłeś
 

  if(pointControl = 2){
    gameScore = gameScore + 5;
  }

Powinno być
 

  if(pointControl == 2){ // <---- podwójne " == "
    gameScore = gameScore + 5;
  }

 Także do dzieła

@_LM_ o to przepraszam, akurat nie było to przez niewiedze tylko przez zapomnienie. Wiem że = to jest przypisanie liczby do np zmiennej == porównanie || to takie coś lub coś && coś i coś

20 godzin temu, farmaceuta napisał:

Pora pomyśleć o millis()...jest naprawdę prosty i co najważniejsze nie blokuje kodu...

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);

int time = 100;
int gameScore = 0;
int buttonState2 = 0;
int pointControl = 0;
unsigned long aktualnyCzas=0, staryCzas=0;
short przerwa=150UL;

void setup()
{
  lcd.begin(16, 2);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(0);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop(){
  aktualnyCzas = millis();
  while (buttonState2 == LOW) {
    aktualnyCzas = millis();
    if(( aktualnyCzas - staryCzas ) >= przerwa){
      digitalWrite(6, LOW);
      digitalWrite(5, HIGH);
      pointControl = 0;
      buttonState2 = digitalRead(2);

      staryCzas = aktualnyCzas;
    }
    
    if((aktualnyCzas - staryCzas) >= przerwa){
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      pointControl = 1;
      buttonState2 = digitalRead(2);

      staryCzas = aktualnyCzas;
    }
    
    if((aktualnyCzas - staryCzas) >= przerwa){
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
      pointControl = 2;
      buttonState2 = digitalRead(2);

      staryCzas = aktualnyCzas;
    }
    
    if((aktualnyCzas - staryCzas) >= przerwa){
      digitalWrite(7, LOW);
      digitalWrite(6, HIGH);
      pointControl = 1;
      buttonState2 = digitalRead(2);

      staryCzas = aktualnyCzas;
    }
    
    if((aktualnyCzas - staryCzas) >= przerwa){
      digitalWrite(6, LOW);
      digitalWrite(5, HIGH);
      pointControl = 0;
      buttonState2 = digitalRead(2);

      staryCzas = aktualnyCzas;
    }
  }
  if(pointControl == 0){
    gameScore = 0;
  }
  if(pointControl == 1){
    gameScore = gameScore + 1;
  }
  if(pointControl == 2){
    gameScore = gameScore + 5;
  }
  lcd.setCursor(0, 0);
  lcd.print(gameScore);
  delay(1000);
}

Zrobiłem kod i nie działa, co zrobiłem źle?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...