树莓派PWM风扇控制

您所在的位置:网站首页 树莓派pwm风扇 树莓派PWM风扇控制

树莓派PWM风扇控制

2023-05-06 15:58| 来源: 网络整理| 查看: 265

首先声明:极客物联吧帖子也是本人发布,非搬运。

马上夏天了,很多小伙伴的树莓派肯定也是热的不行了吧?我的也是,这代虽然说性能是增强了不少,但是发热也随之增大了不少。原来我是直接贴了几个散热片了事,正常使用情况下,冬天温度也才40-50度左右。最近想搞搞人脸识别,又入手了一个树莓派,也顺便买了一个散热小风扇,但是这个风扇是没有PWM调速的。本着生命不息,折腾不止的心态,既然本身不带,树莓派有这么好的条件,GPIO完全是可以用上的。

其实是以前就折腾过,不过再次翻出来来而已,顺便整理一下代码和文章。

某宝上面有这么一个小玩意儿,可以方便的用来控制风扇。嫌贵或者挡住了也可以自己用NPN三极管做一个,风扇+极直接接在5v上,-极接在三极管集电极C。三极管发射极E接0V,基极B接GPIO3。

%title插图%num

这玩意用到了GPIO3,wiringpi编码为8。

%title插图%numPI GPIO

然后就是为风扇控制编写代码了,以下代码用C语言编写,直接拿来主义就是了。原理也很简单,就是获取CPU温度,然后判断CPU处于哪个阶段,再设置对应的PWM脉冲宽度即可。

/* * * main.c * * Created on: 2017年7月24日 * * 说明:程序使用的是wiringPi。PWM接口为8 * * Author: afirefish * */ #include #include #include #include #include #include #include #include #include #define _FANPIN 8 #define MAX_SIZE 32 #define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp" int initWiringPi(); float getCpuTemp(); void dieError( char *errors ); int main( void ) { /* 初始化 */ if ( initWiringPi() < 0 ) { return(-1); } printf( "[ OK ]Start [quarkbook.com] fan controler.\n" ); /* 启动时防止风扇卡死,全功率运行1s */ softPwmWrite( _FANPIN, 99 ); delay( 1000 ); while ( 1 ) { /* 获取CPU温度 浮点数据 */ float temp = getCpuTemp(); printf( "CPU tempreture is %0.2f\n", temp ); /* 如果小于0,说明获取失败,设置50%电压 */ if ( temp < 0 ) { softPwmWrite( _FANPIN, 50 ); } else if ( temp < 30 ) { softPwmWrite( _FANPIN, 0 ); } else if ( temp > 30 && temp < 40 ) { softPwmWrite( _FANPIN, 30 ); } else if ( temp > 40 && temp < 50 ) { softPwmWrite( _FANPIN, 40 ); } else if ( temp > 50 && temp < 60 ) { softPwmWrite( _FANPIN, 50 ); } else { softPwmWrite( _FANPIN, 80 ); } delay( 1000 ); } return(0); } /* * * 初始化wiringPi * */ int initWiringPi() { if ( wiringPiSetup() != 0 ) { dieError( "WiringPi setup failed!" ); return(-1); } if ( softPwmCreate( _FANPIN, 0, 100 ) != 0 ) { dieError( "GPIO soft pwm setup failed!" ); return(-2); } return(0); } /* * * 获取树莓派CPU温度 * */ float getCpuTemp() { int fd; float temp = 0; char buf[MAX_SIZE]; /* 打开/sys/class/thermal/thermal_zone0/temp */ fd = open( TEMP_PATH, O_RDONLY ); if ( fd < 0 ) { dieError( "Failed to open thermal_zone0/temp" ); return(-1); } /* 读取内容 */ if ( read( fd, buf, MAX_SIZE ) < 0 ) { fclose(fd); dieError( "Failed to read temp\n" ); return(-1); } fclose(fd); /* 转换为浮点数打印 */ temp = atoi( buf ) / 1000.0; return(temp); } /* * * 输出错误信息 * */ void dieError( char *errors ) { if ( strlen( errors )


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3