Мониторинг показателей ПК

Мониторинг показателей ПК

От подписчика Asgard

Делая проект, я вдохновлялся этим видео от AlexGyver, но, у меня не было всех компонентов и я сделал упрощенную версию на том, что было.

Что понадобится для проекта

Как должно работать

  • Короткое нажатие изменяет какой параметр показывать в строке (Загрузка процессора, Загрузка оперативки и т.д.);
  • Долгое нажатие переключает строку, которую мы хотим сейчас настроить;

Видео немного кривое, но другого у меня нет.

Собираем проект: 1. Подключаем экран к ардуино.

У меня был экран МЭЛТ и я подключал по следующей схеме (только к arduino nano):

2. Подключаем тактовую кнопку к контроллеру.

Я подключал в режиме INPUT_PULLUP (без резистора), но вы можете подключать так, как вам нравится или как умеете =)

Подключить кнопку в режиме INPUT_PULLUP совсем просто, одну ногу кнопки подключаем к цифровому выходу arduino (в моей прошивке это 6 пин), вторую ногу кнопки (с той же стороны) подключаем к земле GND.

3. Заливаем прошивку в arduino (я знаю, что можно написать код намного лучше, но я пока только учусь)

#include <LiquidCrystal.h> // подключаем стандартную библиотеку LiquidCrystal (для моего дисплея МЭЛТ, для вашего может и не надо будет)
#include <string.h>
#define BUTTON_PIN 6 // Пин тактовой кнопки
int lcdMaxLength = 16; // Количество символов в строке дисплея
int lcdMaxHeight = 2; // Количество строк дисплея
char inData[108];       // Массив входных значений (СИМВОЛЫ)
int PCdata[26];        // Массив численных значений показаний с компьютера
byte index = 0;
boolean updateDataFlag = 1;
String string_convert;
int menuSelected = 0;
int menuData[] = {4, 5}; // Показать по умолчанию CPU load и GPU use
int skipIndex[] = {2}; // Тут указываем, какие показатели нужно пропустить, я решил, что мне не нужна температура материнской платы
int skipIndexLength[] = {1}; // Указываем длину массива skipIndex
int PCdataLength = 7;
char *PCdataCaption[] = {
"CPU T", // 0
"GPU T", // 1
"Mother T", // 2 Пропускаем, благодаря массиву skipIndex
"Max HDD T", // 3
"CPU load", // 4
"GPU load", // 5
"RAM use", // 6
"GPU M use" // 7
};
char *PCdataSuffix[] = { // в чем измеряется тот или иной показатель
"grad", // 0
"grad", // 1
"grad", // 2
"grad", // 3
"%", // 4
"%", // 5
"%", // 6
"%", // 7
};
boolean buttonActive = false;
boolean longPressActive = false;
long buttonTimer = 0;
long longPressTime = 250;
/*Что идёт в порт из программы HardwareMonitor:
0-CPU temp,
1-GPU temp,
2-mother temp,
3-max HDD temp,
4-CPU load,
5-GPU load,
6-RAM use,
7-GPU memory use,
!Все, что идет ниже, не используется в моей версии прошивки.
8-maxFAN,
9-minFAN,
10-maxTEMP,
11-minTEMP,
12-manualFAN,
13-manualCOLOR,
14-fanCtrl,
15-colorCtrl,
16-brightCtrl,
17-LOGinterval,
18-tempSource
*/
void switchData() {
if (menuData[menuSelected] < PCdataLength) {
boolean skip = false;
int nextIndex = menuData[menuSelected] + 1;
for (int i = 0; i < skipIndexLength; i++) {
if (nextIndex == skipIndex[i]) {
skip = true;
}
}
if (skip) {
menuData[menuSelected] += 1;
switchData();
} else {
menuData[menuSelected] += 1;
}
} else {
menuData[menuSelected] = 0;
}
updateDataFlag = true;
}
// Инициализируем объект-экран (опять, это для экрана МЭЛТ, в вашем случае может быть иначе, читайте инструкцию по подключению)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
lcd.begin(lcdMaxLength, lcdMaxHeight);
lcd.clear();
}
void drawData() {
for (int i = 0; i < lcdMaxHeight; i++) {
lcd.setCursor(0, i);
lcd.print(PCdataCaption[menuData[i]]);
lcd.print(": ");
lcd.print(PCdata[menuData[i]]);
getSuffix(i);
}
}
int getSuffix(int menuIndex) {
if (PCdataSuffix[menuData[menuIndex]] == "grad") {
lcd.command(0b101010);
lcd.print("\xB0");
} else {
lcd.print(PCdataSuffix[menuData[menuIndex]]);
}
return;
}
void loop() {
parsing();
handleButtonClick();
drawMenu();
updateDisplay();
}
void handleButtonClick() { // Нажали кнопку
boolean buttonPressed = !digitalRead(BUTTON_PIN);
if (buttonPressed) {
// Кнопка нажата
if (buttonActive == false) {
buttonActive = true;
buttonTimer = millis();
}
if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {
longPressActive = true;
}
} else {
// Кнопка НЕ нажата
if (buttonActive == true) {
if (longPressActive == true) {
// Конец долгого нажатия
longPressActive = false;
switchMenu();
} else {
// Конец короткого нажатия
switchData();
}
buttonActive = false;
}
}
}
void switchMenu() {
if (menuSelected < lcdMaxHeight - 1) {
menuSelected += 1;
} else {
menuSelected = 0;
}
updateDataFlag = true;
}
void drawMenu() {
lcd.setCursor(lcdMaxLength - 1, menuSelected);
lcd.print("<");
}
void parsing() {
while (Serial.available() > 0) {
char aChar = Serial.read();
if (aChar != 'E') {
inData[index] = aChar;
index++;
inData[index] = '\0';
} else {
char *p = inData;
char *str;
index = 0;
String value = "";
while ((str = strtok_r(p, ";", &p)) != NULL) {
string_convert = str;
PCdata[index] = string_convert.toInt();
index++;
}
index = 0;
updateDataFlag = 1;
}
}
}
void updateDisplay() {
if (updateDataFlag) {
lcd.clear();
drawData();
updateDataFlag = 0;
}
}

4. Открываем программу HardwareMonitor

Идем в верхней панели Options -> Serial -> Config

В поле PORT address выбираем порт, к которому подключается ардуино (возможно придется действовать методом проб, т.к. изначально не очень понятно, к какому именно порту подключена arduino).

Далее нужно запустить передачу данных, идем в верхней панели Options -> Serial -> Run

5. Собираем все на макетной плате

Необязательный шаг, но очень интересный. Тут уж как получится, нужно тренироваться… ))

Спасибо Asgard за то, что поделился с нами своим проектом!

Если Вы нашли ошибки в тексте или тоже хотите поделится с нами своими проектами, напишите нам. Мы очень рады каждому новому проекту!

Более подробную информацию о Arduino Nano можно найти в этом разделе, а другие интересные проекты для Arduino располагаются тут.