From 3490ff6021985329531c0f399c7ac4f8300fadcf Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 3 Mar 2024 13:38:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++- pwmfan.cpp | 179 +++++++++++++++++++++++++++++------------------------ 2 files changed, 107 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index 0a71eee..b3fbcea 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,13 @@ Скрипт управляет вращением вентилятора Penta Sata Hat на Rock Pi 4C -Компиляция (заранее обзавестись библиотекой lmraa для Rock4C) - +1. Подготовка libmraa +Собрать из https://github.com/eclipse/mraa +2. Сборка проекта g++ -o pwmfan pwmfan.cpp -lmraa +3. Запуск +./pwmfan +Если возникает ошибка "error while loading shared libraries" (не находит libmraa.so.2). +ln -s /usr/local/lib/libmraa.so.2 /usr/lib/libmraa.so.2 +Путь до libmraa.so.2 можно найти после выполнения sudo make install (при сборке libmraa) \ No newline at end of file diff --git a/pwmfan.cpp b/pwmfan.cpp index 2d1b4bd..53a12d3 100644 --- a/pwmfan.cpp +++ b/pwmfan.cpp @@ -1,13 +1,3 @@ -/* - * Author: Thomas Ingleby - * Copyright (c) 2014 Intel Corporation. - * - * SPDX-License-Identifier: MIT - * - * Example usage: Generates PWM at a step rate of 0.01 continuously. - * Press Ctrl+C to exit - */ - /* standard headers */ #include #include @@ -25,6 +15,7 @@ /* mraa headers */ #include "mraa/common.hpp" #include "mraa/pwm.hpp" + /* для HDD*/ #include #include @@ -34,20 +25,102 @@ #include #define PWM_PORT 13 -#define TEMPERATURE_FILE "/sys/class/thermal/thermal_zone0/temp" +#define CPU_TEMPERATURE_FILE "/sys/class/thermal/thermal_zone0/temp" #define T_MIN 30 #define T_MAX 50 - - - - +#define INVERT_CONTROL_CURVE 0 +const std::array HDD_NAMES = {"/dev/sda", "/dev/sdb", "/dev/sdc", "/dev/sdd"}; volatile sig_atomic_t flag = 1; +// power^ +// 100%| *--------- +// | / +// | / +// | / +// | / +// | / +// | / +// | / +// | / +// | / +// ---====*--------*---------------> +// 0 | T_MIN T_MAX max[TEMP], celsius + +int main(void) +{ + signal(SIGINT, sig_handler); + std::cout << "!!!Control fan connected to RockPi4 pin " << PWM_PORT << " according to CPU&HDD temperature!!!\n"; + initPWM(); + checkControlCurve(); + + float power = 0.0f; + int temperature = 0; + + while (flag) { + temperature = readTemp(); + power = calcPower(temperature); + std::cout << "T:" << t << "С power:"<< value << "%\n"; + pwm.write(value); + usleep(2000000); + } + + return EXIT_SUCCESS; +} + +float calcPower(int temperature) { + if (temperature < T_MIN) { + value = 0.0f; + } + if (temperature >= T_MIN && temperature <= T_MAX) { + value = (float(temperature)-float(T_MIN))/(float(T_MAX)-float(T_MIN)); + if (value < 0.25) { + value = 0.0f; + } + } + if (temperature > T_MAX) { + value = 1.0f; + } + if !(INVERT_CONTROL_CURVE) { + return value; + } + else { + return (1.0f-value); + } +} + +void checkControlCurve(){ + std::cout << "PWM power 0%" << std::endl; + pwm.write(0.0f) + usleep(2000000); + + std::cout << "PWM power 25%" << std::endl; + pwm.write(0.25f) + usleep(2000000); + + std::cout << "PWM power 50%" << std::endl; + pwm.write(0.5f) + usleep(2000000); + + std::cout << "PWM power 75%" << std::endl; + pwm.write(0.75f) + usleep(2000000); + + std::cout << "PWM power 100%" << std::endl; + pwm.write(1.0f) + usleep(2000000); +} + +void initPWM(){ + mraa::Pwm pwm(PWM_PORT); + std::cout << "Cycling PWM on pin " << PWM_PORT << std::endl; + pwm.enable(true); +} + int readTempCPU(){ std::fstream ftemp; std::string raw; - ftemp.open(TEMPERATURE_FILE,std::ios::in); + ftemp.open(CPU_TEMPERATURE_FILE,std::ios::in); if (ftemp.is_open()){ getline(ftemp, raw); ftemp.close(); @@ -80,39 +153,21 @@ int readTempHDD(const std::string& drive) { int readTemp(){ int T_CPU = readTempCPU(); - // std::cout << "Temperature CPU: " << T_CPU << " C" << std::endl; + int max = T_CPU; - int T_HDD_1 = readTempHDD("/dev/sda"); - // std::cout << "Temperature /dev/sda: " << T_HDD_1 << " C" << std::endl; - - int T_HDD_2 = readTempHDD("/dev/sdb"); - // std::cout << "Temperature /dev/sdb: " << T_HDD_2 << " C" << std::endl; - - int T_HDD_3 = readTempHDD("/dev/sdc"); - // std::cout << "Temperature /dev/sdc: " << T_HDD_3 << " C" << std::endl; - - int T_HDD_4 = readTempHDD("/dev/sdd"); - // std::cout << "Temperature /dev/sdd: " << T_HDD_4 << " C" << std::endl; - - int max = T_CPU; - if (T_HDD_1 > max) { - max = T_HDD_1; - } - if (T_HDD_2 > max) { - max = T_HDD_2; - } - if (T_HDD_3 > max) { - max = T_HDD_3; - } - if (T_HDD_4 > max) { - max = T_HDD_4; - } + std::array T_HDD; + + for (int i = 0; i < HDD_NAMES.size(); ++i) { + T_HDD[i] = readTempHDD(HDD_NAMES[i]); + if (T_HDD[i] > max) { + max = T_HDD[i]; + } + } return max; } -void -sig_handler(int signum) +void sig_handler(int signum) { if (signum == SIGINT) { std::cout << "Exiting..." << std::endl; @@ -120,40 +175,4 @@ sig_handler(int signum) } } -int -main(void) -{ - std::cout << " Control fan connected to RockPi4 pin " << PWM_PORT << " according to CPU&HDD temperature\n"; - float value = 0.0f; - int t = 0; - signal(SIGINT, sig_handler); - - //! [Interesting] - mraa::Pwm pwm(PWM_PORT); - std::cout << "Cycling PWM on IO3 (pwm3)" << std::endl; - pwm.enable(true); - - while (flag) { - //value = value + 0.01f; - pwm.write(value); - usleep(2000000); - t = readTemp(); - if (t < T_MIN) { - value = 0.0f; - } - if (t >= T_MIN && t <= T_MAX) { - value = (float(t)-float(T_MIN))/(float(T_MAX)-float(T_MIN)); - if (value<0.25) { - value = 0.0f; - } - } - if (t > T_MAX) { - value = 1.0f; - } - std::cout << "T:" << t << "С power:"<< value << "%\n"; - } - //! [Interesting] - - return EXIT_SUCCESS; -}