某天忘记把树莓派的电源断掉,然后第二天早上被它的风扇声音吵醒!!
严格来说在温度不高的时候风扇没必要打开,好在树莓派最不怕的就是各种折腾了。
动手把风扇改成温控的。

描述

raspbian的/sys/class/thermal/thermal_zone0/temp文件内存着CPU的温度,读出来处以1000就得到温度了,省了给它测温的麻烦,大赞。
另外需要用的一个三极管,我这里用的是S9013,网上很多教程用的是S8085。严格来说不同的三极管实现起来是有不同的,这里不深究哪种三极管更好了。
突然想复习一下三极管怎么工作的( ╯□╰ )

预备知识

首先要知道的是树莓派的引脚定义,将树莓派有网络接口的一端朝下,有GPIO接口(就是那四十个脚)的一面面向自己,从上到下,从左到右,为物理引脚1~40,像这样

但是具体到程序内,用的不是物理引脚,不同的库对引脚的定义也不同,这里提供一个对照图

本文将使用winringPi作为控制引脚的库。
可以使用命令

sudo apt install wiringpisudo apt purge wiringpi

来完成安装,可以使用

gpio -v

来验证。
目前没有查询到每个脚具体的电气参数,理论上是可以将风扇直接插在引脚上,然后控制引脚的电平来间接控制风扇的开关的,但是不清楚具体哪个脚能承受多大的电流,就没有贸然尝试了。用了比较保险的三极管。
将三极管平的一面面向自己,引脚向下,从左到右引脚分别是E(发射极Emitter)B(基极Basic)C(集电极collector)。
连接示意图参考如下

安装

按图连接好之后,安装控制软件了。

git clone https://github.com/BDZNH/AutoControlRaspberryFan.gitcd AutoControlRaspberryFanmakesudo make install

可以前往https://github.com/BDZNH/AutoControlRaspberryFan查看帮助。

源代码

/******************************************************************************-------------------------------------------------------------------------------        Project Name : AutoControlRaspberryfan                                         Author       : BDZNH                                                           Project URL  : https://github.com/BDZNH/AutoControlRaspberryFan                what is this : Auto control raspberry fan with 5V. Turn the fan                               when the temperaure is high than 45°C, turn off                                fan when the CPU temperature is lower than 39°C.        -------------------------------------------------------------------------------******************************************************************************/#include #include #include #include #include #include #define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"#define LOG_PATH "/tmp/RaspberrypiFanSpeed.log"#define PID_PATH "/var/run/autocontrolfan.pid"#define _FANPIN 8#define min(x,y) (x<=y?x:y)using namespace std;void GetCpuTempera(ifstream &fin,double &temp);int initWiringPi();void showInfo();void SaveLog(ofstream &log, double &temp, int FanSpeed, time_t &time_cur);int main(){showInfo();ofstream log(LOG_PATH);if (!log.is_open()){cout << "Can't open file : " << LOG_PATH << endl;}log.close();ifstream fin(TEMP_PATH, ios_base::in);if (!fin.is_open()){cout << "Can't open file : " << TEMP_PATH << endl;return -1;}ofstream pid(PID_PATH);if (!pid.is_open()){cout << "Can't open file : " << PID_PATH << endl;}pid << getpid() << endl;pid.close();pid.clear();time_t time_cur;double temp = 0;int Fan_Speed = 0;bool Forty_five_Flag = false;if (initWiringPi() < 0){return -1;}while (true){GetCpuTempera(fin,temp);if (temp >= 42)cout << "Cpu temperature is : 033[0;31m" << temp << "°C   033[0m" << flush;elsecout << "Cpu temperature is : 033[1;32m" << temp << "°C   033[0m" << flush;if (Forty_five_Flag){if (temp < 39.0){Forty_five_Flag = false;Fan_Speed = 0;softPwmWrite(_FANPIN, Fan_Speed);SaveLog(log, temp, Fan_Speed, time_cur);}else{SaveLog(log, temp, Fan_Speed, time_cur);}sleep(1);}else{if (temp < 39.0){sleep(1);Fan_Speed = 0;softPwmWrite(_FANPIN, Fan_Speed);SaveLog(log, temp, Fan_Speed, time_cur);}else if (temp >= 40.0 && temp <= 45.0){Fan_Speed = min(((((int)temp - 40) * 10) + 60),100);softPwmWrite(_FANPIN, Fan_Speed);SaveLog(log, temp, Fan_Speed, time_cur);sleep(2);}else if (temp > 45.0){Fan_Speed = 100;softPwmWrite(_FANPIN, Fan_Speed);Forty_five_Flag = true;SaveLog(log, temp, Fan_Speed, time_cur);sleep(5);}}sleep(1);cout << "";}return 0;}void GetCpuTempera(ifstream &fin, double &temp){fin >> temp;temp = temp / 1000.0;fin.clear();fin.seekg(0, ios::beg);}int initWiringPi(){if (wiringPiSetup() != 0){cout << "WiringPi setup failed" << flush << " ";return -1;}if (softPwmCreate(_FANPIN, 0, 100) != 0){cout << "softPwmcreat setup failed" << flush << " ";return -2;}return 0;}void showInfo(){cout << "-------------------------------------------------------------------------------" << endl;cout << "        Project Name : AutoControlRaspberryfan                                 " << endl;cout << "        Author       : BDZNH                                                   " << endl;cout << "        Project URL  : https://github.com/BDZNH/AutoControlRaspberryFan        " << endl;cout << "        what is this : Auto control raspberry fan with 5V. Turn the fan        " << endl;cout << "                       when the temperaure is high than 45°C, turn off         " << endl;cout << "                       fan when the CPU temperature is lower than 39°C.        " << endl;cout << "-------------------------------------------------------------------------------" << endl;cout << "" << endl;}void SaveLog(ofstream &log, double &temp, int Fan_Speed, time_t &time_cur){log.open(LOG_PATH,ios_base::out);if (!log.is_open()){cout << "Can't open file : " << LOG_PATH << endl;}time(&time_cur);log << ctime(&time_cur) << "CPU temperature is : " << temp << "°C Set fan speed to " << Fan_Speed << endl;log.close();log.clear();}

代码内设定的是超过45°C时开启风扇,低于39°C时关闭风扇。处于[40°C,45°C]时按需调节,温度越高,转速越快。
后边会让程序支持指定阈值和工作模式,不知道是不是我的错觉,不是满速旋转的时候风扇有怪怪的声音。

生命重在折腾


参考资料

https://blog.newnius.com/raspberry-control-fan-with-transistor.html
树莓派wiringPi库详解
PS:链接一内的脚本用Python实现,无奈Python会占用大量CPU,对树莓派来说并不合适。后来虽然在百度也找到一些python脚本,占用资源也很少,但是还是写了这个练手。

百度贴吧找到的python脚本

#!/usr/bin/env python# encoding: utf-8import RPi.GPIOimport timeRPi.GPIO.setwarnings(False)RPi.GPIO.setmode(RPi.GPIO.BCM)RPi.GPIO.setup(2, RPi.GPIO.OUT)pwm = RPi.GPIO.PWM(2,100)RPi.GPIO.setwarnings(False)speed = 0prv_temp = 0try:while True:tmpFile = open( '/sys/class/thermal/thermal_zone0/temp' )cpu_temp = int(tmpFile.read())tmpFile.close()if cpu_temp>=34500 :if prv_temp<34500 :#启动时防止风扇卡死先全功率转0.1秒pwm.start(0)pwm.ChangeDutyCycle(100)time.sleep(.1)speed = min( cpu_temp/125-257 , 100 )pwm.ChangeDutyCycle(speed)else :pwm.stop()prv_temp = cpu_temptime.sleep(5)except KeyboardInterrupt:passpwm.stop()

树莓派 ubuntu gpio_树莓派自动温控风扇相关推荐

  1. 树莓派 ubuntu gpio_树莓派学习笔记(一)输入输出GPIO

    硬件:树莓派3B+ 系统:ubuntu mate #RPI.GPIO模块使用 RPI.GPIO提供了一个在Raspberry中控制GPIO的类 #它是运行在基于Linux核心中,由于无法预测系统资源使 ...

  2. 树莓派 + SSD启动 + CentOS 8 64位 + 内网穿透 + 自动温控风扇 + SMB服务 + 文件分类备份

    功能描述 上闲鱼拿下了个树莓派4B 8G,300块,我仿佛听见有人说"哇"?哦,其实它的外显输出有点问题,但我是不关心,真香. 到手之后自然是传统装机,点到为止,64位centos ...

  3. 树莓派4B Ubuntu 21.04 自动温控开关风扇以及RPi.GPIO避坑指南

    本人对树莓派有一些了解,虽然学过模电数电,但也只是学过,过于硬件的东西也不懂. 好了,首先说明,树莓派GPIO引脚都是3.3v的,一般风扇都是5v的,所以不能用GPIO直接供电.即使你的风扇额定电压为 ...

  4. 树莓派 ubuntu gpio_如何给树莓派安装操作系统

    新的树莓派拿到手中,你迫不及待的要把玩.别急,这可不像你买的Macbook开机就能用,想要顺利启动树莓派,还要经历五个步骤. 准备一张micro SD卡 把操作系统写入SD卡 连接显示器等外围设备 通 ...

  5. 树莓派 ubuntu 远程控制

    树莓派 ubuntu 远程控制 树莓派上能够支持的远程连接软件 nomachine 下载 nomachine 安装 Windows 上的操作 但是 参考 树莓派上能够支持的远程连接软件 首先选择树莓派 ...

  6. 三极管打造树莓派温控风扇

    为了防止树莓派长时间开机运转温度过高导致触发过热关机,很多人都给装了散热风扇,但某宝买的风扇插上之后是随着开机一直运转的,不能随温度变化而自动开闭,很多时候做无用功浪费电且产生噪音.本文将以一个硬件小 ...

  7. python控制树莓派风扇_三极管打造树莓派温控风扇

    为了防止树莓派长时间开机运转温度过高导致触发过热关机,很多人都给装了散热风扇,但某宝买的风扇插上之后是随着开机一直运转的,不能随温度变化而自动开闭,很多时候做无用功浪费电且产生噪音.本文将以一个硬件小 ...

  8. 树莓派3B+温控风扇

    树莓派3B+温控风扇 已添加散热片的树莓派3B+,在空载工作过程中温度过高,需要增加风扇达到物理降温的效果.但在使用过程中,风扇发出的声音过高,需要在温度较低的情况下停止风扇的工作. 准备材料 树莓派 ...

  9. 树莓派——PWM温控风扇程序(C++、python)、开机自启动

    原理 读取/sys/class/thermal/thermal_zone0/temp文件,返回树莓派温度,控制GPIO产生PWM,从而实现温控风扇的控制. C/C++代码 命令行操作 cd /home ...

最新文章

  1. 三、单链表增删改查原理和代码实现
  2. 使用Mockito时遇到的一些问题
  3. 校验码(海明校验,CRC冗余校验,奇偶校验)
  4. 编程随想 关系图_支持PLC编程的5大语言,全部会用的才是大神!
  5. LU分解的矩阵逆运算
  6. 无需第三方app,清理Mac缓存垃圾
  7. 我的美丽天使(My Fair Angel)全剧情攻略
  8. Asterisk 对VoiceXML 及CSTA的支持
  9. FPAG—UART串口实现与解析-黑金fpga资料解析
  10. 天池比赛实践——阿里云安全恶意程序检测(基于机器学习算法XGBoost)
  11. Reveal Effect(揭露效果)低版本兼容
  12. 中国电信无限流量卡服务器,拒绝套路!中国电信再出新版“无限量”卡,流量不限速!...
  13. 用笔记本改装智能家居服务器,超级DIY笔记本和台式机改装成平板电脑
  14. 发送短信验证码(天翼开放平台)
  15. 项目经理如何激励自己的团队
  16. 现代信用卡管理阅读笔记(一)
  17. 《组网技术》:路由器基本配置
  18. Android 集成Crosswalk替换成X5WebView
  19. 光年(Light Year Admin)后台管理系统模板
  20. 我的世界服务器如何制作武器,我的世界2B2T服务器玩家都会去做的7件事 第1件是游戏中的禁忌...

热门文章

  1. 你的Web3域名 价值究竟何在?
  2. GUI怎么能缺少列表, LVGL『List列表控件』介绍
  3. 中国证券IT发展简史(中)
  4. 有了Forter ,中国的跨境电商们可以安心做生意了
  5. 济源一中2021高考成绩查询入口,喜讯!高考刷新济源最高纪录!
  6. 读梁飞-RPC框架几行代码就够了 有感
  7. 人工智能_游戏AI –行为树简介
  8. 英特尔至强E7 v2处理器:2倍性能提升,3倍内存容量,4倍I/O带宽
  9. 解决Ubuntu12.04安装python-dev时依赖出错的问题
  10. 上海交通大学2021计算机录取,2021年上海交通大学高考录取结果什么时候出来及查询系统入口...