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

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.