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

硬件上

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

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

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

二、接线

相关电路图如下:

S9013

连接电路图

连接引脚图

软件上

一、GPIO简单使用

首先看一些例程:

1.GPIO输出

# -*- 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灯闪烁

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.更新源:

$ sudo apt-get update

2.安装python:

$ sudo apt-get install python-dev

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

$ sudo apt-get install python-pip

4.利用pip安装rpi.gpio:

$ sudo pip install rpi.gpio

四、编写程序

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

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

#!/usr/bin/python2.7
#coding:utf-8
__author__ = "Zhaosi"
__date__ = "2016-11-20"
__blog__ = "https://dreamcreator108.com"

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)

测试代码,执行很成功。