• 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
Przyczyna złego działania kodu.
#1
Witam forumowiczów, męczę się z tym już 3 dzień i dalej nie wiem o co chodzi. Dodatkowo napiszę że kod wcześniej, (jakieś 5 dni temu) działał poprawnie. Jednak stale go modyfikuję i mogłem coś poknocić. Chodzi o to, że mam taką akcję wywoływaną przez bibliotekę Timers.h:
Kod:
void Otrzymany_Znak()  {
 if (Serial1.available())  {
   DaneBT=Serial1.read();
   if (DaneBT=='f')  {
     Garaz.updateInterval(0,100);
     Zmienna_Swiatlo=true;
     Serial1.println(Zmienna_Swiatlo);
     Funkcja_Swiatlo();  }
   if (DaneBT=='g')  {
     Brama.updateInterval(0,100);
     Garaz.updateInterval(0,100);  }  }  }

Następnie po wysłaniu znaku "f", aktywuje się ten kod:
Kod:
void Garaz_Otworz()  {
 Stan3=digitalRead(Kranc3);
 if (Stan3==HIGH)  {
   digitalWrite(Garaz_Kierunek, LOW);
   analogWrite(Garaz_Predkosc, 90);  }
 else  {
   Zmienna_Swiatlo=false;
   Serial1.println(Zmienna_Swiatlo);
   digitalWrite(Garaz_Kierunek, LOW);
   digitalWrite(Garaz_Predkosc, LOW);
   Garaz.updateInterval(0,0);
   Serial1.println("Garaż otwarty");  }  }

Oraz funkcja:
Kod:
void Funkcja_Swiatlo()  {  
  if(Zmienna_Swiatlo==true)  {    
   digitalWrite(Swiatlo, LOW);
   Czas_Start=millis();  
   Serial1.println(Czas_Start);
   Serial1.println("czas start");}
  else  {
   Czas_Teraz=millis();
   Serial1.println("czas teraz");
   Serial1.println(Czas_Teraz);
   if (Czas_Teraz - Czas_Start > Czas_Zwloka && digitalRead(Swiatlo)==LOW)  {
    digitalWrite(Swiatlo, HIGH);  }  }  }


Problem polega na tym, że nie wykonuje się procedura "else" w funkcji "Funkcja_Swiatlo()". Co może być przyczyną złego działania kodu ?
 
Odpowiedź
#2
(07-03-2017, 12:46)H4X napisał(a): Problem polega na tym, że nie wykonuje się procedura "else" w funkcji "Funkcja_Swiatlo()". Co może być przyczyną złego działania kodu ?
Przed wywołaniem funkcji "Funkcja_Swiatlo()" ustawiasz zmienną "Zmienna_Swiatlo=true" więc w funcji wykona się zawsze część zawarta po "if(Zmienna_Swiatlo==true) ".
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ź
#3
No tak ale później w kodzie ustawiam zmienną na "false", więc powinna wykonać się druga część warunku "if-else". Czyli typy zmiennych mam w złych miejscach ?
 
Odpowiedź
#4
Wydaje mi się że dobrze ustawiłem wartości zmiennej, gdyż na początku ustawiam ją na "true", wtedy zmienna światło zmienia stan na LOW, czyli wykonuje się "if" w części "Funkcja_Swiatlo", co aktywuje przekaźnik i zapisywany jest czas, następnie gdy krańcówka zmieni stan na niski, zmienna przybiera wartość "false" i powinna wykonać się druga część warunku "if-else" w funkcji światła. Dobrze rozumuję ?
 
Odpowiedź
#5
Wydaje mi się że Ci się źle wydaje!!!
Funkcja Funkcja_Swiatlo()  wywoływana jest tylko raz w funkcji Otrzymany_Znak() i tylko wartość zmiennej Zmienna_Swiatlo z tej funkcji się liczy!!!
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ź
#6
Teraz rozumiem, czy dobrze będzie wstawić tę funkcję do pętli Loop ?

Czy może lepiej będzie zrobić osobny timer aby wywoływać ją tylko wtedy kiedy jest potrzebna ?
 
Odpowiedź
#7
Problem rozwiązany, przez moje złe myślenie o tym jak działa program, funkcja Funkcja_Swiatlo wykonywała się raz, tak jak pisał "namok", po wstawieniu funkcji do pętli Loop, kod działa dokładnie tak jak powinien.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości