找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 259|回复: 1

ophub 改进我家云风扇脚本增加风扇关闭,启动功能

[复制链接]

关联:

我家云ChainedboxProL1最新固件ophub使用方案详解

20240428 增加风扇关闭功能,在冬天气温比较低时,如果风扇还旋转,因为热胀冷缩轴承非常容易磨损,天气冷的时候是风扇损坏率较高的时候。


脚本是我用曾经大二c语言基础 和 GPT3.5 和力啃下来的。

个人见解:ophub我家云用的f大的调速脚本,脚本我没看的太懂,我的理解是根据温度的匀速调速脚本,但是我家云的情况不太一样,我家云主板上的散热器是一块厚铝合金,实际目的是为了增加cpu的热容,使温度不易跳变,由于平时cpu使用频率也很低,温度更多是来自环境温度和硬盘温度,所以我之前的使用爱好是cpu温度低风扇不开启可保证寿命,温度高于65低于75度,风扇低速、低噪音运行,缓慢抽走我家云内热风就行,没有必要强制降低cpu温度,当cpu突破75度,风扇全速运行,强制散热。由于cpu重负载情况不多,所以风扇很少全速开启。这套逻辑使用下来非常满意;


替换/user/bin/pwm-fan.pl





  1. #!/usr/bin/perl

  2. use strict;

  3. ################################################################################
  4. # 参数我已经修改完善,没有特殊情况勿改
  5. # 参数调整区 风扇按照固定占空比启动后10s,根据cpu温度调整转速,低于$temp_low风扇停转,高于$temp_fanOn风扇启动。
  6. # 速度最小值(满速是99),如果太小可能进入死区,风扇不转,需配合下面提示调整
  7. my $speed_min = 15;

  8. # 速度最大值(满速是99)
  9. my $speed_max = 99;

  10. # 温度低限(摄氏度): 小于等于此温度风扇停转
  11. my $temp_low = 50;

  12. # 风扇启动温度低限(摄氏度): 大于于等于此值按启动风扇散热
  13. my $temp_fanOn = 65;

  14. # 风扇启动占空比参数(%): 风扇启动时使用固定占空比:风扇启动占空比参数,设置要点:保证能启动同时风扇噪音不要过大
  15. my $duty_cycle_on = 3;

  16. # 温度最高限(摄氏度): 大于此值按最高速率转动
  17. my $temp_high = 75;

  18. # 调速间隔(秒)
  19. my $interval = 10;
  20. ################################################################################
  21. #用到的变量,下面参数勿动
  22. # 风扇状态位: 0为关闭,1为开启
  23. my $fanclose_temp = 0;

  24. # 风扇首次启动: 0为风扇运转中,1风扇从关闭到开启是第一次运行
  25. my $fan_up = 0;

  26. # 风扇切换温度转换值
  27. my $coeff_temp = 0;

  28. ################################################################################

  29. my $fixed_speed = $ARGV[0];
  30. my $period = 25000;
  31. &init;
  32. if( ($fixed_speed ne "") &&
  33.     ($fixed_speed =~ m/^[0-9]{1,3}$/) ) {
  34.     # 如果命令行参数为 0-100 的整数,则按指定的固定速率调速
  35.     &set_fixed_speed($fixed_speed);
  36. } else {
  37.     # 否则自动调速
  38.     while(1) {
  39.         &auto_speed;
  40.         sleep($interval);   
  41.     }
  42. }
  43. exit 0;

  44. ###############################################################################
  45. sub get_soc_temp {
  46.     my @fnames=(
  47.           '/sys/devices/virtual/thermal/thermal_zone0/temp',
  48.           '/sys/devices/platform/scpi/scpi:sensors/hwmon/hwmon0/temp1_input',
  49.        );
  50.     my $fh;
  51.     my $temp = 50;
  52.     for my $fname (@fnames) {
  53.         if( -f $fname ) {
  54.             open $fh, "<", $fname;
  55.             $temp = <$fh> / 1000.0;
  56.             close $fh;
  57.             return $temp;
  58.         }
  59.     }
  60.     return $temp;
  61. }

  62. sub init {

  63.     $speed_max = 100  if ($speed_max > 100);
  64.     $speed_min = 0  if($speed_min < 0);

  65.     my $fh;
  66.     `rmmod pwm_fan 2>/dev/null`;

  67.     open $fh, ">", "/sys/class/pwm/pwmchip0/export";
  68.     print $fh "0\n";
  69.     close $fh;

  70.     open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/period";
  71.     print $fh "$period\n";
  72.     close $fh;

  73.     open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/polarity";
  74.     print $fh "normal\n";
  75.     close $fh;

  76.     open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/enable";
  77.     print $fh "1\n";
  78.     close $fh;
  79. }

  80. sub set_fixed_speed {
  81.     my $fixed_speed = shift;

  82.     # 最大值0.99
  83.     my $coeff_speed = ($fixed_speed / 100.0) > 1 ?  0.99 : ($fixed_speed / 100.0);

  84.     #0.1-0.19 定义为死区
  85.     $coeff_speed = 0.20 if $coeff_speed > 0 and $coeff_speed < 0.2;

  86.     my $duty_cycle = int($coeff_speed * $period);

  87.     open my $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/duty_cycle";
  88.     print $fh "$duty_cycle\n";
  89.     close $fh;
  90. }

  91. sub auto_speed {
  92.     my $temp = &get_soc_temp;
  93.     #my $coeff_temp;
  94.     if($temp <= $temp_low) {
  95.         $coeff_temp = 0;
  96.         $fanclose_temp = 0;
  97.         #$fanclose_temp = 1; #去掉此行代码前的#测试风扇是否可以维持旋转,测试完毕行代码前加#
  98.         } elsif($temp > $temp_high) {
  99.                 $coeff_temp = 1;
  100.                 $fanclose_temp = 1;
  101.                 } elsif(($temp > $temp_fanOn)&&($fanclose_temp == 0)){
  102.                      $fan_up = 1;
  103.                      $fanclose_temp = 1;
  104.                      }else {
  105.                             $coeff_temp = ($temp - $temp_low) / ($temp_high - $temp_low);
  106.                             }

  107.     my $coeff_speed_min = $speed_min / $speed_max  * ($speed_max / 100);
  108.     my $coeff_speed = $coeff_temp;
  109.     $coeff_speed = ($coeff_speed_min + $coeff_speed) > 0.99 ? 0.99 : ($coeff_speed_min + $coeff_speed);
  110.    
  111.     my $duty_cycle = int($coeff_speed * $period);

  112.     if($fanclose_temp == 0) {
  113.         $duty_cycle = 0;
  114.         }elsif(($fanclose_temp == 1)&&($fan_up == 1)){
  115.                 $duty_cycle = $duty_cycle_on ;
  116.                 $fan_up = 0; #风扇以启动,清零首次标志位
  117.                 }else{
  118.                 }
  119.    
  120.     open my $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/duty_cycle";
  121.     print $fh "$duty_cycle\n";
  122.     close $fh;
  123. }
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
非常感谢,试用一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-20 01:31

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表