Cuprins:

Monitor hardware PC: 6 pași (cu imagini)
Monitor hardware PC: 6 pași (cu imagini)
Anonim
Monitor hardware PC
Monitor hardware PC
Monitor hardware PC
Monitor hardware PC
Monitor hardware PC
Monitor hardware PC

Buna tuturor. Am început acest proiect din două motive: am construit recent o buclă de răcire a apei în computerul meu și aveam nevoie de ceva pentru a umple vizual un spațiu în carcasă ȘI am vrut să pot fi verificate temperaturile și alte statistici cu o privire rapidă, fără ca OSD shenanigans să umple colțul ecranului. Desigur, există soluții gata făcute pentru asta, dar majoritatea nu s-ar potrivi cu feng shui-ul meu. Deci, în loc să pun un afișaj HDMI de 7 în carcasa mea, cu un cablu care scoate carcasa și bara de activități a ferestrelor întotdeauna aprinsă, am decis să-mi construiesc propria jucărie.

Întrucât nu sunt inginer și nici programator, ci doar un tip cu un lipitor și câteva cunoștințe autodidacte, acest lucru nu va fi doar un instructiv pas cu pas, voi încerca să mă concentrez asupra problemei rezolvarea și cercetarea aspectelor care m-au condus la această construcție.

DECLARAȚIE DE RESPONSABILITATE: TOATE LUCRĂRILE MELE SUNT ÎMPĂRȚITE CA ATRIBUȚIE COMUNĂ CREATIVĂ-SHAREALIKE 4.0. AM PRIN INSPIRATIE DIN MULTE EXEMPLE PENTRU TOT PE INTERNET, DACĂ RECUNOAȚIȚI O PARTE DIN ACEASTĂ LUCRU CA A VOASTRĂ, VĂ RUGĂM SĂ VĂ CONTACTAȚI PENTRU ATRIBUIRE. NICI O ÎNCĂLCARE NU ESTE PREVĂZUTĂ, VOR FI FERICIT DE A CORECTA ORICE GĂLIRE. MULȚUMESC

A DOUA DECLARAȚIE DE RESPONSABILITATE: LUCRAREA MEA ESTE ÎMPĂRȚITĂ ASTA. NU SUNT RESPONSABIL PENTRU NICI O DAUNĂ DERIVATĂ DIN UTILIZAREA NICIUNULUI CODULUI SAU INSTRUCȚIUNILOR MEU

Provizii

  • Arduino Nano (sau UNO dacă doriți)
  • Afișaj TFT. În cazul meu este un afișaj de 3,5 "compatibil ILI9486 / ILI9488L.
  • Senso de temperatură. În cazul mu, un senzor de temperatură analogic TMP36.
  • Cabluri, fire, conectori dupont (mai multe despre asta mai târziu)
  • (opțional) Panou pentru testare
  • (opțional, dar recomandat) un mic perfboard

Pasul 1: Studiu de fezabilitate (tip de)

După cum am spus, nu am vrut, iar afișajul HDMI a rămas în carcasa computerului meu, așa că, îmbrăcat în propria mea ingeniozitate, am început să caut idei similare pe internet. Și acesta este sfatul numărul unu: Google este prietenul tău (ei bine, orice motor de căutare decent …). Trăim într-o lume în care nimic nu mai este cu adevărat original, dar în loc să ne uităm la această frază cu semnificație negativă, am putea folosi acest lucru în avantajul nostru: orice vrei să creezi, probabil că cineva undeva a făcut deja ceva similar, deci dacă tu nu știu cum să implementați o idee, sunt mari șanse să găsiți informații utile acolo. Când căutați pe internet, este adesea util să aveți în vedere două reguli:

  1. nu vă deranjați să mergeți după pagina 3 sau 4 a oricărei căutări, este aproape întotdeauna o pierdere de timp. In schimb
  2. schimbați termenii de căutare, doar reformulați întrebarea dintr-un alt punct de vedere (adică: "senzor de temperatură arduino" -> "citiți temperatura cu arduino").

De fapt, este plin de proiecte bune acolo și recunosc că am petrecut primele zile studiind majoritatea acestor proiecte. Dar niciunul dintre ei nu era pregătit să meargă după mine, deoarece îmi doream ceva care să se potrivească nevoilor mele.

Întrucât trebuia să fac ceva personalizat, am decis să mă concentrez pe hardware-ul potrivit de utilizat și să las partea software pentru mai târziu, deoarece software-ul poate fi întotdeauna creat și adaptat nevoilor, pe de altă parte hardware sunt obligat la disponibilitate și caracteristici.

Am vrut ceva bazat pe Arduino, pentru că îl aveam deja, este bine documentat și comunitatea înflorește. Nici o problemă aici, așa cum am spus înainte, multe informații.

Mi-am dorit un afișaj suficient de mare pentru a putea fi văzut clar de la câțiva metri distanță și care să se potrivească cu aspectul propriu al construcției mele, acest lucru exclude orice afișaj de caractere nokia și LCD. Nici OLED nu sunt discutabile, deoarece sunt mici. Așa că am optat pentru un afișaj color TFT. Nu este nevoie de ecran tactil, deoarece va fi în interiorul computerului. Am găsit unul de 3,5 , deja conceput pentru Arduino, ~ 15 € pe Amazon. Destul de bun.

Acum, după ce hardware-ul a fost identificat, m-am concentrat asupra software-ului.

Aproape toate proiectele, partea Arduino, sunt destul de asemănătoare. Trebuie doar să adaptez codul pentru afișaj și pentru protocolul de comunicație pentru a aduna date din aplicația server. Pe partea computerului, majoritatea proiectelor se bazau pe C, C ++, C #, python și majoritatea proiectelor ofereau doar o interfață CLI sau un server Windows ca un serviciu. În schimb, am vrut o interfață grafică. Nu am folosit niciodată un limbaj asemănător cu C în Windows, lăsând în pace clădirea GUI. Dar am învățat ceva Visual Basic acum 15 ani, așa că am încercat și am descărcat versiunea gratuită Visual Studio de la Microsoft.

După ce am studiat o mulțime de proiecte similare, m-am hotărât să folosesc OpenHardwareMonitor pentru a obține toate informațiile despre hardware și RivaTuner pentru FPS, deoarece acestea sunt gratuite și suficient documentate.

Pasul 2: Testarea hardware-ului

Testarea hardware-ului
Testarea hardware-ului
Testarea hardware-ului
Testarea hardware-ului
Testarea hardware-ului
Testarea hardware-ului

Înainte de a porni fierul de lipit și de a fixa pentru totdeauna în timp și spațiu orice componentă electronică, este o bună practică să construiți un prototip de testare (vârful numărul doi). Din fericire, nu mai este anul 1995. În zilele noastre este destul de ușor să aranjați prototipuri destul de complexe chiar și pe panouri mici. În cazul meu, afișajul TFT a scăzut în pinout pentru Arduino Uno, așa că l-am lăsat pe Arduino uno și am început să mă joc cu bibliotecile de exemplu și să citesc manualele de referință pentru a înțelege principiile și limitele sale de funcționare.

În acest moment mi-am dat seama cum să desenez linii și bitmap-uri și să scriu text, așa că am început să mă joc cu codificarea software, lăsând toate lucrurile secundare pentru mai târziu, dar voi include aici senzorul de temperatură.

La un moment dat, am avut un loc gol pe afișaj, dar niciuna dintre datele de la senzorii PC-ului nu a fost cu adevărat utilă, așa că am decis să pun un senzor de temperatură în interiorul carcasei pentru temperatura ambiantă. Afișajul mănâncă aproape toți pinii Arduino, din fericire pinul analogic A5 nu este utilizat, așa că am legat un TMP36. Am testat chiar un DHT22, dar este mult prea mare pentru această aplicație.

Există o mulțime de exemple pentru TMP36, tocmai am copiat unul dintre acestea într-o funcție. TMP35 are 3 pini, Vin merge la 5V, GND merge la sol și Out merge la pinul A5. Am plasat un condensator ceramic 0.1uF între Vin și GND. Ei spun că este nevoie. Probabil că este inutil în acest caz, dar … chiar am setat tensiunea de referință analogică Arduino la pinul de 3,3 v pentru o citire mai bună a temperaturii. Încă inutil în acest caz, dar …

Pasul 3: Cod Arduino

Descărcați și deschideți codul Arduino inclus pentru a urma explicația din acest pas. Am încercat să las suficiente comentarii în cod pentru a fi clar fără a-l inunda.

Veți avea nevoie definitiv de MCUFRIEND_kbv și de bibliotecile Adafruit GFX. Ambele sunt ușor de instalat din Arduino IDE.

Programul poate fi împărțit în secțiuni ca aceasta:

  1. definiți și declarați toate variabilele globale și alte lucruri necesare
  2. inițializați afișajul, setați referința externă și desenați interfața de utilizare (toate acestea conținute în funcția setup (), deoarece trebuie să ruleze o singură dată)
  3. citiți datele din conexiunea serială și alocați-le în funcția matrice (buclă ())
  4. citiți datele senzorului de temperatură extern (funcția readExtTemp ())
  5. imprimați datele pe afișaj (funcția printData ())
  6. înapoi la buclă

SECȚIUNEA 1: Declarații și definiții

În secțiunea inițială a codului, am folosit o mulțime de pointeri și tablouri, așa că am reușit să stoarce o mulțime de linii repetitive de cod în scurt timp pentru a scrie cicluri FOR. Da, sunt leneș. După cum puteți vedea, am declarat o matrice de pointer și am populat-o cu toate imaginile din fișierul pics.h. Acest lucru a făcut posibilă realizarea trucului ciclului FOR pentru a desena toate icoanele.

SECȚIUNEA 2: setup (), în principal desen UI

M-am stabilit cu fontul implicit, deoarece nu are fundal transparent, așa că permite să scrieți o nouă linie de text peste una veche fără a fi necesară ștergerea acestuia. Utilizarea unui alt font ar fi însemnat să desenați un pătrat negru peste textul vechi înainte de a scrie o nouă linie, ducând la un efect de sclipire neplăcut.

După câteva testări, am ajuns la un compromis bun între lizibilitate și informații afișate. Am împărțit afișajul în două coloane și 5 rânduri. Coloana din stânga se referă la datele CPU și ale plăcii de bază, inclusiv de sus în jos numele procesorului, temperatura, încărcarea, utilizarea RAM și temperatura plăcii de bază. Cea potrivită dedicată GPU și include numele GPU, temperatura, sarcina, contorul de cadre pe secundă și senzorul de temperatură extern.

După cum puteți vedea în cod, am decis să evit să folosesc imagini pe cardul SD, deoarece se încarcă foarte lent. Am decis să includ toate pictogramele în memoria PROGMEM și să trasez liniile cu comanda dedicată drawLine (). acest lucru este util și pentru mici corecții ale interfeței de utilizare.

În încercarea slabă de a oferi IU o aparență de adâncime, am desenat două din toate (linii, dreptunghiuri, imagini) cu culori diferite și cu un mic offset. Din păcate, nu este rezultatul pe care l-am sperat, dar va face trucul.

Ultimele linii ale acestei funcții sunt pentru imprimarea substituentelor pe TFT, până când Arduino va primi datele.

SECȚIUNEA 3: bucla principală (), preluarea și formatarea datelor

Aici se întâmplă magia: datele sunt primite prin serial, atribuite variabilei corecte și apoi tipărite. Pentru a obține toate acestea în cel mai mic număr de linii, am folosit o comandă de comutare de caz și una pentru ciclu.

Protocolul de comunicare cu care am venit este împărțit în două părți: o executare inițială odată cu strângerea de mână și partea reală de date.

Strângerea de mână este necesară pentru implementarea caracteristicii de autoconectare la pornirea programului PC. Merge astfel:

  • PC-ul trimite șirul de strângere de mână (în acest caz este doar „*****;”)
  • Arduino trimite înapoi un răspuns

Ușor de țăran.

Partea de date arată astfel: "i: xxx, yyy, zzz, aaa,;" înțelesul este:

„i” este indexul, l-am numit componentSelector în cod. valorile „i” sunt:

  • i = 0 - NUME. Următoarele valori sunt numele afișate în primul rând de pe afișaj. Acest lucru va fi trimis și tipărit pe afișaj o singură dată, deoarece de astăzi este destul de dificil să se facă hotswap CPU și GPU …
  • i = 1 - DATELE COLONNEI 1 - următoarele valori sunt afișate în jumătatea stângă a afișajului de sus în jos. În cazul meu: temperatura CPU, încărcarea procesorului, utilizarea RAM, temperatura plăcii de bază.
  • i = 2 - DATA COLONII 2 - ca mai sus, dar pentru jumătatea dreaptă a afișajului
  • i = 3 - COMANDĂ DE PRINTARE. În acest caz, șirul serial brut va fi doar „3:;” deoarece alte date nu sunt necesare.

"xxx, aaaa, zzz, aaa" sunt valorile reale. acestea sunt citite ca șiruri de către arduino și întreaga formatare este realizată de programul PC. Pentru i = 0 aceste valori sunt 14 caractere fiecare pentru numele hardware. Pentru i = 1 sau 2, acestea vor avea doar trei caractere fiecare, suficient pentru a afișa temperaturi și cadre pe secundă. Desigur, ":", "," și ";" caracterele sunt interzise în aceste câmpuri.

":" Este separatorul dintre componentSelector și valori, "," este separatorul de valori și ";" este sfârșitul liniei

Când primiți datele, Arduino le va salva ca un șir până la „;” simbolul este primit, apoi va căuta simbolul ":" și îl va folosi pentru a obține valoarea componentSelecor. Aceasta va fi utilizată pentru funcția de schimbare a cazului pentru a selecta procedura corectă de urmat. De asemenea, este utilizat pentru a selecta indexul corect în matricea allData.

După aceasta, Arduino va căuta simbolul "," și va continua să plaseze valorile în matricea allData.

Dacă componentSelector este 0, semnalizatorul printName va fi setat la true. Dacă componentSelector este 3, se apelează funcțiile readExtTemp () și printData ().

Secțiunea 4: funcția readExtTemp ()

Nu sunt multe de spus aici, se citește de 32 de ori de la pinul A5 și generează valoarea temperaturii ca șir. Sunt alături de rebeli, așa că folosesc Celsius. Orice mai mult de 100 ° C este incorect, deci va fi afișat ca "---" pe afișaj. Pentru ceva mai mic de 100 ° C va fi formatat astfel încât să aibă spații suficiente pentru a acoperi spațiul de 3 caractere pe afișaj. Este posibil să scoateți și să reintroduceți senzorul și nu va fi afișată nicio valoare ciudată.

Secțiunea 5: funcția printData ()

Ca întotdeauna, am folosit pentru cicluri pentru a imprima secvențial lucruri pe ecran. Dacă steagul printNames este adevărat, acesta va imprima numele, va seta steagul la false și va continua.

Secțiunea 6: înapoi la buclă

Explicându-mă suficient, aș spune …

fișierul pics.h

Aici am stocat toate pictogramele pentru UI. Este posibil să folosesc cititorul de card SD inclus pe afișaj, dar îmi rămânea suficientă memorie în Arduino pentru pictogramele mele alb-negru.

Le-am proiectat cu Junior Icon Editor, deoarece este gratuit și destul de bun pentru pictarea pixelilor cu icoane mici. A trebuit să convertesc fișierele cu pictograme (salvate ca PNG) cu instrumentul online SKAARHOJ.

Pasul 4: Cod Visual Basic

Cod Visual Basic
Cod Visual Basic

Iată codul VB

ANUNȚ: este prima dată când împărtășesc un proiect Visual Studio. Tocmai am copiat folderele proiectului și le-am închis. Dacă acest lucru nu funcționează, vă rog să-mi spuneți un mod mai bun de a împărtăși acest tip de proiecte. Mulțumesc

După cum am spus mai devreme, nu pot crea o interfață grafică în C # sau în alte limbi, dar am avut câteva experiențe în Visual Basic cu mult timp în urmă. Am descărcat ediția Visual Studio Community (este bineînțeles gratuită) cu mediul Visual Basic. Ei bine, a trebuit să-mi dau seama de multe lucruri, deoarece ultima dată când am folosit VB era versiunea 2005 sau așa … Dar internetul este plin de indicii bune, ca de obicei.

După ce am aflat câteva lucruri de interfață, versiunea mai nouă este de fapt mai ușoară și mai flexibilă decât cea veche.

Pentru acest program am vrut ceva cu un formular Windows, dar complet gestionabil dintr-o pictogramă din bara de sistem. De fapt, am folosit formularul aproape numai în scopuri de depanare, deoarece îmi place să pun casete text și liste pentru a citi valorile de ieșire ale funcțiilor și câteva butoane de comandă pentru a le testa.

Programul „final” este doar o pictogramă de tavă cu un meniu pop-up care arată diferitele controale și un formular principal cu două casete de listă care arată datele trimise către Arduino.

Am implementat o funcție de autoconectare și o funcție „start at boot”. Mai multe despre asta mai târziu.

Programul principal este doar o adaptare a diferitelor exemple și fragmente de cod folosind biblioteca OpenHardwareMonitor și biblioteca RivaTuner Shared Memory.

Programul merge astfel:

  • obțineți datele din bibliotecile OpenHardwareMonitor și RTSSSm
  • pregătiți și formatați toate datele pentru protocolul de comunicare
  • trimiteți datele către Arduino
  • clătiți și repetați

desigur, numele hardware-ului sunt citite la început și trimise o singură dată.

Contorul FPS se activează numai atunci când este utilizată o aplicație compatibilă (de ex. Un joc, un program de modelare 3D și așa mai departe), altfel va fi trimis pe ecran afișajul „---”.

Nu voi aprofunda explicând cum să obțin valorile din biblioteci, deoarece este bine documentat pe internet și ușor de înțeles din cod. Vreau doar să povestesc despre problemele legate de obținerea temperaturii plăcii de bază pentru a arăta prin biblioteca OpenHardwareMonitor (de acum înainte OHMonitor, deoarece viața este prea scurtă). Am un Asus Maximus VIII Gene MoBo, care este echipat cu senzori de temperatură ** ** pe placa de bază, dar OHMonitor le numește senzor de temperatură # 1, # 2 … #n ȘI nicăieri nu este specificată locația temperaturii. Așa că a trebuit să instalez software-ul îngrozitor al suitei Asus AI, unde senzorii au cel puțin NUME și să compare diferitele temperaturi dintre cele două programe. Se pare că senzorul de temperatură generic al plăcii mele de bază este # 2 pentru OHMonitor, așa că, după cum puteți vedea în sub Timer1_tick de sub obiectele MoBo, a trebuit să caut un nume de senzor care să conțină șirul "# 2" pentru a obține citirea corectă.

TL; DR: va trebui să aveți grijă de senzorii de temperatură ai plăcii de bază. Restul este probabil bine de plecat.

Cu toate acestea, aceasta este doar versiunea 1, intenționez să instalez acest gadget pe celălalt computer al meu, așa că probabil voi implementa o modalitate de a selecta senzorii și poate chiar să reproiectez interfața de pe Arduino din mers.

Funcția de conectare automată

Această funcție este de fapt simplă: dacă PC-ul nu este conectat cu un Arduino, la fiecare x milisecunde (bazat pe Timer1) se numește această funcție. Încearcă să se conecteze cu fiecare port COM de pe PC, dacă are succes, trimite șirul de strângere de mână „*****;”. Dacă răspunsul este „R”, atunci dispozitivul corect este conectat și se urmează procedura normală. Altfel, încearcă următorul port COM.

După cum puteți vedea, există o mulțime de excepții în această funcție. Acest lucru se datorează faptului că am vrut să se conecteze complet și să joace, fără ieșire de eroare. Manevrând excepțiile, am reușit să-l fac să ignore absența completă a dispozitivului extern și pot chiar să conectez dispozitivul la fierbinte și să-l deconectez oricând vreau, fără a genera o eroare de rupere pentru program.

Funcția Start At Boot

Am vrut ca programul să înceapă la pornire. Destul de ușor, zici. Spuneți un link în folderul corespunzător. Dar nu. Datorită bibliotecilor OHMonitor și RTSS, avem nevoie de nivelul de execuție al administratorului pentru a colecta informații. Aceasta înseamnă ecranul UAC complet enervant de fiecare dată când este lansată această aplicație. În nici un caz. Așa că am adaptat scenariul realizat de Matthew Wai (link aici) pentru a obține un început silențios la boot. Tocmai am copiat scriptul în fișierul Resources1, împărțit în mai multe părți, apoi am implementat un subrutină care creează (sau elimină) un fișier de activități Windows, personalizat cu locația executabilă a programului curent și astfel de lucruri.

Pictograma tăvii de sistem

Datorită obiectelor NotifyIcon și ContextMenu, am reușit să implementez o modalitate simplă și simplă de a controla aplicația. Doar faceți clic dreapta pe pictograma tăvii și apare meniul. Există aceste opțiuni:

  • Începeți la pornire: îl puteți verifica și debifa pentru a activa sau dezactiva funcția de pornire la pornire
  • Conectare automată: la fel ca mai sus, dar gestionează funcția de conectare automată
  • Conectare / Deconectare: gestionează conexiunea. Nu funcționează cu conectarea automată activată
  • Timp de reîmprospătare: oferă un submeniu derulant, puteți alege timpul de reîmprospătare de la 1 la zece secunde
  • Maximizare: deschide fereastra principală. La fel ca dublu clic pe pictogramă
  • Ieșire: auto-explicativ

Compilarea software-ului

Pentru a compila software-ul, va trebui probabil să descărcați și să adăugați o referință la bibliotecile care nu sunt incluse în cod.

Puteți găsi biblioteca OpenHardwareMonitor aici. Trebuie să descărcați software-ul, să deschideți fișierul zip și să copiați fișierul OpenHardwareMonitorLib. DLL în folderul proiectului.

Iată linkul pentru biblioteca RTSSharedMemoryNET, trebuie să descărcați și să compilați pentru arhitectura dvs., apoi să copiați RTSS [TL; DR] moryNET. DLL în folderul de proiect.

Acum trebuie să adăugați o referință în codul dvs., instrucțiuni aici

Doar asigurați-vă că ați compilat atât proiectele RTSS [TL; DR] moryNET, cât și serverele PCHwMon pentru aceeași arhitectură.

Am inclus un program de configurare gata pregătit, astfel încât să puteți instala totul fără a juca cu Visual Basic. Este compilat pentru x86, va funcționa atât pe arhitecturi x86 cât și pe x64. Este necesară executarea cadrului. NET 4.7.2.

În orice caz, va trebui să instalați RivaTuner. O puteți găsi aici ca aplicație autonomă sau puteți instala Msi Afterburner, care ar trebui să includă RTServer.

Pasul 5: Implementarea finală a hardware-ului

Recomandat: