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

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