Съдържание:

Хардуерен монитор за компютър: 6 стъпки (със снимки)
Хардуерен монитор за компютър: 6 стъпки (със снимки)

Видео: Хардуерен монитор за компютър: 6 стъпки (със снимки)

Видео: Хардуерен монитор за компютър: 6 стъпки (със снимки)
Видео: С кой кабел да си свържем монитора? Разликата между кабелите? 2024, Юли
Anonim
Хардуерен монитор за компютър
Хардуерен монитор за компютър
Хардуерен монитор за компютър
Хардуерен монитор за компютър
Хардуерен монитор за компютър
Хардуерен монитор за компютър

Здравейте всички. Започнах този проект по две причини: наскоро изградих контур за водно охлаждане в компютъра си и имах нужда от нещо, което визуално да запълни малко пространство в кутията, и исках да мога да проверя температурите и други статистически данни с бърз поглед, без да манипулира OSD ъгъла на екрана. Разбира се, има готови решения за това, но повечето от тях просто не биха отговаряли на моя фън шуй. Така че, вместо да поставя HDMI 7 -инчов дисплей в кутията ми с кабел, който стърчи в кутията и лентата със задачи на Windows винаги е включена, реших да си направя собствена играчка.

Тъй като не съм инженер, нито програмист, а просто човек с поялник и някои самоуки познания, това няма да бъде само инструкция стъпка по стъпка, аз също ще се опитам да се съсредоточа върху проблема решаващи и изследователски аспекти, които ме доведоха до това изграждане.

ОТКАЗ ОТ ОТГОВОРНОСТ: ВСЯКА МОЯ РАБОТА Е СПОДЕЛЕНА КАТО СЪЗДАВАЩО ОБЩО ПРИЛАГАНЕ-СПОДЕЛЯНЕ 4.0. ВЗЕМАМ ВДЪХНОВЕНИЕ ОТ МНОГО ПРИМЕРИ В ИНТЕРНЕТА, АКО ПРИЗНАЕТЕ НЯКОЯ ЧАСТ ОТ ТАЗИ РАБОТА КАТО ВАШАТА, МОЛЯ, СВЪРЖЕТЕ СЕ С МЕН ЗА АТРИБУЦИЯ. НЕ СЕ НАМАЛЯВАТ НАРУШЕНИЯ, ЩЕ СЕ РАДВАМ ДА ПОПРАВЯ ВСЯКАКАВА ГРЕШКА. БЛАГОДАРЯ ТИ

ВТОРО ОТГОВОРНОСТ: РАБОТАТА МИ СЕ СПОДЕЛЯ КАТО Е. НЕ НЯМА ОТГОВОРНОСТ ЗА ВРЕДИ, ПРОИЗВОДЕНИ ОТ ИЗПОЛЗВАНЕТО НА НЯКОЙ МОЙ КОД или ИНСТРУКЦИИ

Консумативи

  • Arduino Nano (или UNO, ако искате)
  • TFT дисплей. В моя случай това е 3,5 -инчов дисплей, съвместим с ILI9486 / ILI9488L.
  • Температура Senso. В даден случай аналогов сензор за температура TMP36.
  • Кабели, проводници, съединители dupont (повече за това по -късно)
  • (по избор) Платка за тестване
  • (по избор, но препоръчително) малка перфорирана дъска

Стъпка 1: Проучване на осъществимостта (нещо като)

Както казах, не исках и HDMI дисплеят заседна в кутията на моя компютър, така че, прикрит от собствената си изобретателност, започнах да търся подобни идеи в интернет. И това е съвет номер едно: Google е ваш приятел (добре, всяка прилична търсачка …). Живеем в свят, в който вече нищо не е наистина оригинално, но вместо да гледаме на тази фраза с отрицателно значение, бихме могли да използваме това за наше предимство: каквото искате да създадете, вероятно някой някъде вече е направил нещо подобно, така че ако не знам как да приложа идея, има голяма вероятност да намерите полезна информация там. Когато търсите в интернет, често е полезно да имате предвид две правила:

  1. не се притеснявайте да отидете след страница 3 или 4 от всяко търсене, почти винаги е загуба на време. Вместо
  2. променете думите за търсене, просто преформулирайте въпроса от друга гледна точка (т.е.: "сензор за температура arduino" -> "четене на температура с arduino").

Всъщност там е пълно с добри проекти и признавам, че прекарах първите дни в изучаването на повечето от тези проекти. Но никой от тях не беше готов да отиде за мен, тъй като исках нещо, което да отговаря на моите нужди.

Тъй като трябваше да направя нещо по поръчка, реших да се съсредоточа върху подходящия хардуер за използване и да оставя софтуерната страна за по -късно, защото софтуерът винаги може да бъде създаден и адаптиран към нуждите, от друга страна хардуерната страна съм обвързан с наличността и функции.

Исках нещо на базата на Arduino, защото вече го имах, добре документирано и общността процъфтява. Тук няма проблем, както казах преди изобилна информация.

Исках достатъчно голям дисплей, който да се вижда ясно от няколко метра разстояние и който да отговаря на външния вид на моята конструкция, това изключваше всякакви дисплеи на Nokia и LCD. OLED също не са под въпрос, тъй като са малки. Затова избрах цветен TFT дисплей. Няма нужда от сензорен екран, тъй като той ще бъде вътре в компютъра. Намерих 3,5 -инчов, вече проектиран за Arduino, ~ 15 € в Amazon. Достатъчно добър.

Сега, след като хардуерът беше определен, се съсредоточих върху софтуера.

Почти всички проекти, от страна на Arduino, са доста сходни. Просто трябва да адаптирам кода за дисплея и за комуникационния протокол за събиране на данни от приложението на сървъра. От компютърна страна повечето проекти бяха базирани на C, C ++, C#, python и повечето проекти предлагаха само CLI интерфейс или сървър, подобен на услуга на Windows. Исках графичен интерфейс, вместо това. Никога не съм използвал език, подобен на C в Windows, оставям настрана сградата на GUI. Но научих някои Visual Basic преди 15 години, затова го пробвах и изтеглих безплатната версия на Visual Studio от Microsoft.

След като изучих много подобни проекти, се спрях да използвам OpenHardwareMonitor, за да получа цялата информация за хардуера и RivaTuner за FPS, защото те са безплатни и достатъчно документирани.

Стъпка 2: Тестване на хардуера

Тестване на хардуера
Тестване на хардуера
Тестване на хардуера
Тестване на хардуера
Тестване на хардуера
Тестване на хардуера

Преди да включите поялника и да фиксирате завинаги във времето и пространството всеки електронен компонент, е добра практика да изградите прототип за изпитване (накрайник номер две). За щастие, вече не е 1995 г. В днешно време е доста лесно да се подредят доста сложни прототипи дори на малки дъски. В моя случай TFT дисплеят имаше спад в разпечатката за Arduino Uno, затова го пуснах на моя Arduino uno и започнах да играя с примерните библиотеки и да чета референтните ръководства, за да разбера принципите на работа и ограниченията му.

В този момент разбрах как да рисувам линии и растерни карти и да пиша текст, затова започнах да се занимавам със софтуерно кодиране, оставяйки всички вторични неща за по -късно, но ще включа тук температурния сензор.

В един момент надолу по линията имах празно място на дисплея, но никой от данните от сензорите на компютъра не беше наистина полезен, затова реших да поставя вътре в корпуса температурен сензор за температура на околната среда. Дисплеят изяжда почти всички щифтове на Arduino, за щастие аналоговият щифт A5 не се използва, затова завързах TMP36. Дори тествах DHT22, но това е прекалено много за това приложение.

Има много примери за TMP36, току -що копирах един от тях във функция. TMP35 има 3 пина, Vin преминава към 5V, GND отива към земята и Out отива към щифт A5. Поставих керамичен кондензатор 0.1uF между Vin и GND. Казват, че е необходимо. Вероятно това е безполезно в този случай, но… дори зададох референтното напрежение на Arduino на 3.3v щифт за по -добро отчитане на температурата. Все още безполезен в този случай, но …

Стъпка 3: Arduino код

Моля, изтеглете и отворете включения Arduino код, за да следвате обяснението в тази стъпка. Опитах се да оставя достатъчно коментари в кода, за да е ясен, без да го заливам.

Определено ще ви трябват библиотеките MCUFRIEND_kbv и Adafruit GFX. И двете лесно се инсталират от Arduino IDE.

Програмата може да бъде разделена на секции като тази:

  1. дефинирайте и декларирайте всички глобални променливи и други необходими неща
  2. инициализирайте дисплея, задайте външната препратка и нарисувайте потребителския интерфейс (всичко това се съдържа във функцията setup (), тъй като тя трябва да работи само веднъж)
  3. прочетете данни от серийна връзка и ги разпределете в масива (функция loop ())
  4. четене на данни от външен сензор за температура (функция readExtTemp ())
  5. отпечатване на данни на дисплея (функция printData ())
  6. обратно към цикъла

РАЗДЕЛ 1: Декларации и определения

В началния раздел на кода използвах много указатели и масиви, така че успях да изстискам много повтарящи се редове код по -кратко, за да пиша цикли FOR. Да, мързелив съм. Както можете да видите, декларирах масив от указатели и го запълних с всички снимки от файла pics.h. Това направи възможно да се направи трикът за цикъл FOR, за да се нарисуват всички икони.

РАЗДЕЛ 2: setup (), най -вече чертеж на потребителския интерфейс

Настаних се с шрифта по подразбиране, тъй като той няма прозрачен фон, така че позволява да се напише нов ред текст върху стар, без да е необходимо изтриването му. Използването на друг шрифт би означавало да нарисувате черен квадрат над стария текст, преди да напишете нов ред, което да доведе до неприятен ефект на трептене.

След известно тестване стигнах до добър компромис между четливостта и показаната информация. Разделих дисплея на две колони и 5 реда. Лявата колона е за данни за процесора и дънната платка, включително от горе до долу името на процесора, температурата, натоварването, използването на RAM и температурата на дънната платка. Десният, посветен на графичния процесор, включва име на графичния процесор, температура, натоварване, брояч на кадрите в секунда и външен температурен сензор.

Както можете да видите в кода, реших да избягвам да използвам снимки на SD картата, тъй като тя се зарежда наистина бавно. Реших да включа всички икони в паметта на PROGMEM и да нарисувам линиите със специалната команда drawLine (). това е полезно и за малки корекции на потребителския интерфейс.

В слабия опит да придам на потребителския интерфейс подобие на дълбочина, нарисувах две от всичко (линии, правоъгълници, снимки) с различни цветове и с малко отместване. За съжаление това не е резултатът, на който се надявах, но ще свърши работа.

Последните редове на тази функция са за отпечатване на заместители на TFT, докато Arduino не получи данните.

РАЗДЕЛ 3: основен цикъл (), извличане на данни и форматиране

Тук се случва магията: данните се получават през сериен, присвояват на правилната променлива и след това се отпечатват. За да постигна всичко това в най -малък брой редове, използвах команда за превключване на случай и цикъл for.

Комуникационният протокол, с който дойдох, е разделен на две части: първоначално изпълнение след ръкостискане и действителната част от данни.

Ръкостискането е необходимо за прилагане на функцията за автоматично свързване при стартиране на компютърната програма. Това става така:

  • Компютърът изпраща низ за ръкостискане (в този случай е само "*****;")
  • Arduino изпраща отговор

Лесна работа.

Частта с данни изглежда така: "i: xxx, yyy, zzz, aaa,;" смисълът е:

"i" е индексът, нарекох го componentSelector в кода. Стойностите "i" са:

  • i = 0 - ИМЕНА. Следните стойности са имената, показани в първия ред на дисплея. Това ще бъде изпратено и отпечатано на дисплея само веднъж, тъй като днес е доста трудно да се заменят процесора и графичния процесор…
  • i = 1 - ПЪРВИ КОЛОННИ ДАННИ - следните стойности се показват в лявата половина на дисплея отгоре надолу. В моя случай: температура на процесора, натоварване на процесора, използване на RAM, температура на дънната платка.
  • i = 2 - ВТОРИ КОЛОННИ ДАННИ - както по -горе, но за дясната половина на дисплея
  • i = 3 - КОМАНДА ЗА ПЕЧАТ. В този случай необработеният сериен низ ще бъде само "3:;" тъй като други данни не са необходими.

"xxx, yyy, zzz, aaa" са действителните стойности. те се четат като низове от arduino и цялото форматиране се извършва от компютърната програма. За i = 0 тези стойности са по 14 знака за имената на хардуера. За i = 1 или 2 те ще бъдат само по три знака всеки, достатъчен за показване на температурите и кадрите в секунди. Разбира се ":", "," и ";" символите са забранени в тези полета.

":" Е разделителят между componentSelector и стойностите, "," е разделителят на стойностите и ";" е краят на реда

При получаване на данните, Arduino ще ги запише като низ до ";" символ е получен, тогава той ще търси символа ":" и ще го използва, за да получи стойността на componentSelecor. Това ще се използва за функцията за превключване, за да изберете правилната процедура, която да следвате. Използва се и за избор на правилния индекс в масива allData.

След това Arduino ще търси символа "," и ще продължи да поставя стойностите в масива allData.

Ако componentSelector е 0, флагът printName ще бъде зададен на true. Ако componentSelector е 3, се извикват функциите readExtTemp () и printData ().

Раздел 4: функция readExtTemp ()

Тук няма какво да се каже, той се чете 32 пъти от щифт A5 и извежда температурната стойност като низ. Аз съм с бунтовниците, затова използвам Целзий. Всичко над 100 ° C е неправилно, така че ще се покаже като "---" на дисплея. За всичко по -малко от 100 ° C ще бъде форматирано, за да има достатъчно интервали, за да покрие 3 знака пространство на дисплея. Възможно е да извадите и поставите отново сензора и няма да се покаже странна стойност.

Раздел 5: функция printData ()

Както винаги използвах за цикли за последователно отпечатване на неща на дисплея. Ако флагът printNames е истина, той ще отпечата имената, ще зададе флага на false и ще продължи.

Раздел 6: обратно към цикъла

Достатъчно обяснителен, бих казал …

pics.h файл

Тук съхранявам всички икони за потребителския интерфейс. Възможно е да използвам четеца на SD карти, включен в дисплея, но имах достатъчно памет в Arduino за моите черно -бели икони.

Проектирах ги с Junior Icon Editor, тъй като е безплатен и доста добър за пикселно рисуване на малки икони. Трябваше да конвертирам файловете с икони (запазени като PNG) с онлайн инструмента SKAARHOJ.

Стъпка 4: Visual Basic код

Visual Basic код
Visual Basic код

Ето кода на VB

ЗАБЕЛЕЖКА: това е първият път, когато споделям проект на Visual Studio. Току -що копирах папките на проекта и ги ципирах. Ако това не работи, моля, кажете ми по -добър начин за споделяне на този вид проекти. Благодаря ти

Както казах по -рано, не мога да създам графичен интерфейс на C# или други езици, но имах опит в Visual Basic отдавна. Изтеглих изданието на Visual Studio Community (безплатно е, разбира се) със средата Visual Basic. Е, трябваше да разбера много неща, тъй като за последен път използвах VB беше версия 2005 или нещо подобно … Но интернет е пълен с добри намеци, както обикновено.

След като разбра някои неща за интерфейса, по -новата версия всъщност е по -лесна и по -гъвкава от старата.

За тази програма исках нещо с прозорец на Windows, но напълно управляемо от иконата в системната област. Всъщност използвах формата почти само за отстраняване на грешки, тъй като обичам да поставям текстови кутии и списъци, за да чета изходните стойности на функциите и някои командни бутони, за да ги тествам.

„Окончателната“програма е само икона на тава с изскачащо меню, което показва различните контроли и основна форма с две списъчни кутии, които показват данните, изпратени до Arduino.

Приложих функция за автоматично свързване и функция „стартиране при стартиране“. Повече за това по -късно.

Основната програма е просто адаптация на различни примери и фрагменти от код, използвайки библиотеката OpenHardwareMonitor и библиотеката с споделена памет RivaTuner.

Програмата върви по следния начин:

  • вземете данните от библиотеките OpenHardwareMonitor и RTSSSm
  • подготвя и форматира всички данни за комуникационния протокол
  • изпратете данните до Arduino
  • изплакнете и повторете

разбира се имената на хардуера се четат при стартиране и се изпращат само веднъж.

Броячът на FPS се активира само когато се използва съвместимо приложение (например игра, програма за 3D моделиране и т.н.), в противен случай заместителят "---" ще бъде изпратен на дисплея.

няма да се задълбочавам да обяснявам как да получавам стойностите от библиотеките, тъй като това е добре документирано в интернет и донякъде разбираемо от кода. Просто искам да разкажа за проблемите с показването на температурата на дънната платка чрез библиотеката OpenHardwareMonitor (оттук нататък OHMonitor, тъй като животът е твърде кратък). Имам Asus Maximus VIII Gene MoBo, който е оборудван с фу ** тонни температурни сензори на дънната платка, но OHMonitor ги назовава като Температурен сензор #1, #2… #n И никъде не е посочено местоположението на температурата. Така че трябваше да инсталирам ужасния софтуер на Asus AI Suite, където сензорите имат поне NAMES и да сравняват различните температури между двете програми. Изглежда, че общият температурен сензор на дънната ми платка е #2 за OHMonitor, така че както можете да видите в подпрограмата Timer1_tick под нещата на MoBo, трябваше да потърся име на сензор, съдържащ низа " #2", за да получа правилното отчитане.

TL; DR: ще трябва сами да се погрижите за правилните сензори за температура на дънната платка. Останалото вероятно е добре.

Това обаче е само версия 1, планирам да инсталирам тази притурка на другия си компютър, така че вероятно ще внедря начин за избор на сензори и може би дори да препроектирам интерфейса на Arduino в движение.

Функцията за автоматично свързване

Тази функция всъщност е проста: ако компютърът не е свързан с Arduino, на всеки х милисекунди (въз основа на Timer1) тази функция се извиква. Той се опитва да се свърже с всеки COM порт на компютъра, ако успее, изпраща низ за ръкостискане "*****;". Ако отговорът е "R", тогава правилното устройство е свързано и се следва нормалната процедура. Иначе се опитва следващия COM порт.

Както можете да видите, има много изключения в тази функция. Това е така, защото исках напълно да се включи и пусне, без изход за грешка. Обработвайки изключенията, успях да го накарам да игнорира пълното отсъствие на външното устройство и дори мога да го включа и да го свържа, когато искам, без да генерирам грешка при прекъсване на програмата.

Функцията Старт при зареждане

Исках програмата да стартира при стартиране. Доста лесно, ще кажете. Кажете, поставете връзка в съответната папка. Но не. Поради библиотеките OHMonitor и RTSS се нуждаем от ниво на администраторско изпълнение за събиране на информация. Това означава крайно досаден UAC екран при всяко стартиране на това приложение. Няма начин. Затова адаптирах скрипта, направен от Матю Уей (връзка тук), за да постигна безшумен старт при зареждане. Току -що копирах скрипта във файла Resources1, разделен на няколко части, след което внедрих подпрограма, която създава (или премахва) файл със задачи на Windows, персонализиран с текущото изпълнявано място на програмата и такива неща.

Иконата на системната тава

Благодарение на обектите NotifyIcon и ContextMenu, успях да внедря лесен и дебел начин за управление на приложението. Щракнете с десния бутон върху иконата в тавата и се появява менюто. Има тези мнения:

  • Стартирайте при зареждане: можете да поставите отметка и да премахнете отметката, за да активирате или деактивирате функцията за стартиране при зареждане
  • Автоматично свързване: същото като по -горе, но обработва функцията за автоматично свързване
  • Свързване/прекъсване на връзката: той управлява връзката. Не работи с активирана функция за автоматично свързване
  • Време за опресняване: дава падащо подменю, можете да изберете времето за опресняване от 1 до десет секунди
  • Увеличаване: отваря главния прозорец. Същото като двойното щракване върху иконата
  • Изход: обяснително

Компилиране на софтуера

За да компилирате софтуера, вероятно ще трябва да изтеглите и да добавите препратка към библиотеките, които не са включени в кода.

Можете да намерите библиотеката OpenHardwareMonitor тук. Трябва да изтеглите софтуера, да отворите zip файла и да копирате файла OpenHardwareMonitorLib. DLL в папката на проекта.

Ето връзката към библиотеката RTSSharedMemoryNET, трябва да изтеглите и компилирате за вашата архитектура, след което да копирате RTSS [TL; DR] moryNET. DLL в папката на вашия проект.

Сега трябва да добавите препратка в кода си, инструкции тук

Просто не забравяйте да компилирате сървърните проекти RTSS [TL; DR] moryNET и PCHwMon за една и съща архитектура.

Включих готова програма за настройка, така че можете да инсталирате всичко, без да се занимавате с Visual Basic. Той е компилиран за x86, ще работи както на x86, така и на x64 архитектури. Той изисква. NET framework 4.7.2 да се изпълнява.

Във всеки случай ще трябва да инсталирате RivaTuner. Можете да го намерите тук като самостоятелно приложение или да инсталирате Msi Afterburner, който трябва да включва RTServer.

Стъпка 5: Окончателна хардуерна реализация

Препоръчано: