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

描述

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. python如何收集数据_用Python做数据清洗:采集几百个xls或csv中的数据并汇总
  2. Jmeter连接mysql报Cannot create PoolableConnectionFactory (Communications link failureThe last packet
  3. 小白的AFNetWorking之路
  4. 多线程中的ManualResetEvent
  5. Spring cloud整合zookeeper
  6. FileSystemObject和Folders使用详细介绍
  7. Win7系统账户被禁用的解决方法
  8. iOS-使用添加的花样字体
  9. 震惊!谷歌专家爆料:Python和AI这回真的玩大了!网友:好方法!
  10. Java多线程之Synchronized详解
  11. 航空订票系统C++课程设计
  12. chrome 浏览器 FungLeo 常用插件汇总
  13. FreeMarker常见指令的简单介绍—快速入门(二)
  14. 写给程序员看的项目管理入门
  15. 手机兼职赚钱,分享2个手机可操作的项目给你!
  16. QString与QByteArray互转
  17. Archive of Our Own_为什么说for...of循环是JS中的宝石?
  18. 局域网控制软件的选择成为局域网是否安全的衡量标准
  19. Linux、UNIX 下磁带机设备(Tape)的管理和使用
  20. Comsol学习笔记5:如何发挥计算机的性能,并行计算

热门文章

  1. 关于TF变换的学习笔记(二)
  2. 【你好,windows】Windows 7 X64 Ultimate繁体纯净版2020.3.15
  3. 如何在智能手机上安装mysql(安卓系统)
  4. element-ui element-plus trap-focus - 分析
  5. 前端里的几种颜色渐变
  6. SpringBoot思维导图(知识点总结)
  7. 想玩明白Hive哪有那么容易,十分钟你都看不完
  8. angular2入门-第一个angular2 App
  9. Django框架介绍之cookie与session
  10. 荣耀50和小米civi参数对比