在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    3619

    瀏覽量

    122181
  • 電流
    +關注

    關注

    40

    文章

    6913

    瀏覽量

    132449
  • Linux
    +關注

    關注

    87

    文章

    11329

    瀏覽量

    209969
  • 風扇
    +關注

    關注

    4

    文章

    414

    瀏覽量

    37462
  • 樹莓派
    +關注

    關注

    117

    文章

    1710

    瀏覽量

    105759
收藏 人收藏

    評論

    相關推薦

    樹莓自動散熱風扇

    控制一個迷你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

    樹莓風扇安裝

    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 ?1689次閱讀

    STM32、Arduino、樹莓開發方式差異大嗎

    最近看到有網友問:STM32、Arduino、樹莓開發方式差異大嗎? ? 要說相同點,它們之間也有很多相同點。但你要說他們之間開發的差異,其實也蠻大的。 ? STM32、Arduino、樹莓
    的頭像 發表于 01-02 11:33 ?328次閱讀
    主站蜘蛛池模板: 女人张开腿让男人捅爽| 伊人精品视频在线| 色.www| 男女交性视频免费播放视频| 久操视频在线播放| 天天操夜夜噜| 成人亚洲电影| 精品久久久久久中文字幕欧美| 欧美爽爽爽爽爽爽视频| 午夜精品福利在线| 最新理论三级中文在线观看| 757福利影院合集3000| 视频在线观看h| 精品亚洲大全| 免费视频精品| 日日舔夜夜操| 天天草夜夜骑| 国产又大又黄又粗又爽| 美女被曹| 久久国产午夜精品理论篇小说| se色成人亚洲综合| 成年男人午夜片免费观看| 国产骚b| 奇米影视久久| 色天天天天| 2021国产成人午夜精品| 国产精品福利视频手机免费观看| 欧美18xxoovideos| 757福利影院合集3000| 黑色丝袜在丝袜福利国产| 狠狠色噜噜综合社区| 天天拍天天射| 色老二精品视频在线观看| 日韩一二三级| 日本成人资源| 欧美日韩一区二区三区视视频| 国产女主播精品大秀系列在线| 国产成人99久久亚洲综合精品| 国产成人精品三级| 青青热久久国产久精品秒播| 69xxx欧美|