用户
 找回密码
 立即注册

QQ登录

只需要一步,快速开始

搜索

11

主题

26

帖子

397

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
397
2017-7-25 16:22:42 cheetah 管理员 楼主 11099
本帖最后由 cheetah 于 2017-7-25 17:29 编辑

话说在某宝买的小风扇是不是很吵??!!最开始我是直接接了一个继电器(光电耦合那种,很小巧),但是也只能根据CPU温度控制风扇的运转-停止,在运转的时候还是呜呜呜的响个不停。
偶然在逛某宝的时候发现这个神奇的东东,PWM风扇控制器。虽然也可以搞个三极管自己做,但是自己做的不美观呀。于是花了几个钱买了个,如下图
204459nvr9rk8rytwkevpt.png

想要购买的盆友直接某宝搜索“树莓派 温度控制器”,就不打广告了。
(PS:自己做的话需要一个NPN三极管,不能用PNP哦,风扇+极直接接在5v上,-极接在三极管集电极C。三极管发射极E接0V,基极B接GPIO3
然后把控制器插到树莓派上面,插好之后是这个样子的。
_-1970999433_P70725-160816_1500970097000_wifi_0.jpg

接下来就是上代码的时候了(C语言),顺便在文末会贴上下载的
  1. /*
  2. * main.c
  3. *
  4. *  Created on: 2017年7月24日
  5. *         说明:程序使用的事wiringPi。PWM接口为8
  6. *      Author: cheetah
  7. */

  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <fcntl.h>
  14. #include <unistd.h>
  15. #include <wiringPi.h>
  16. #include <softPwm.h>

  17. #define _FANPIN 8
  18. #define MAX_SIZE 32
  19. #define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"

  20. int initWiringPi();
  21. float getCpuTemp();
  22. void dieError(char *errors);

  23. int main(void)
  24. {
  25.         //初始化
  26.         if (initWiringPi() < 0)
  27.         {
  28.                 return -1;
  29.         }
  30.         printf("[ OK ]Start geeiot smart fan controler.\n");
  31.         while (1)
  32.         {
  33.                 //获取CPU温度 浮点数据
  34.                 float temp = getCpuTemp();
  35.                 //printf("CPU tempreture is %0.2f\n", temp);
  36.                 //如果小于0,说明获取失败,设置50%电压
  37.                 if (temp < 0)
  38.                 {
  39.                         softPwmWrite(_FANPIN, 50);
  40.                 }
  41.                 else if (temp < 30)
  42.                 {
  43.                         softPwmWrite(_FANPIN, 0);
  44.                 }
  45.                 else if (temp > 30 && temp < 40)
  46.                 {
  47.                         softPwmWrite(_FANPIN, 30);
  48.                 }
  49.                 else if (temp > 40 && temp < 50)
  50.                 {
  51.                         softPwmWrite(_FANPIN, 40);
  52.                 }
  53.                 else if (temp > 50 && temp < 60)
  54.                 {
  55.                         softPwmWrite(_FANPIN, 50);
  56.                 }
  57.                 else
  58.                 {
  59.                         softPwmWrite(_FANPIN, 80);
  60.                 }
  61.                 delay(1000);
  62.         }
  63.         return 0;
  64. }

  65. /*
  66. * 初始化wiringPi
  67. */
  68. int initWiringPi()
  69. {
  70.         if (wiringPiSetup() != 0)
  71.         {
  72.                 dieError("WiringPi setup failed!");
  73.                 return -1;
  74.         }
  75.         if (softPwmCreate(_FANPIN, 0, 100) != 0)
  76.         {
  77.                 dieError("GPIO soft pwm setup failed!");
  78.                 return -2;
  79.         }
  80.         return 0;
  81. }

  82. /*
  83. * 获取树莓派CPU温度
  84. */
  85. float getCpuTemp()
  86. {
  87.         int fd;
  88.         float temp = 0;
  89.         char buf[MAX_SIZE];
  90.         // 打开/sys/class/thermal/thermal_zone0/temp
  91.         fd = open(TEMP_PATH, O_RDONLY);
  92.         if (fd < 0)
  93.         {
  94.                 dieError("Failed to open thermal_zone0/temp");
  95.                 return -1;
  96.         }
  97.         // 读取内容
  98.         if (read(fd, buf, MAX_SIZE) < 0)
  99.         {
  100.                 dieError("Failed to read temp\n");
  101.                 return -1;
  102.         }
  103.         // 转换为浮点数打印
  104.         temp = atoi(buf) / 1000.0;
  105.         return temp;
  106. }

  107. /*
  108. * 输出错误信息
  109. */
  110. void dieError(char *errors)
  111. {
  112.         if (strlen(errors) <= 0)
  113.         {
  114.                 return;
  115.         }
  116.         else
  117.         {
  118.                 printf("[ FAILED ]%s\n", errors);
  119.         }
  120. }
复制代码
将代码保存为AutoFanControler.c (自行复制粘贴)
  1. sudo nano AutoFanControler.c
复制代码
然后编译
  1. sudo gcc AutoFanControler.c -o AutoFanControler -lwiringPi -lpthread
复制代码
之后执行
  1. sudo ./AutoFanControler
复制代码
就可以智能控制树莓派的散热风扇啦
深度截图_deepin-terminal_20170725155151.png

注意:给的代码是不会显示具体温度的。那句显示具体温度的代码被注释了。方便小白直接用作开机启动。

===================================华丽丽的分割线====================================

下面的教程是以服务的方式设置开机启动,我知道这是很多小伙伴想要的。进行这一步的前提是你已经把程序编译好了,并且可以执行了。
先创建个文件夹来存放程序
  1. mkdir ~/Programs
  2. cp AutoFanControler ~/Programs/
复制代码
然后创建服务启动脚本
  1. sudo nano /etc/init.d/fancontroler
复制代码
把下面的代码复制进去
  1. #!/bin/bash
  2. # /etc/init.d/fancontroler
  3.   
  4. ### BEGIN INIT INFO
  5. # Provides: embbnux
  6. # Required-Start: $remote_fs $syslog
  7. # Required-Stop: $remote_fs $syslog
  8. # Default-Start: 2 3 4 5
  9. # Default-Stop: 0 1 6
  10. # Short-Description: CPU fan control
  11. # Description: This service is used to control cpu fan.
  12. ### END INIT INFO
  13.   
  14. case "$1" in
  15.     start)
  16.         echo "Starting Fancontroler"
  17.         sudo home/pi/Programs/AutoFanControler &
  18.         ;;
  19.     stop)
  20.         echo "Stopping Fancontroler"
  21.         kill $(ps aux | grep -m 1 'AutoFanControle' | awk '{ print $2 }')
  22.         ;;
  23.     *)
  24.         echo "Usage: service fancontroler start|stop"
  25.         exit 1
  26.         ;;
  27. esac
  28. exit 0
复制代码
增加运行权限并重启。重启的目的是让系统加载这个服务
  1. sudo chmod +x /etc/init.d/fancontroler
  2. sudo reboot
复制代码
重启之后就可以用下面的 命令设置启动和停止啦,哈哈
  1. sudo service fancontroler start   #启动
  2. sudo service fancontroler stop    #停止
复制代码
然后重点来了。下面的命令就是设置开机启动
  1. sudo update-rc.d fancontroler  defaults
复制代码
是不是很赞呢。我知道,那就顺便回复一下咯,心情好还可以关注一波微信公众号,就在旁边。

好了,下面是程序的下载:
游客,如果您要查看本帖隐藏内容请回复

使用道具 举报 回复
2018-4-25 21:08:48 zhouyishiwo 来自手机 新手上路
沙发
不错,正需要,先回复下载下来看看。谢谢楼主分享
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册