Skocz do zawartości

Problem ze zbyt częstym wykonywaniem warunku


Pomocna odpowiedź

Napisano

witam problem może wydawać się banalnie prosty ale nie umiem sobie z nim poradzić  chodzi o to że pisze program i nie używam funkcji delay ale bibloteki timers mój problem polega na tym że gdy czujnik jest w stanie wysokim to na wyświetlaczu pojawia się napis "pojemność zbiornika 70%" i generuje mi sygnał na buzzer wszystko niby działa tylko nie wiem jak zrobić aby się to nie powtarzało chce aby ten warunek powtórzył się tylko  raz i czekał aż kolejny warunek się spełni bo w ten sposób jak ustawie na 7 sekund to ten warunek logicznie będzie powtarzał się co 7 sekund a ja chce żeby ten warunek spełnił się raz i czekał na spełnienie kolejnego warunku 

cz2 = digitalRead(23);
cz3 = digitalRead(24);
cz4 = digitalRead(25);
cz5 = digitalRead(26) ;
cz6 = digitalRead(27);

if (cz1==LOW && cz2==LOW && cz3==LOW && cz4==LOW && cz5 ==LOW&& cz6 == LOW && czekaj.available() ) {
  lcd.init();
lcd.setCursor(0, 0);
lcd.print("pojemnosc ");
lcd.setCursor(0, 1);
  lcd.print("zbiornika 70%");
  tone(A5, 7000,500);
czekaj.time(7000);
czekaj.restart();
}
else
{
if (cz2==LOW && cz3==LOW && cz4==LOW && cz5==LOW&& cz6 == LOW && czekaj.available() ) {
 
lcd.setCursor(0, 0);
lcd.print("pojemnosc ");
  lcd.setCursor(0, 1);
lcd.print("zbiornika  50%");

  czekaj.restart();
}
else
{
  if (cz6 ==LOW && cz5==LOW && cz4==LOW && cz3 == LOW && czekaj.available()){
   
  lcd.setCursor(0, 0);
  lcd.print("pojemnosc ");
  lcd.setCursor(0, 1);
  lcd.print("zbiornika  40%");
     czekaj.restart();

}
else
{
  if (cz6==LOW && cz5==LOW && cz4 == LOW && czekaj.available()){
   
    lcd.setCursor(0, 0);
  lcd.print("pojemnosc ");
  lcd.setCursor(0, 1);
  lcd.print("zbiornika 30%");
   czekaj.restart();

}
else
{
  if (cz6 ==LOW && cz5 == LOW && czekaj.available()){
   
    lcd.setCursor(0, 0);
  lcd.print("pojemnosc ");
  lcd.setCursor(0, 1);
  lcd.print("zbiornika  20%");
   czekaj.restart();
 
  }

else

{
  if (cz6 == LOW && czekaj.available() ) {
   
  lcd.setCursor(0, 0);
  lcd.print("pojemnosc ");
  lcd.setCursor(0, 1);
  lcd.print("zbiornika  10%");
    czekaj.restart();
 
    }


 
}
}
}
}
}
lcd.init();

if(digitalRead(31)  == LOW &&  czas.available()) {
 
     lcd.setCursor(0, 0);
lcd.print("redlica");
  lcd.setCursor(0, 1);
lcd.print("zapchana   nr1");
   tone(A5, 7000,500);
   
}

if  (digitalRead(31) == HIGH){
czas.restart();
czas.time(5000);


}

}   

 

@Pitraszek1 witam na forum 🙂

Chętnie pomożemy, ale naprawdę ciężko zrozumieć Twoje pytanie. To nie jest złośliwość z mojej strony, jakakolwiek interpunkcja byłaby tutaj pomocna. Napisałeś wszystko jednym ciągiem bez żadnej kropki, bez żadnego przecinka... Mimo szczerych chęci nie jestem w stanie rozumieć Twojej wiadomości. Mógłbyś postarać się opisać ten problem raz jeszcze, ale w trochę bardziej "spokojny" sposób?

Na ten moment domyślam się tylko, że Twój problem możesz rozwiązać za pomocą dodatkowej zmiennej, która będzie pamiętała czy buzzer był już włączony podczas danego alarmu czy nie. Jednak nie mam pewności, że poprawnie zrozumiałem Twój post.

PS Zadbaj też o formatowanie programu. Wykorzystaj przynajmniej automatyczną opcję w (Narzędzia > Automatyczne formatowanie), a będzie już znacznie lepiej 😉

Chodzi mi o to że jeżeli zostanie spełniony warunek

if (cz1==LOW && cz2==LOW && cz3==LOW && cz4==LOW && cz5 ==LOW&& cz6 == LOW && czekaj.available() ) {
  lcd.init();
lcd.setCursor(0, 0);
lcd.print("pojemnosc ");
lcd.setCursor(0, 1);
  lcd.print("zbiornika 70%");
  tone(A5, 7000,500);
czekaj.time(7000);
czekaj.restart();
}

to chce aby ten warunek się nie powtarzał bo w tym kodzie warunek powtarza się co 7 sekund i buzzer za każdym razem piszczy, a ja chce aby warunek wykonał się raz i czekał aż wykona się drugi warunek 

else
{
if (cz2==LOW && cz3==LOW && cz4==LOW && cz5==LOW&& cz6 == LOW && czekaj.available() ) {
 
lcd.setCursor(0, 0);
lcd.print("pojemnosc ");
  lcd.setCursor(0, 1);
lcd.print("zbiornika  50%");

  czekaj.restart();

i tak za każdym razem, nie wiem jak  to zrobić mam nadzieje że lepiej to teraz wytłumaczyłem 

Ja już wypadłem z obiegu, ale

if (cz1==LOW && cz2==LOW && cz3==LOW && cz4==LOW && cz5 ==LOW&& cz6 == LOW && czekaj.available() )

oraz 

if (cz2==LOW && cz3==LOW && cz4==LOW && cz5==LOW&& cz6 == LOW && czekaj.available() )

mają szansę wykonywać się po sobie (pomijam to, że drugi przypadek jest w "else").

Jeżeli odczytujesz stany na poszczególnych pinach to w drugim przypadku spodziewasz się, że na cz1 będzie HIGH i to też powinieneś uwzględnić:

if (cz1==HIGH && cz2==LOW && cz3==LOW && cz4==LOW && cz5==LOW&& cz6 == LOW && czekaj.available() )

Dobrym pomysłem byłoby sprawdzenie stanu na pinach jeden raz na początku pętli programu (może w oddzielnej funkcji) i na tej podstawie określenie poziomu w zbiorniku (albo pojemności, jeśli z jakiegoś powodu ona się zmienia).

Żeby za każdym razem "IF" nie wykonywał się przy przebiegu przez pętlę musisz sprawdzać, czy aktualny poziom różni się od poprzedniego.

@Pitraszek1 teraz jest już jasne 🙂

Dodaj w takim razie dodatkową zmienną, która będzie pamiętała czy alarm (buzzer) był już włączony. Jeśli warunek jest spełniony, a alarm nie był włączony to znaczy, że powinien się włączyć . Jeśli warunek jest spełniony, ale alarm był już włączony to nic nie robimy. Co w tym stylu (pseudokod):

if (warunek == true) {
	if (alarm == 0) {
		BUZZER_ON;
		alarm = 1;
	}
} else {
	alarm = 0;
}

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