Skocz do zawartości

Dwie funkcje void loop() w jednym kodzie.


BeeKeyPro

Pomocna odpowiedź

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ę! 🙂

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

@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.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

@_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);
}

 

Link do komentarza
Share on other sites

@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 

Link do komentarza
Share on other sites

Zacznij od prostego mrygania ledem, obsługi przycisku i tak dalej aż załapiesz o co w tym chodzi 

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

@_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ś

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.