这里我们通过设置按钮 完成长按三秒 重启树莓派的功能。
![](https://img.haomeiwen.com/i14105978/6d7dc557b8efdd67.png)
解析:
首先我们连接硬件:
![](https://img.haomeiwen.com/i14105978/e61bec7e1806c2d5.png)
G接 GND S接GPIO端口 V接5V
根据引脚图连接硬件
#define KEY 23 设置引脚号
wiringPiSetupGpio() 初始化wiringPi 这里使用wiringPi编号
alarm(n) 表示 n 秒后 发送 一个 SIGALRM信号
alarm(0) 取消之前的alarm指令 即 取消n秒后的指令
signal(SIGALRM,handler) 设置收到SIGALRM信号后的处理函数
处理函数handler:接收到对应信号便重启树莓派,reboot为树莓派重启指令。
void handler(int signo)
{
printf("执行reboot\n");
system("sudo reboot");
}
![](https://img.haomeiwen.com/i14105978/a74154b20b255c5c.png)
通过usleep(int n) 规避抖动时间
睡眠 n 微秒 1秒 = 1 000 000 微秒
代码:
#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
//指定引脚接口
#define KEY 23
void handler(int signo)
{
printf("执行reboot\n");
system("sudo reboot");
}
int main(int arg,char** argv)
{
if(-1==wiringPiSetupGpio())
{
return -1;
}
signal(SIGALRM,handler);
pinMode(KEY,INPUT);
//该按钮为低电平按钮 按下为低
while(1)
{
if(digitalRead(KEY)==LOW)
{
//跳过前沿抖动
usleep(20000);
//确认按下
if(digitalRead(KEY)==LOW)
{
alarm(3);
while(digitalRead(KEY)==LOW);
usleep(20000);//跳过后沿抖动
if(digitalRead(KEY)==HIGH)
{
alarm(0);
}
}
}
}
return 0;
}
网友评论