这里均以s8050为开关,s8050为NPN型三极管,以平的那面为参考面,左边阵脚接电源正极,中间针脚为开关,右边阵脚接电源负极
不控速风扇:
#!/usr/bin/python
#coding:utf-8
import time
import RPi.GPIO as GPIO
#这里选择14(BCM)号针脚作为开关
GPIO_OUT = 14
def setup_GPIO():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(GPIO_OUT, GPIO.OUT)
#开启风扇
def start_fan():
GPIO.output(GPIO_OUT,GPIO.HIGH)
#关闭风扇
def stop_fan():
GPIO.output(GPIO_OUT,GPIO.LOW)
#获取cpu温度
def cpu_temp():
tempFile=open("/sys/class/thermal/thermal_zone0/temp")
cpu_temp=tempFile.read()
tempFile.close()
temp_c=(int(cpu_temp)/1000)
return int(temp_c)
#若温度大于等于55度开启风扇,小于等于45度关闭扇。中间相差温度作为缓冲,不然风扇就会一会开一会关。
def fen():
if cpu_temp()>=55:
start_fan()
fen_state(1)
elif cpu_temp()<=45:
stop_fan()
fen_state(0)
else:
pass
def fen_state(state):
f=open("/etc/startup-script/state.txt")
file=f.readlines()
i=0
for line in file:
line = line.strip("\n")
v = line.split(":")
if v[0] == "fen_state":
file[i] = "fen_state:"+str(state)
break
i=i+1
f=open("/etc/startup-script/state.txt",'w+')
f.writelines(file)
f.close()
if __name__ == '__main__':
setup_GPIO()
fen_state(0)
while True:
fen()
time.sleep(5)
控速风扇:
#!/usr/bin/env python
# encoding: utf-8
import RPi.GPIO as GPIO
import time
#以14号(BCM)阵脚为开关
GPIO_OUT = 14
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(GPIO_OUT,GPIO.OUT)
pwm = GPIO.PWM(GPIO_OUT, 100)
speed=0
prv_temp=0
try:
while True:
tmpFile=open('/sys/class/thermal/thermal_zone0/temp')
cpu_temp=int(tmpFile.read())/1000
tmpFile.close()
if cpu_temp >= 34:
if prv_temp < 34:
# 启动时防止风扇卡死先全功率转0.1秒
pwm.start(0)
pwm.ChangeDutyCycle(100)
time.sleep(.1)
speed=min(cpu_temp, 100)
pwm.ChangeDutyCycle(speed)
else:
pwm.stop()
prv_temp=cpu_temp
time.sleep(5)
except KeyboardInterrupt:
pass
pwm.stop()
2 comments
同样的接线pwm效果如何呢
good, thanks!