引脚对照表
先放一张引脚对照表。
我直接把风扇接在了BOARD编码的39号引脚和40号引脚上。通过40号引脚的高低电平控制风扇的转动与停止。
ps:这里有点问题,我最开始用的是一个小风扇,用40号引脚上的电压可以带动风扇,后面我换了一个风扇就不行了,通过程序控制风扇开和关时能通过万用表看到引脚上电压的变化,但风扇就是不动,接到2号或者4号引脚又可以了,但是2号和4号引脚又不能通过编程控制电压,所以有点难搞。这里应该可以接一个继电器,通过29号引脚控制继电器的通断进而控制风扇,我不懂硬件,就不搞了这个了。
代码
#include <wiringPi.h> //这个库的详细介绍 在文中末尾
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#define FANIO 29 //风扇接线 这里的29是wiringPi编码,就是上面说的40号引脚
#define DMT 45 //设置默认上限温度
//风扇控制
//参数:
// 0 :关闭风扇
// 1 :打开风扇
void fanCtrl(int stat)
{
wiringPiSetup(); //硬件初始化
pinMode(FANIO,OUTPUT); //设置FANIO为OUTPUT模式
if(stat)
{
digitalWrite(FANIO,HIGH); //设置为高电平
}else
{
digitalWrite(FANIO,LOW); //设置低电平
}
}
//获取CPU温度 返回为 CPU温度×1000
int getTemp()
{
int temp;
//打开存放CPU温度的文件
FILE *file=fopen("/sys/class/thermal/thermal_zone0/temp","r");
fscanf(file,"%d",&temp); //读取温度
fclose(file);
return temp;
}
//启动风扇自动控制
//参数为CPU温度上限 x 1000
void fanAuto(int maxT)
{
int temp=0;
while(1)
{
temp=getTemp(); //获取当前CPU温度
if(temp>maxT)
{
fanCtrl(1); //开启风扇
}else
{
fanCtrl(0); //关闭风扇
}
delay(5*1000); //延时5*1000 ms
}
}
int main(int argc,char *argv[])
{
int tempMax=50; //温度上限设置
int temp; //当前温度
char cmmd[20]; //命令
if(argc==1)
{
//参数错误,输出提示
printf("参数:\n\
-open: 打开风扇\n\
-close: 关闭风扇\n\
-auto [temp=%d] :设置温度上限,触发上限时自动开启风扇\n\
-v [temp=%d]:实时监视\n",DMT,DMT);
exit(1);
}
strcpy(cmmd,argv[1]);
if(strcmp(cmmd,"-open")==0) //开启风扇
{
fanCtrl(1);
printf("风扇已开启\n");
exit(0);
}
if(strcmp(cmmd,"-close")==0) //关闭风扇
{
fanCtrl(0);
printf("风扇已关闭\n");
exit(0);
}
if(strcmp(cmmd,"-auto")==0) //自动模式
{
if(argc==3)
{
tempMax=atoi(argv[2]); //获取设置的上限值
}else
{
tempMax=DMT; //没有设置,使用默认值
}
pid_t pid=fork(); //创建进程执行温度检测
if(pid==0) //
{
fanAuto(tempMax*1000);
}
if(pid==-1)
{
printf("开启失败!\n");
exit(1);
}
printf("开启成功!上限为:%d\n",tempMax);
exit(0);
}
if(strcmp(cmmd,"-v")==0) //实时监视
{
if(argc==3)
{
tempMax=atoi(argv[2]);
}else
{
tempMax=DMT;
}
while(1)
{
temp=getTemp();
printf("当前温度为:%.2f°C\n",(float)temp/1000);
if(temp>(tempMax*1000))
{
fanCtrl(1);
printf("超过上限,风扇已开启!\n");
}else
{
fanCtrl(0);
printf("温度正常,风扇已关闭!\n");
}
delay(1500); }
}
printf("参数:\n\
-open: 打开风扇\n\
-close: 关闭风扇\n\
-auto [temp=%d] :设置温度上限,触发上限时自动开启风扇\n\
-v [temp=%d]:实时监视\n",DMT,DMT);
return 0;
}
编译:
gcc fanCtrl.c -o fanCtrl -l wiringPi
运行:
问题
每开一次自动模式就会在后台创建一个进程,要手动关闭
如图:
这个我目前没办法解决,先手动关闭吧,也不是很麻烦。
关闭自动模式留下的进程:
pkill fanCtrl
优化
每次都要cd到这个目录 或者 输入全路径 才可以运行这个程序,很麻烦,
我们可以将生成的可执行文件放到bin目录下,这样就可以在任何目录控制风扇了,
比如放到“/usr/local/bin”下
sudo mv fanCtrl /usr/local/bin/
这样就能在其他目录执行这个风扇控制程序了
当然也可以建立软链接:
这样
sudo ln -s /home/pi/code/c/fanCtrl/fanCtrl /usr/local/bin/fanCtrl
参考:【树莓派wiringPi库详解】(引脚图也是这里扒来的)