Spisu treści:

Monitor sprzętu PC: 6 kroków (ze zdjęciami)
Monitor sprzętu PC: 6 kroków (ze zdjęciami)

Wideo: Monitor sprzętu PC: 6 kroków (ze zdjęciami)

Wideo: Monitor sprzętu PC: 6 kroków (ze zdjęciami)
Wideo: Kupujemy monitor #1: Jaka rozdzielczość i proporcje? 2024, Lipiec
Anonim
Monitor sprzętu PC
Monitor sprzętu PC
Monitor sprzętu PC
Monitor sprzętu PC
Monitor sprzętu PC
Monitor sprzętu PC

Cześć wszystkim. Rozpocząłem ten projekt z dwóch powodów: niedawno zbudowałem pętlę chłodzenia wodą na moim komputerze i potrzebowałem czegoś, co wizualnie wypełniłoby trochę miejsca w obudowie ORAZ chciałem mieć możliwość sprawdzenia temperatury i innych statystyk za pomocą szybkiego podglądu bez sztuczek OSD wypełniających rogu ekranu. Oczywiście są na to gotowe rozwiązania, ale większość z nich po prostu nie pasowałaby do mojego feng shui. Tak więc, zamiast umieszczać wyświetlacz HDMI 7 w mojej obudowie z kablem wystającym z obudowy i zawsze włączonym paskiem zadań systemu Windows, postanowiłem zbudować własną zabawkę.

Ponieważ nie jestem inżynierem ani programistą, tylko kolesiem z lutownicą i pewną wiedzą samouka, to nie będzie tylko instruktaż krok po kroku, postaram się też skupić na problemie rozwiązywanie i badanie aspektów, które doprowadziły mnie do tego buildu.

OŚWIADCZENIE: WSZYSTKIE MOJE PRACY JEST UDOSTĘPNIONE JAKO CREATIVE WSPÓLNY ATTRIBUTION-SHAREALIKE 4.0. ZAINSPIRUJĘ SIĘ WIELU PRZYKŁADAMI Z CAŁEGO INTERNETU, JEŚLI JAKĄŚ CZĘŚĆ TEJ PRACY UZNAJESZ ZA SWOJĄ, PROSZĘ O KONTAKT W CELU UZNANIA. ŻADNE NARUSZENIE NIE JEST ZAMIERZONE, Z PRZYJEMNOŚCIĄ MOGĘ POPRAWIĆ WSZELKI BŁĄD. DZIĘKUJĘ CI

DRUGIE ZASTRZEŻENIE: MOJA PRACA JEST UDOSTĘPNIANA TAK, JAK JEST. NIE PONOSZAM ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK SZKODY WYNIKAJĄCE Z UŻYCIA JAKIEGOKOLWIEK MOJEGO KODU LUB INSTRUKCJI

Kieszonkowe dzieci

  • Arduino Nano (lub UNO, jeśli chcesz)
  • Wyświetlacz TFT. W moim przypadku jest to wyświetlacz 3,5" kompatybilny z ILI9486 / ILI9488L.
  • Czujnik temperatury. W wielu przypadkach analogowy czujnik temperatury TMP36.
  • Kable, przewody, złącza dupontowe (o tym później)
  • (opcjonalnie) Deska do krojenia chleba do testowania
  • (opcjonalne, ale zalecane) mała deska perforowana

Krok 1: Studium wykonalności (w pewnym sensie)

Jak powiedziałem, nie chciałem, a wyświetlacz HDMI utknął w obudowie mojego komputera, więc zamaskowany własną pomysłowością zacząłem szukać podobnych pomysłów w Internecie. I to jest wskazówka numer jeden: Google jest twoim przyjacielem (no cóż, każda przyzwoita wyszukiwarka…). Żyjemy w świecie, w którym nic nie jest już tak naprawdę oryginalne, ale zamiast patrzeć na to zdanie z negatywnym znaczeniem, moglibyśmy wykorzystać to na naszą korzyść: cokolwiek chcesz stworzyć, prawdopodobnie ktoś gdzieś już zrobił coś podobnego, więc jeśli ty nie wiesz, jak wdrożyć pomysł, są duże szanse, że znajdziesz tam przydatne informacje. Podczas przeszukiwania Internetu często warto pamiętać o dwóch zasadach:

  1. nie zawracaj sobie głowy szukaniem strony 3 lub 4, to prawie zawsze strata czasu. Zamiast
  2. zmień wyszukiwane hasła, po prostu przeformułuj pytanie z innego punktu widzenia (np.: "czujnik temperatury arduino" -> "odczytaj temperaturę z arduino").

Właściwie jest tam pełno dobrych projektów i przyznaję, że pierwsze dni spędziłem na studiowaniu większości z nich. Ale żaden z nich nie był gotowy na mnie, ponieważ chciałem czegoś, co pasowałoby do moich potrzeb.

Ponieważ musiałem zrobić coś niestandardowego, postanowiłem skupić się na odpowiednim sprzęcie do użycia, a stronę oprogramowania zostawić na później, ponieważ oprogramowanie zawsze można stworzyć i dostosować do potrzeb, z drugiej strony sprzętowej jestem związany z dostępnością i funkcje.

Chciałem czegoś opartego na Arduino, ponieważ już to miałem, jest dobrze udokumentowane, a jego społeczność kwitnie. Nie ma problemu, jak już wcześniej wspomniałem o wielu informacjach.

Chciałem, aby wyświetlacz był wystarczająco duży, aby był wyraźnie widoczny z kilku metrów i pasowałby do wyglądu mojej konstrukcji, wykluczyło to wszelkie wyświetlacze znaków Nokia i LCD. OLED też nie wchodzą w rachubę, ponieważ są małe. Zdecydowałem się więc na kolorowy wyświetlacz TFT. Nie ma potrzeby korzystania z ekranu dotykowego, ponieważ będzie on znajdował się wewnątrz komputera. Znalazłem 3,5-calowy, już zaprojektowany dla Arduino, ~ 15 € na Amazon. Wystarczająco dobry.

Teraz, gdy już znalazłem sprzęt, skupiłem się na oprogramowaniu.

Prawie wszystkie projekty, po stronie Arduino, są dość podobne. Muszę tylko dostosować kod wyświetlacza i protokołu komunikacyjnego do zbierania danych z aplikacji serwera. Po stronie komputerów większość projektów była oparta na C, C++, C#, pythonie, a większość projektów oferowała tylko interfejs CLI lub serwer podobny do usługi Windows. Zamiast tego chciałem GUI. Nigdy nie używałem żadnego języka podobnego do C w Windowsie, nie mówiąc już o budynku GUI. Ale 15 lat temu nauczyłem się trochę Visual Basica, więc spróbowałem i pobrałem darmową wersję Visual Studio od Microsoftu.

Po przestudiowaniu wielu podobnych projektów zdecydowałem się użyć OpenHardwareMonitor, aby uzyskać wszystkie informacje o sprzęcie i RivaTuner dla FPS, ponieważ są one bezpłatne i wystarczająco udokumentowane.

Krok 2: Testowanie sprzętu

Testowanie sprzętu
Testowanie sprzętu
Testowanie sprzętu
Testowanie sprzętu
Testowanie sprzętu
Testowanie sprzętu

Przed włączeniem lutownicy i zamocowaniem na zawsze w czasie i przestrzeni dowolnego elementu elektronicznego, dobrą praktyką jest zbudowanie prototypu testowego (wskazówka numer dwa). Na szczęście to już nie rok 1995. W dzisiejszych czasach dość łatwo jest ułożyć dość skomplikowane prototypy nawet na małych płytkach stykowych. W moim przypadku wyświetlacz TFT miał spadek pinoutów dla Arduino Uno, więc upuściłem go na moim Arduino uno i zacząłem bawić się przykładowymi bibliotekami i czytać instrukcje obsługi, aby zrozumieć jego zasady działania i ograniczenia.

W tym momencie wymyśliłem, jak rysować linie i bitmapy oraz pisać tekst, więc zacząłem bawić się kodowaniem oprogramowania, pozostawiając wszystkie drugorzędne rzeczy na później, ale tutaj dołączę czujnik temperatury.

W pewnym momencie na ekranie pojawiło się puste miejsce, ale żadne dane z czujników komputera nie były naprawdę przydatne, więc zdecydowałem się umieścić czujnik temperatury wewnątrz obudowy na temperaturę otoczenia. Wyświetlacz zjada prawie wszystkie piny Arduino, na szczęście analogowy pin A5 jest nieużywany, więc związałem TMP36. Testowałem nawet DHT22, ale to przesada dla tej aplikacji.

Istnieje wiele przykładów TMP36, po prostu skopiowałem jeden z nich w funkcji. TMP35 ma 3 piny, Vin idzie do 5V, GND idzie do masy a Out idzie na pin A5. Pomiędzy Vin a GND umieściłem kondensator ceramiczny 0,1uF. Mówią, że to potrzebne. Prawdopodobnie w tym przypadku jest to bezużyteczne, ale… Ustawiłem nawet analogowe napięcie odniesienia Arduino na pin 3,3 V dla lepszego odczytu temperatury. W tym przypadku nadal bezużyteczne, ale…

Krok 3: Kod Arduino

Pobierz i otwórz dołączony kod Arduino, aby postępować zgodnie z wyjaśnieniem w tym kroku. Próbowałem zostawić wystarczająco dużo komentarzy w kodzie, aby był przejrzysty bez zalewania go.

Na pewno będziesz potrzebować bibliotek MCUFRIEND_kbv i Adafruit GFX. Oba łatwe do zainstalowania z Arduino IDE.

Program można podzielić na sekcje takie jak:

  1. zdefiniuj i zadeklaruj wszystkie zmienne globalne i inne potrzebne rzeczy
  2. zainicjować wyświetlacz, ustawić zewnętrzne odwołanie i narysować interfejs użytkownika (wszystko to jest zawarte w funkcji setup(), ponieważ musi działać tylko raz)
  3. odczytać dane z połączenia szeregowego i alokować je w tablicy (funkcja loop())
  4. odczyt danych z czujnika temperatury zewnętrznej (funkcja readExtTemp())
  5. drukowanie danych na wyświetlaczu (funkcja printData())
  6. powrót do pętli

CZĘŚĆ 1: Deklaracje i definicje

W początkowej części kodu użyłem wielu wskaźników i tablic, dzięki czemu mogłem skrócić wiele powtarzających się wierszy kodu, aby napisać dla cykli FOR. Tak, jestem leniwy. Jak widać, zadeklarowałem tablicę wskaźników i wypełniłem ją wszystkimi obrazkami z pliku pics.h. Umożliwiło to wykonanie sztuczki z cyklem FOR, aby narysować wszystkie ikony.

SEKCJA 2: setup(), głównie rysowanie interfejsu użytkownika

Zdecydowałem się na domyślną czcionkę, ponieważ nie ma ona przezroczystego tła, dzięki czemu pozwala napisać nową linię tekstu na starej bez konieczności jej usuwania. Użycie innej czcionki oznaczałoby narysowanie czarnego kwadratu na starym tekście przed napisaniem nowej linii, co prowadziłoby do nieprzyjemnego efektu migotania.

Po kilku testach doszedłem do dobrego kompromisu pomiędzy czytelnością a wyświetlanymi informacjami. Wyświetlacz podzieliłem na dwie kolumny i 5 wierszy. Lewa kolumna dotyczy danych procesora i płyty głównej, w tym nazwy procesora od góry do dołu, temperatury, obciążenia, użycia pamięci RAM i temperatury płyty głównej. Właściwy dedykowany do GPU i zawiera nazwę GPU, temperaturę, obciążenie, licznik klatek na sekundę i zewnętrzny czujnik temperatury.

Jak widać w kodzie, postanowiłem uniknąć używania zdjęć na karcie SD, ponieważ ładuje się ona naprawdę wolno. Postanowiłem umieścić wszystkie ikony w pamięci PROGMEM i rysować linie za pomocą dedykowanego polecenia drawLine(). jest to również przydatne w przypadku drobnych poprawek interfejsu użytkownika.

Próbując nadać interfejsowi wrażenie głębi, narysowałem wszystko po dwa (linie, prostokąty, obrazki) różnymi kolorami iz niewielkim przesunięciem. Niestety nie jest to wynik, na który liczyłem, ale załatwi sprawę.

Ostatnie wiersze tej funkcji służą do drukowania symboli zastępczych na TFT, dopóki Arduino nie otrzyma danych.

SEKCJA 3: main loop(), pobieranie i formatowanie danych

Tutaj dzieje się magia: dane są odbierane przez serial, przypisywane do właściwej zmiennej, a następnie drukowane. Aby osiągnąć to wszystko w jak najmniejszej liczbie wierszy, użyłem polecenia switch case i cyklu for.

Protokół komunikacyjny, z którym przyszedłem, jest podzielony na dwie części: początkowe wykonanie po uścisku dłoni i rzeczywistą część danych.

Uścisk dłoni jest potrzebny do wdrożenia funkcji automatycznego połączenia podczas uruchamiania programu PC. To wygląda tak:

  • PC wysyła ciąg uzgadniania (w tym przypadku jest to po prostu "*****;")
  • Arduino odsyła odpowiedź

Bułka z masłem.

Część danych wygląda tak: „i:xxx, yyy, zzz, aaa,;” znaczenie to:

"i" to indeks, nazwałem go w kodzie componentSelector. Wartości „i” to:

  • i=0 - NAZWY. Następujące wartości są nazwami wyświetlanymi w pierwszym wierszu na wyświetlaczu. Zostanie to wysłane i wydrukowane na wyświetlaczu tylko raz, na dzień dzisiejszy dość trudno jest hotswap CPU i GPU…
  • i=1 - DANE 1 KOLUMNY - w lewej połowie wyświetlacza od góry do dołu wyświetlane są następujące wartości. W moim przypadku: temperatura procesora, obciążenie procesora, użycie pamięci RAM, temperatura płyty głównej.
  • i=2 - DANE 2 KOLUMNY - jw, ale dla prawej połowy wyświetlacza
  • i=3 - POLECENIE WYDRUKU. W tym przypadku nieprzetworzony ciąg seryjny będzie po prostu „3:;” ponieważ inne dane nie są potrzebne.

„xxx, yyy, zzz, aaa” to rzeczywiste wartości. są one odczytywane jako ciągi przez arduino, a całe formatowanie wykonuje program na PC. Dla i=0 wartości te mają po 14 znaków dla nazw sprzętu. Dla i=1 lub 2 będą to tylko trzy znaki, co wystarczy do wyświetlania temperatur i klatek na sekundę. Oczywiście ":", ", " i ";" znaki są zabronione w tych polach.

":" jest separatorem między componentSelector a wartościami, "," jest separatorem wartości, a ";" jest koniec linii?

Po odebraniu danych Arduino zapisze je jako ciąg aż do „;” zostanie odebrany symbol, wówczas będzie szukał symbolu ":" i użyje go do uzyskania wartości componentSelecor. Będzie on używany w funkcji obudowy przełącznika w celu wybrania właściwej procedury do wykonania. Służy również do wybrania prawidłowego indeksu w tablicy allData.

Następnie Arduino poszuka symbolu „,” i przystąpi do umieszczania wartości w tablicy allData.

Jeśli componentSelector ma wartość 0, flaga printName zostanie ustawiona na true. Jeśli componentSelector ma wartość 3, wywoływane są funkcje readExtTemp() i printData().

Sekcja 4: funkcja readExtTemp()

Nie ma tu wiele do powiedzenia, odczytuje 32 razy z pinu A5 i wyprowadza wartość temperatury jako ciąg. Jestem z Rebeliantami, więc używam Celsjusza. Każda wartość powyżej 100°C jest nieprawidłowa, więc na wyświetlaczu zostanie wyświetlona jako „---”. Dla wartości niższych niż 100°C zostanie sformatowany tak, aby mieć wystarczająco dużo miejsca, aby pokryć przestrzeń 3 znaków na wyświetlaczu. Możliwe jest wyjęcie i ponowne włożenie czujnika i żadna dziwna wartość nie zostanie wyświetlona.

Sekcja 5: funkcja printData()

Jak zawsze używałem cykli do sekwencyjnego drukowania rzeczy na wyświetlaczu. Jeśli flaga printNames ma wartość true, wydrukuje nazwy, ustawi flagę na false i będzie kontynuować.

Sekcja 6: powrót do pętli

Samo wyjaśnienie wystarczająco, powiedziałbym…

pics.h plik

Tutaj zachowałem wszystkie ikony interfejsu użytkownika. Możliwe jest użycie czytnika kart SD dołączonego do wyświetlacza, ale miałem wystarczająco dużo pamięci w Arduino na moje czarno-białe ikony.

Zaprojektowałem je za pomocą Junior Icon Editor, ponieważ jest darmowy i całkiem dobry do malowania małych ikon w pikselach. Musiałem przekonwertować pliki ikon (zapisane jako PNG) za pomocą narzędzia online SKAARHOJ.

Krok 4: Kod Visual Basic

Kod Visual Basic
Kod Visual Basic

Oto kod VB

UWAGA: po raz pierwszy udostępniam projekt Visual Studio. Po prostu skopiowałem foldery projektu i spakowałem je. Jeśli to nie zadziała, daj mi znać lepszy sposób udostępniania tego rodzaju projektów. Dziękuję Ci

Jak powiedziałem wcześniej, nie jestem w stanie stworzyć GUI w C# lub w innych językach, ale już dawno miałem pewne doświadczenia z Visual Basic. Pobrałem wersję Visual Studio Community (oczywiście za darmo) ze środowiskiem Visual Basic. Cóż, musiałem wymyślić wiele rzeczy, ponieważ ostatnim razem, gdy korzystałem z VB, była to wersja 2005 lub coś takiego… Ale internet jak zwykle jest pełen dobrych wskazówek.

Po ustaleniu kilku rzeczy związanych z interfejsem, nowsza wersja jest w rzeczywistości łatwiejsza i bardziej elastyczna niż stara.

Do tego programu chciałem coś z formularzem Windows, ale w pełni zarządzalne z ikony w zasobniku systemowym. W rzeczywistości używałem tego formularza prawie tylko do celów debugowania, ponieważ lubię umieszczać pola tekstowe i listy, aby odczytać wartości wyjściowe funkcji i niektóre przyciski poleceń, aby je przetestować.

„Ostateczny” program to tylko ikona w zasobniku z wyskakującym menu, które pokazuje różne kontrolki i główny formularz z dwoma listami, które pokazują dane wysyłane do Arduino.

Zaimplementowałem funkcję autoconnect i funkcję „start at boot”. Więcej o tym później.

Główny program to po prostu adaptacja różnych przykładów i fragmentów kodu przy użyciu biblioteki OpenHardwareMonitor i biblioteki RivaTuner Shared Memory.

Program wygląda tak:

  • pobrać dane z bibliotek OpenHardwareMonitor i RTSSSm
  • przygotować i sformatować wszystkie dane do protokołu komunikacyjnego,
  • wyślij dane do Arduino
  • wypłukać i powtórzyć

oczywiście nazwy sprzętu są odczytywane na początku i wysyłane tylko raz.

Licznik FPS aktywuje się tylko wtedy, gdy używana jest kompatybilna aplikacja (np. gra, program do modelowania 3D itd.), w przeciwnym razie na wyświetlacz zostanie wysłany symbol zastępczy „---”.

Nie będę się zagłębiał w wyjaśnianie, jak uzyskać wartości z bibliotek, ponieważ jest to dobrze udokumentowane w Internecie i nieco zrozumiałe z kodu. Chcę tylko opowiedzieć o problemach z wyświetlaniem temperatury płyty głównej przez bibliotekę OpenHardwareMonitor (od teraz OHMonitor, ponieważ życie jest zbyt krótkie). Mam Asus Maximus VIII Gene MoBo, który jest wyposażony w fu **tonowe czujniki temperatury na płycie głównej, ale OHMonitor nazywa je jako Czujnik temperatury #1, #2… #n I nigdzie nie określono lokalizacji temperatury. Musiałem więc zainstalować okropne oprogramowanie Asus AI Suite, w którym czujniki mają co najmniej NAZWY i porównywać różne temperatury między dwoma programami. Wygląda na to, że mój ogólny czujnik temperatury płyty głównej jest nr 2 dla OHMonitor, więc jak widać w sub Timer1_tick pod rzeczami MoBo, musiałem poszukać nazwy czujnika zawierającej ciąg „#2”, aby uzyskać poprawny odczyt.

TL; DR: będziesz musiał sam zadbać o właściwe czujniki temperatury płyty głównej. Reszta jest chyba dobra.

Jednak to tylko wersja 1, planuję zainstalować ten gadżet na moim drugim komputerze, więc prawdopodobnie zaimplementuję sposób wyboru czujników, a może nawet przeprojektuję interfejs Arduino w podróży.

Funkcja automatycznego łączenia

Ta funkcja jest właściwie prosta: jeśli komputer nie jest połączony z Arduino, co x milisekund (w oparciu o Timer1) ta funkcja jest wywoływana. Próbuje połączyć się z każdym portem COM na komputerze, jeśli się powiedzie, wysyła ciąg uzgadniania "*****;". Jeśli odpowiedź brzmi „R”, oznacza to, że podłączone jest prawidłowe urządzenie i postępuje się zgodnie z normalną procedurą. W przeciwnym razie próbuje następnego portu COM.

Jak widać, w tej funkcji jest wiele wyjątków. To dlatego, że chciałem, aby był w pełni plug and play, bez wyjścia błędów. Obsługując wyjątki, udało mi się zignorować całkowity brak urządzenia zewnętrznego i mogę nawet hotplug i hotunplug, kiedy tylko chcę, bez generowania błędu zerwania programu.

Funkcja Start przy rozruchu

Chciałem, żeby program uruchamiał się przy starcie. Mówisz, całkiem proste. Powiesz, że umieść link w odpowiednim folderze. Ale nie. Ze względu na biblioteki OHMonitor i RTSS do zbierania informacji potrzebujemy poziomu wykonania administratora. Oznacza to całkowicie irytujący ekran UAC za każdym razem, gdy ta aplikacja jest uruchamiana. Nie ma mowy. Zaadaptowałem więc skrypt stworzony przez Matthew Wai (link tutaj), aby uzyskać cichy start przy starcie. Po prostu skopiowałem skrypt do pliku Resources1, podzieliłem go na kilka części, a następnie zaimplementowałem podprogram, który tworzy (lub usuwa) plik zadań systemu Windows, dostosowany do bieżącej lokalizacji wykonywalnej programu i tym podobnych rzeczy.

Ikona w zasobniku systemowym

Dzięki obiektom NotifyIcon i ContextMenu udało mi się zaimplementować łatwy i gruby sposób kontrolowania aplikacji. Wystarczy kliknąć prawym przyciskiem myszy ikonę zasobnika i pojawi się menu. Są te opcje:

  • Rozpocznij przy starcie: możesz zaznaczyć i odznaczyć, aby włączyć lub wyłączyć funkcję startu przy starcie
  • Automatyczne łączenie: tak samo jak powyżej, ale obsługuje funkcję automatycznego łączenia
  • Connect/Disconnect: obsługuje połączenie. Nie działa z włączonym automatycznym połączeniem
  • Czas odświeżania: daje rozwijane podmenu, możesz wybrać czas odświeżania od 1 do dziesięciu sekund
  • Maksymalizuj: otwiera okno główne. To samo, co dwukrotne kliknięcie ikony
  • Wyjście: samo wyjaśniające

Kompilacja oprogramowania

Aby skompilować oprogramowanie, prawdopodobnie będziesz musiał pobrać i dodać referencję do bibliotek, które nie są zawarte w kodzie.

Bibliotekę OpenHardwareMonitor znajdziesz tutaj. Musisz pobrać oprogramowanie, otworzyć plik zip i skopiować plik OpenHardwareMonitorLib. DLL do folderu projektu.

Oto link do biblioteki RTSSharedMemoryNET, musisz pobrać i skompilować dla swojej architektury, a następnie skopiować plik RTSS[TL;DR]moryNET. DLL do folderu projektu.

Teraz musisz dodać odwołanie w swoim kodzie, instrukcje tutaj

Tylko pamiętaj, aby skompilować projekty serwerów RTSS[TL;DR]moryNET i PCHwMon dla tej samej architektury.

Dołączyłem gotowy program instalacyjny, dzięki czemu możesz zainstalować całość bez grzebania w Visual Basic. Jest skompilowany dla x86, będzie działał zarówno na architekturze x86, jak i x64. Do uruchomienia wymagana jest platforma. NET Framework 4.7.2.

W każdym razie będziesz musiał zainstalować RivaTuner. Możesz go znaleźć tutaj jako samodzielną aplikację lub zainstalować Msi Afterburner, który powinien zawierać RTServer.

Krok 5: Ostateczna implementacja sprzętu

Zalecana: