class Pifan::Process

Public Class Methods

new(parameters) click to toggle source
# File lib/pifan/process.rb, line 11
def initialize(parameters)
  @control_pin = parameters[:control_pin]
  @refresh_time = parameters[:refresh_time]
  @pwm_frequency = parameters[:pwm_frequency]
  @temp_steps = parameters[:temperature_steps]
  @speed_steps = parameters[:speed_steps]

  RPi::GPIO.set_numbering :bcm
  RPi::GPIO.setup @control_pin, as: :output, initialize: :low
  @fan = RPi::GPIO::PWM.new(@control_pin, @pwm_frequency)
  @fan.start(0)
end

Public Instance Methods

cleanup() click to toggle source
# File lib/pifan/process.rb, line 52
def cleanup
  RPi::GPIO.clean_up
end
start() click to toggle source
# File lib/pifan/process.rb, line 24
def start
  hyst = 1
  cpu_temp_old = 0
  fan_speed_old = 0

  # Run at full speed for 2 secs to avoid not starting at small speed
  @fan.duty_cycle = 100
  sleep 2

  loop do
    cpu_temp_current = cpu_temp
    logger.debug("New temperature: #{cpu_temp_current}")

    if (cpu_temp_current - cpu_temp_old).abs > hyst
      fan_speed_current = fan_speed
      if fan_speed_current != fan_speed_old
        logger.debug("New fan speed: #{fan_speed_current}")
        @fan.duty_cycle = fan_speed_current
        fan_speed_old = fan_speed_current
      end

      cpu_temp_old = cpu_temp_current
    end

    sleep @refresh_time
  end
end

Private Instance Methods

cpu_temp() click to toggle source
# File lib/pifan/process.rb, line 58
def cpu_temp
  File.read(CPU_TEMP_FILENAME).to_f / 1000
end
fan_speed() click to toggle source
# File lib/pifan/process.rb, line 62
def fan_speed
  if cpu_temp <= @temp_steps.first
    @speed_steps.first
  elsif cpu_temp >= @temp_steps.last
    @speed_steps.last
  else
    more_index = @temp_steps.find_index { |n| cpu_temp < n }
    less_index = more_index - 1

    speed_interpolation less_index, more_index
  end
end
speed_interpolation(less_index, more_index) click to toggle source
# File lib/pifan/process.rb, line 75
def speed_interpolation(less_index, more_index)
  ((@speed_steps[more_index] - @speed_steps[less_index]) / \
    (@temp_steps[more_index] - @temp_steps[less_index]) * \
    (cpu_temp - @temp_steps[less_index]) + \
    @speed_steps[less_index]).round 1
end