Innholdsfortegnelse:

PC -maskinvareovervåking: 6 trinn (med bilder)
PC -maskinvareovervåking: 6 trinn (med bilder)

Video: PC -maskinvareovervåking: 6 trinn (med bilder)

Video: PC -maskinvareovervåking: 6 trinn (med bilder)
Video: 🔥 How To Remove ANYTHING From a Photo in Photoshop! 2024, Juli
Anonim
PC Hardware Monitor
PC Hardware Monitor
PC Hardware Monitor
PC Hardware Monitor
PC Hardware Monitor
PC Hardware Monitor

Hei alle sammen. Jeg startet dette prosjektet av to grunner: Jeg bygde en vannkjølingssløyfe i min PC nylig og trengte noe for å visuelt fylle litt plass i saken OG jeg ønsket å få sjekket temperaturer og annen statistikk med en rask titt uten at OSD -sjangere fylte hjørne av skjermen. Selvfølgelig er det ferdige løsninger for det, men de fleste av dem ville bare ikke passe min feng shui. Så i stedet for å sette en 7 -tommers HDMI -skjerm i etuiet mitt med en kabel som stikker ut saken og oppgavelinjen i Windows alltid er på, bestemte jeg meg for å bygge mitt eget leketøy.

Siden jeg ikke er ingeniør eller programmerer, men bare en fyr med loddejern og litt selvlært kunnskap, vil dette ikke bare være en trinnvis instruksjon, jeg vil også prøve å fokusere på problemet løse og forskningsaspekter som førte meg til dette bygget.

ANSVARSFRASKRIVELSE: ALT MITT ARBEID ER DELT SOM KREATIVT FELLES ATTRIBUTION-SHAREALIKE 4.0. JEG TAR INSPIRASJON FRA MANGE EKSEMPLER PÅ HELE INTERNETTET, HVIS DU GJENNERKJENNER EN DEL AV DETTE ARBEIDET SITT DITT, KONTAKT MEG FOR ATTRIBUSJON. INGEN KENGELSE ER TILTAKET, JEG BLI GLAD FOR Å KORRIGERE ALLE FEIL. TAKK SKAL DU HA

ANDEN ANSVARSFRASKRIVELSE: MITT ARBEID ER DELT SOM DET ER. JEG ER IKKE ANSVARLIG FOR NOEN SKADE FRA BRUK AV NOEN AV MIN KODE ELLER INSTRUKSJONER

Rekvisita

  • Arduino Nano (eller UNO hvis du vil)
  • TFT -skjerm. I mitt tilfelle er det en ILI9486 / ILI9488L kompatibel 3,5 "skjerm.
  • Temperatur Senso. I tilfelle en analog TMP36 temp sensor.
  • Kabler, ledninger, dupont -kontakter (mer om det senere)
  • (valgfritt) Brødbrett for testing
  • (valgfritt, men anbefalt) et lite perfboard

Trinn 1: Mulighetsstudie (en slags)

Som jeg sa, jeg ville ikke, og HDMI -skjermen ble sittende fast i PC -etuiet, så jeg kledde i min egen oppfinnsomhet og begynte å søke etter lignende ideer på internett. Og dette er tips nummer én: Google er vennen din (vel, en anstendig søkemotor …). Vi lever i en verden der ingenting virkelig er originalt lenger, men i stedet for å se på denne setningen med en negativ betydning, kan vi bruke dette til vår fordel: uansett hva du vil skape, sannsynligvis hadde noen et sted allerede gjort noe lignende, så hvis du vet ikke hvordan du skal implementere en idé, gode sjanser er at du finner nyttig informasjon der ute. Når du søker på internett, er det ofte nyttig å huske på to regler:

  1. ikke bry deg om å gå etter side 3 eller 4 i noe søk, det er nesten alltid bortkastet tid. I stedet
  2. endre søkeordene, bare omformuler spørsmålet fra et annet synspunkt (dvs.: "arduino temperatursensor" -> "les temperatur med arduino").

Faktisk er det fullt av gode prosjekter der ute, og jeg innrømmer at jeg brukte de første dagene på å studere de fleste av disse prosjektene. Men ingen av dem var klare til å gå for meg, ettersom jeg ønsket noe som passet til mine behov.

Ettersom jeg måtte lage noe tilpasset, bestemte jeg meg for å fokusere på riktig maskinvare å bruke og la programvaresiden ligge til senere, fordi programvaren alltid kan opprettes og tilpasses behov, på den annen side er maskinvaresiden bundet til tilgjengelighet og funksjoner.

Jeg ville ha noe basert på Arduino, fordi jeg allerede hadde det, det er godt dokumentert og fellesskapet blomstrer. Ikke noe problem her, som jeg sa før rikelig med informasjon.

Jeg ønsket en skjerm som var stor nok til å bli sett tydelig fra et par meter unna, og som ville passe til utseendet til min bygning, dette utelukket enhver nokia og LCD -skjerm. OLED er også uaktuelt, ettersom de er små. Så jeg valgte en TFT fargeskjerm. Ingen behov for berøringsskjerm, siden den vil være inne i PC -en. Jeg fant en 3,5 , som allerede er designet for Arduino, ~ 15 € på Amazon. Bra nok.

Nå, etter at maskinvaren er blitt identifisert, fokuserte jeg på programvaren.

Nesten alle prosjektene, Arduino -siden, er ganske like. Jeg trenger bare å tilpasse koden for displayet og for kommunikasjonsprotokollen for å samle data fra serverappen. Datamaskin, de fleste prosjekter var basert på C, C ++, C#, python og de fleste prosjekter tilbød bare et CLI-grensesnitt eller en Windows-tjenestelignende server. Jeg ville ha en GUI, i stedet. Jeg har aldri brukt noe C-lignende språk i Windows, la alene GUI-bygningen være. Men jeg lærte litt Visual Basic for 15 år siden, så jeg prøvde det og lastet ned gratis Visual Studio -versjonen fra Microsoft.

Etter å ha studert mange lignende prosjekter, bestemte jeg meg for å bruke OpenHardwareMonitor for å få all maskinvareinformasjon og RivaTuner for FPS, fordi disse er gratis og nok dokumentert.

Trinn 2: Maskinvaretesting

Testing av maskinvare
Testing av maskinvare
Testing av maskinvare
Testing av maskinvare
Testing av maskinvare
Testing av maskinvare

Før du slår på loddejernet og fikserer en elektronisk komponent for alltid i tid og rom, er det god praksis å bygge en testprototype (tips nummer to). Heldigvis er det ikke 1995 lenger. I dag er det ganske enkelt å arrangere ganske komplekse prototyper selv på små brødbrett. I mitt tilfelle hadde TFT -skjermen en nedgang i pinout for Arduino Uno, så jeg droppet den på min Arduino uno og begynte å leke med eksempelbibliotekene og lese referansehåndbøkene for å forstå driftsprinsippene og begrensningene.

På dette tidspunktet fant jeg ut hvordan jeg skulle tegne linjer og bitmaps og skrive tekst, så jeg begynte å fikle med programvarekoding, og la alle sekundære ting ligge senere, men jeg vil inkludere temperatursensoren her.

På et eller annet tidspunkt hadde jeg et tomt sted på skjermen, men ingen av dataene fra PC -sensorene var veldig nyttige, så jeg bestemte meg for å sette en temperatursensor i saken for omgivelsestemperatur. Displayet spiser opp nesten alle Arduino -pinnene, heldigvis er analog pinne A5 ubrukt, så jeg knyttet en TMP36. Jeg har til og med testet en DHT22, men det er overkill for denne applikasjonen.

Det er mange eksempler på TMP36, jeg har nettopp kopiert et av disse i en funksjon. TMP35 har 3 pins, Vin går til 5V, GND går til bakken og Out går til pin A5. Jeg plasserte en 0.1uF keramisk kondensator mellom Vin og GND. De sier at det er nødvendig. Sannsynligvis er det ubrukelig i dette tilfellet, men … Jeg har til og med satt den analoge referansespenningen fra Arduino til 3,3v -pinnen for bedre temperaturavlesning. Fremdeles ubrukelig i dette tilfellet, men …

Trinn 3: Arduino -kode

Last ned og åpne den medfølgende Arduino -koden for å følge forklaringen i dette trinnet. Jeg prøvde å legge igjen nok kommentarer i koden til å være tydelig uten å oversvømme den.

Du vil definitivt trenge MCUFRIEND_kbv og Adafruit GFX -bibliotekene. Begge enkelt installerbare fra Arduino IDE.

Programmet kan deles inn i seksjoner som dette:

  1. definere og deklarere alle de globale variablene og andre nødvendige ting
  2. initialiser skjermen, sett den eksterne referansen og tegne brukergrensesnittet (alt dette finnes i oppsett () -funksjonen, ettersom den bare må kjøres en gang)
  3. lese data fra seriell tilkobling og tildele dem i array (loop () -funksjonen)
  4. lese eksterne temp -sensordata (readExtTemp () -funksjon)
  5. skrive ut data på displayet (printData () -funksjonen)
  6. tilbake til løkken

SEKSJON 1: Erklæringer og definisjoner

I den første delen av koden brukte jeg mange pekere og matriser, så jeg har klart å presse mange repeterende koderader inn for å skrive FOR sykluser. Ja, jeg er lat. Som du kan se erklærte jeg en pekermatrise og fylte den med alle bildene fra pics.h -filen. Dette gjorde det mulig å gjøre FOR syklus -trikset for å tegne alle ikonene.

SEKSJON 2: setup (), for det meste UI -tegning

Jeg bestemte meg med standardfonten, siden den ikke har gjennomsiktig bakgrunn, så den lar deg skrive en ny tekstlinje over en gammel uten å måtte slette den. Å bruke en annen skrift ville ha betydd å tegne en svart firkant over den gamle teksten før du skriver en ny linje, noe som fører til en ubehagelig flimrende effekt.

Etter noen tester kom jeg til et godt kompromiss mellom lesbarhet og vist informasjon. Jeg delte displayet i to kolonner og 5 rader. Den venstre kolonnen går for CPU- og hovedkortdata, inkludert ovenfra og ned CPU -navn, temperatur, belastning, RAM -bruk og hovedkorttemperatur. Den rette dedikert til GPU og inkluderer GPU -navn, temperatur, belastning, Frames Per Second -teller og ekstern temperatursensor.

Som du kan se i koden, bestemte jeg meg for å unngå å bruke bilder på SD -kortet, siden det er veldig tregt å laste inn. Jeg bestemte meg for å inkludere alle ikonene i PROGMEM -minnet og tegne linjene med den dedikerte drawLine () -kommandoen. Dette er også nyttig for små UI -korreksjoner.

I det svake forsøket på å gi brukergrensesnittet et skinn av dybde, tegnet jeg to av alt (linjer, rektangler, bilder) med forskjellige farger og med en liten forskyvning. Dessverre er det ikke resultatet jeg håpet på, men det vil gjøre susen.

De siste linjene i denne funksjonen er for utskrift av plassholdere på TFT, inntil Arduino vil motta dataene.

DEL 3: hovedsløyfe (), henting og formatering av data

Her skjer magien: data blir mottatt gjennom seriell, tilordnet den korrekte variabelen og deretter skrevet ut. For å oppnå alt dette i det minste antallet linjer, brukte jeg en switch case -kommando og en for cycle.

Kommunikasjonsprotokollen jeg kom med er delt i to deler: en første utførelse av et håndtrykk og den faktiske datadelen.

Håndtrykket er nødvendig for å implementere autokoblingsfunksjonen når PC -programmet starter. Det går slik:

  • PC sender håndtrykkstrengen (i dette tilfellet er bare "*****;")
  • Arduino sender tilbake et svar

Lett peasy.

Datadelen ser slik ut: "i: xxx, åååå, zzz, aaa,;" betydningen er:

"i" er indeksen, jeg kalte det componentSelector i koden. "i" verdier er:

  • i = 0 - NAVN. De følgende verdiene er navnene som vises i granraden på displayet. Dette sendes og skrives ut på skjermen bare én gang, og i dag er det ganske vanskelig å bytte CPU og GPU …
  • i = 1 - 1. COLUMN DATA - følgende verdier vises i venstre halvdel av displayet fra topp til bunn. I mitt tilfelle: CPU -temp, CPU -belastning, RAM -bruk, Hovedkort -temp.
  • i = 2 - 2. COLUMN DATA - som ovenfor, men for høyre halvdel av displayet
  • i = 3 - SKRIV UT KOMMANDO. I dette tilfellet vil den rå serielle strengen bare være "3:;" ettersom andre data ikke er nødvendig.

"xxx, ååå, zzz, aaa" er de faktiske verdiene. de leses som strenger av arduinoen og hele formateringen er laget av PC -programmet. For i = 0 er disse verdiene 14 tegn hver for maskinvarenavnene. For i = 1 eller 2 vil disse bare være tre tegn hver, nok til å vise temperaturer og bilder per sekund. Selvfølgelig ":", "," og ";" tegn er forbudt i disse feltene.

":" Er skilletegnet mellom componentSelector og verdier, "," er verdiseparatoren og ";" er slutten på linjen

Når du mottar dataene, vil Arduino lagre den som en streng til ";" symbolet mottas, så vil det lete etter ":" -symbolet og bruke det til å få componentSelecor -verdien. Dette vil bli brukt for switch case -funksjonen for å velge riktig fremgangsmåte. Den brukes også til å velge riktig indeks i allData -matrisen.

Etter dette vil Arduino lete etter symbolet "," og fortsette å sette verdiene i allData -matrisen.

Hvis componentSelector er 0, blir flagget printName satt til true. Hvis componentSelector er 3, kalles funksjonene readExtTemp () og printData ().

Del 4: readExtTemp () -funksjonen

Ikke mye å si her, den leser 32 ganger fra pin A5 og sender ut temperaturverdien som en streng. Jeg er sammen med opprørerne, så jeg bruker Celsius. Alt mer enn 100 ° C er feil, så det vises som "---" på displayet. For noe mindre enn 100 ° C vil det bli formatert til å ha nok mellomrom til å dekke 3 tegn mellomrom på displayet. Det er mulig å fjerne og sette inn sensoren igjen, og ingen merkelig verdi vises.

Del 5: printData () -funksjonen

Som alltid brukte jeg sykluser til å skrive ut ting på skjermen i rekkefølge. Hvis flagget printNames er sant, vil det skrive ut navnene, sette flagget til false og fortsette.

Seksjon 6: tilbake til løkken

Selvforklarende nok, vil jeg si …

pics.h -fil

Her lagret jeg alle ikonene for brukergrensesnittet. Det er mulig å bruke SD -kortleseren som følger med på skjermen, men jeg hadde nok minne igjen i Arduino for mine svart -hvite ikoner.

Jeg designet dem med Junior Icon Editor ettersom det er gratis og ganske bra for pikselmaling av små ikoner. Jeg måtte konvertere ikonfilene (lagret som PNG) med onlineverktøyet SKAARHOJ.

Trinn 4: Visual Basic Code

Visual Basic Code
Visual Basic Code

Her er VB -koden

MERKNAD: dette er første gang jeg deler et Visual Studio -prosjekt. Jeg har nettopp kopiert prosjektmappene og zippet dem. Hvis dette ikke fungerer, vennligst gi meg beskjed om en bedre måte å dele denne typen prosjekter. Takk skal du ha

Som jeg sa tidligere, kan jeg ikke lage en GUI på C# eller andre språk, men jeg hadde noen erfaringer med Visual Basic for lenge siden. Jeg lastet ned Visual Studio Community -utgaven (det er selvfølgelig gratis) med Visual Basic -miljøet. Vel, jeg måtte finne ut mange ting, siden sist jeg brukte VB var det versjon 2005 eller slikt … Men internett er fullt av gode tips, som vanlig.

Etter å ha funnet ut noen grensesnittgreier, er den nyere versjonen faktisk enklere og mer fleksibel enn den gamle.

For dette programmet ville jeg ha noe med et Windows -skjema, men fullt håndterbart fra et systemstatusfeltikon. Jeg brukte faktisk skjemaet nesten bare for feilsøkingsformål, ettersom jeg liker å sette tekstbokser og lister for å lese utgangsverdiene til funksjonene og noen kommandoknapper for å teste dem.

Det "siste" programmet er bare et skuffikon med en hurtigmeny som viser de forskjellige kontrollene og et hovedskjema med to listebokser som viser dataene som er sendt til Arduino.

Jeg implementerte en autoconnect -funksjon og en "start at boot" -funksjon. Mer om det senere.

Hovedprogrammet er bare en tilpasning av forskjellige eksempler og kodebiter ved hjelp av OpenHardwareMonitor -biblioteket og RivaTuner Shared Memory -biblioteket.

Programmet går slik:

  • få dataene fra OpenHardwareMonitor og RTSSSm -biblioteker
  • forberede og formatere alle dataene for kommunikasjonsprotokollen
  • sende dataene til Arduino
  • skyll og gjenta

selvfølgelig maskinvarenavn leses ved start og sendes bare én gang.

FPS-telleren aktiveres bare når en kompatibel app brukes (f.eks. Et spill, et 3D-modelleringsprogram og så videre), ellers vil "---" plassholderen bli sendt til displayet.

Jeg vil ikke gå i dybden med å forklare hvordan du får verdiene fra bibliotekene, ettersom det er godt dokumentert på internett og noe forståelig fra koden. Vil bare fortelle om problemene med å få hovedkortets temperatur til å vises gjennom OpenHardwareMonitor (fra nå av OHMonitor, fordi livet er for kort) bibliotek. Jeg har en Asus Maximus VIII Gene MoBo, som er utstyrt med en fu ** tonn temperatursensorer på hovedkortet, men OHMonitor navngir dem som temperatursensor #1, #2… #n OG ingen steder er spesifisert temperaturplasseringen. Så jeg måtte installere den forferdelige Asus AI suite -programvaren, hvor sensorene har minst NAMES og sammenligner de forskjellige temperaturene mellom de to programmene. Det ser ut til at den generiske temp -sensoren til hovedkortet mitt er #2 for OHMonitor, så som du kan se i Timer1_tick -suben under MoBo -tingene måtte jeg lete etter et sensornavn som inneholder strengen " #2" for å få riktig avlesning.

TL; DR: du må passe på de riktige hovedkortets temperatursensorer selv. Resten er sannsynligvis god å gå.

Men dette er bare versjon 1, jeg planlegger å installere denne gadgeten på min andre PC, så jeg vil sannsynligvis implementere en måte å velge sensorene og kanskje til og med redesigne grensesnittet på Arduino mens du er på farten.

Autokoblingsfunksjonen

Denne funksjonen er faktisk enkel: hvis PC -en ikke er koblet til en Arduino, kalles hver x millisekund (basert på timeren1) denne funksjonen. Den prøver å koble til hver COM -port på PCen, hvis den lykkes sender den håndtrykkstrengen "*****;". Hvis svaret er "R", er den riktige enheten tilkoblet og den normale prosedyren følges. Ellers prøver den neste COM -port.

Som du kan se, er det mange unntak i denne funksjonen. Dette er fordi jeg ønsket at den var plug and play helt, uten feilmelding. Ved å håndtere unntakene har jeg klart å ignorere det totale fraværet av den eksterne enheten, og jeg kan til og med koble enheten til og koble fra enheten når jeg vil, uten å generere en feilmelding for programmet.

Start ved oppstart -funksjonen

Jeg ville at programmet skulle starte ved oppstart. Ganske enkelt, sier du. Legg en lenke i riktig mappe, sier du. Men nei. På grunn av OHMonitor- og RTSS -bibliotekene trenger vi administratørkjøringsnivå for å samle informasjon. Dette betyr den helt irriterende UAC -skjermen hver gang denne appen lanseres. Aldri. Så jeg tilpasset manuset laget av Matthew Wai (lenke her) for å oppnå en stille start ved oppstart. Jeg kopierte nettopp skriptet i Resources1 -filen, splittet i flere deler, og implementerte deretter en underprogram som oppretter (eller fjerner) en Windows -oppgavefil, tilpasset den gjeldende programmets kjørbare plassering og slike ting.

Systemskuffikonet

Takket være NotifyIcon og ContextMenu -objektene har jeg klart å implementere en lett og fet måte å kontrollere appen på. Bare høyreklikk på skuffikonet, og menyen vises. Det er disse oprionene:

  • Start ved oppstart: du kan kontrollere og fjerne merket for å aktivere eller deaktivere start ved oppstart -funksjonen
  • Autoconnect: samme som ovenfor, men håndterer autoconnect -funksjonen
  • Koble til/fra: den håndterer tilkoblingen. Fungerer ikke med autokobling aktivert
  • Oppdateringstid: gir en nedtrekksmeny, du kan velge oppdateringstiden fra 1 til ti sekunder
  • Maksimer: åpner hovedvinduet. Samme som å dobbeltklikke på ikonet
  • Utgang: selvforklarende

Kompilering av programvaren

For å kompilere programvaren må du sannsynligvis laste ned og legge til en referanse til bibliotekene som ikke er inkludert i koden.

Du finner OpenHardwareMonitor -biblioteket her. Du må laste ned programvaren, åpne zip -filen og kopiere OpenHardwareMonitorLib. DLL -filen i prosjektmappen.

Her er lenken til RTSSharedMemoryNET -biblioteket. Du må laste ned og kompilere for arkitekturen din, og deretter kopiere RTSS [TL; DR] moryNET. DLL i prosjektmappen.

Nå må du legge til en referanse i koden din, instruksjoner her

Bare vær sikker på å kompilere både RTSS [TL; DR] moryNET og PCHwMon serverprosjekter for samme arkitektur.

Jeg inkluderte et ferdig oppsettprogram, slik at du kan installere det hele uten å fikle med Visual Basic. Den er kompilert for x86, vil fungere på både x86 og x64 arkitekturer. Det krever. NET framework 4.7.2 for å kjøre.

Uansett må du installere RivaTuner. Du finner den her som en frittstående app, eller du kan installere Msi Afterburner, som bør inneholde RTServer.

Trinn 5: Endelig maskinvareimplementering

Anbefalt: