OrangePiZero加装温控风扇

写在前面

刚入国产派的时候,一早醒来,CPU温度都是50º起的
这还是春天乱穿衣服的季节,到了夏天会不会炸机真不好说

Temperature.jpg
于是乎,捣鼓了一番,加装了散热风扇,利用了板载的一个USB口,一个GPIO口。
先看看最后成品图
Top_view.jpg


思路

为了避免风扇在一个温度值时不断跳跃,决定采用如下控制思路

风扇未运转时

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传送门
gpio.png


实现

软件部分

主函数部分 由每秒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公头线 热缩管
电路图

Fan.png
采用了个小开关是因为手头只有12V的风扇,直接5V驱动太弱,所以这样可以实现强制开启散热

运行效果

不服跑个分

计算4000位圆周率

time echo "scale=4000;4*a(1)"|bc -l -q

温度变化

armbianmonitor.png

写在最后

一次简单的软硬件配合,散热效果还算满意,最后加上 开机自启,估摸可以平安度过酷暑。
Bottom_view.jpg