├── .gitattributes ├── README.md ├── bin └── fan ├── include └── fan.h ├── lib └── fan.o ├── makefile ├── photos ├── GPIO_Show.jpg ├── cmd_result.jpg ├── cmd_result2.jpg ├── connection.jpg ├── fan.jpg ├── raspberryPi.jpg └── s8050.jpg └── src ├── fan.c └── main.c /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RaspberryPi Fan Control 2 | 树莓派上的CPU风扇温控模块。可提供三种风扇管理模式:自定义模式、强力模式、自动模式(正在更新中)。【RaspberryPi、WringPi、PWM调速】 3 | 4 | 自定义模式:可设置风扇的启动的温度阈值和关闭的温度阈值、风扇的转速等参数,根据此类参数对风扇进行控制。 5 | 6 | 强力模式:风扇以最大状态运行。 7 | 8 | 自动模式: 9 | 10 | # 一、使用说明 11 | ## 1:准备前操作 12 | (1)当前树莓派系统中包含GCC和wiringPI等开发工具。(官方的系统即可) 13 | 14 | (2)需要的其他硬件设备:散热风扇(如图1所示),如果散热风扇不支持PWM调速,即风扇只有两个线,需要准备一个NPN型三极管,手动焊接出第三条信号线,具体见2小节风扇焊接部分;需要准备若干杜邦线等。 15 | 16 | ![Fan]( https://github.com/wwptrdudu/RaspberryPi_Fan_Control/blob/master/photos/fan.jpg ) 17 | 18 | 图1:不带PWM调速的散热风扇 19 | 20 | 21 | ## 2:风扇连接 22 | (1)如果购买的散热风扇为三根线,即支持PWM控制,则分别将正极线接5V、负极线接0V、信号线接GPIO-2针脚,如图2所示。针脚的定义在include文件夹中fan.h文件中,可自行修改。 23 | 24 | ![GPIO-Show]( https://github.com/wwptrdudu/RaspberryPi_Fan_Control/blob/master/photos/GPIO_Show.jpg ) 25 | 26 | 图2:连接阵脚图 27 | 28 | 29 | (2)如果购买的散热风扇为二根线,则不支持PWM控制,需要准备一个开关三极管,我这里从收音机中拆出的一个8050型号的三极管。用电烙铁依照图3、图4的说明进行焊接,最后可用热缩管对焊接的部分和三极管针脚进行保护一下,防止短路。焊接完成之后,此风扇则已经支持PWM调速,则可依照(1)的说明将风扇连接到树莓派上。关于三极管型号的科普,我这里推荐一个简单的基础视频([三极管的应用基础介绍](https://www.bilibili.com/video/av8960413 "三极管的应用基础介绍")),其他的三极管知识可从Google上进行搜索。 30 | 31 | 32 | ![s8050]( https://github.com/wwptrdudu/RaspberryPi_Fan_Control/blob/master/photos/s8050.jpg ) 33 | 34 | 图3:NPN开关三极管s8050 35 | 36 | 37 | 38 | ![connection]( https://github.com/wwptrdudu/RaspberryPi_Fan_Control/blob/master/photos/connection.jpg ) 39 | 40 | 图4:焊接图示 41 | 42 | ## 2:编译 43 | 安装wiringPi: 44 | git clone https://github.com/WiringPi/WiringPi 45 | ./build 46 | 47 | 编译该源码: 48 | 49 | git clone https://github.com/wwptrdudu/RaspberryPi_Fan_Control.git 50 | cd RaspberryPi_Fan_Control 51 | make 52 | 53 | ## 3:运行 54 | 55 | sudo bin/fan 56 | 57 | 58 | # 二、效果 59 | 60 | 连接好的树莓派如图5所示: 61 | 62 | 63 | ![RapsberryPi]( https://github.com/wwptrdudu/RaspberryPi_Fan_Control/blob/master/photos/raspberryPi.jpg ) 64 | 65 | 图5:树莓派 66 | 67 | 程序运行效果如图6所示: 68 | 69 | 70 | ![CMD_RESULT]( https://github.com/wwptrdudu/RaspberryPi_Fan_Control/blob/master/photos/cmd_result2.jpg ) 71 | 72 | 图6:程序运行结果 73 | 74 | ## 三、 更新日志 75 | 76 | #### 【2018.09.29 中】 77 | 1、修复bug:关闭进程后,风扇为不确定状态运行,修改为关闭。 78 | 79 | 2、更新:自定义模式下,添加了风扇启动的温度阈值和关闭的温度阈值。解决了一个阈值风扇转速不定的问题。 80 | 81 | #### 【2018.09.22.夜】 82 | 记得在几个月前已经把硬件连接好了,可惜在焊接的时候没有拍摄图片,所以缺少了好多焊接的过程图片。不过,焊接好后也并没有写这个驱动程序,以前一直打算以后写来着,终于拖到了现在。终于把以前挖好的坑填起来了,更新的话,应该会很快吧。 83 | 84 | 85 | 86 | # Contact me 87 | #### If you have any questions, please contact me. 88 | #### QQ: 1348351139 89 | #### e-mail: 1348351139@qq.com 90 | -------------------------------------------------------------------------------- /bin/fan: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/bin/fan -------------------------------------------------------------------------------- /include/fan.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The C-program module that controls the fan on the Raspberry Pi. 3 | * 4 | * author: wwptrdudu <1348351139@qq.com> 5 | * github: https://github.com/wwptrdudu 6 | * QQ: 1348351139 7 | * data: 2018.09.22 8 | */ 9 | 10 | 11 | #ifndef _FAN_H_ 12 | #define _FAN_H_ 13 | 14 | #include 15 | #include 16 | #include 17 | 18 | 19 | #define FAN_PIN 2 //风扇的控制信号阵脚为GPIO2 20 | 21 | #define AUTOMATIC 0 22 | #define CUSTOM 1 23 | #define POWERFUL 2 24 | 25 | #define TRUE 1 26 | #define FALSE 0 27 | 28 | typedef struct { 29 | pthread_t th_fan; //线程标识符,在此线程中处理风扇的速度控制 30 | int start_threshold; //自定义模式下的温度阈值,达到此值风扇开启 31 | int stop_threshold; //自定义模式下的温度阈值,达到此值风扇关闭(注意:开启阈值 > 关闭阈值) 32 | int fan_speed; //风扇转速 33 | 34 | int fan_switch; //风扇开关 35 | int mode; //风扇的运行模式 36 | }Fan; 37 | 38 | 39 | 40 | extern int fan_init(int mode, int start_threshold, int stop_threshold, int speed); 41 | 42 | extern void open_fan(); 43 | 44 | extern void close_fan(); 45 | 46 | extern void sys_close_fan(); 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /lib/fan.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/lib/fan.o -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | CFLAGS = -Iinclude -lpthread -lwiringPi 3 | 4 | 5 | TOP_PATH = $(shell pwd) 6 | SRC_PATH = $(TOP_PATH)/src 7 | BIN_PATH = $(TOP_PATH)/bin 8 | LIB_PATH = $(TOP_PATH)/lib 9 | INC_PATH = $(TOP_PATH)/include 10 | 11 | TARGET = $(BIN_PATH)/fan 12 | 13 | $(TARGET): $(LIB_PATH)/fan.o $(SRC_PATH)/main.c 14 | $(CC) $(CFLAGS) $(SRC_PATH)/main.c $(LIB_PATH)/fan.o -o $(TARGET) 15 | 16 | $(LIB_PATH)/fan.o: $(SRC_PATH)/fan.c 17 | $(CC) $(CFLAGS) -o lib/fan.o -c src/fan.c 18 | 19 | 20 | clean: 21 | rm -rf lib/*.o bin/* 22 | 23 | -------------------------------------------------------------------------------- /photos/GPIO_Show.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/photos/GPIO_Show.jpg -------------------------------------------------------------------------------- /photos/cmd_result.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/photos/cmd_result.jpg -------------------------------------------------------------------------------- /photos/cmd_result2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/photos/cmd_result2.jpg -------------------------------------------------------------------------------- /photos/connection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/photos/connection.jpg -------------------------------------------------------------------------------- /photos/fan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/photos/fan.jpg -------------------------------------------------------------------------------- /photos/raspberryPi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/photos/raspberryPi.jpg -------------------------------------------------------------------------------- /photos/s8050.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwptrdo/RaspberryPi_Fan_Control/876ab352d961d4c5b00a61ddc779b48b370a4f7f/photos/s8050.jpg -------------------------------------------------------------------------------- /src/fan.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The C-program module that controls the fan on the Raspberry Pi. 3 | * 4 | * author: wwptrdudu <1348351139@qq.com> 5 | * github: https://github.com/wwptrdudu 6 | * QQ: 1348351139 7 | * data: 2018.09.22 8 | */ 9 | 10 | #include "fan.h" 11 | #include 12 | #include 13 | #include 14 | 15 | #define CMD_RESULT_LEN 1024 16 | 17 | 18 | static Fan s_fan; 19 | 20 | 21 | 22 | /* 23 | * 日志 24 | */ 25 | static void show_sys_info(char *str) 26 | { 27 | printf("%s", str); 28 | /* 29 | * 可将日志信息添加到文件中,代码在下方添加 30 | */ 31 | 32 | } 33 | 34 | 35 | /* 36 | * 功能:执行系统命令,并获取命令的返回数据 37 | * 参数:cmd 要执行的系统命令,result 为接收命令返回的数据 38 | * 返回值:成功返回0,失败返回-1 39 | * 注意:执行的命令和返回的数据最大为CMD_RESULT_LEN 40 | */ 41 | static int execute_cmd_result(const char *cmd, char *result) 42 | { 43 | if (cmd == NULL || result == NULL || strlen(cmd) <= 0) 44 | return -1; 45 | char buf_ps[CMD_RESULT_LEN] = {0}; 46 | char ps[CMD_RESULT_LEN] = {0}; 47 | FILE *ptr; 48 | strcpy(ps, cmd); 49 | if((ptr=popen(ps, "r"))!=NULL) 50 | { 51 | while(fgets(buf_ps, CMD_RESULT_LEN, ptr)!=NULL) 52 | { 53 | strcat(result, buf_ps); 54 | if(strlen(result)>CMD_RESULT_LEN) 55 | break; 56 | } 57 | pclose(ptr); 58 | ptr = NULL; 59 | } 60 | else 61 | { 62 | printf("error: [sys.c]popen %s error\n", ps); 63 | return -1; 64 | } 65 | return 0; 66 | } 67 | 68 | 69 | /* 70 | * 功能:获取系统cpu温度 71 | * 参数:无 72 | * 返回值:成功返回0,失败返回-1 73 | */ 74 | static int sys_cpu_temp() 75 | { 76 | char buff[CMD_RESULT_LEN] = {0}; 77 | if (execute_cmd_result("cat /sys/class/thermal/thermal_zone0/temp", buff) < 0) 78 | { 79 | show_sys_info("错误:执行获取cpu温度命令失败!\n"); 80 | return -1; 81 | } 82 | double ret = atof(buff)/1000.0; 83 | return (int)ret; 84 | } 85 | 86 | 87 | /* 88 | * 强力风扇模式 89 | */ 90 | static void powerful_mode() 91 | { 92 | digitalWrite(FAN_PIN, HIGH); //始终高电平 93 | } 94 | 95 | static int is_running_custom = FALSE; //标识位:标识是否正在运行自定义模式, 防止线程多开 96 | static int is_running_automatic = FALSE; //标识位:标识是否正在运行自动模式, 防止线程多开 97 | 98 | 99 | /* 100 | * 自定义模式中的主要负责的线程 101 | */ 102 | static void* custom_th(void *arg) 103 | { 104 | is_running_custom = TRUE; 105 | int powerful = 100; //风扇最大时,权重标识为100 106 | int flag = 0; 107 | //PWM调速 108 | while(s_fan.mode == CUSTOM && s_fan.fan_switch) 109 | { 110 | int temp = sys_cpu_temp(); //获取系统CPU温度 111 | 112 | //如果温度达到了开启风扇的温度阈值, 标识风扇在转, 反之,则停下 113 | if (temp >= s_fan.start_threshold) 114 | { 115 | flag = 1; 116 | } 117 | if (temp <= s_fan.stop_threshold) 118 | { 119 | flag = 0; 120 | } 121 | if (flag) 122 | { 123 | //发送50个脉冲 124 | int i = 0; 125 | for (; i < 50; i++) 126 | { 127 | //如果调节声音和风扇的大小,可以更改1000和800两个数字,做微调即可! 128 | digitalWrite(FAN_PIN, HIGH); 129 | delayMicroseconds(s_fan.fan_speed * 1000); 130 | digitalWrite(FAN_PIN, LOW); 131 | delayMicroseconds((powerful*800) - (s_fan.fan_speed*1000)); 132 | } 133 | 134 | } 135 | 136 | 137 | } 138 | is_running_custom = FALSE; 139 | 140 | return (void*)0; 141 | } 142 | 143 | 144 | /* 145 | * 自定义模式: 创建一个线程,根据自定义的参数对风扇转速进行调整 146 | */ 147 | static void custom_mode() 148 | { 149 | if (s_fan.fan_switch && s_fan.mode == CUSTOM && !is_running_custom && !is_running_automatic) 150 | { 151 | //设置线程分离属性,以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源。 152 | pthread_attr_t attr; 153 | pthread_attr_init(&attr); 154 | pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 155 | 156 | pthread_t th; 157 | int err_h; 158 | if (err_h = pthread_create(&th, &attr, custom_th, (void*)0) != 0) 159 | { 160 | perror("custom_th pthread_create error!"); 161 | pthread_attr_destroy(&attr); //销毁线程属性结构体 162 | return ; 163 | } 164 | 165 | pthread_attr_destroy(&attr); //销毁线程属性结构体 166 | 167 | } 168 | return; 169 | } 170 | 171 | /* 172 | * 自动控制模式中的主管线程 173 | */ 174 | 175 | static void* automatic_th(void* arg) 176 | { 177 | is_running_automatic = TRUE; //标识线程只能开一个 178 | 179 | while(s_fan.mode == AUTOMATIC && s_fan.fan_switch) 180 | { 181 | int temp = sys_cpu_temp(); //获取系统CPU温度 182 | 183 | printf("自动模式尚未实现! CPU温度为:%d\n", temp); 184 | sleep(3); 185 | } 186 | is_running_automatic = FALSE; 187 | } 188 | 189 | /* 190 | * 自动模式 191 | */ 192 | static void automatic_mode() 193 | { 194 | 195 | if (s_fan.fan_switch && s_fan.mode == AUTOMATIC && !is_running_custom && !is_running_automatic) 196 | { 197 | //设置线程分离属性,以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源。 198 | pthread_attr_t attr; 199 | pthread_attr_init(&attr); 200 | pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 201 | 202 | pthread_t th; 203 | int err_h; 204 | if (err_h = pthread_create(&th, &attr, automatic_th, (void*)0) != 0) 205 | { 206 | perror("custom_th pthread_create error!"); 207 | pthread_attr_destroy(&attr); //销毁线程属性结构体 208 | return ; 209 | } 210 | 211 | pthread_attr_destroy(&attr); //销毁线程属性结构体 212 | } 213 | 214 | return; 215 | } 216 | 217 | 218 | /* 219 | * 功能:风扇线程处理函数 220 | * 调度不同的运行模式 221 | * 说明:这个线程在程序启动时运行,直到程序运行结束( CTRL+C ) 222 | */ 223 | static void* fan_server_th(void *arg) 224 | { 225 | show_sys_info("风扇管理线程启动成功!\n"); 226 | 227 | while(1) 228 | { 229 | //获取线程锁(未) 230 | 231 | 232 | //如果检测到风扇管理开关未打开,则此线程睡眠 233 | if (!s_fan.fan_switch) 234 | { 235 | digitalWrite(FAN_PIN, LOW); 236 | sleep(1); 237 | } 238 | else if (s_fan.mode == CUSTOM) 239 | { 240 | custom_mode(); 241 | } 242 | else if (s_fan.mode == AUTOMATIC) 243 | { 244 | automatic_mode(); 245 | } 246 | else if (s_fan.mode == POWERFUL) 247 | { 248 | powerful_mode(); 249 | } 250 | else 251 | { 252 | show_sys_info("ERROR: 风扇运行模式调度出错!\n"); 253 | } 254 | 255 | //释放线程锁(未) 256 | 257 | sleep(1); 258 | } 259 | 260 | 261 | return (void*)0; 262 | } 263 | 264 | 265 | /* 266 | * 功能:初始化风扇阵脚 267 | * 参数:mode:风扇模式 268 | * start_threshold: 自定义模式下的风扇开启的温度阈值[0-100] 269 | * stop_threshold : 自定义模式下的风扇关闭的温度阈值[0-100] 270 | * speed: 风扇转速[25-100] 271 | * 注意:保证start_threshold > stop_threshold 272 | * 273 | * 返回值:成功返回0,失败返回-1 274 | */ 275 | int fan_init(int mode, int start_threshold, int stop_threshold, int speed) 276 | { 277 | 278 | memset(&s_fan, 0, sizeof(Fan)); 279 | 280 | pinMode(FAN_PIN, OUTPUT); 281 | digitalWrite(FAN_PIN, LOW); 282 | 283 | //模式 284 | if (mode != AUTOMATIC && mode != CUSTOM && mode != POWERFUL) 285 | { 286 | s_fan.mode = AUTOMATIC; 287 | show_sys_info("选择风扇的模式有误,已更改为自动模式!\n"); 288 | } 289 | else 290 | { 291 | s_fan.mode = mode; 292 | } 293 | 294 | if (start_threshold <= stop_threshold) 295 | { 296 | s_fan.start_threshold = 45; 297 | s_fan.stop_threshold = 41; 298 | show_sys_info("自定义模式下设置的风扇温度阈值参数有误,已更改为默认数值!\n"); 299 | } 300 | 301 | if (start_threshold < 0 || start_threshold > 100 || stop_threshold < 0 || stop_threshold > 100 ||speed < 25 || speed > 100) 302 | { 303 | //传入参数有误,自定义模式下为默认值 304 | s_fan.start_threshold = 45; 305 | s_fan.stop_threshold = 41; 306 | s_fan.fan_speed = 51; 307 | 308 | show_sys_info("自定义模式下设置风扇的参数有误,已更改为默认值!\n"); 309 | } 310 | else 311 | { 312 | s_fan.start_threshold = start_threshold; 313 | s_fan.stop_threshold = stop_threshold; 314 | s_fan.fan_speed = speed; //自定义模式下的风扇转速 315 | } 316 | 317 | s_fan.fan_switch = FALSE; //风扇管理默认关闭 318 | 319 | printf("风扇参数设置成功!模式:%d, 自定义模式下风扇启动温度阈值:%d 关闭风扇温度阈值:%d 风扇转速:%d\n", 320 | s_fan.mode, s_fan.start_threshold, s_fan.stop_threshold, s_fan.fan_speed); 321 | 322 | /* 323 | * 启动风扇控制线程,对风扇进行管理 324 | */ 325 | 326 | //设置线程分离属性,以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源。 327 | pthread_attr_t attr; 328 | pthread_attr_init(&attr); 329 | pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 330 | 331 | int err_h; 332 | if (err_h = pthread_create(&s_fan.th_fan, &attr, fan_server_th, (void*)0) != 0) 333 | { 334 | perror("fan_server_th pthread_create error!"); 335 | pthread_attr_destroy(&attr); //销毁线程属性结构体 336 | return -1; 337 | } 338 | 339 | pthread_attr_destroy(&attr); //销毁线程属性结构体 340 | return 0; 341 | } 342 | 343 | 344 | /* 345 | * 功能:开启风扇管理 346 | */ 347 | void open_fan() 348 | { 349 | s_fan.fan_switch = TRUE; 350 | } 351 | 352 | 353 | 354 | /* 355 | * 功能:关闭风扇管理 356 | */ 357 | void close_fan() 358 | { 359 | s_fan.fan_switch = FALSE; 360 | } 361 | 362 | 363 | /* 364 | * 功能:更改风扇模式 365 | */ 366 | int change_fan_mode(int mode) 367 | { 368 | if (mode != AUTOMATIC && mode != CUSTOM && mode != POWERFUL) 369 | { 370 | show_sys_info("ERROR: 风扇更改模式失败, mode参数有误!\n"); 371 | return -1; 372 | } 373 | s_fan.mode = mode; 374 | return 0; 375 | } 376 | 377 | 378 | /* 379 | * 功能:系统关闭风扇 380 | * 注意:一般在程序退出之前调用 381 | */ 382 | void sys_close_fan() 383 | { 384 | close_fan(); 385 | digitalWrite(FAN_PIN, LOW); //风扇针脚低电平 386 | } 387 | 388 | 389 | 390 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The C-language module that controls the fan on the Raspberry Pi. 3 | * 4 | * author: wwptrdudu <1348351139@qq.com> 5 | * github: https://github.com/wwptrdudu 6 | * QQ: 1348351139 7 | * data: 2018.09.22 8 | */ 9 | 10 | 11 | #include "fan.h" 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | static void signal_handler(int signo) 18 | { 19 | if (signo == SIGCHLD) 20 | { 21 | wait(0); //释放僵尸进程 (保留) 22 | } 23 | else if (signo == SIGINT) //捕获Ctrl+C信号 24 | { 25 | sys_close_fan(); //关闭风扇管理 26 | printf("已经关闭风扇管理程序!\n"); 27 | exit(1); 28 | } 29 | } 30 | 31 | int main(int argc, char* argv[]) 32 | { 33 | if (signal(SIGCHLD, signal_handler) == SIG_ERR) 34 | { 35 | //show_sys_info("登记信号SIGCHLD出错\n"); 36 | printf("登记信号SIGCHLD出错!\n"); 37 | exit(1); 38 | } 39 | //登记Ctrl+C(第九个信号) 40 | if (signal(SIGINT, signal_handler) == SIG_ERR) 41 | { 42 | printf("登记信号SIGINT出错!\n"); 43 | exit(1); 44 | } 45 | 46 | 47 | wiringPiSetup(); //wiringPi库初始化 48 | 49 | /* 50 | *功能:初始化风扇管理 51 | *参数:初始启动的模式、风扇的启动温度阈值(0-100)、风扇的关闭温度阈值(0-100),自定义模式下的风扇速度[25-100] */ 52 | fan_init(CUSTOM, 45, 39, 52); 53 | 54 | open_fan(); //开启风扇管理 55 | 56 | 57 | 58 | while(1) 59 | { 60 | 61 | sleep(18); 62 | } 63 | 64 | return 0; 65 | } 66 | --------------------------------------------------------------------------------