Skocz do zawartości

Reakcja na zmianę wartości zmiennej


cebulaczek

Pomocna odpowiedź

Cześć i przy okazji witam wszystkich po świętach, mam nadzieje, że były spokojne i ktoś jest już w stanie udzielić pomocy 😉

Szukałem w internecie ale mój angielski nie jest najwyższych lotów dlatego zwracam sie do was. W jaki sposób zmusić program do tego aby nie "odświeżał" wyświetlacza (lcd 2x16) bez przerwy w pętli a jedynie w momencie kiedy wartości zmiennych ulegają zmianie i tylko wtedy aktualizuje wyświetlane dane. Takie mryganie wyświetlacza jest niezwykle irytujące a używanie "delay" mija się chyba z celem.

Jeśli ktoś chciałby odnieść sie do mojego kodu to załączam chociaż moje pytanie jest bardziej ogólne, zeby wiedzieć na przyszłośc 🙂

#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
float test = 0;

void setup()
{
  dht.begin();
  lcd.init();
  lcd.backlight();
  lcd.print("LCD - OK");
  test = dht.readHumidity();
  if (test > 0) {
    lcd.setCursor(0, 1);
    lcd.print("DHT - OK");
  }
  else {
    lcd.setCursor(0, 1);
    lcd.print("DHT - ERROR");
    delay(60000);
  }
  delay(2000);
}
void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("TEMP: ");
  lcd.print(t);
  lcd.print("^C");
  lcd.setCursor(0, 1);
  lcd.print("Wilg: ");
  lcd.print(h);
  lcd.print("%");
  delay(1000);
}

 

Link do komentarza
Share on other sites

@cebulaczek, nie ma do tego gotowej funkcji. Musisz sam zadbać o to, aby wyświetlać pomiar tylko, gdy jest inny od poprzedniego. Musisz zapamiętywać poprzedni pomiar, porównywać go z aktualnym i od tego uzależniać działanie programu.

  • Pomogłeś! 1
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

W takim razie żeby było czytelnie, zamieszczam kod o którym mówi @Treker w poście powyżej: 

#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
float test = 0;

void setup()
{
  dht.begin();
  lcd.init();
  lcd.backlight();
  lcd.print("LCD - OK");
  test = dht.readHumidity();
  if (test > 0) {
    lcd.setCursor(0, 1);
    lcd.print("DHT - OK");
  }
  else {
    lcd.setCursor(0, 1);
    lcd.print("DHT - ERROR");
    delay(60000);
  }
  delay(2000);
  lcd.clear();
}
void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float hlcd = 0;
  float tlcd = 0;
  if (tlcd != t) {
    tlcd = t;
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(tlcd);
    lcd.print("^C");
  } if (hlcd != h) {
    hlcd = h;
    lcd.setCursor(0, 1);
    lcd.print("Wilg: ");
    lcd.print(hlcd);
    lcd.print("%");
  }
}

 

 

A teraz drugie pytanie dotyczące tylko częściowo reakcji wyświetlacza. ale nie chce zaśmiecać forum nowym tematem. Pierwsze podłączenie zegara DS3231 od razu z kodem do wyświetlania na lcd udał się w 99%, nie wiem tylko jak mam sobie poradzić z tym, że zegar wysyła czas w formacie gg:mm:ss, i wszystko jest dobrze dopóki sekundy są wartością dwucyfrową, jeśli minuta minie i sekundy idą od zera to wtedy jest format gg:mm:s - jest wartość na jedno miejsce i na drugim miejscu zostaje "9" z 59 sekundy poprzedniego pomiaru, i tak to sobie leci aż minie 10sekund i wraca wartość dwucyfrowa. Wygląda to tak:

16:45:55
16:45:56
16:45:57
16:45:58
16:45:59
16:46:19
16:46:29
16:46:39
16:46:49
16:46:59
16:46:69
16:46:79
16:46:89
16:46:99
16:46:10

Kod tego programu jest trochę chaotyczny bo miałem problem z bibliotekami i jest to tak modyfikacja znalezionego kodu. Mam nadzieje, że dosyć zrozumiale opisałem mój problem

#include <DS3231.h>
#include <Wire.h>
#include <OneWire.h>
#include <DHT.h>
#include <config.h>
#include <ds3231.h>
#include <LiquidCrystal_I2C.h>
RTCDateTime dt;
DS3231 clock;
LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  lcd.init(); 
  clock.begin();
  clock.setDateTime(__DATE__, __TIME__);

}

void loop() {
  dt = clock.getDateTime();
  lcd.backlight();
  lcd.print(dt.year); lcd.print("-");
  lcd.print(dt.month);  lcd.print("-");
  lcd.print(dt.day); lcd.print(" ");
  lcd.setCursor(0,1);
  lcd.print(dt.hour); lcd.print(":");
  lcd.print(dt.minute); lcd.print(":");
  lcd.print(dt.second); lcd.print("");
  lcd.setCursor(0,0);
  delay(1000);

}

 

Link do komentarza
Share on other sites

Bo nie używasz procedury lcd.clear() tylko nadpisujesz. W poprzednim kodzie z dht też. Więc kiedy któraś pozycja na lcd była zapisana w poprzedniej pętli, w w tej nie jest, to bez lcd.clear() na tej pozycji zostaje znak z poprzedniej pętli..

Można też zrobić czas jak napisał Belferek, ale np. przy kodzie z odczytem temperatury, bez lcd.clear() może być problem gdy wynik odczytu z dwucyfrowego zmieni się na jednocyfrowy...

Edytowano przez SOYER
Link do komentarza
Share on other sites

To jest generalny problem braku możliwości formatowania wyjścia z funkcji print. Ona generuje tyle znaków ile potrzeba do wydrukowania otrzymanej liczby więc 123 będzie wypisane za pomocą trzech cyfr, 57 za pomocą dwóch a 7 to tylko jedna cyfra i nic z tym nie zrobisz. Żeby wyprowadzany łańcuch był konkretnej długości musisz go przygotować wcześniej w postaci tekstowej (np. używając metod klasy String lub pisząc samodzielnie konwersję bin->ASCII), albo zrobić prosty myk który zadziała w tym jednym konkretnym przypadku minut i sekund. Pisząc:

if (dt.second < 10)
  lcd.print("0");
lcd.print(dt.second);

wypuszczasz dodatkowe zero przed liczbą sekund jeśli jest ona jednocyfrowa. Nieładne, ale zadziała.

W Twoim wypisywaniu widzę jeszcze jeden problem: dlaczego nie ma godziny 16:46:00 tylko od razu masz 16:46:1 (z poprzednią dziewiątką)?

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)

@marek1707 co do braku godziny 16:46:00 to dopiero po twoim poście to zauważyłem.

Ogólnie rzecz biorąc to poczekałem aż minie godzina 17 i zegar kompletnie trafił szlag, obecnie wskazuje godzinę 17:7:699, cały czas pracuje na moim pierwszym kodzie.

 

Nie mogłem skompilować programu ze względu na śmietnik w bibliotekach, musiałem trochę posprzątać oraz zrezygnowałem z polecenia "lcd.clear();" ze względu, że pojawia się irytujące miganie/odświeżanie całego ekranu a bez tej komendy całość działa na chwilę obecną zadowalająco. Przy okazji dostosowałem cały kod na nowy rok żeby nadal nie było problemu tym razem ze styczniową datą 🙂

Jeśli coś można poprawić (albo skrócić) to chętnie się nauczę 

#include <DS3231.h>
#include <Wire.h>
#include <config.h>
#include <LiquidCrystal_I2C.h>
RTCDateTime dt;
DS3231 clock;
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();
  clock.begin();
  clock.setDateTime(__DATE__, __TIME__);
  lcd.backlight();

}

void loop() {
  dt = clock.getDateTime();
  lcd.print(dt.year); lcd.print("-");
  if (dt.month < 10) {
    lcd.print("0");
  }
  lcd.print(dt.month);  lcd.print("-");
  if (dt.day < 10) {
    lcd.print("0");
  }
  lcd.print(dt.day); lcd.print(" ");
  lcd.setCursor(0, 1);
  if (dt.hour < 10) {
    lcd.print("0");
  }
  lcd.print(dt.hour); lcd.print(":");
  if (dt.minute < 10) {
    lcd.print("0");
  }
  lcd.print(dt.minute); lcd.print(":");
  if (dt.second < 10) {
    lcd.print("0");
  }
  lcd.print(dt.second);
  delay(1000);
  lcd.setCursor(0, 0);

}

 

PS. Do czego służy biblioteka <config.h>? Jak pisałem modyfikowałem gotowy kod i chcę to wszystko uprzątnąć i skomentować.

 

Edytowano przez cebulaczek
Link do komentarza
Share on other sites

Dokładnie to co napisałem, nadpisujesz, brak lcd.clear()... Tylko, że to też trzeba wstawić z głową, żeby nie migało... Możesz zajżeć do mojego kodu z wątku o czujniku jakości powietrza 

ostatnia strona. Też wyświetlam czas i datę, wprawdzie bez sekund...

  • Lubię! 1
Link do komentarza
Share on other sites

19 minut temu, cebulaczek napisał:

Do czego służy biblioteka <config.h>

A tego to Ci nikt nie powie - to jest plik nagłówkowy zawierający deklaracje klas, funkcji, zmiennych ...... Może to być wszystko! Zajrzyj do niego, a jak nie wiesz do czego służy to może jest zbędne - zakomentuj, skompiluj i zobacz co nie działa, gdzie pojawi się błąd, a dowiesz się do czego służy 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

 

23 godziny temu, cebulaczek napisał:

if (tlcd != t) {

tlcd = t; lcd.setCursor(0, 0);

lcd.print("Temp: "); /

lcd.print(tlcd);

lcd.print("^C");

}

 

To znając problem z wyświetlaniem czasu, popatrz na Twój kod powyżej i powiedz mi co się pojawi na wyświetlaczu kiedy temperatura zmieni się z dwucyfrowej na jednocyfrową...?

Link do komentarza
Share on other sites

22 godziny temu, SOYER napisał:

To znając problem z wyświetlaniem czasu, popatrz na Twój kod powyżej i powiedz mi co się pojawi na wyświetlaczu kiedy temperatura zmieni się z dwucyfrowej na jednocyfrową...?

wiem co masz na myśli ale wystawiając czujnik za okno wskazywał prawidłowo temperature i wilgotność,  dla pewności poskładam to jeszcze raz i sprawdzę bo może coś zmodyfikowałem później i nie sprawdziłem.

Co do tego z zegarem to wydaje mi się, że akurat w tym przypadku kiedy wyświetlacz musiałby się odświeżać co sekundę, lepiej zostawić nadpisywanie i upewnić się, że format zawsze będzie dwucyfrowy. Gdybym zrezygnował z sekund to lcd.clear() co minute byłby jak najbardziej pożądany i pewnie automatycznie bym to wstawił.

Link do komentarza
Share on other sites

Nie rozumiemy się, oczywiście że czujnik bedzie prawidlowo mierzył, a wyswietlacz wyświetlał prawidłową temperaturę, ale w jaki sposób? Albo inaczej mówiąc, znowu bedziesz miał "śmieci" na wyświetlaczu, potrafisz powiedzieć w którym miejscu? Można to wywnioskować z kodu, albo sprawdzić doświadczalnie, daj mu wyświetlać dwucyfrową, a potem wystaw za okno żeby zmierzył jednocyfrową, oczywiście nie wyłączając urządzenia w czasie przenoszenia na zewnątrz. Jak go wylaczysz to tak jakbys zrobił lcd.clear:-). Na razie nie wstawiaj lcd.clear() do kodu...;-)

Edytowano przez SOYER
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.