karpa Napisano Wrzesień 22, 2023 Udostępnij Napisano Wrzesień 22, 2023 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 More sharing options...
ethanak Wrzesień 22, 2023 Udostępnij Wrzesień 22, 2023 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 More sharing options...
karpa Wrzesień 22, 2023 Autor tematu Udostępnij Wrzesień 22, 2023 Racja .... po zmianie pętli chodzi Pozdrawiam Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »