Skocz do zawartości

Problem ze zbyt częstym wykonywaniem warunku


Pitraszek1

Pomocna odpowiedź

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);


}

}   

 

Link do komentarza
Share on other sites

@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 😉

Link do komentarza
Share on other sites

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 

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@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;
}
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.