Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)

p.kaczmarek2 15 Nov 2020 19:05 4959 13
phoenixcontact
  • Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Witajcie moi drodzy
    Przedstawię tutaj mój projekt zewnętrznego wyświetlacza temperatury procesora z komputera. Wyświetlacz pokazuje temperatury od 0 do 99C, jednocześnie odpowiednio dobierając swój kolor. Wyświetlacz zrobiony jest samodzielnie od 0 w oparciu o diody WS2812B, sterowany jest poprzez PIC18F67J60, a temperatury odbiera z komputera z systemem Windows poprzez Ethernet, a dokładniej HTTP. Wyświetlacz zasila się poprzez kabel USB z dowolnej ładowarki od telefonu. Projekt jest oparty przede wszystkim o druk 3D (obudowa, sam wyświetlacz) oraz moje własne, przygotowane wcześniej moduły.

    Wstęp
    Projekt złożyłem od 0 z samodzielnie przygotowanych wcześniej modułów (mój DIY wyświetlacz 7 segmentowy i moja płytka pod PIC18F67J60 obsługująca komunikacją Ethernet.
    Firmware na PICa napisałem w Mikro C PRO for PIC, program na Windowsa (odczyt temperatury) w Visual Studio, C#.
    Projekt obejmował:
    - implementację obsługi wyświetlacza opartego na WS2812B dla PIC18F67J60
    - implementację kontroli tego wyświetlacza poprzez HTTP na PIC18F67J60 (kontrola wyświetlanych znaków, 0-9 i abcdef, oraz kontrola koloru reprezentowanego poprzez wartość hue)
    - projekt 3D i wydruk obudowy na termometr (zaprojektowana w Blenderze, wydrukowana białym filamentem PLA na drukarce 3D Ender 3 Pro)
    - aplikację napisanę w C# na Windowsa która odczyta temperaturę procesora z wbudowanego sensora i wyśle ją po HTTP do PICa

    Użyty wyświetlacz 7-segmentowy bazujący na WS2812B
    W projekcie użyłem samodzielnie zrobionego dużego, kolorowego wyświetlacza opartego na WS2812B.
    Opisany jest on szczegółowo tutaj:
    https://www.elektroda.pl/rtvforum/topic3728082.html
    Ale w dużym skrócie to, projekt płytki:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Lutowanie płytki wyświetlacza:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Plastikowa ramka - projekt w Blenderze:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Wydruk 3D (filament PLA na Ender 3 Pro):
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Finalizacja:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)

    Użyta płytka komunikacji Ethernet oparta na PIC18F67J60
    Do projektu użyłem swojej płytki komunikacji Ethernet opartej o PIC18F67J60 który sam (bez zewnętrznych układów typu ENC28J600) wspiera komunikację Ethernet.
    Projekt:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Wykonanie:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Na pokładzie jest PIC18F67J60 który obsługuje bezpośrednio komunikację Ethernetową. Obok niego jest złącze Magjack JXD0-0006NL. Dodatkowo jest tylko jeszcze stabilizator LDO TC1264 (zapewnia stabilne 3.3V z 5V z USB). Na płytce są jeszcze miejsca na pamięci 24AA256, ale nie są używane. No i rezonator kwarcowy 25MHz, dla PICa.


    Obsługa mojego wyświetlacza WS2812B dla PIC18F67J60
    Sam protokół sterowania WS2812B implementowałem jakiś czas temu dla PIC18F45K50:
    https://www.elektroda.pl/rtvforum/topic3590731.html
    Na szczęście nie było problemu z przeportowaniem tego na PIC18F67J60. Jednak obsługa protokołu WS2812B to tylko połowa sukcesu, trzeba jeszcze zamienić znaki na odpowiednie segmenty, tzn. PIC musi wiedzieć co wyświetla.
    Chciałem to co można wyświetlać wygodnie na wyświetlaczu 7-segmentowym, czyli cyfry i litery abcdef.
    W tym celu przygotowałem tablicę masek dla kolejnych kodów znaku (poszczególne bity każdej liczby określają czy dany segment jest zapalony):
    Code: c
    Log in, to see the code

    Następnym etapem była funkcja wyświetlająca dany znak na danej pozycji wyświetlacza. W jej nazwie zostało 'digit', choć wyświetla ona też wspierane litery.
    Code: c
    Log in, to see the code

    W powyższej funkcji mnożę pozycję cyfry razy 7, bo każda cyfra ma 7 segmentów. Potem kolejno badam kolejne bity wartości maski danej cyfry i sprawdzam który z 7 segmentów trzeba zapalić.
    Potem zostało zrobić funkcję wyświetlającą cały ciąg znaków. Zakładam w niej, że przekazywana tablica zawiera 3 znaki.
    Code: c
    Log in, to see the code

    Do tego celu też potrzebowałem funkcji pomocniczej gdyż w ASCII niestety 'A' nie jest tuż po '9'. Funkcja poniżej zamienia kod ASCII znaku na indeks tablicy przedstawionej wcześniej:
    Code: c
    Log in, to see the code


    Firmware na PIC18F67J60 (komunikacja przez HTTP/TCP)
    Program na PICa napisałem w Mikro C PRO for PIC i bazowałem go na HTTP Demo z przykładów kompilatora.
    Program obsługuje prostą stronę internetową, która pośrednio bierze udział w sterowaniu wyświetlaczem.
    Na stronie wyświetlany jest bieżący tekst w takim kolorze w jakim jest na wyświetlaczu:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Na stronie są też dostępne różne linki służące do testowania wyświetlacza. Część z tych linków po prostu ustawia wybrany kolor, część ustawia dany tekst, a część uruchamia testowe animacje WS2812B.
    Tu macie wgląd w kod HTML strony (on jest częściowo generowany przez PICa):
    Code: html
    Log in, to see the code

    Zasadniczo to do sterowania wyświetlaczem używane są trzy rodzaje pakietów, oba oparte na HTTP GET.
    - pakiet ustawienia koloru - 192.168.0.129/c/[R]/[G]/[ B ] - ustawia kolor o danym RGB
    - pakiet ustawienia koloru - 192.168.0.129/h/[KOD_HUE] - ustawia kolor o danym hue (barwie)
    - pakiet ustawienia tekstu - 192.168.0.129/v/[TEKST] - wyświetla dany tekst na wyświetlaczu
    Takie pakiety można wysyłać z dowolnego źródła, też automatycznie z aplikacji na Windowsie. To właśnie robię, szczegóły w kolejnym akapicie.
    Od strony PICa parsing pakietów wygląda bardzo prosto. Na przykład dla funkcji ustawiającej kolor:
    Code: c
    Log in, to see the code

    Funkcja parseInt bierze jako argumentów wskaźnik do wskaźnika na tekst i wczytuje z niego jedną liczbę, jednocześnie przesuwając wskaźnik (liczby oddzielone są ukośnikami):
    Code: c
    Log in, to see the code


    Software po stronie komputera (na Windowsa)
    Software po stronie komputera ma za zadanie odczytanie temperatury procesora (jego obudowy, lub średniej z rdzeniów, dowolnie) i wysłanie jej poprzez TCP/HTTP do PICa.
    Częstotliwość wysyłania temperatury można ustawić w kodzie, w tym momencie wysyłam ją co sekundę.
    Do napisania tego programu użyłem Visual Studio i języka C#.
    Niestety okazało się, że z odczytem temperatury procesora jest nieco problemów.
    W sieci krąży na przykład taki fragment kodu:
    Code: c
    Log in, to see the code

    Niestety u mnie on nie działał, a próbowałem nawet w trybie Administratora. Ostatecznie rozwiązaniem dla mnie okazała się biblioteka OpenHardwareMonitor którą zainstalowałem poprzez NuGet Packages:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Jednak trzeba mieć na uwadze, że ona też nie wspiera wszystkich procesorów, więc ze wszystkim jest więcej kłopotów niż myślałem.
    W załączonym kodzie (do pobrania) zaimplementowane jest więc kilka metod, zmienia się je #ifdef'em.
    Do samego wysyłania temperatury używam klasy WebRequest.

    Pierwsza wersja obudowy
    Pierwszą wersję obudowy zaprojektowałem tak by była jak najmniejsza.
    Nie miałem wtedy jeszcze całego konceptu wyświetlacza w głowie.
    Płytkę z PIC dałem równolegle do wyświetlacza.
    Model 3D (przód):
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Widoczny gwint na śrubkę przedniego elementu:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Spód (dodatkowo jest tu miejsce na przykręcenie śrubkami złacza microUSB od zasilania):
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Po wydrukowaniu i złożeniu, w trakcie programowania (PICKIT2 bezpośrednio podłączony do płytki z PIC):
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Finalne składanie pierwszej wersji:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet) Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Pierwszy test przez Ethernet:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Jednak ta obudowa mi nie odpowiadała i zrobiłem potem ją od 0, inaczej.

    Finalna wersja obudowy
    Finalną wersję obudowy wykonałem zgodnie z tym co przedstawiłem w moim tutorialu modelowania obudowy w Blenderze:
    https://www.elektroda.pl/rtvforum/topic3735510.html
    Tylko odpowiednio zmodyfikowałem wymiary i dodałem otwory montażowe.
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Wydruk podstawy:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Panel tylni:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Przedni panel:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Mocowanie wyświetlacza w przednim panelu za pomocą dodatkowych 'bloczków' wydrukowanych w 3D i śrubek:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Zamocowane:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Dodatkowo wyprowadzone złącze na ICSP w tylnym panelu (pasuje na ścisk):
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet) Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    W trakcie montażu:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Złącza z tyłu (potem przy pierwszym pinie ICSP zrobiłem kropkę markerem):
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Podłączony już do zasilacza 5V z telefonu (złącze microUSB) i sieci Ethernet:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Całość złożona:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)

    Filmik - testy wyświetlacza poprzez stronę internetową
    Tutaj udało mi się wziąć w jeden kadr ekran monitora i gotowy wyświetlacz w obudowie. Na filmiku widać jak klikanie w kolejne linki na testowej stronie internetowej powoduje reakcje wyświetlacza, czyli taki ogólny test funkcjonalności.
    Na stronie internetowej wyświetlany jest też bieżący napis z wyświetlacza wraz z odpowiednim kolorem.




    Filmik - test kolorów/gradientu z poziomu Windowsa i C#
    Kolor wyświetlacza zależy od temperatury jaka jest pokazywana. Im większa temperatura, tym cieplejszy kolor.
    Kolor jest liczony po stronie aplikacji na Windowsa. Komputer wysyła do PICa dwa pakiety: jeden z tekstem do wyświetlenia, drugi określający jego kolor (jako liczbowa wartość hue).
    Kod obliczania gradientu i wysyłania go wraz z kolorem:
    Code: c
    Log in, to see the code

    Dodatkowo zrobiłem funkcję służącą do przedstawiania działania gradientu, która nie odczytuje temperatury z procesora, tylko kolejno wyświetla dostępne wartości:
    Code: c
    Log in, to see the code

    Rezultat na filmie:



    Wyświetlanie temperatury w normalnym trybie działa analogicznie, po prostu wtedy temperatura odzwierciedla temperaturę procesora na komputerze.

    Pomiar prądu
    Wyświetlacz zasilam z ładowarki 5V od starego telefonu. Podłączony do niej jest przez przedłużacz USB, bo stoi na szafce. W celu pomiaru prądu wpiąłem USB Doctor między przedłużacz a kabel microUSB:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet) Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    (w trakcie pomiaru PIC ciągle odbierał nowe pakiety, wysyłane były kilka razy na sekundę)
    Napięcie zasilania wynosi około 4.5V, a prąd zmienia się w zależności od tego co jest wyświetlane od około 0.15A do 0.2A. Czyli wyświetlacz pobiera około 1W.


    Co można by zrobić lepiej
    Projekt doprowadziłem do zadowalającego dla mnie stanu ale oczywiście dużo można by ulepszyć. Między innymi:
    - można by nieco zmniejszyć wysokość panelu przedniego i tylnego ponieważ na skutek drobnych niedokładności wydruku górna i dolna połowa obudowy nie przylegają do siebie idealnie na ścisk (ale jest to wręcz niezauważalne)
    - w kodzie C na PIC można by ulepszyć kilka rzeczy by było bardziej eleganckie, można by też poprawić kilka ryzykownych fragmentów kodu (można wywołać w pewnym miejscu przepełnienie bufora), ale jako, że jest to tylko wyświetlacz temperatury to tego nie robiłem
    - na ten moment firmware PICa nie obsługuje sytuacji w której po prostu wyłączę komputer kontrolujący wyświetlacz, wtedy po prostu wyświetlacz cały czas pokazuje ostatnią zapamietaną temperaturę. W przyszłości być może dodam jakiś prosty timeout, że wyświetlacz gaśnie, jak nie otrzyma żadnych pakietów w ciągu np. 15 minut (to nie problem, wystarczy zliczać np. sekundy timerem i dodać ifa, że gdy ilość sekund bez pakietów przekroczy N to wtedy ... )
    - można by nieco zmienić sposób wyświetlania temperatury, np. wyświetlać maksymalną wartość temperatur z rdzeniów procesora, a nie ich średnią...

    Załączniki
    Poniżej umieszczam do pobrania wszystkie pliki powiązane z projektem, zarówno projekt PCB jak i kody.









    NazwaFormatLink
    Projekt PCB z PIC18F67J60Eagle .sch/.brd PicEthV2_7...201115.zip Download (97.62 kB)Points: 1 for user
    Projekt PCB wyświetlacza 7segEagle .sch/.brd ws2812b_7s.._10.zip Download (116.24 kB)Points: 1 for user
    Firmware PIC18F67J60Projekt Mikro C, kody .c HTTPDemo_w...201115.zip Download (371.31 kB)Points: 1 for user
    Aplikacja na komputerProjekt Visual Studio, kody .cs Temperatur...201115.zip Download (409.81 kB)Points: 3 for user
    Model obudowy (finalny)Format Blendera (.blend) caseTemp_7...201115.zip Download (87.81 kB)Points: 1 for user
    Model obudowy (finalny)Wyeksportowane STLe (.stl) caseTempST...201115.zip Download (77.98 kB)Points: 1 for user
    Model samego wyświetlacza (plastikowa nakładka na jego PCB)Format Blendera (.blend) my7segdisp....blend.zip Download (74.53 kB)Points: 1 for user
    Model obudowy (stary)Format Blendera (.blend) my7segdisp...201115.zip Download (98.21 kB)Points: 0.5 for user


    Podsumowanie
    Z mojego wyświetlacza jestem bardzo zadowolony. O dziwo okazał się on być bardziej praktyczny niż robienie kolejnego zegarka (choć zegarek też mam w planach).
    Ustawiłem go na półce, dość daleko za komputerem, ale akurat mam tak ustawione meble, że mam go ciągle w polu widzenia i widzę jaka jest temperatura, zastępuje mi on zerkanie na temperatury na pasku zadań, zwłaszcza gdy włączone jest coś na pełny ekran.
    Jeśli chodzi o "wystawanie" modułów samych wyświetlaczy, to jest to zgodne z moim projektem i zamysłem artystycznym na obudowę. Ale oczywiście można by przedłużyć obudowę o kilka mm lub więcej, schować wyświetlacze i dać nawet przed nimi nawet dociętą na wymiar szybkę.
    Projekt ten pokazuje też jak bardzo dużo może wnieść do elektroniki druk 3D, bez niego byłoby trudniej wykonać obudowę na wymiar i sam wyświetlacz.
    About Author
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • phoenixcontact
  • #3
    p.kaczmarek2
    Moderator Smart Home
    Nie zwróciłem na to uwagi, nie widać tego mocno, ale jako poprawkę lepiej chyba byłoby pogrubić cztery boczne ścianki tutaj:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Mam w planach drugą wersję tych wyświetlaczy (po dwie WS2812B na segment, grubsze ścianki) ale i tak musiałem jakoś wykorzystać pierwszy prototyp.
  • phoenixcontact
  • #4
    Piottr242
    Level 23  
    p.kaczmarek2 wrote:
    Nie zwróciłem na to uwagi, nie widać tego mocno

    Gdyby nie było widać, to bym nie zwrócił na to uwagi i nie zaproponował rozwiązania z kategorii najprostszych :-)
    Na zdjęciach widać że światło ucieka również pod plastikową ramką.
  • #5
    miszcz310
    Level 23  
    Fajny projekt i super wykonanie! Gratuluję, że wszystko działa. Jedno mnie jednak nurtuje troszkę. Jak masz drukarkę 3d i tak projektujesz specjalną obudowę. Czemu nie zrobić czegoś "dopasowanego"? Tam chyba nie ma jakiś bardzo grzejących się elementów, a w środku pustki jak w sklepie w godziny dla seniora. Jakby trochę odchudzić nawet tę obudowę a płytki dać na "sztorc" (tylko problem z gniazdem Ethernet) to by mniej miejsca na biurku zajmowało. W sensie takie coś jak ta pierwsza tylko np. z nóżkami, żeby wyświetlacz był pod dobrym kątem.
    Pozdrawiam!
  • #6
    p.kaczmarek2
    Moderator Smart Home
    miszcz310 wrote:
    Czemu nie zrobić czegoś "dopasowanego"?

    Pierwsza wersja taka była:
    Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet) Kolorowy wyświetlacz temperatury procesora (sterowany przez Ethernet)
    Ale mi nie pasowało całkowicie jednak estetycznie i chciałem mieć za wszelką cenę gniazdo Ethernet i pozostałe z tyłu, a nie z boku.

    Oczywiście gdyby móc przeprojektować płytkę od Ethernetu i inaczej umieścić na niej gniazdo to by się wszystko uprościło, ale trochę mi tych płytek zostało i chciałem użyć tego co mam.
  • #7
    zgierzman
    Level 31  
    O gustach się nie dyskutuje, więc skoro Tobie taka obudowa odpowiada...

    Ale jak dla mnie zbyt podobna jest do tych paskudnych obudów uniwersalnych. Jak ja ich nie lubię...
  • #8
    p.kaczmarek2
    Moderator Smart Home
    Akurat moja obudowa bazuje na moim tutorialu który pokazywał jak zrobić... właśnie taką własną wersję obudowy uniwersalnej.

    A jaki inny styl, wygląd obudowy byś Ty proponował? Będę robić wkrótce nieco lepszą wersję tego (też z poprawionym wyświetlaczem 7seg, chyba pod zegarek), więc sugestie mile widziane.
  • #9
    zgierzman
    Level 31  
    p.kaczmarek2 wrote:
    A jaki inny styl, wygląd obudowy byś Ty proponował?


    Jeśli chodzi o to co mnie się podoba, to Twoja pierwsza wersja obudowy bardziej mi odpowiada. Tyle, że ja zrobiłbym ją z czarnego tworzywa, nie wysuwałbym tak wyświetlaczy, natomiast cały front przykryłbym dociętym na wymiar kawałkiem ciemnej dymionej pleksi.

    Chcesz mieć gniazda z tyłu i płaską obudowę? Przecież to nie problem włożyć do środka kawałek patchcorda, a na tyną ściankę zamontować zwykłe gniazdo RJ45. Identycznie jak to zrobiłeś z ICSP...
  • #11
    p.kaczmarek2
    Moderator Smart Home
    zgierzman wrote:
    Tyle, że ja zrobiłbym ją z czarnego tworzywa, nie wysuwałbym tak wyświetlaczy, natomiast cały front przykryłbym dociętym na wymiar kawałkiem ciemnej dymionej pleksi.

    A to jest dobry pomysł, przemyślę go.

    A z tym złączem Ethernet to może po prostu pokuszę się o moduł bezprzewodowy który już mam w szufladzie, RN131 jeśli dobrze pamiętam.

    cheval de bataille wrote:
    Jakiej drukarki 3D używasz? Może to kwestia zdjęć, może koloru filamentu, ale wynik wygląda super.


    Nic nadzwyczajnego, Ender 3 Pro i filament biały PLA, nozzle 0.4mm i w Cura ustawienie Standard. Praktycznie konfiguracja taka jak po kupieniu, choć przyznaję, że do lepszych wyników trzeba skalibrować kilka rzeczy, m. in. wypoziomować bed a i też upewnić się czy nie ma luzów na osiach.

    Ale ogólnie tak, jakość wydruków z względnie taniej drukarki 3D w roku 2020 jest naprawdę dobra, polecam.
  • #12
    aadeer
    Level 14  
    Fajnie jeszcze zobaczyć jakiś uC bez Arduino (mimo, że sam często używam Arduino Core 8-) )...
  • #13
    VIGOR_PICTURES
    Level 20  
    Oho, widzę że nie tylko ja poszedłem drogą pod tytułem OpenHardwareMonitor podczas prób wyszarpania (bo Windows nie pomaga) danych związanych z parametrami komputera. Ja co prawda przez aplikację w C++ wysyłam zapytania WSQL. Dlaczego akurat zdecydowałeś się na taki typ wyświetlacza (wielkość)? Czysto dla zabawy czy potrzebujesz tak dużych cyfr? Pamiętasz ile mniej więcej filamentu poszło na obudowę? Ciekaw jestem jaki jest koszt wydrukowania sobie własnej obudowy.

    Pozdrawiam!
  • #14
    Anonymous
    Level 1