Skocz do zawartości

Przełączanie między "ekranami" LCD po wciśnięciu przycisku


mkowsky

Pomocna odpowiedź

Witam

Kod mojego programu uprościłem do niezbędnego minimum tak, żeby łatwiej było się przez niego przedzierać a zarazem móc w pełni przedstawić problem.

Działanie programu:

W momencie kiedy przycisk jest niewciśnięty (HIGH) wywoływa funkcję, czyWilgotno, która odczytuje pomiar z czujnika i wyświetla jego wynik na ekranie LCD.

W momencie wciśnięcia przycisku program ma za zadanie wyświetlić kolejno po sobie dwie funkcje ileStopni() oraz ileSwiatla() w konkretnych odstepach czasowych, których działanie jest analogiczne do funkcji czyWilgotno() a nastepnie powrocic do wyswietlania funkcji czyWilgotno()

I tutaj pojawia sie mój problem(y):

1.  Funkcja znajdująca się w pęlti while wykonuje się z tak dużą częstotliwością, że wyniki pomiaru wyświetlane na ekranie zmieniają się bardzo szybko - czy da się jakoś zmniejszyć częstotliwość ich wyświetlania bez użycia delay (w przypadku jej użycia program przestanie dobrze reagować na wciśnięcie przycisku).

2. Czy jest sens zastępować delay pomiędzy wywołaniami funkcji ileStopin oraz ileSwiatla? Chodzi mi o to żeby np funkcja ileStopni zostala wyswietlona na ekrnaie przez x sekund. Jeśli tak to w jaki sposób to najlepiej zrobić?

3. Jak wy Drodzy użytkownicy zabralibyście się do problemu przełączania pomiędzy ekranami po wcisnieciu przycisku, gdzie dane maja zostac wyswietlane przez okreslony czas? 

void setup() { 
Serial.begin(9600);
sensors.begin();
pinMode(3,INPUT_PULLUP);


}

void loop() {
  
    while ( digitalRead(3) == HIGH){
   czyWilgotno();
  delay(25);
    }
 
  lcd.clear();
  ileStopni();
  delay(3000);
  lcd.clear();
  ileSwiatla();
  delay(3000);
  lcd.clear();
 
}

Z góry dziękuje za odpowiedź i przepraszam jeśli coś jest mało czytelnie lub chaotycznie opisane.

Link do komentarza
Share on other sites

Gość es2
1 godzinę temu, mkowsky napisał:

Chodzi mi o to żeby np funkcja ileStopni zostala wyswietlona na ekrnaie przez x sekund. Jeśli tak to w jaki sposób to najlepiej zrobić?

Na początek możesz użyć millis().

1 godzinę temu, mkowsky napisał:

Jak wy Drodzy użytkownicy zabralibyście się do problemu przełączania pomiędzy ekranami po wcisnieciu przycisku, gdzie dane maja zostac wyswietlane przez okreslony czas? 

Użyłbym timerów. W prostych programach mam ich kilkanaście,w bardziej rozbudowanych 20..30, rekordowy program miał ponad 100 timerów.

Link do komentarza
Share on other sites

@mkowsky, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

 

Dnia 10.12.2018 o 23:39, mkowsky napisał:

Kod mojego programu uprościłem do niezbędnego minimum tak, żeby łatwiej było się przez niego przedzierać a zarazem móc w pełni przedstawić problem.

Tak jak koledzy już wyżej napisali - przyda się m.in. millis(). Opisz może jednak co dokładnie ma robić Twój program, bo czasami mogłeś uprościć zbyt dużo i przypadkiem udzielimy Ci złych wskazówek. Nie musisz wklejać całego programu, opisz słownie co on dokładnie ma robić.

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

Dnia 12.12.2018 o 00:14, Treker napisał:

Tak jak koledzy już wyżej napisali - przyda się m.in. millis(). Opisz może jednak co dokładnie ma robić Twój program, bo czasami mogłeś uprościć zbyt dużo i przypadkiem udzielimy Ci złych wskazówek. Nie musisz wklejać całego programu, opisz słownie co on dokładnie ma robić.

Zaczynając od czegoś prostego -> chciałbym aby mój program wyświetlał na wyświetlaczu pomiar z trzech różnych czujników w odstępie 3 sekund w taki sposób:

1 pomiar ( widoczny przez 3 sekundy)

czyszczenie ekranu

2 pomiar (widoczny przez 3 sekundy)

czyszczenie ekranu

3 pomiar (widoczny przez 3 sekundy)

czyszczenie ekranu

 

W przypadku wyświetlania tylko jednego pomiaru wszystko jest w porządku, niestety przy próbie dodania dwóch kolejnych wszystko się sypie. Rozumiem, że problem pojawia się gdzieś przy okazji warunków logicznych. Czy ktoś może naprowadzić mnie na to jak to zgrabnie zapisać, tak aby działało według tego co napisałem?

unsigned long aktualnyCzas = 0;

unsigned long zapamietanyCzas1 = 0;
unsigned long zapamietanyCzas2 = 0;
unsigned long zapamietanyCzas3 = 0;

void setup() { 
Serial.begin(9600);
sensors.begin();
lcd.begin(16,2);
lcd.backlight();
}

void loop() {
   aktualnyCzas = millis();
  
        if (aktualnyCzas - zapamietanyCzas1 >= 3000UL) {
    zapamietanyCzas1 = aktualnyCzas;
    lcd.clear();
    czyWilgotno();
    }
  
   if (aktualnyCzas - zapamietanyCzas2 >= 6000UL) {
    zapamietanyCzas2 = aktualnyCzas;
    lcd.clear();
    ileStopni();
  }
   if (aktualnyCzas - zapamietanyCzas3 >= 9000UL) {
    zapamietanyCzas3 = aktualnyCzas;
    lcd.clear();
    ileSwiatla();
  }
  
  
}

 

Link do komentarza
Share on other sites

mkowsky, usiądź na spokojnie i zastanów sie jak działa Twój program. Popatrz, na początku procek czeka trzy sekundy

1 godzinę temu, mkowsky napisał:

if (aktualnyCzas - zapamietanyCzas1 >= 3000UL) {

jak spełni sie ten warunek to co robisz? kasujesz odliczanie:

 

1 godzinę temu, mkowsky napisał:

zapamietanyCzas1 = aktualnyCzas;

czyścisz ekran(nie miga ci napis przy każdym obiegu pętli?) i uruchamiasz procedurę czywilgotno()...

rozumiemy się... minęły 3 sekundy, program wykonal warunek z pierwszego if-a i przelatuje dalej pętla za pętlą,  przez te 3 sekundy wyświetla ci się tam coś z tej procedury czywilgotno(), i nagle mija 6 sekund od uruchomienia programu i wypadałoby żeby program przeszedl do drugiego if-a. Tak?

1 godzinę temu, mkowsky napisał:

if (aktualnyCzas - zapamietanyCzas2 >= 6000UL) { zapamietanyCzas2 = aktualnyCzas; lcd.clear(); ileStopni();

no bo przecież mineło 6 sekund...

ale przypomnij sobie co zrobił program 3 sekundy temu:

1 godzinę temu, mkowsky napisał:

zapamietanyCzas1 = aktualnyCzas;

wyzerował pierwszy licznik,

a skoro tak to znowu spełnia mu się warunek z pierwszego if-a:

1 godzinę temu, mkowsky napisał:

if (aktualnyCzas - zapamietanyCzas1 >= 3000UL)

tak?

Mnie jako początkującemu też było trudno ogarnąć fakt, że program leci w kółko(o ile go gdzieś nie zatrzymasz jakąś funkcją), leci z zawrotną prędkością, nam się wydaje, że coś zrobił, teraz będzie robił następną rzecz wpisaną w program. Owszem, ale on to robi setki (tysiące?) razy na sekundę...

Z innej beczki, poszukaj coś o instrukcji switch case, maszyna stanów itp... Myslę, że sporo by Ci ułatwiła, ja wszystkie operacje na LCD robię na switch-u...

Tutaj też poczytaj cały wątek, może coś wyniesiesz(nawet ja dalem radę;-)), jak teraz to czytam to dziękuję Bogu za cierpliwość Elvisa:-)):

 

 

 

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

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.