找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 467|回复: 2

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

[复制链接]
发表于 2024-4-25 12:00 | 显示全部楼层 |阅读模式
本帖最后由 2562733675 于 2024-6-4 22:09 编辑

关联:

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

20240604 增加风扇降噪系数(系数可以是小数),倍数降低风扇温度最高限(最高限默认75度)以下,最低限以上的风扇转速,强调不超温就尽量不让风扇吵闹的原则;
               修改风扇停转温度,根据硬盘最佳寿命40度为修改参考;
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. #20240604 增加风扇降噪系数(系数可以是小数),倍数降低风扇温度最高限(最高限默认75度)以下,最低限以上的风扇转速,强调不超温就尽量不让风扇吵闹的原则;
  5. #              修改风扇停转温度,根据硬盘最佳寿命40度为修改参考;
  6. #20240428 增加风扇关闭功能,在冬天气温比较低时,如果风扇还旋转,因为热胀冷缩轴承非常容易磨损,天气冷的时候是风扇损坏率较高的时候。
  7. # 参数我已经修改完善,没有特殊情况勿改 -根据F大脚本修改 by Ran
  8. # cat /sys/devices/virtual/thermal/thermal_zone0/temp #用此行命令可在ssh命令矿中查看cpu实时温度
  9. # 参数调整区 风扇按照固定占空比启动后10s,根据cpu温度调整转速,低于$temp_low风扇停转,高于$temp_fanOn风扇启动。
  10. # 速度最小值(满速是99),如果太小可能进入死区,风扇不转,需配合下面提示调整
  11. my $speed_min = 8;

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

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

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

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

  20. # 降噪系数: 降低风扇启动到cpu温度最高限区间的风扇噪音,降低幅度计算1/$fan_n,最终风扇转速=计算转速*(1/$fan_n)+$speed_min;
  21. my $fan_n = 2;

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

  24. # 调速间隔(秒)
  25. my $interval = 10;
  26. ################################################################################
  27. #用到的变量,下面参数勿动
  28. # 风扇状态位:0为关闭,1为开启
  29. my $fanclose_temp = 0;

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

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

  34. ################################################################################

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

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

  68. sub init {

  69.     $speed_max = 100  if ($speed_max > 100);
  70.     $speed_min = 0  if($speed_min < 0);

  71.     my $fh;
  72.     `rmmod pwm_fan 2>/dev/null`;

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

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

  79.     open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/polarity";
  80.     print $fh "normal\n";
  81.     close $fh;

  82.     open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/enable";
  83.     print $fh "1\n";
  84.     close $fh;
  85. }

  86. sub set_fixed_speed {
  87.     my $fixed_speed = shift;

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

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

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

  93.     open my $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/duty_cycle";
  94.     print $fh "$duty_cycle\n";
  95.     close $fh;
  96. }

  97. sub auto_speed {
  98.     my $temp = &get_soc_temp;
  99.     #my $coeff_temp;
  100.     if($temp <= $temp_low) {
  101.         $coeff_temp = 0;
  102.         $fanclose_temp = 0;
  103.         #$fanclose_temp = 1; #去掉此行代码前的#测试风扇是否可以维持旋转,测试完毕此行代码前加#
  104.         } elsif($temp > $temp_high) {
  105.                 $coeff_temp = 1;
  106.                       $fanclose_temp = 1;
  107.                 } elsif(($temp > $temp_fanOn)&&($fanclose_temp == 0)){
  108.                                $fan_up = 1; #风扇启转,设置首启转志位
  109.                                $fanclose_temp = 1;
  110.                                }else {
  111.                             $coeff_temp = ($temp - $temp_low) / (($temp_high - $temp_low)*$fan_n);
  112.                             }

  113.     my $coeff_speed_min = $speed_min / $speed_max  * ($speed_max / 100);
  114.     my $coeff_speed = $coeff_temp;
  115.     $coeff_speed = ($coeff_speed_min + $coeff_speed) > 0.99 ? 0.99 :($coeff_speed_min + $coeff_speed);
  116.    
  117.     my $duty_cycle = int($coeff_speed * $period);

  118.     if($fanclose_temp == 0) {
  119.         $duty_cycle = 0;
  120.         }elsif(($fanclose_temp == 1)&&($fan_up == 1)){
  121.                 $duty_cycle = $duty_cycle_on ;
  122.                 $fan_up = 0; #风扇已启动,清零首启转志位
  123.                 }else{
  124.                 }
  125.    
  126.     open my $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/duty_cycle";
  127.     print $fh "$duty_cycle\n";
  128.     close $fh;
  129. }
复制代码


本帖子中包含更多资源

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

×
发表于 2024-4-28 13:27 | 显示全部楼层
非常感谢,试用一下
回复 支持 反对

使用道具 举报

发表于 2024-5-24 21:22 | 显示全部楼层
太棒了,谢谢分享。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-5 18:51

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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