Skocz do zawartości

Sprawdzenie programu - w pętli nie sprawdza jednego z warunków


karpa

Pomocna odpowiedź

Witam 

Napisałem prosty program do obsługi podajnika złożonego z dwóch silników - od tygodnia podajnik jest używany, ale pojawił się pomysł dołożenia zabezpieczenia przenośników przed, "wyjechaniem" poza wyłączniki krańcowe w przypadku awarii, lub przed zbyt długą pracą w przypadku poluzowania paska napędu etc.

Problem jest taki, że w funkcji if program nie wykonuje operacji .... w czym tkwi błąd ?

Warunek wstawiony jako pierwszy pod pętlą while. linia 57

 

unsigned long aktualnyCzas = 0;
unsigned long startCzas = 0;
unsigned long opoznienie = 2000UL; // opoznienie silnika drugiego
unsigned long czasPracy = 5000UL; // maksymalny czas pracy silnika
// piny przyciskow,
#define START A0
#define STOP A1
// piny krancowek W1, W2 do silnika M1, W3, W4 do silnika M2
#define W1 A2
#define W2 A3
#define W3 A4
#define W4 A5
//piny przekaznikow-silnikow P - jada przód T - jazda tyl
#define M1P 8
#define M1T 9
#define M2P 10
#define M2T 11
#define ALARM 12
// zapamietanie kierunku
bool kierunekPrzod = false, kierunekTyl = false;
int liczbaCykli = 0;

void setup() {
  pinMode(START, INPUT_PULLUP);
  pinMode(STOP, INPUT_PULLUP);
  pinMode(W1, INPUT_PULLUP);
  pinMode(W2, INPUT_PULLUP);
  pinMode(W3, INPUT_PULLUP);
  pinMode(W4, INPUT_PULLUP);
  pinMode(M1T, OUTPUT);
  pinMode(M1P, OUTPUT);
  pinMode(M2T, OUTPUT);
  pinMode(M2P, OUTPUT);
  pinMode(ALARM, OUTPUT);
  digitalWrite(M1P, LOW);
  digitalWrite(M1T, LOW);
  digitalWrite(M2P, LOW);
  digitalWrite(M2T, LOW);
  digitalWrite(ALARM, LOW);
}

void loop() {

  aktualnyCzas = millis();
  if (digitalRead(START)==LOW and digitalRead(W1)==LOW and digitalRead(W3)==LOW) // START stołów do przodu
{
  digitalWrite(M1P, HIGH); // start silnika pierwszego
  startCzas = aktualnyCzas;
 }
  if (digitalRead(M1P)==HIGH and aktualnyCzas - startCzas > opoznienie) { // START drugiego silnika po opoznieniu
  digitalWrite(M2P, HIGH);
  kierunekPrzod = true;
}

while (kierunekPrzod==true)
{ 
if (aktualnyCzas-startCzas >= czasPracy) digitalWrite(ALARM, HIGH); //WŁĄCZ ALARM, ZATRZYMAJ SILNIK OPUŚĆ PĘTLĘ itd ...... ale nie działa
if (digitalRead(STOP)==LOW) // Nacisniecie stop przy jezdzie do przodu zatrzymanie i silniki krancowki otwarte nacisniecie start powoduje kontynuację
  {
    digitalWrite(M1P, LOW);
    digitalWrite(M2P, LOW);
    delay(50);
}
if (digitalRead(START)==LOW)
  {
    digitalWrite(M1P, HIGH);
    digitalWrite(M2P, HIGH);
    delay(50);
}

if (digitalRead(W4)==LOW) digitalWrite(M2P, LOW);   // po otwarciu krancowki zatrzymaj drugi silnik
if (digitalRead(W2)==LOW) digitalWrite(M1P, LOW);  // po otwarciu krancowki zatrzymaj pierwszy silnik
if (digitalRead(W2)==LOW and (digitalRead(W4)==LOW)) // kiedy obydwie krancówki dojechały do pozycji koncowej
 {
   digitalWrite(M1P, LOW);
   digitalWrite(M2P, LOW);
   kierunekPrzod = false; 
   kierunekTyl = true;
 }
}

if (kierunekTyl==true)
{ 

  delay(1000); // poczekaj z przelaczeniem stycznikow
  digitalWrite(M1T, HIGH);
  digitalWrite(M2T, HIGH);
  }
while (kierunekTyl==true)
{
if (digitalRead(STOP)==LOW)
  {
    digitalWrite(M1T, LOW);
    digitalWrite(M2T, LOW);
    delay(50);
}
if (digitalRead(START)==LOW)
  {
    digitalWrite(M1T, HIGH);
    digitalWrite(M2T, HIGH);
    delay(50);
}
if (digitalRead(W1)==LOW) digitalWrite(M1T, LOW);  // po otwarciu krancowki zatrzymaj pierwszy silnik
if (digitalRead(W3)==LOW) digitalWrite(M2T, LOW);   // po otwarciu krancowki zatrzymaj drugi silnik
if (digitalRead(W1)==LOW and digitalRead(W3)==LOW) // kiedy obywdwie krancówki dojechały do pozycji koncowej
    kierunekTyl = false;
}
}

 

Link do komentarza
Share on other sites

Bo tak się programów na mikrokontrolery nie pisze.

Zapomnij o delay. Zapomnij o while (bo jedną pętlę w programie masz, przecież loop chodzi w pętli). Sprawdź co to jest maszyna stanów (typowe zastosowanie do tego celu).

Albo męcz sie ze sprawdzaniem wszystkiego w piętnastu miejscach i zastanawianiem się, dlaczego nie działa w szesnastym.

Twój wybór.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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