Рефактор

main
L_DelOff 2024-03-03 13:38:38 +03:00
parent bf4ab02293
commit 3490ff6021
2 changed files with 107 additions and 82 deletions

View File

@ -2,7 +2,13 @@
Скрипт управляет вращением вентилятора Penta Sata Hat на Rock Pi 4C Скрипт управляет вращением вентилятора Penta Sata Hat на Rock Pi 4C
Компиляция (заранее обзавестись библиотекой lmraa для Rock4C) 1. Подготовка libmraa
Собрать из https://github.com/eclipse/mraa
2. Сборка проекта
g++ -o pwmfan pwmfan.cpp -lmraa 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)

View File

@ -1,13 +1,3 @@
/*
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
* 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 */ /* standard headers */
#include <iostream> #include <iostream>
#include <signal.h> #include <signal.h>
@ -25,6 +15,7 @@
/* mraa headers */ /* mraa headers */
#include "mraa/common.hpp" #include "mraa/common.hpp"
#include "mraa/pwm.hpp" #include "mraa/pwm.hpp"
/* для HDD*/ /* для HDD*/
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
@ -34,20 +25,102 @@
#include <array> #include <array>
#define PWM_PORT 13 #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_MIN 30
#define T_MAX 50 #define T_MAX 50
#define INVERT_CONTROL_CURVE 0
const std::array<std::string, 4> HDD_NAMES = {"/dev/sda", "/dev/sdb", "/dev/sdc", "/dev/sdd"};
volatile sig_atomic_t flag = 1; 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(){ int readTempCPU(){
std::fstream ftemp; std::fstream ftemp;
std::string raw; std::string raw;
ftemp.open(TEMPERATURE_FILE,std::ios::in); ftemp.open(CPU_TEMPERATURE_FILE,std::ios::in);
if (ftemp.is_open()){ if (ftemp.is_open()){
getline(ftemp, raw); getline(ftemp, raw);
ftemp.close(); ftemp.close();
@ -80,39 +153,21 @@ int readTempHDD(const std::string& drive) {
int readTemp(){ int readTemp(){
int T_CPU = readTempCPU(); 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::array<int, HDD_NAMES.size()> T_HDD;
// std::cout << "Temperature /dev/sda: " << T_HDD_1 << " C" << std::endl;
for (int i = 0; i < HDD_NAMES.size(); ++i) {
int T_HDD_2 = readTempHDD("/dev/sdb"); T_HDD[i] = readTempHDD(HDD_NAMES[i]);
// std::cout << "Temperature /dev/sdb: " << T_HDD_2 << " C" << std::endl; if (T_HDD[i] > max) {
max = T_HDD[i];
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;
}
return max; return max;
} }
void void sig_handler(int signum)
sig_handler(int signum)
{ {
if (signum == SIGINT) { if (signum == SIGINT) {
std::cout << "Exiting..." << std::endl; 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;
}