logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Termometr do sypialni w formie ramki

krzbor 01 Lis 2022 20:01 7542 9
  • Ramka na zdjęcia z wyświetlaczem temperatury pokazująca temperaturę wewnętrzną i zewnętrzną.
    Na początku wyjaśnienie do tytułu – nie jest to typowy termometr, gdyż niczego nie mierzy lecz po prostu wyświetla temperaturę pobraną przez inne czujniki. Stwierdziłem jednak, że „wyświetlacz temperatury” brzmi dziwnie. Za to „do sypialni” ma swoje uzasadnienie, o czym napiszę dalej.

    Trochę historii

    Wskazania temperatury zewnętrznej w sypialni mają swój sens – wszak to tam podejmujemy decyzję jak się ubrać. Początkowo temperaturę wyświetlał stary tablet Lenovo – dzięki przeglądarce Chrome i możliwości wyświetlania na całym ekranie wyglądało to całkiem przyzwoicie. Problemem była jasność świecenia – w nocy w sypialni ma być ciemno. Przeglądarka nie ma możliwości sterowania podświetleniem. Częściowo rozwiązałem problem nakładając półprzeźroczysty „div” na podstawie danych zegara astronomicznego. Działało to nawet całkiem dobrze, ale ikonki Wi-Fi czy zasilania i tak mocno świeciły. Wystarczyło jednak odwrócić ekran, tak aby z pozycji poduszki nie było go widać i było OK. Pewnego razu jednak zauważyłem, że wyświetlacz się wybrzuszył, a po pewnym czasie, gdy wybrzuszenie wzrosło, wyświetlanie zaczęło szwankować. Czytałem o puchnących bateriach przy stałym zasilaniu, lecz myślałem, że nie dotknie to Lenovo. Powstał problem – pozyskać nowy tablet, czy zrobić to „po swojemu”. Kiedyś z myślą o własnym wyświetlaczu temperatury kupiłem moduł TFT 480x320px. W zasadzie zależało mi na dużym wyświetlaczu, a nie na wysokiej rozdzielczości, ale wówczas nic ciekawszego niż ten 4” wyświetlacz nie znalazłem. Postanowiłem zatem wybudować własną konstrukcję opartą o ESP8266.

    Budowa ramki

    Podstawowy problem przy budowie urządzenia „na widoku” jest oczywiście obudowa. Postanowiłem, że całość zrobię w formie ramki na zdjęcia. Na komodzie, gdzie stoi „termometr” są też inne ramki z prawdziwymi zdjęciami – stwierdziłem, że wszystko będzie się ładnie komponować:
    Zegar, wyświetlacz temperatury i pluszowy miś w sypialni
    Był to mój pierwszy projekt z wyświetlaczem TFT – dlatego najpierw przeprowadziłem testy:
    Moduł ESP8266 z połączonym wyświetlaczem TFT.
    Zwykle układy buduję na płytce uniwersalnej, ale miałem gotową płytkę pod ESP-12 dla całkiem innego projektu (znany problem – trzeba zamówić kilka sztuk) – postanowiłem zrobić „recykling”. Nie będę kreślił schematu, gdyż po prostu odpowiednie piny ESP (interfejs SPI) są podłączone do wyświetlacza. Dodatkowe piny to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    oraz GPIO15 do sterowania podświetlaniem TFT. Wybór GPIO15 nie był przypadkowy. Podczas startu ten pin ma wymuszony stan niski (wymaga tego ESP8266). Powoduje to, że przez cały czas startu ESP ekran nie jest podświetlany i dopiero gdy wszystko jest gotowe to podświetlenie jest załączane.
    Jak już wspominałem istotne było ściemnianie, dlatego ramka została wyposażona w fotorezystor:
    Schemat elektroniczny układu z fotorezystorem i rezystorami.
    Przydało się jedyne wejście ADC procesora ESP8266. Może dziwić wysoka rezystancja R4. Wynika ona z tego, że układ miał mieć dobrą rozdzielczość przy bardzo małym oświetleniu.

    Konstrukcja

    Po zakupie ramki i oderwaniu tylnej stopki wyciąłem otwór na wyświetlacz:
    Ramka na zdjęcia wykonana z płyty drewnianej z otworem na wyświetlacz
    Precyzja cięcia nie jest specjalnie istotna – z przodu i tak będzie passe partout, który zamaskuje wszystko. Ważne jest jednak umieszczenie otworu w pionie – część aktywna wyświetlacza nie jest w jego środku, co należy uwzględnić przy wycinaniu otworu.
    Po zamontowaniu wyświetlacza z przodu wygląda to tak:
    Samodzielnie wykonany wyświetlacz w ramce na zdjęcia z widocznymi przewodami i zamontowanym ekranem TFT.
    Śruby są stożkowe i mają swoje gniazda, tak aby z przodu powstała jedna równa płaszczyzna. Ponieważ płyta jest cienka, dodałem trochę kleju „kropelka” pod łebki śrub dla wzmocnienia całości. Widok z boku:
    Widok z boku ramki z wyświetlaczem TFT na płycie zamocowanej za pomocą nakrętek i śrubek.
    Grubość płyty i nakrętki zgadzała się idealnie z grubością wyświetlacza.
    A tak wygląda całość po zmontowaniu:
    Płytka drukowana z elementami elektronicznymi i przewodami.
    Górne śruby z płytki nie są przymocowane do wyświetlacza – pełnią wyłącznie rolę dystansów.
    Widok gotowej ramki z tyłu:
    Tył ramki z wbudowanym wyświetlaczem i elektroniką.
    Ponieważ nie wykorzystuję panelu dotykowego, w ramce pozostawiłem oryginalne plexi.

    Oprogramowanie

    Programowanie ESP wykonałem jak zwykle w Arduino. Do obsługi wyświetlacza postanowiłem użyć biblioteki TFT_eSPI, która bardzo dobrze współpracuje z moim wyświetlaczem. Autorzy biblioteki w ciekawy sposób rozwiązali problem konfiguracji pinów sterujących oraz typu wyświetlacza – wszystko jest w pliku „User_Setup.h”. To rozwiązanie ma tę zaletę, że po jednorazowej konfiguracji można kompilować przykładowe projekty, które od razu działają! Na „pierwszy ogień” poszedł przykład z wyświetlaniem obrazka JPG – działało bardzo dobrze, a ja przekonałem się, że mam dobrze podłączony i sprawny wyświetlacz. Kolejny krok to wyświetlanie napisów – tu też są dostępne przykłady. Postanowiłem je trochę zmodyfikować i sprawdzić, co z polskimi znakami. Niestety ich nie było. Później czytałem, że można to zrobić, ale proste to nie jest. Trochę to ostudziło mój zapał, tym bardziej, że chciałem używać ładnych, dużych znaków.
    Postanowiłem rozwiązać problem inaczej – zdecydowałem, że ramka będzie wyświetlać tylko cały obraz, który powstanie po stronie serwera przy użyciu PHP i biblioteki GD. Biblioteka GD daje mi dostęp do pisania z użyciem TrueType, a ponieważ PHP to język interpretowany, bardzo łatwo o modyfikację – nie muszę nic kompilować, wgrywać itd.
    Pozostał problem jak przesłać obraz z PHP do ESP. Kompresję JPEG odrzuciłem – jest to kompresja stratna, a ja nie chciałem mieć rozmazanego obrazu na krawędziach. Moduł do kompresji PNG nie działał (prawdopodobnie wymaga większej ilości pamięci RAM). Myślałem jeszcze o GIF, ale ostatecznie zdecydowałem się na własne rozwiązanie z własną kompresją.
    Postanowiłem, że PHP przygotuje od razu obraz do wyświetlenia, czyli zakoduje go do 65k kolorów (RGB 565) czego wymaga wyświetlacz TFT. Początkowo dane były wysyłane bez kompresji – każdy wiersz składał się z 320 pikseli czyli 640 bajtów. Całość obrazu miała więc rozmiar 307200 bajtów. Działało to bardzo ładnie i ciekawie, ale wolno. Przekonałem się, że Wi-Fi w ESP8266 jest bardzo wolne. Przerysowanie zajmowało ponad 2 sekundy. Ponieważ można je wykonać bez wymazywania poprzedniej treści powstawał ciekawy efekt przejścia typu „żaluzja”, co może być przydatne, gdy ktoś chce zrobić elektroniczną ramkę na zdjęcia.
    Mnie jednak zależało na prędkości, dlatego dodałem kompresję opartą o RLE. Poniżej opis zastosowanej metody.

    Kompresja

    Ponieważ jeden piksel to 2 bajty postanowiłem wszystko kodować na dwóch bajtach – w dalszym opisie będę to nazywał „słowem”, które może zawierać liczby lub kolor RGB (w układzie 565). Podstawowym założeniem był łatwy odczyt po stronie ESP. Dlatego pierwsze słowo zawiera liczbę słów w wierszu. Kolejne słowo jest słowem sterującym (nazwijmy go n) – jeśli jest mniejsze od 10000 to oznacza, że należy następnych n słów przepisać jako piksele. Jeśli n jest większe od 10000, to następne słowo (piksel) należy powielić (n-10000) razy. Takie kodowanie stosujemy do końca wiersza – czyli kolejne słowo sterujące i dane itd. Po zakodowaniu wiersza kod PHP sprawdza, czy aby zakodowany ciąg (wiersz pikseli) nie jest dłuższy niż bez kompresji. W takim przypadku kompresja jest anulowana dla tego wiersza, a ESP gdy odczyta, że wiersz ma 320 słów, wie iż nie jest on skompresowany. Dla poniższego obrazu:
    Wyświetlacz graficzny z temperaturą
    Kompresja daje rozmiar wynikowy 43160 bajtów, co stanowi 14% oryginału. Uznałem to za bardzo przyzwoity wynik.

    Kod Arduino

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Cały kod to mniej niż 200 wierszy. Oprócz wspomnianej biblioteki TFT_eSPI używam jeszcze Wi-FiManager do konfiguracji sieci WiFi oraz ESP8266httpUpdate do aktualizacji OTA. Aktualizację OTA stosuję od pewnego czasu i muszę przyznać, że to bardzo dobre rozwiązanie. W Arduino zaktualizowałem bibliotekę ESP8266 do 3.x. Niestety kod do obsługi OTA przestał działać (problem z kompilacją). Nie chciało mi się szukać rozwiązania problemu, więc wróciłem do starszej wersji biblioteki (2.7.4). Po pozbyciu się OTA (lub naprawie mojego kodu) prawdopodobnie będzie wszystko działać z biblioteką 3.x.
    Działanie programu jest proste – główna pętla wykonuje się co 2s i w tym interwale wykonywany jest pomiar oświetlenia. Co 30 cykli (czyli co 1 minutę) kierowane jest zapytanie do serwera o nowy obraz do wyświetlenia. W nagłówku odpowiedzi są wpisy typu „X-”, które definiują komendę oraz ustawienie PWM podświetlania. Zdecydowałem, że ramka tylko wysyła wynik pomiaru oświetlenia, a skrypt PHP będzie określał jasność. Cykl odpytywania co jedną minutę może być skrócony, jeśli w ciągu 2s nastąpi zmiana jasności o 100. Ramka reaguje więc szybko na zapalenie/zgaszenie światła w sypialni.

    Kod PHP

    Kod: PHP
    Zaloguj się, aby zobaczyć kod

    Przedstawiony kod nie jest kodem, który u mnie działa, gdyż skrypt PHP pobiera dane z różnych miejsc i składa je w jeden obraz. Pokazuje jednak jak coś napisać z użyciem TrueType, włożyć obrazek i skompresować całość opisanym wcześniej algorytmem. Kod PHP przyjmuje dodatkowy atrybut w postaci „output=png” do zastosowania w przeglądarce WWW np.:
    http://192.168.0.24/term/term.php?output=png
    który powoduje, że obraz będzie zwracany jako plik PNG – jest to idealne do testów, gdyż nie trzeba patrzeć na naszą ramkę, a wynik widać w przeglądarce.

    Podsumowanie

    Myślę, że zaproponowane rozwiązanie może być przydatne w wielu przypadkach np. do tworzenia skomplikowanych grafik, ciekawych tekstów o nietypowym foncie. Jeśli ktoś będzie chciał zrobić w oparciu o to rozwiązanie zegar, ale bez wyświetlania sekund, to warto w odpowiedzi w nagłówku dodać kolejny wpis „X-”, który poda liczbę sekund do kolejnej zmiany minuty. Można wówczas zsynchronizować czas zapytania o obraz ze zmianą minuty. Można też zbudować elektroniczną ramkę na zdjęcia, w której obrazy będą pobierane z sieci – ciekawy prezent np. dla rodziców. Mankamentem w tym przypadku jest niestety mały rozmiar wyświetlacza.

    Poniżej do pobrania przykładowy kod PHP wraz z czcionką oraz obrazkiem:
    Załączniki:
    • php.zip (637.24 KB) Musisz być zalogowany, aby pobrać ten załącznik.

    Fajne? Ranking DIY
    O autorze
    krzbor
    Poziom 29  
    Offline 
    krzbor napisał 1783 postów o ocenie 1072, pomógł 42 razy. Jest z nami od 2004 roku.
  • #2 20263418
    gulson
    Administrator Systemowy
    Posty: 29505
    Pomógł: 150
    Ocena: 6112
    Bardzo dziękuję za prezentację konstrukcji DIY i wstawienie logotypu elektrody. Wyszło super. Myślę, że zawsze ramka jest problematyczna, aby wyszła estetycznie i wszystko w niej zmieścić.
    Napisz do mnie po skromny upominek! :)
  • #3 20263786
    error105
    Poziom 14  
    Posty: 481
    Pomógł: 1
    Ocena: 146
    Fajny projekt.
    Jedyne co przeszkadza, to ten lichy TFT bez żadnych kątów widzenia :( trochę boli fakt, że w zasadzie nie ma dobrych jakościowo wyświetlaczy z SPI, albo kosztują więcej niż 27” monitory :(
  • #4 20263840
    ADI-mistrzu
    Poziom 30  
    Posty: 2261
    Pomógł: 37
    Ocena: 308
    Nie myślałeś aby wstawić w miejsce TFT e-ink? Nawet kolorowy.
  • #5 20263957
    krzbor
    Poziom 29  
    Posty: 1783
    Pomógł: 42
    Ocena: 1072
    error105 napisał:
    Fajny projekt.
    Jedyne co przeszkadza, to ten lichy TFT bez żadnych kątów widzenia :( trochę boli fakt, że w zasadzie nie ma dobrych jakościowo wyświetlaczy z SPI, albo kosztują więcej niż 27” monitory :(

    Z tymi kątami nie jest tak źle. Warto jednak to sprawdzić, gdyż w pionie wydają się one różne w zależności jak odwrócimy ekran. Taniego wyświetlacza z SPI powyżej 4 cali praktycznie nie ma, albo tak jak piszesz, są w kosmicznej cenie.

    ADI-mistrzu napisał:
    Nie myślałeś aby wstawić w miejsce TFT e-ink? Nawet kolorowy.

    Zdjęcie ramki zostało wykonane wieczorem - stąd duży kontrast pomiędzy ramką, a treścią wyświetlaną na TFT. Normalnie w dzień wygląda to znacznie lepiej. Dodatkowo aparat podbija kontrast pomiędzy ramką, a TFT.
    Zgadzam się, że zastosowane rozwiązanie dobrze nadaje się do e-ink - choć w tym przypadku dodał bym jeszcze sumę kontrolną przesyłanego obrazu. Gdy suma kontrolna się nie zmienia, nie będzie odświeżania. TFT po prostu miałem, e-ink trzeba było kupić. Zależało mi także na widoczności w nocy.
  • #6 20264083
    ADI-mistrzu
    Poziom 30  
    Posty: 2261
    Pomógł: 37
    Ocena: 308
    @krzbor są e-ink z możliwością podświetlenia, ale jak z ich dostępnością to niestety nie wiem.
  • #8 20265000
    krzbor
    Poziom 29  
    Posty: 1783
    Pomógł: 42
    Ocena: 1072
    Chiński :) Dokładny "polskawy" opis: ''3.95 "/4.0" calowy 320*480 ST7796S TFT kolorowy moduł wyświetlacza LCD z panelem dotykowym dla Arduino UNO Mega2560 8/16 Bit". Zdjęcie złącza:
    Termometr do sypialni w formie ramki
    Dołączam User_Setup.h:
    Załączniki:
    • User_Setup.h (16.76 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 20266676
    krzbor
    Poziom 29  
    Posty: 1783
    Pomógł: 42
    Ocena: 1072
    Żadna ramka nie wygląda pięknie z tyłu. Gdyby tył był jakoś widoczny, to dodałbym obudowę lub jakąś osłonę. Wiedziałem jednak, że przy rozmiarze ramki w stosunku do wyświetlacza i elektroniki nic nie będzie widać. Starałem się, aby było możliwie płasko - stąd niezbyt estetycznie pochylony stabilizator. Oczywiście ideałem byłaby ładna, zaprojektowana od podstaw płytka najlepiej z gniazdem pasującym od razu do pinów wyświetlacza - taka kanapka. Myślę jednak, że inni pójdą w inną stronę - po prostu użyją NodeMCU - tam mają gniazdo zasilania, stabilizator i łatwiejsze programowanie. Drobnym problemem będzie jednak konieczność przeróbki wejścia ADC.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik przedstawił projekt termometru do sypialni w formie ramki, który wyświetla temperaturę z zewnętrznych czujników. Początkowo używał do tego starego tabletu Lenovo, jednak napotkał problemy z jasnością wyświetlacza w nocy. W odpowiedzi na sugestie, rozważono zastosowanie wyświetlacza e-ink zamiast TFT, co mogłoby poprawić widoczność w ciemności. Użytkownik podzielił się informacjami o używanym wyświetlaczu TFT 3.95"/4.0" 320*480 ST7796S, wskazując na ograniczenia związane z kątami widzenia i dostępnością lepszych wyświetlaczy. Dyskutowano również o estetyce konstrukcji, zwracając uwagę na wygląd tyłu ramki oraz możliwości zastosowania NodeMCU dla uproszczenia projektu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA