Arduino Polska Forum

Pełna wersja: Przyczyna złego działania kodu.
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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 ?
(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) ".
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 ?
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ę ?
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!!!
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 ?
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.