Advertisement
fWeidinger

Python

Dec 13th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import RPi.GPIO as GPIO
  5. import time
  6. import sys
  7.  
  8. # Configuration
  9. FAN_PIN = 14 # BCM pin used to drive transistor's base
  10. WAIT_TIME = 1 # [s] Time to wait between each refresh
  11. FAN_MIN = 20 # [%] Fan minimum speed.
  12. PWM_FREQ = 25 # [Hz] Change this value if fan has strange behavior
  13. INITIALIZING_TIME = 5 # [s] Time Pi is initializing (max fan speed)
  14.  
  15. # Configurable temperature and fan speed steps
  16. tempSteps = [50, 60, 70] # [°C]
  17. speedSteps = [60, 70, 100]
  18. # [%]
  19.  
  20. # Fan speed will change only of the difference of temperature is higher than hysteresis
  21. hyst = 5
  22.  
  23. # Setup GPIO pin
  24. GPIO.setmode(GPIO.BCM)
  25. GPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW)
  26. fan=GPIO.PWM(FAN_PIN,PWM_FREQ)
  27. fan.start(0);
  28.  
  29.  
  30. i = 0
  31. cpuTempOld=0
  32. fanSpeedOld=0
  33. initializing_cnt=0
  34.  
  35.  
  36.  
  37. # We must set a speed value for each temperature step
  38. if(len(speedSteps) != len(tempSteps)):
  39. print("Numbers of temp steps and speed steps are different")
  40. exit(0)
  41.  
  42. try:
  43. while (1):
  44. # Read CPU temperature
  45. cpuTempFile=open("/sys/class/thermal/thermal_zone0/temp","r")
  46. cpuTemp=float(cpuTempFile.read())/1000
  47. cpuTempFile.close()
  48.  
  49. # Calculate desired fan speed
  50. if initializing_cnt <= INITIALIZING_TIME:
  51. initializing_cnt += WAIT_TIME
  52. fanSpeed = 100
  53. else:
  54. if(abs(cpuTemp-cpuTempOld > hyst)):
  55.  
  56. # Below first value, fan will run at min speed.
  57. if(cpuTemp < tempSteps[0]):
  58. fanSpeed = speedSteps[0]
  59.  
  60. # Above last value, fan will run at max speed
  61. elif(cpuTemp >= tempSteps[len(tempSteps)-1]):
  62. fanSpeed = speedSteps[len(tempSteps)-1]
  63.  
  64. # If temperature is between 2 steps, fan speed is calculated by linear interpolation
  65. else:
  66. for i in range(0,len(tempSteps)-1):
  67. if((cpuTemp >= tempSteps[i]) and (cpuTemp < tempSteps[i+1])):
  68. fanSpeed = round((speedSteps[i+1]-speedSteps[i])\
  69. /(tempSteps[i+1]-tempSteps[i])\
  70. *(cpuTemp-tempSteps[i])\
  71. +speedSteps[i],1)
  72.  
  73. if((fanSpeed != fanSpeedOld) ):
  74. if((fanSpeed != fanSpeedOld)\
  75. and ((fanSpeed >= FAN_MIN) or (fanSpeed == 0))):
  76. fan.ChangeDutyCycle(fanSpeed)
  77. fanSpeedOld = fanSpeed
  78.  
  79. # Wait until next refresh
  80. time.sleep(WAIT_TIME)
  81.  
  82.  
  83. # If a keyboard interrupt occurs (ctrl + c), the GPIO is set to 0 and the program exits.
  84. except(KeyboardInterrupt):
  85. print("Fan ctrl interrupted by keyboard")
  86. GPIO.cleanup()
  87. sys.exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement