Skocz do zawartości

Reakcja na zmianę wartości zmiennej


cebulaczek

Pomocna odpowiedź

(edytowany)

2j3priw.jpg

300ry4h.jpg

 

Dopiero na zdjęciu zobaczyłem, że po profesjonalnym pomiarze laboratoryjnym w lodówce obok kiełbasy (na zewnątrz niekorzystne warunki atmosferyczne) wyszedł krzaczek w postaci podwójnej litery "C". Dlatego wcześniej tego błędu też nie widziałem

Edytowano przez cebulaczek
Link do komentarza
Share on other sites

bingo!! i co znowu będziesz coś wstawiał? spację? gdzie? za każdym razem będziesz rozważal setki przypadków kiedy coś się będzie przesuwać na LCD? czy może jednak lcd.clear(), w odpowiednim miejscu żeby nie migało.... Pomyśl gdzie i kiedy wstawić clear-a? Kiedy coś się zmienia, a kiedy nie??

1 godzinę temu, SOYER napisał:

bez lcd.clear() może być problem gdy wynik odczytu z dwucyfrowego zmieni się na jednocyfrowy...

a nie mówiłem....

Wiesz dlaczego tak się dzieje?

Edytowano przez SOYER
Link do komentarza
Share on other sites

(edytowany)

Już zaczynam chyba łapać tok myślenia który próbujesz mi przedstawić. 

Zanim polecę znowu do lodówki to po prostu zapytam bo domownicy dziwnie się patrzą 😉

przed rozpoczęciem wyświetlania czegokolwiek na ekranie ale już po zebraniu danych dodam dokładnie to:

void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float hlcd = 0;
  float tlcd = 0;
  if (t<10) {				\\ tutaj dołożyłem 
    lcd.clear();
  }
  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("%");
  }
}

Dorzucę jeszcze opóźnienie w zbieraniu danych jeśli temperatura spada poniżej 10stopni żeby uniknąć "migania" 

Dla wilgotności nie dodaje nic bo raczej wątpie żeby taka susza nastąpiła 😉

Edytowano przez cebulaczek
Link do komentarza
Share on other sites

źle, po pierwsze, zawsze kiedy temperatura będzie jednocyfrowa, lcd będzie migał, po drugie, wyobraź sobie dużo bardziej skomplikowany program np.: 

będziesz siedział dwa tygodnie i ciągle gapił sie na wyswietlacz żeby wyłapywać rózne śmieci?

Kiedy trzeba oczyścić wyświetlacz, a kiedy nie ma takiej potrzeby?

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

Ja bym się tutaj nie upierał akurat, że czyszczenie całego wyświetlacza jest potrzebne. Jeśli to ma nadpisywać tylko jedną liczbę, w konkretnym miejscu na wyświetlaczu to można też po prostu zrobić coś w stylu:

lcd.setCursor(0, 0);
lcd.print("    ");
lcd.setCursor(0, 0);
lcd.print(temperatura);

Czyli ustawiamy kursor w miejscu, gdzie zaczyna się liczba, wypisujemy tam 4 spacje, wracamy kursorem i wyświetlamy pomiar. Nie jest to najbardziej eleganckie rozwiązanie od strony programistycznej, ale działa i nie trzeba ciągle kasować zawartości całego wyświetlacza. Dzięki temu powinno się dać zwiększyć częstotliwość aktualizacji informacji na ekranie bez widocznego migania.

Link do komentarza
Share on other sites

Kod kolegi cebulaczka:

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 nie prościej i łatwiej tak:

 

if (tlcd != t) { 

 tlcd = t;

 lcd.clear();

}

lcd.setCursor(0, 0); 

lcd.print("Temp: ");

lcd.print(tlcd); lcd.print("^C");

if (hlcd != h) { 

 hlcd = h; 

 lcd.clear();

}

lcd.setCursor(0, 1); 

lcd.print("Wilg: ");

lcd.print(hlcd); 

lcd.print("%"); 

Rozwiązuje wiele problemów z góry... 

Jak szybko rosnie lub maleje temperatura lub wilgotność: jedno mignięcie na kilka minut, nawet nie zauważysz, no chyba że będzie do dwoch miejsc po przecinku...;-)

Edytowano przez SOYER
Link do komentarza
Share on other sites

@SOYER właśnie w tym problem, że mój program w tym momencie uwzględnia dokładność pomiaru do dwóch miejsc po przecinku dlatego twój sposób nie do końca rozwiązuje tą kwestię. Co prawda nie widzę zastosowania tak dokładnego pomiaru i jeżeli już zbuduje  coś "stałego" to na pewno będzie zaokrąglane do pełnej liczby i wtedy twoja propozycja jest jak najbardziej użyteczna i czytelna.

Link do komentarza
Share on other sites

Zawsze do wyświetlania dwucyfrowej wartości można zastosować coś takiego:

lcd.print(tlcd/10);
lcd.print(tlcd % 10);

chociaż ja z reguły nie bawię się w wynajdowanie koła kolejny raz i używam starego dobrego sprintfa:

char buf[17]; // żeby się zmieścił cały rządek na wyświetlaczu
...
sprintf(buf,"Temp: %+3d \001C",tlcd);
lcd.print(buf);

deklarując sobie przy okazji znak stopnia (bo jakby nie patrzeć ° i ˇ to nie to samo)

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

35 minut temu, ethanak napisał:

Zawsze do wyświetlania dwucyfrowej wartości można zastosować coś takiego:


lcd.print(tlcd/10);
lcd.print(tlcd % 10);

chociaż ja z reguły nie bawię się w wynajdowanie koła kolejny raz i używam starego dobrego sprintfa:


char buf[17]; // żeby się zmieścił cały rządek na wyświetlaczu
...
sprintf(buf,"Temp: %+3d \001C",tlcd);
lcd.print(buf);

deklarując sobie przy okazji znak stopnia (bo jakby nie patrzeć ° i ˇ to nie to samo)

Z obu kodów to rozumiem chyba tylko:

lcd.print(tlcd/10);

dzielimy tlcd przez 10

i to:

char buf[17];

deklarujemy tablicę z 17 znakami...

reszta jest milczeniem.

Link do komentarza
Share on other sites

Hm... wspominałem Ci kiedyś że warto nauczyć się podstawowych operatorów? 😉

a % b to modulo (reszta z dzielenia a/b)

Co do sprintf - wrzuć w googla "man sprintf", będziesz miał lekturę na najbliższy wieczór. Tylko koniecznie trzeba pamiętać, że w Arduino AVR rodzina funkcji prontf nie obsługuje wartości zmiennoprzecinkowych!

Tak przy okazji - lcd.print(buf) to pewnie rozumiesz, nie przesadzaj.

Link do komentarza
Share on other sites

operatory to w miarę znam, wiem, że % to reszta z dzielenia, ale załózmy że tlcd to 22, więc myślałem, że wypisuje 2,2  a potem resztę z dzielenia czyli 2. Nie pasowało mi to...

Jednak nigdy nie używałem jeszcze takich działań i jak mniemam pierwsze działanie (dzielenie) da nam wynik w całych liczbach tak? Czyli 2 i reszta z dzielenia 2, czyli wyświetli 22, wtedy pasuje:-)

Teraz:

sprintf(buf,"Temp: %+3d \001C",tlcd);

z tego co wyczytalem;-)(popraw mnie jak trzeba): formatujemy tekst(czyli wskazujemy jak ma być wypisywany?), ten tekst zapisujemy do tablicy buf, i wpisujemy "Temp:" potem znak specjalny dla tej funkcji czyli %, potem deklarujemy, że bedzie wyswietlana liczba dodatnia, całkowita ze znakiem(ten znak to np. ","?), minimum trzy znaki (jak mniej to bedzie poprzedzone zerem, np 02,21 tak?). \001C to chyba ten znak specjalny stopień i C ale ni huhu coś więcej...

Link do komentarza
Share on other sites

prawie dobrze.

spacją a nie zerem (gdyby zerem to by było 03d a nie 3d).

co do huhu... ostatnia rzecz to wypisanie zawartości bufora na lcd.

jeszcze co do operatorów: operacje  na intach dają zawsze wynik int, stąd 22/10=2 a nie 2.2.

ot i cała filozofia.

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

Nie no to: lcd.print(buf); to wiem co robi, ale nie wiem co to jest: \001C, jednak ten znak specjalny tak? Co konkretnie jest to \001? Nie wiem czy ta spacja przed \ też jest ważna?

Sugerowałem się tym zerem przed liczbą trzycyfrową z tego:http://cpp0x.pl/dokumentacja/standard-C/tekst-sformatowany-printf/736, gdzie jest napisane(podkreślenie moje):

Dla specyfikatorów typów całkowitych tj. d, i, o, u, x oraz X precyzja określa minimalną liczbę cyfr jaka ma zostać wyświetlona. Jeżeli liczba cyfr jest mniejsza od podanej wartości to liczba zostanie uzupełniona zerami wiodącymi. Liczba nie zostanie ucięta jeżeli liczba będzie dłuższa niż podana wartość. Jeżeli długość precyzji będzie wynosiła 0 oraz wartość, która ma zostać wypisana będzie wynosiła 0 to nic nie zostanie wypisane na ekran. Jeżeli nie określono precyzji, domyślną wartością dla wymienionych powyżej typów jest 1. 

Generalnie ciekawe takie fomatowanie tekstu, wydaje się przydatne...;-)

Link do komentarza
Share on other sites

Po pierwsze: poczytaj coś o sposobie zapisywania znaków w C i ciągach unikowych (temat akurat na jakąś lekcję na kursie Arduino - @Treker, nie ma tam czegoś na ten temat? Jeśli nie to może warto coś nadmienić?).

W skrócie: backslash i trzy cyfry ósemkowe z zakresu 000..377 to znak o kodzie określanym przez te cyfry. W tym przypadku \001 to znak o kodzie 1 (kody 0..7 w lcd są zarezerwowane dla znaków tworzonych przez użytkownika). Spacja przed backslashem to po prostu spacja we własnej osobie, jest bardzo ważna bo chciałem w tym miejscu mieć spację. Literka C oznacza ni mniej ni więcej jak literkę C 😉

Po drugie: pomyliłeś szerokość z precyzją. Czytaj uważniej.

Po trzecie: owszem, przydatne, podobnie jak wiele funkcji ze standardu C. Może już najwyższy czas spróbować się z nimi zapoznać?

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

Dnia 1.01.2019 o 20:57, ethanak napisał:

W skrócie: backslash i trzy cyfry ósemkowe z zakresu 000..377 to znak o kodzie określanym przez te cyfry. W tym przypadku \001 to znak o kodzie 1 (kody 0..7 w lcd są zarezerwowane dla znaków tworzonych przez użytkownika)

Coś, gdzieś, jakiś link, tutorial, nawet nie wiem o co zapytać wujka google... Też chcę mieć stopień a nie *...

 

Dnia 1.01.2019 o 20:57, ethanak napisał:

Spacja przed backslashem to po prostu spacja we własnej osobie, jest bardzo ważna bo chciałem w tym miejscu mieć spację

😂

 

Dnia 1.01.2019 o 20:57, ethanak napisał:

Po drugie: pomyliłeś szerokość z precyzją. Czytaj uważniej.

Właśnie czytam...

EDIT:

Szerokość

SzerokośćOpis

(liczba)Minimalna liczba znaków do wyświetlenia. Jeżeli liczba wyświetlanych znaków jest mniejsza niż podana wartość to wynik będzie uzupełniony spacjami. Wartość nie zostanie obcięta jeżeli wynik jest dłuższy niż wartość podana.

Oczywiście miałeś rację. Wczoraj jak to czytałem to nie wiedziałem czy to jest po polsku. Czarna magia. teraz jak wiem, że ty chodzi po prostu o sformatowanie jakiegoś teksu to już wiem o czym czytam. Na razie przeczytałem z 6 razy;-), za każdym razem sprawa jest jaśniejsza...:-)))

EDIT2:

Fajnie wyjaśnione i dodatkowo funkcja "odwrotna":

https://blog.udemy.com/sprintf-c/

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.