之前总是觉得树莓自带风扇太吵人,百度了一堆教程要么是用继电器简单控制开关的,要没就是用三极管结果是用Python写的程序,这让我这个处女座的C语言起家的人怎么能受的了,二话不说自己撸做吧。
材料:
S8050二极管一个,杜邦线,风扇,面包板,树莓派3B板子。附图S8050针脚图及树莓3B GPIO针脚图.
插线方式是我自己试出来的,网上百度贴吧的版本在我试过了并没有啥用处,后来烧了2个二极管后终于愣是给我试出来了,在这里就放送给大家:
电路比较简单,我就不画图了
风扇+极直接接在5v上,-极接在三极管B。
E接GND,C接gpio(最好是GPIO.1,因为GPIO.1支持原生PWM)
接完之后,正常情况下风扇转速随GPIO.1接口的电流的增大而增大
硬件不复杂,但是接错了就容易烧二极管,所以我先在面包板上进行接线,方便插拔。
软件代码:
#include <stdio.h> #include <wiringPi.h> #include <stdlib.h> #include <stdint.h> #include <math.h> #define M 1 int main(void){ FILE *fp; int temperature; double speed=0; if(wiringPiSetup()==-1){ //初始化针脚 printf("erro from wiringPisetup!!\n"); exit(1);} pinMode(M,PWM_OUTPUT); //PWM方式启动GPIO.1 while(1){ fp=fopen("/sys/class/thermal/thermal_zone0/temp","r"); //读取CPU温度储存文件 if(fp==NULL){ printf("erro from fopen()!\n"); exit(1);} fscanf(fp,"%d",&temperature); fclose(fp); //及时关闭文件指针防止后续温度无法正常读取 if(temperature>=36000&&temperature<56000){ if(speed==0){ //此处防止风扇卡停 speed=1023; pwmWrite(M,speed); delay(100);} //此处防止风扇卡停 speed=768.0+255.0*exp(((temperature-36000.0)/20000.0)-1); //风扇速度 pwmWrite(M,(int)speed); delay(5000);} //防止CPU过高占用 if(temperature>=56000){ speed=1023; //56℃上全速运行 pwmWrite(M,(int)speed); delay(10000);} //保证温度下降,防止频繁变速 if(temperature<36000){ //36℃以下彻底不转 speed=0; pwmWrite(M,(int)speed); delay(5000);}} return 0; }
来划重点:
1. /sys/class/thermal/thermal_zone0/temp 这个文件中储存的是CPU的实时温度,由树莓自行获取。
2. 千万不能少了delay()不然CPU很容易又极高的占用,delay()里的数按毫秒来记。
3. 编译方式:
gcc -o 编译后文件名 编译文件 -lwirirgPi -lm
4. 运行方式:
sudo ./文件名
好的至此你的风扇PWM也就大工告成了,不过我测试时候有个问题,就是三极管工作时间一长发热就有点厉害,我也不知道是啥问题。
转载请注明出处 :www.zhazhafang.cn