INHOUDSOPGAWE:

PC hardeware monitor: 6 stappe (met foto's)
PC hardeware monitor: 6 stappe (met foto's)

Video: PC hardeware monitor: 6 stappe (met foto's)

Video: PC hardeware monitor: 6 stappe (met foto's)
Video: You're Using Your Monitor WRONG! (Here's How to Fix It) 2024, Julie
Anonim
PC hardeware monitor
PC hardeware monitor
PC hardeware monitor
PC hardeware monitor
PC hardeware monitor
PC hardeware monitor

Haai almal. Ek het hierdie projek om twee redes begin: ek het onlangs 'n waterverkoelinglus in my rekenaar gebou en het iets nodig gehad om ruimte in die kas visueel te vul, en ek wou die temperatuur en ander statistieke vinnig laat nagaan sonder dat OSD -opnames die hoek van die skerm. Daarvoor is daar natuurlik klaargemaakte oplossings, maar die meeste pas nie by my feng shui nie. Dus, in plaas daarvan om 'n HDMI 7 -skerm in my omhulsel te plaas met 'n kabel wat uit die omhulsel steek en die taakbalk van die vensters altyd aan, het ek besluit om my eie speelding te bou.

Aangesien ek nie 'n ingenieur of 'n programmeerder is nie, maar net 'n man met 'n soldeerbout en 'n bietjie selfopgeleide kennis, is dit nie net 'n stap-vir-stap instruksie nie, maar ek sal ook fokus op die probleem oplossings- en navorsingsaspekte wat my tot hierdie konstruksie gelei het.

VRYWARING: AL MY WERK WORD GEDEEL AS KREATIEWE GEMEENSKAPLIKE AANTREKKING-AANDELING 4.0. EK HET INSPIRASIE UIT BAIE VOORBEELDE OP DIE INTERNET GEMAAK, AS JY 'N GEDEELTE VAN HIERDIE WERK AS JOU UITKEN, KONTAK MY ASB VIR ATTRIBUSIE. Geen oortreding is bedoel nie, ek sal gelukkig wees om enige fout reg te stel. DANKIE

TWEEDE VRYWARING: MY WERK WORD gedeel soos dit is. EK IS NIE VERANTWOORDELIK VIR ENIGE SKADE AAN DIE GEBRUIK VAN ENIGE MY KODE OF INSTRUKSIES NIE

Voorrade

  • Arduino Nano (of UNO as jy wil)
  • TFT -skerm. In my geval is dit 'n ILI9486 / ILI9488L -versoenbare 3,5 "-skerm.
  • Temperatuur Senso. In my geval 'n analoog TMP36 temp sensor.
  • Kabels, drade, dupont -verbindings (meer hieroor later)
  • (opsioneel) Broodbord om te toets
  • (opsioneel, maar aanbeveel) 'n klein bord

Stap 1: Uitvoerbaarheidstudie (soort van)

Soos ek gesê het, wou ek nie hê nie, en ek het 'n HDMI -skerm in my rekenaarkas vasgesteek, so ek het my eie vindingrykheid begin soek na soortgelyke idees op die internet. En dit is wenk nommer een: Google is jou vriend (wel, enige ordentlike soekenjin …). Ons leef in 'n wêreld waarin niks meer oorspronklik is nie, maar in plaas daarvan om na hierdie frase met 'n negatiewe betekenis te kyk, kan ons dit tot ons voordeel gebruik: wat u ook al wil skep, waarskynlik het iemand êrens al iets soortgelyks gedoen, so as u weet nie hoe u 'n idee moet implementeer nie, maar die kans is goed dat u nuttige inligting daaroor sal vind. As u op die internet soek, is dit dikwels handig om aan twee reëls te let:

  1. moenie na bladsy 3 of 4 van enige soektog gaan nie; dit is amper altyd tydmors. In plaas daarvan
  2. verander die soekterme, herformuleer die vraag net vanuit 'n ander oogpunt (dws: "arduino temperatuursensor" -> "lees temperatuur met arduino").

Dit is eintlik vol goeie projekte, en ek erken dat ek die eerste dae die meeste van hierdie projekte bestudeer het. Maar nie een van hulle was gereed om vir my te gaan nie, want ek wou iets hê wat by my behoeftes pas.

Aangesien ek iets aangepas moes maak, het ek besluit om te konsentreer op die regte hardeware om te gebruik en die sagtewarekant vir later te laat, want die sagteware kan altyd geskep en aangepas word volgens die behoeftes, aan die ander kant is die hardeware kant gebonde aan beskikbaarheid en funksies.

Ek wou iets hê wat gebaseer is op Arduino, want ek het dit al gehad, dit is goed gedokumenteer en die gemeenskap floreer. Geen probleem hier nie, soos ek al gesê het, baie inligting.

Ek wou 'n skerm hê wat groot genoeg was om 'n paar meter verder duidelik te sien, en dit pas by die voorkoms van my gebou, dit sluit enige Nokia- en LCD -karakterskerm uit. OLED is ook nie ter sprake nie, aangesien hulle klein is. Ek het dus gekies vir 'n TFT -kleurskerm. U hoef geen aanraakskerm te hê nie, aangesien dit binne -in die rekenaar sal wees. Ek het 'n 3,5 een, reeds ontwerp vir Arduino, ~ 15 € op Amazon gevind. Goed genoeg.

Nou, nadat die hardeware vasgestel is, het ek gefokus op die sagteware.

Byna al die projekte, aan die kant van Arduino, is baie soortgelyk. Ek hoef net die kode vir die skerm en die kommunikasieprotokol aan te pas om data uit die bediener -app te versamel. Rekenaarkant, die meeste projekte was gebaseer op C, C ++, C#, python en die meeste projekte het slegs 'n CLI-koppelvlak of 'n Windows-diensagtige bediener aangebied. Ek wou eerder 'n GUI hê. Ek het nooit 'n C-agtige taal in Windows gebruik nie, laat staan die GUI-gebou. Maar ek het 15 jaar gelede Visual Basic geleer, so ek het dit probeer en die gratis Visual Studio -weergawe van Microsoft afgelaai.

Nadat ek baie soortgelyke projekte bestudeer het, het ek besluit om OpenHardwareMonitor te gebruik om al die hardeware -inligting en RivaTuner vir FPS te kry, want dit is gratis en genoeg gedokumenteer.

Stap 2: Toets hardeware

Hardeware toets
Hardeware toets
Hardeware toets
Hardeware toets
Hardeware toets
Hardeware toets

Voordat u die soldeerbout aansit en vir altyd in tyd en ruimte enige elektroniese komponent regmaak, is dit goed om 'n toetsprototipe te bou (punt nommer twee). Gelukkig is dit nie meer 1995 nie. Tans is dit redelik maklik om taamlik ingewikkelde prototipes te rangskik, selfs op klein broodborde. In my geval het die TFT -skerm 'n daling in die pinout vir Arduino Uno gehad, so ek het dit op my Arduino uno laat val en met die voorbeeldbiblioteke begin speel en die naslaanhandleidings gelees om die beginsels en beperkings daarvan te verstaan.

Op hierdie stadium het ek agtergekom hoe om lyne en bitmaps te teken en teks te skryf, so ek het begin knoeier met sagteware -kodering, en al die sekondêre dinge vir later gelaat, maar ek sal die temperatuursensor hier insluit.

Op 'n stadium het ek 'n leë plek op die skerm gehad, maar nie een van die data van die PC -sensors was regtig nuttig nie, so ek het besluit om 'n temperatuursensor in die omhulsel te plaas vir omgewingstemperatuur. Die skerm vreet byna al die Arduino -penne op, gelukkig is die analoog pen A5 ongebruik, so ek het 'n TMP36 vasgemaak. Ek het selfs 'n DHT22 getoets, maar dit is te veel vir hierdie toepassing.

Daar is baie voorbeelde vir die TMP36; ek het net een hiervan in 'n funksie gekopieer. Die TMP35 het 3 penne, Vin gaan na 5V, GND gaan grond toe en Out gaan na pin A5. Ek het 'n 0.1uF keramiek kondensator tussen Vin en GND geplaas. Hulle sê dit is nodig. Waarskynlik is dit in hierdie geval nutteloos, maar … ek het selfs die analoge Arduino -verwysingspanning op die 3.3v -pen gestel vir 'n beter temperatuurlesing. Nog steeds nutteloos in hierdie geval, maar …

Stap 3: Arduino -kode

Laai die ingesluit Arduino -kode af en maak dit oop om die verduideliking in hierdie stap te volg. Ek het probeer om genoeg kommentaar in die kode te gee om duidelik te wees sonder om dit te oorstroom.

U het beslis die MCUFRIEND_kbv en die Adafruit GFX -biblioteke nodig. Beide kan maklik geïnstalleer word vanaf die Arduino IDE.

Die program kan onderverdeel word in afdelings soos volg:

  1. definieer en verklaar al die globale veranderlikes en ander benodigde dinge
  2. initialiseer die skerm, stel die eksterne verwysing in en teken die UI (dit alles bevat in die setup () -funksie, aangesien dit slegs een keer moet werk)
  3. lees data van die seriële verbinding en ken dit toe in die skikking (loop () funksie)
  4. lees eksterne tempsensordata (funksie readExtTemp ())
  5. druk data op die skerm (printData () -funksie)
  6. terug na die lus

AFDELING 1: Verklarings en definisies

In die aanvanklike afdeling van die kode het ek baie wenke en skikkings gebruik, sodat ek baie herhalende reëls kode korter kon druk om VIR siklusse te skryf. Ja, ek is lui. Soos u kan sien, verklaar ek 'n wyserreeks en vul dit met al die foto's uit die pics.h -lêer. Dit het dit moontlik gemaak om die FOR -siklus -truuk te doen om al die ikone te teken.

AFDELING 2: Opstelling (), meestal UI -tekening

Ek het besluit met die standaard lettertipe, aangesien dit nie 'n deursigtige agtergrond het nie, dus kan ek 'n nuwe reël teks oor 'n ou skryf sonder om dit te verwyder. Deur 'n ander lettertipe te gebruik, sou 'n swart vierkant oor die ou teks geteken gewees het voordat 'n nuwe reël geskryf is, wat 'n onaangename flikkering sou veroorsaak.

Na 'n paar toetse het ek 'n goeie kompromie bereik tussen leesbaarheid en getoonde inligting. Ek het die skerm in twee kolomme en 5 rye verdeel. Die linkerkolom gaan oor CPU- en moederborddata, insluitend CPU -naam van bo na onder, temperatuur, laai, RAM -gebruik en moederbordtemperatuur. Die regte een is toegewy aan GPU en bevat GPU -naam, temperatuur, vrag, Frames Per Second -teller en eksterne temperatuursensor.

Soos u in die kode kan sien, het ek besluit om nie foto's op die SD -kaart te gebruik nie, aangesien dit baie stadig is om te laai. Ek het besluit om al die ikone in die PROGMEM -geheue op te neem en die lyne te teken met die toegewyde drawLine () -opdrag. dit is ook nuttig vir klein UI -regstellings.

In die swak poging om die UI 'n diepte -voorkoms te gee, het ek twee van alles (lyne, reghoeke, prente) met verskillende kleure en met 'n klein offset geteken. Ongelukkig is dit nie die resultaat waarop ek gehoop het nie, maar dit sal die ding doen.

Die laaste reëls van hierdie funksie is vir die druk van plekhouers op die TFT totdat die Arduino die data sal ontvang.

AFDELING 3: hooflus (), ophaal en opmaak van data

Hier gebeur die magie: data word deur middel van die reeks ontvang, aan die korrekte veranderlike toegewys en dan gedruk. Om dit alles in die minste aantal reëls te bereik, het ek 'n switch case -opdrag en 'n for cycle gebruik.

Die kommunikasieprotokol waarmee ek gekom het, is in twee dele verdeel: 'n eerste handdruk en 'n werklike gegewensgedeelte.

Die handdruk is nodig vir die implementering van die outokonneksie -funksie wanneer die rekenaarprogram begin. Dit gaan so:

  • PC stuur die handdrukstring (in hierdie geval is dit net "*****;")
  • Arduino stuur 'n antwoord terug

Baie maklik.

Die data gedeelte lyk so: "i: xxx, yyy, zzz, aaa,;" die betekenis is:

"i" is die indeks, ek noem dit componentSelector in die kode. "i" waardes is:

  • i = 0 - NAME. Die volgende waardes is die name wat in die rye op die skerm vertoon word. Dit word slegs een keer op die skerm gestuur en gedruk, aangesien dit vandag nogal moeilik is om CPU en GPU te verwissel …
  • i = 1 - 1ste KOLOMGEGEWENS - die volgende waardes word in die linker helfte van die skerm van bo na onder getoon. In my geval: CPU temp, CPU load, RAM usage, Motherboard temp.
  • i = 2 - 2de KOLOMGEGEWENS - soos hierbo, maar vir die regter helfte van die skerm
  • i = 3 - AFDRUKOPDRAG. In hierdie geval is die rou reeksreeks slegs "3:;" aangesien ander data nie nodig is nie.

"xxx, yyy, zzz, aaa" is die werklike waardes. dit word deur die arduino as snare gelees en die hele opmaak word deur die rekenaarprogram gemaak. Vir i = 0 is hierdie waardes elk 14 karakters vir die hardeware name. Vir i = 1 of 2 is dit slegs drie karakters elk, genoeg om temperature en rame per sekonde te wys. Natuurlik die ":", "," en ";" karakters is verbode in hierdie velde.

Die ":" is die skeiding tussen componentSelector en waardes, die "," is die waardeskeider en die ";" is die einde van die reël

As die data ontvang word, sal die Arduino dit as 'n string stoor tot die ";" simbool ontvang word, dan sal dit na die ":" simbool soek en dit gebruik om die componentSelecor -waarde te kry. Dit word gebruik vir die skakelaarfunksie om die korrekte prosedure te kies om te volg. Dit word ook gebruik om die korrekte indeks in die allData -skikking te kies.

Hierna sal die Arduino na die "," simbool soek en die waardes in die allData -skikking plaas.

As die componentSelector 0 is, word die printName -vlag op true gestel. As componentSelector 3 is, word readExtTemp () en printData () funksies genoem.

Afdeling 4: readExtTemp () -funksie

Hier is nie veel te sê nie, dit lees 32 keer van pen A5 en gee die temperatuurwaarde as 'n string uit. Ek is by die Rebels, so ek gebruik Celsius. Enigiets meer as 100 ° C is verkeerd, so dit sal as "---" op die skerm vertoon word. Vir enigiets minder as 100 ° C sal dit geformateer word om genoeg spasies te hê om die ruimte van 3 karakters op die skerm te dek. Dit is moontlik om die sensor te verwyder en weer in te sit, en daar word geen vreemde waarde getoon nie.

Afdeling 5: printData () -funksie

Soos altyd het ek gereeld vir siklusse dinge op die skerm gedruk. As die vlag printNames waar is, sal dit die name druk, die vlag op vals stel en voortgaan.

Afdeling 6: terug na die lus

Self genoeg verduidelik, sou ek sê …

pics.h lêer

Hier het ek al die ikone vir die UI gestoor. Dit is moontlik om die SD -kaartleser op die skerm te gebruik, maar ek het genoeg geheue in die Arduino oor vir my swart en wit ikone.

Ek het dit ontwerp met Junior Icon Editor, aangesien dit gratis en redelik goed is om klein ikone te pixel skilder. Ek moes die ikoonlêers (gestoor as PNG) omskakel met die SKAARHOJ -hulpmiddel.

Stap 4: Visual Basic Code

Visuele basiese kode
Visuele basiese kode

Hier is die VB -kode

KENNISGEWING: dit is die eerste keer dat ek 'n Visual Studio -projek deel. Ek het net die projekvouers gekopieer en dit gerits. As dit nie werk nie, laat weet my asseblief 'n beter manier om hierdie soort projekte te deel. Dankie

Soos ek vroeër gesê het, is ek nie in staat om 'n GUI in C# of ander tale te skep nie, maar ek het 'n lang tyd ervaring in Visual Basic gehad. Ek het die Visual Studio Community -uitgawe afgelaai (dit is natuurlik gratis) met die Visual Basic -omgewing. Wel, ek moes baie dinge uitvind, want die laaste keer dat ek VB gebruik het, was dit weergawe 2005 of so … Maar die internet is soos gewoonlik vol goeie wenke.

Nadat u 'n paar koppelvlak -dinge uitgevind het, is die nuwer weergawe eintlik makliker en buigbaarder as die ou.

Vir hierdie program wou ek iets hê met 'n venstersvorm, maar heeltemal hanteerbaar vanaf die ikoon van die stelselbalk. Ek het die vorm eintlik amper net vir ontfoutingsdoeleindes gebruik, aangesien ek teksbakke en lyste wil plaas om die uitvoerwaardes van die funksies te lees en 'n paar opdragknoppies om dit te toets.

Die 'finale' program is slegs 'n skinkbord -ikoon met 'n opspringmenu wat die verskillende kontroles wys en 'n hoofvorm met twee lysblokkies wat die data wat na die Arduino gestuur is, vertoon.

Ek het 'n outokoppelingsfunksie geïmplementeer en 'n 'begin by opstart' -funksie. Meer hieroor later.

Die hoofprogram is slegs 'n aanpassing van verskillende voorbeelde en stukke kode met behulp van die OpenHardwareMonitor -biblioteek en die RivaTuner Shared Memory -biblioteek.

Die program verloop soos volg:

  • kry die data van OpenHardwareMonitor- en RTSSSm -biblioteke
  • berei al die data vir die kommunikasieprotokol voor en formateer dit
  • stuur die data na die Arduino
  • spoel en herhaal

natuurlik word die hardeware -name aan die begin gelees en slegs een keer gestuur.

Die FPS-toonbank word slegs geaktiveer wanneer 'n versoenbare app gebruik word (bv. 'N speletjie, 'n 3D-modelleringsprogram, ensovoorts), anders word die' --- 'plekhouer na die skerm gestuur.

Ek sal nie diepgaande verduidelik hoe ek die waardes uit die biblioteke kan haal nie, want dit is goed gedokumenteer op die internet en ietwat verstaanbaar uit die kode. Ek wil net vertel oor die probleme om die moederbordtemperatuur deur die OpenHardwareMonitor (van nou af OHMonitor, omdat die lewe te kort is) deur die biblioteek te wys. Ek het 'n Asus Maximus VIII Gene MoBo, wat toegerus is met 'n fu ** ton temperatuursensors op die moederbord, maar OHMonitor noem dit as Temperatuursensor #1, #2 … #n EN die temperatuurplek word nêrens gespesifiseer nie. Ek moes dus die aaklige Asus AI suite -sagteware installeer, waar die sensors ten minste NAME het en die verskillende temperature tussen die twee programme vergelyk. Dit lyk asof my generiese tempsensor op moederbord nommer 2 is vir OHMonitor, so soos u kan sien in die Timer1_tick -sub onder die MoBo -materiaal, moes ek 'n sensornaam soek wat die string " #2" bevat om die korrekte lesing te kry.

TL; DR: u moet self na die korrekte temperatuursensors van die moederbord kyk. Die res is waarskynlik goed om te gaan.

Dit is egter slegs weergawe 1, ek is van plan om hierdie gadget op my ander rekenaar te installeer, so ek sal waarskynlik 'n manier implementeer om die sensors te kies en miskien selfs die koppelvlak op die Arduino onderweg te herontwerp.

Die outokoppelfunksie

Hierdie funksie is eintlik eenvoudig: as die rekenaar nie aan 'n Arduino gekoppel is nie, word hierdie funksie elke x millisekondes (gebaseer op die timer1) genoem. Dit probeer kontak maak met elke COM -poort op die rekenaar, as dit suksesvol is, stuur dit die handdrukstring "*****;". As die antwoord "R" is, word die korrekte toestel gekoppel en word die normale prosedure gevolg. Anders probeer die volgende COM -poort.

Soos u kan sien, is daar baie uitsonderings in hierdie funksie. Dit is omdat ek dit heeltemal plug and play wou hê, sonder foutopvoer. As ek die uitsonderings hanteer het, kon ek die volledige afwesigheid van die eksterne toestel laat ignoreer, en ek kan die toestel selfs weer koppel en weer loskoppel sonder om 'n breekfout vir die program te veroorsaak.

Die funksie Begin by opstart

Ek wou hê dat die program by die begin moet begin. Redelik maklik, sê jy. Plaas 'n skakel in die toepaslike gids, sê jy. Maar nee. As gevolg van die OHMonitor- en RTSS -biblioteke, benodig ons die uitvoeringsvlak van die administrateur om inligting te versamel. Dit beteken dat die UAC -skerm heeltemal irriterend is elke keer as hierdie app bekendgestel word. Glad nie. Daarom het ek die skrif wat Matthew Wai gemaak het (skakel hier) aangepas om 'n stille begin by die begin te kry. Ek het sopas die script in die Resources1 -lêer gekopieer, in verskillende dele verdeel, en 'n subroutine geïmplementeer wat 'n Windows -taaklêer skep (of verwyder), aangepas met die huidige uitvoerbare plek van die program en sulke dinge.

Die stelselbak -ikoon

Danksy die NotifyIcon- en ContextMenu -voorwerpe kon ek 'n maklike en vette manier implementeer om die app te beheer. Klik net met die rechtermuisknop op die skinkbord -ikoon en die spyskaart verskyn. Daar is hierdie oprions:

  • Begin by opstart: u kan dit aan- en uitskakel om die begin by opstartfunksie in of uit te skakel
  • Outokoppel: dieselfde as hierbo, maar hanteer die outokoppelingsfunksie
  • Koppel/ontkoppel: dit hanteer die verbinding. Werk nie met die outokonneksie aangeskakel nie
  • Herlaai tyd: gee 'n aftrek -submenu; u kan die verversingstyd van 1 tot tien sekondes kies
  • Maksimaliseer: maak die hoofvenster oop. Dieselfde as om op die ikoon te dubbelklik
  • Uitgang: selfverduidelikend

Die opstel van die sagteware

Om die sagteware saam te stel, sal u waarskynlik die biblioteke wat nie in die kode is nie, moet aflaai en 'n verwysing moet byvoeg.

U kan die OpenHardwareMonitor -biblioteek hier vind. U moet die sagteware aflaai, die zip -lêer oopmaak en die OpenHardwareMonitorLib. DLL -lêer in die projektmap kopieer.

Hier is die skakel na die RTSSharedMemoryNET -biblioteek; u moet dit aflaai en opstel vir u argitektuur, en dan die RTSS [TL; DR] moryNET. DLL in u projektmap kopieer.

U moet nou 'n verwysing by u kode voeg, instruksies hier

Maak net seker dat u beide die RTSS [TL; DR] moryNET- en PCHwMon -bedienerprojekte vir dieselfde argitektuur saamstel.

Ek het 'n gereedgemaakte opstelprogram ingesluit, sodat u die hele ding kan installeer sonder om met Visual Basic te peuter. Dit is saamgestel vir x86, werk op beide x86 en x64 argitekture. Dit vereis dat die. NET -raamwerk 4.7.2 werk.

In elk geval moet u RivaTuner installeer. U kan dit hier vind as 'n selfstandige app, of u kan Msi Afterburner installeer, wat die RTServer moet insluit.

Stap 5: Finale implementering van hardeware

Aanbeveel: