OrangePiZero加装温控风扇
写在前面
刚入国产派的时候,一早醒来,CPU温度都是50º起的
这还是春天乱穿衣服的季节,到了夏天会不会炸机真不好说
于是乎,捣鼓了一番,加装了散热风扇,利用了板载的一个USB口,一个GPIO口。
先看看最后成品图
思路
为了避免风扇在一个温度值时不断跳跃,决定采用如下控制思路
风扇未运转时
Temp > 45℃ 风扇ON
风扇运转时
Temp < 40℃ 风扇OFF
系统配置
Orange Pi Zero 运行着 Armbian
的5.27的夜版,内核为3.4.113-sun8i
虽然最新4.10.0-sun8i
支持谷歌BBR黑科技,并且温度可以精确到0.01℃
但是在这板子上还有诸多毛病:
- 红外无法接收
- 红色LED无法驱动
- 开机自检很慢
- ……
求稳,还是用3.4内核
Armbian官网 固件下载
控制风扇运停转需要使用GPIO,橙子派上也有已经移植过来的wiringOP,事先需要构建下
GitHub传送门
实现
软件部分
主函数部分 由每秒CPU温度判断是否改变引脚的电位
getTemp()函数 通过文件读取并返回CPU温度
#include<wiringPi.h>
#include <stdio.h>
#include <fcntl.h>
#define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"
#define MAX_SIZE 32
int main(void)
{
wiringPiSetup () ;
pinMode (11, OUTPUT) ;
int status = 0;
while (1)
{
int temp = getTemp();
if(status == 1 && temp < 40)
{
digitalWrite (11, LOW);
status = 0;
print("Turn OFF");
}
if(status == 0 && temp > 45)
{
digitalWrite (11, HIGH);
status = 1;
print("Turn ON");
}
delay(1000);
printf("TEMP: %d℃\\n",temp);
}
return 0 ;
}
int getTemp()
{
int fd;
double temp = 0;
char buf[MAX_SIZE];
fd = open(TEMP_PATH, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "failed to open thermal_zone0/temp\n");
return -1;
}
if (read(fd, buf, MAX_SIZE) < 0) {
fprintf(stderr, "failed to read temp\n");
return -1;
}
temp = atoi(buf);
close(fd);
return temp;
}
编译&运行
gcc -o temp temp.c -lwiringPi && ./temp
硬件部分
橙子派GPIO口的最大输出电流也没有资料查阅,估摸着差不多也是 20mA
,因此需要直接USB 5V供电
材料
5v0.15A风扇
S8050三极管
330Ω电阻
杜邦线
USB公头线
热缩管
电路图
采用了个小开关是因为手头只有12V的风扇,直接5V驱动太弱,所以这样可以实现强制开启散热
运行效果
不服跑个分
计算4000位圆周率
time echo "scale=4000;4*a(1)"|bc -l -q
温度变化
写在最后
一次简单的软硬件配合,散热效果还算满意,最后加上 开机自启
,估摸可以平安度过酷暑。