衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

樹莓派控制風扇的幾種方式

CHANBAEK ? 來源:頭條號科G棧 ? 作者:頭條號科G棧 ? 2023-03-22 15:22 ? 次閱讀

為了提高樹莓派的散熱效率,可以加一個小風扇,網上那種5v-dc 25x25的就可以。 我使用一個s9013三極管控制風扇的啟停,電路原理圖如下所示:

基極電阻的大小可以根據實際情況調整,如果電阻過大會導致基極電流太小,進而CE電流太小; 如果電阻過小,可能會燒壞三極管。 最佳狀態是三極管導通后ce電流剛好是風扇的額定電流,可以根據風扇額定電流和三極管放大倍數大概算出基極的電流,然后根據gpio電壓算出需要的電阻。

控制風扇可以有多種方式,c、python、shell腳本都可以,下面是我實現的代碼。

1、使用linux文件IO函數,實現開關風扇操作,這是最直接簡單的方式,不需要安裝其他東西,就是要頻繁開關文件。

#include
#include
#include
#include 
#include 
int get_temp()
{
    char  temp[8];
   int fd = open("/sys/class/thermal/thermal_zone0/temp",O_RDONLY);
   read(fd,&temp,5);
   close(fd);
   return atoi(temp);
}

uint8_t fan_on = 0;
void main()
{
    char* buff = "18";
	int fd = access("/sys/class/gpio/gpio18/value",F_OK);
	if(fd<0)
	{
		fd = open("/sys/class/gpio/export",O_WRONLY);
        write(fd,buff,1);
        close(fd);
	}
    fd = open("/sys/class/gpio/gpio18/direction",O_WRONLY);
    buff = "out";
    write(fd,buff,3);
    close(fd);
    while(1)
    {
        int temp = get_temp();
       // printf("temp:%f\\n",temp/1000.0);
        temp /=1000; 
        if((fan_on == 1)&&(temp <= 40))
        {
            
            fd = open("/sys/class/gpio/gpio18/value",O_WRONLY);
            buff = "0";
            write(fd,buff,1);
            close(fd);
            printf("fan off\\n");
            fan_on = 0;
        }
        else if((fan_on == 0)&&(temp >=45))
        {
            fd = open("/sys/class/gpio/gpio18/value",O_WRONLY);
            buff = "1";
            write(fd,buff,1);
            close(fd);
            printf("fan on\\n");
            fan_on = 1;
        }
        sleep(1);
    }   
}

2、使用bcm2835庫,開關控制風扇,需要安裝bcm2835庫,編譯需要加上-lbcm2835選項,另外需要sudo管理員權限運行。

#include 
#include
#include
#include 
#include 
#define PIN RPI_GPIO_P1_12

int get_temp()
{
    char  temp[8];
   int fd = open("/sys/class/thermal/thermal_zone0/temp",O_RDONLY);
   read(fd,&temp,5);
   close(fd);
   return atoi(temp);
}

int main(int argc,char **argv)
{
    if (!bcm2835_init())
        return 1;
 
  // 輸出方式
  bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
 
  while (1)
  {
        int temp = get_temp();
       // printf("temp:%f\\n",temp/1000.0);
        temp /=1000; 
     if((fan_on == 1)&&(temp <= 40))
    {
        bcm2835_gpio_write(PIN, HIGH);
        fan_on = 0;
    }
    else if((fan_on == 0)&&(temp >=45))
    {
        bcm2835_gpio_write(PIN, LOW);
        fan_on = 1;
    }
    bcm2835_delay(1000);
  }
  bcm2835_close();
  return 0;
}

3、使用bcm2835庫,pwm方式控制,可以更精細的控制轉速,不過pwm的頻率不宜太高,否則高頻噪音很大,還不如讓其全速運行。 另外pwm占空比過低風扇也不轉,所以我直接讓他從50%開始運轉,并且在停止和運轉有一個死區,避免在零界點頻繁啟停。 具體大家可以根據自己的需求調整。

#include 
#include 
#include 
#include 
#include 
#include 

// PWM output on RPi Plug P1 pin 12 (which is GPIO pin 18)
// in alt fun 5.
// Note that this is the _only_ PWM pin available on the RPi IO headers
#define PIN RPI_GPIO_P1_12
// and it is controlled by PWM channel 0
#define PWM_CHANNEL 0
// This controls the max range of the PWM signal
#define RANGE 200

int get_temp()
{
    char  temp[8];
   int fd = open("/sys/class/thermal/thermal_zone0/temp",O_RDONLY);
   read(fd,&temp,5);
   close(fd);
   return atoi(temp);
}

int temp;
int main(int argc, char **argv)
{
    if (!bcm2835_init())
	return 1;

    // Set the output pin to Alt Fun 5, to allow PWM channel 0 to be output there
    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_ALT5);

    bcm2835_pwm_set_clock(BCM2835_PWM_CLOCK_DIVIDER_2048);
    bcm2835_pwm_set_mode(PWM_CHANNEL, 1, 1);
    bcm2835_pwm_set_range(PWM_CHANNEL, RANGE);

    while (1)
    {
        temp= get_temp()/100;
        // printf("temp:%f\\n",temp/1000.0);
        if((temp <= 400))
        {
	        bcm2835_pwm_set_data(PWM_CHANNEL, 0);
        }
        else if(temp > 500)
        {
            bcm2835_pwm_set_data(PWM_CHANNEL, RANGE);
        }
        else if(temp > 450)
        { 
            bcm2835_pwm_set_data(PWM_CHANNEL, (temp-450)*2+100);
        }
        //printf("temp:%d\\n",temp);
        sleep(1);
    }
    bcm2835_close();
    return 0;
}

4、python開關控制

import RPi.GPIO as gpio
from time import sleep

Temper_HI = 47  # 風扇啟動溫度
Temper_LO = 40  # 風扇關閉溫度
gpio_pin = 12
# 初始化GPIO針腳控制
gpio.setmode(gpio.BOARD)
gpio.setup(gpio_pin, gpio.OUT)

while True:
    with open("/sys/class/thermal/thermal_zone0/temp", "r") as f: 
        temper = int(f.read()) // 100 / 10  # 計算溫度,保留一位小數
    # print(temper)
    if temper > Temper_HI:  
        gpio.output(gpio_pin, gpio.HIGH)  

    if temper < Temper_LO:
        gpio.output(gpio_pin, gpio.LOW)  
    sleep(1)

5、python pwm控制

import RPi.GPIO as gpio
import time 
fan_gpio_pin = 12
temp_max = 500
temp_on = 450
temp_min = 400
def get_cpu_temp():
    with open('/sys/class/thermal/thermal_zone0/temp') as f:
        cpu_temp = int(f.read())
    return cpu_temp/100 

def main():
    gpio.setwarnings(False)
    gpio.setmode(gpio.BOARD)
    gpio.setup(fan_gpio_pin, gpio.OUT, initial=gpio.LOW)
    pwm = gpio.PWM(fan_gpio_pin, 50)
    hasFanStarted = False
    while True:
        temp = get_cpu_temp()
        # print(temp)
        if temp < temp_min:
            if hasFanStarted:      
                pwm.start(0)         
                hasFanStarted = False
        elif temp >= temp_on and temp <= temp_max:
            pwm.start(temp-temp_on+50)
            hasFanStarted = True

        elif temp > temp_max:
            pwm.start(100)
            hasFanStarted = True
        time.sleep(1)

if __name__ == '__main__':
    main()

6、shell腳本開關控制(shell腳本語法有點麻煩,不熟悉不建議使用)

#! /bin/bash
fan_is_on=0
if [ ! -e "/sys/class/gpio/gpio18/value" ]
    then
    echo "export gpio 18"
    echo "18" > "/sys/class/gpio/export"
fi

echo "out" > "/sys/class/gpio/gpio18/direction"

while ((1))
do 
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp)
echo $TEMP
if [[ $fan_is_on -eq 1 ]] && [[ $TEMP -lt 40000 ]]
    then
    fan_is_on=0
    echo "fan off"
    echo "0" > "/sys/class/gpio/gpio18/value"
elif [[ $fan_is_on -eq 0 ]] && [[ $TEMP -gt 45000 ]]
    then
    fan_is_on=1
    echo "fan on"
    echo "1" > "/sys/class/gpio/gpio18/value"
fi
sleep 1s
done

大家覺得哪種方式更好呢? 如果是你會選擇哪個?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 三極管
    +關注

    關注

    143

    文章

    3622

    瀏覽量

    122400
  • 電流
    +關注

    關注

    40

    文章

    6941

    瀏覽量

    132686
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210400
  • 風扇
    +關注

    關注

    4

    文章

    415

    瀏覽量

    37525
  • 樹莓派
    +關注

    關注

    117

    文章

    1710

    瀏覽量

    105880
收藏 人收藏

    評論

    相關推薦

    樹莓自動散熱風扇

    控制一個迷你5V風扇,不需要用到電路實驗板和晶體管之類的。只需要一些電纜和通道繼電器。這里推薦2通道繼電器。一個腳本執行每小時檢查樹莓溫度和開/關
    發表于 01-06 15:20

    控制樹莓板載 LED 的幾種方式

    所有的樹莓型號或多或少都自帶了一些]
    發表于 05-23 07:00

    請問樹莓管腳有哪幾種編碼方式

    樹莓40Pin引腳對照表樹莓管腳有三種編碼方式
    發表于 11-10 07:11

    【.NET 與樹莓】小風扇模塊 精選資料分享

    想,這種小風扇直接上電源就行了,還用得著單片機和樹莓?確實,不過,搭配 L9110 驅動芯片,再用單片機發出...
    發表于 09-08 07:33

    樹莓4B Ubuntu 21.04自動溫控開關風扇

    樹莓4B Ubuntu 21.04 自動溫控開關風扇以及RPi.GPIO避坑指南本人對樹莓有一些了解,雖然學過模電數電,但也只是學過,過
    發表于 09-08 07:38

    樹莓是怎樣控制風扇散熱的

    樹莓9層外殼自帶一個散熱風扇風扇是2針的,不能控制,插上電源后就一直全速運轉,晚上噪音很大。而且,一直運行,
    發表于 09-08 07:47

    樹莓裝機教程

    樹莓裝機教程樹莓裝機教程樹莓裝機教程樹莓
    發表于 11-25 10:14 ?52次下載

    樹莓風扇安裝

    RaspberryPi(中文名為“樹莓”,簡寫為RPi,(或者RasPi/RPI)是為學習計算機編程教育而設計),只有信用卡大小的微型電腦,其系統基于Linux。隨著Windows10IoT的發布,我們也將可以用上運行Windows的
    的頭像 發表于 03-25 17:42 ?3.8w次閱讀

    樹莓是什么樹莓的簡單介紹

    要想玩轉樹莓,首先得知道樹莓是什么。在本節中,作者將帶領大家揭開樹莓的神秘面紗,了解
    發表于 05-15 18:09 ?30次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>是什么<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>的簡單介紹

    使用樹莓設計智能小車教程之樹莓手機PC控制小車的實驗免費下載

    本文檔的主要內容詳細介紹的是使用樹莓設計智能小車教程之樹莓手機PC控制小車的實驗免費下載。
    發表于 06-24 08:00 ?22次下載
    使用<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>設計智能小車教程之<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>手機PC<b class='flag-5'>控制</b>小車的實驗免費下載

    使用樹莓控制的汽車

    電子發燒友網站提供《使用樹莓控制的汽車.zip》資料免費下載
    發表于 11-23 11:20 ?1次下載
    使用<b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>控制</b>的汽車

    樹莓控制步進電機

    樹莓控制步進電機 前言 設備 連接 源碼 前言 測試步進電機 設備 名稱 型號 樹莓 3B+ 步進電機 28BYJ-48-5V 步進電機
    發表于 03-21 11:39 ?0次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>控制</b>步進電機

    樹莓控制PWM控制電機轉速

    樹莓控制PWM控制電機轉速 一、硬件 樹莓 12V直流電機 L298N電機驅動器 220V轉
    發表于 03-31 10:59 ?3次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>控制</b>PWM<b class='flag-5'>控制</b>電機轉速

    樹莓控制繼電器

    樹莓控制繼電器命令行輸入gpio readall查看樹莓io口屬性可以看到被分為左右兩側,左側為樹莓
    發表于 04-21 11:50 ?0次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>控制</b>繼電器

    樹莓4b風扇插哪個引腳

    樹莓4B驅動風扇時,風扇可以插接的引腳主要取決于風扇的類型和所使用的控制方法。以下是一些常見的
    的頭像 發表于 08-30 16:53 ?1843次閱讀
    百家乐海滨网现场| 百家乐官网智能分析| 金银岛百家乐的玩法技巧和规则| 百家乐官网推锅| 真人游戏 role/play| 香港百家乐官网娱乐场开户注册| 大发888下载17| 多台百家乐官网的玩法技巧和规则| 老k娱乐城| 澳门百家乐路单怎么看| 百家乐官网包赢| 大发888娱乐城下载电脑怎么上乐讯新足球今日比分 | 大发888真人网| 百家乐保单破解方法| 百家乐官网连线游戏下载| 百家乐路书| 百家乐官网导航| 百家乐官网桩闲落注点| 大发888游戏破解软件| 皇冠网百家乐赢钱| 淘金百家乐官网现金网| 威尼斯人娱乐老品牌| 百家乐官网手机壳| 百家乐官网佣金计算| 大发888官网df888esbgfwz| 皇室百家乐娱乐城| 澳门百家乐官网的公式| 大赢家比分| 摩纳哥百家乐娱乐城| 缅甸百家乐官网赌博现场下载 | 蒙特卡罗娱乐网| 百家乐免费改| 百家乐最新打法| 百家乐官网赌场技巧网| 博彩太阳城| 都坊百家乐的玩法技巧和规则| 太阳百家乐官网网址| 百家乐官网娱乐城介绍| 德州扑克小游戏| 怎么赢百家乐的玩法技巧和规则| 做生意门口禁忌|