树莓派定时控制散热风扇开关

硬件上

一、思路: GPIO 给三极管基极信号

使用三极管组成开关电路。以 S9013 为例,S9013 是 NPN 型三极管。关于 NPN 型三极管,S9013 的特性如下:

NPN 基极高电压,极电极与发射极短路。低电压,极电极与发射极开路。也就是不工作。

二、接线

相关电路图如下:

S9013

连接电路图

连接引脚图

软件上

一、GPIO 简单使用

首先看一些例程:

1.GPIO 输出

1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding: utf-8 -*-  
import RPi.GPIO as GPIO
import time
# BOARD 编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)
# 输出模式
GPIO.setup(11, GPIO.OUT)

while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)

2.控制 LED 灯闪烁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

led = 23
GPIO.setup(led, GPIO.OUT)

try:
while(True):
GPIO.output(led, 1)
time.sleep(1)
GPIO.output(led, 0)
time.sleep(1)
except Exception as e:
print(e)
finally:
GPIO.cleanup()

三、环境准备

先要安装 RPi.GPIO 库:

1.更新源:

1
sudo apt-get update

2.安装 python:

1
sudo apt-get install python-dev

3.安装 python-pip( python-pip 是一个可以替代 easy_install 的安装和管 python 软件包的工具)

1
sudo apt-get install python-pip

4.利用 pip 安装 rpi.gpio:

1
sudo pip install rpi.gpio

四、编写程序

加入时间控制,在每天的 6 点后开始执行温度控制,12 点 30 分停止温度控制,关闭风扇,13 点 30 分开启温度控制,22 点 50 分后停止执行温度检测控制,关闭风扇。

考虑到实际使用时可能会有重启的需要,所以还需要在 6 点到 23 点有判断,但也可能是自己做麻烦了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/python2.7
#coding:utf-8
__date__ = "2016-11-20"

from RPi import GPIO as gpio #注意RPi中的i是小写的
import time

# 获取cpu的温度
def get_cpu_temp():
with open("/sys/class/thermal/thermal_zone0/temp", 'r') as f:
temp = float(f.read()) / 1000
return temp

# 监控温度,控制风扇开关
def check_temp(port):
# BOARD 编号方式,基于插座引脚编号
gpio.setmode(gpio.BOARD)

# 设置哪个引脚为输出模式
gpio.setup(port, gpio.OUT)

# 标记风扇开关状态
is_close = True

# 标记运行状态
will_run = False

try:
while True:
current_time = time.localtime(time.time())
if(current_time.tm_hour == 6 and current_time.tm_min == 0 and will_run == False):
will_run = True
if(current_time.tm_hour == 12 and current_time.tm_min == 30 and will_run == True):
will_run = False
is_close = True
gpio.output(port, 0)
if(current_time.tm_hour == 13 and current_time.tm_min == 30 and will_run == False):
will_run = True
if(current_time.tm_hour == 22 and current_time.tm_min == 50 and will_run == True):
will_run = False
is_close = True
gpio.output(port, 0)
if((current_time.tm_hour < 6 or current_time.tm_hour > 23) and will_run == True):
will_run = False
is_close = True
gpio.output(port, 0)
temp = get_cpu_temp()
if will_run:
if is_close:
# 温度大于等于 55 时,打开引脚,输出电信号
if temp >= 55:
gpio.output(port, 1)
is_close = False
else:
# 温度降低到 45 及其以下时,关闭引脚
if temp <= 45:
gpio.output(port, 0)
is_close = True

# 休眠 1 秒
time.sleep(1)
print "temp:%s, program is running:, fan is closed:%s" % (temp, will_run, is_close)
except Exception, e:
print "I don't know, something went wrong."
gpio.cleanup()

if __name__ == '__main__':
port = 16
check_temp(port)

测试代码,执行很成功。

Mastodon