Гайд - Делаем монитор железа пк (+бонус) | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой скрипт на основе слитого?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

Гайд Делаем монитор железа пк (+бонус)

Click

Миддл
Автор темы
14 Июл 2023
40
18
0
Получится у нас такая штука:
Photo 2023 07 19 20 23 00
Photo 2023 07 19 20 23 03

Для начала определимся с тем, что нам нужно:
1. +- Прямые руки
2. Arduino nano/uno(без разницы)
3. LCD1602 + I2C
4. DHT11
5. инфракрасный пульт


Все есть? Можно продолжать

Для начала напишем нужный код(для ардуино и для пк)

1. Arduino
Arduino:
#include <DFRobot_DHT11.h>
#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

DFRobot_DHT11 DHT;
#define DHT11_PIN 12

LiquidCrystal_PCF8574 lcd(0x27); // Адрес ЖК-дисплея 0x27 (может быть другим)
IRrecv irrecv(11); // Пин, к которому подключен ИК-приемник
decode_results results;

int currentDisplayMode = 0; // Текущий режим отображения

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  lcd.begin(16, 2);
  lcd.setBacklight(255);
}

void loop() {
  DHT.read(DHT11_PIN);
  if (irrecv.decode(&results)) {
    unsigned long value = results.value; // Конвертация

    // кнопки на пульте
    switch (value) {
      case 0xFF30CF: // Код кнопки "1" на пульте
        currentDisplayMode = 1; // режим отображения 1
        break;

      case 0xFF18E7: // Код кнопки "1" на пульте
        currentDisplayMode = 2; // режим отображения 1
        break;

      default:
        break;
    }

    irrecv.resume(); // Принимаем следующую команду
  }

  // Отображение различных режимов на ЖК-дисплее
  switch (currentDisplayMode) {
    case 1:
      displayTemperatureAndHumidity();
      break;
    case 2:
    displayCPUGPU();
      break;
    default:
      break;
  }
}

// Функция отображения температуры и влажности на ЖК-дисплее
void displayTemperatureAndHumidity() {
  lcd.clear();
    
// Выводим данные на экран
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(DHT.temperature);
  lcd.print("C");

  lcd.setCursor(0, 1);
  lcd.print("Humidity: ");
  lcd.print(DHT.humidity);
  lcd.print("%");
}

// GPU отображение
void displayCPUGPU(){
    int gpuload = Serial.parseInt();
    int gpuTemperature = Serial.parseInt();
    
    lcd.clear();

    // Выводим данные на экран
    lcd.setCursor(0, 0);
    lcd.print("GPU: ");
    lcd.print(gpuload);
    lcd.print("%");
    
    lcd.setCursor(0, 1);
    lcd.print("GPU: ");
    lcd.print(gpuTemperature);
    lcd.print("C");

    delay(500);
}
Хочу немного пояснить за части кода для общего понимания:
#define DHT11_PIN 12 Здесь мы подключаем DHT11, вам нужно написать тот пин, в который подключили. У меня это 12 пин
IRrecv irrecv(11); Подключение приемника пульта. Вам нужно вписать то значение, куда вы подключили его. У меня это 11 пин
Все остальное я +- объяснил в коде.

Теперь напишем код для стороны пк(c++):
PC:
#include <iostream>
#include <Windows.h>
#include <nvml.h>
#include <string>
#include <pdh.h>
#include <pdhmsg.h>

#pragma comment(lib, "nvml.lib")
#pragma comment(lib, "pdh.lib")

// Функция для получения нагрузки GPU (для NVIDIA)
double getGpuLoad() {
    nvmlReturn_t result;
    nvmlDevice_t device;
    unsigned int deviceCount;

    // Инициализация NVML
    result = nvmlInit();
    if (result != NVML_SUCCESS) {
        std::cerr << "Failed to initialize NVML: " << nvmlErrorString(result) << std::endl;
        return -1.0;
    }

    // Получение количества доступных устройств NVIDIA
    result = nvmlDeviceGetCount(&deviceCount);
    if (result != NVML_SUCCESS) {
        std::cerr << "Failed to get device count: " << nvmlErrorString(result) << std::endl;
        nvmlShutdown();
        return -1.0;
    }

    // Открытие первого устройства NVIDIA
    result = nvmlDeviceGetHandleByIndex(0, &device);
    if (result != NVML_SUCCESS) {
        std::cerr << "Failed to get device handle: " << nvmlErrorString(result) << std::endl;
        nvmlShutdown();
        return -1.0;
    }

    // Получение данных о нагрузке GPU
    nvmlUtilization_t gpuUtilization;
    result = nvmlDeviceGetUtilizationRates(device, &gpuUtilization);
    double gpuLoad = (result == NVML_SUCCESS) ? static_cast<double>(gpuUtilization.gpu) : -1.0;

    nvmlShutdown();
    return gpuLoad;
}

// Функция для получения температуры GPU (для NVIDIA)
double getGpuTemperature() {
    nvmlReturn_t result;
    nvmlDevice_t device;
    unsigned int deviceCount;

    // Инициализация NVML
    result = nvmlInit();
    if (result != NVML_SUCCESS) {
        std::cerr << "Failed to initialize NVML: " << nvmlErrorString(result) << std::endl;
        return -1.0;
    }

    // Получение количества доступных устройств NVIDIA
    result = nvmlDeviceGetCount(&deviceCount);
    if (result != NVML_SUCCESS) {
        std::cerr << "Failed to get device count: " << nvmlErrorString(result) << std::endl;
        nvmlShutdown();
        return -1.0;
    }

    // Открытие первого устройства NVIDIA
    result = nvmlDeviceGetHandleByIndex(0, &device);
    if (result != NVML_SUCCESS) {
        std::cerr << "Failed to get device handle: " << nvmlErrorString(result) << std::endl;
        nvmlShutdown();
        return -1.0;
    }

    // Получение данных о температуре GPU
    unsigned int temperature;
    result = nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &temperature);
    double gpuTemperature = (result == NVML_SUCCESS) ? static_cast<double>(temperature) : -1.0;

    nvmlShutdown();
    return gpuTemperature;
}

int main() {
    const std::wstring portName = L"\\\\.\\COM3"; // Укажите правильный COM-порт Arduino
    HANDLE hSerial = CreateFileW(
        portName.c_str(),
        GENERIC_READ | GENERIC_WRITE,
        0,
        nullptr,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        nullptr
    );

    if (hSerial == INVALID_HANDLE_VALUE) {
        std::cerr << "Failed to open serial port." << std::endl;
        return 1;
    }

    DCB dcbSerialParams = { 0 };
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        std::cerr << "Failed to get serial port parameters." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    dcbSerialParams.BaudRate = CBR_9600;      // Скорость передачи данных
    dcbSerialParams.ByteSize = 8;             // Биты данных
    dcbSerialParams.Parity = NOPARITY;        // Паритет
    dcbSerialParams.StopBits = ONESTOPBIT;    // Стоп-биты

    if (!SetCommState(hSerial, &dcbSerialParams)) {
        std::cerr << "Failed to set serial port parameters." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    COMMTIMEOUTS timeouts = { 0 };
    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;
    if (!SetCommTimeouts(hSerial, &timeouts)) {
        std::cerr << "Failed to set serial port timeouts." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    while (true) {
        double gpuload = getGpuLoad();
        double gpuTemperature = getGpuTemperature();

        std::string data = "GPU Temp: " + std::to_string(static_cast<int>(gpuload)) + " GPU Temp: " + std::to_string(static_cast<int>(gpuTemperature)) + "\n";
        DWORD bytesWritten;
        if (!WriteFile(hSerial, data.c_str(), data.size(), &bytesWritten, nullptr)) {
            std::cerr << "Failed to write data to serial port." << std::endl;
            break;
        }

        // Задержка между отправками данных (в миллисекундах)
        Sleep(100); // 100 мс = 0.1 секунды
    }

    CloseHandle(hSerial);
    return 0;
}
Ничего пояснять не буду, т.к просто попросил этот код у GPT:Ast
А, ну вот кроме того, что вам нужно будет вписать порт в который вы подключили ардуинку(88 строка)

Такс, код мы написали, теперь осталось все подключитьanime_piy
Photo 2023 07 19 20 21 10
Правильное подключение всех компонентов вы можете найти в гугле, но я все же распишу(первое - на компоненте, второе - на ардуино):
1. LCD1602:
GND -> GND
VCC -> 5v
SJA -> A5
SCL -> A4


2.DHT11:
VCC -> 5v
DATA -> (любой D пин, например 12)
GND -> GND


3. Приемник(от лицевой стороны):
первая нога -> (любой D пин, например 11)
вторая нога(середина) - > GND
третья нога -> 5v


Вы можете подключать GND и 5v к одному проводу, все работает отлично.

Теперь нам нужно все загрузить на ардуинку
Сначала скачиваем программу - https://www.arduino.cc/ (сами там найдете)

Скачали? Молодцы! Теперь нам нужно все настроить и загрузить.
1. Открываем файлик pc.ino(ну если вы скачали)
2. Загружаем библиотеки. Скетч -> Подключить библиотеку -> Добавить .zip библиотеку
3. Добавляем все библиотеки
4. Ищем нужный порт и выбираем вашу ардуинку(у меня это nano)
5. Нажимаем на стрелочку загрузки
6. Profit!

GND - земля(минус)
5v - +
VCC - 3v/5v
DATA - передача данных по этому проводу
D пин - цифровой пин
A пин - аналоговый пин

Скачать все исходники + библиотеки:
VT - https://www.virustotal.com/gui/file...1408cffe25318cc7e397490ea627f75fdd3?nocache=1
Ебать я от VT в ахуе, если боитесь, то сами компильтеanime_piy

Перед тем как запускать программу на пк закрой ардуино, она может занимать нужный порт
Проверь подключил ли ты библиотеки
Проверь Выбрал ли ты нужный порт и версию ардуино
Попробуй выбрать другой процессор ардуино - Инструменты -> Processor

Идею спиздил у AlexGyver, код, подключение и все остальное - моё
Спасибо за то что прочитал:anime_love: Если хочешь поддержать меня, можешь написать в тг(ну хз, может денюжку подкинуть)
 
Like
  • 1
Реакции: 1 user
Активность:
Пока что здесь никого нет