09_树莓派_树莓派外设板_GPIO_按键的中断与消抖

目录

1.树莓派外设集成板总体介绍

2.第一部分 按键矩阵

GPIO_按键与中断

3.实现效果


1.树莓派外设集成板总体介绍

1)前言:这是一块为了验证树莓派【兼容树莓派多个型号】的40pins的外设接口的外接板,告别复杂的面包板外设搭建。【欢迎各位交流,如果有好的思路,会在点赞评论中抽取免费赠送硬件平台

2)本系列将介绍所有外设的硬件接口构成和软件实现【包括原理图和代码实现】。

软件仓库:GitHub - ikuuil45/Linux_Wringpi_Example

3)硬件架构

4)板子全貌

背面:

右侧插针接口可以直接接到树莓派上

左侧是为板子上面的STM32把所有的引脚接口都预留了,板子本身还可以做一个STM32外设开放的最小系统板

正面:和树莓派的尺寸兼容,不会互相产生干涉

接好的塔板

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖_第1张图片

5)外设板学习索引

第一部分:GPIO基础应用
GPIO入门
GPIO基本概念和用途
使用GPIO点亮LED


按键矩阵
设置按键矩阵
控制LED灯的闪烁
中断按键控制LED


第二部分:PWM调光技术
PWM
PWM基本原理
RGB LED的控制


第三部分:通信协议
串口通信
串口基础知识
树莓派与上位机的通信


I2C通信
I2C基础概念
使用I2C控制OLED显示器
通过I2C与MPU6050陀螺仪传感器通信
通过I2C与SHT30温度仪传感器通信
通过I2C与APDS-9960光敏传感器通信


I2C多设备通信
一主多从的I2C通信配置
同时控制多个I2C设备


SPI通信
SPI基础概念
通过SPI与STM32MCU进行通信

第四部分:综合项目
树莓派系统负载温度检测系统
检查树莓派的
实现智能灯光控制和传感器监测
与上位机进行串口通信实现远程控制


环境监测器
使用多个GPIO、PWM、I2C、SPI传感器进行数据采集(温湿度、姿态等)
数据显示在OLED屏幕上
将数据通过串口发送到上位机进行记录和分析

2.第一部分 按键矩阵

GPIO_按键的中断与消抖

在按键部分,最重要的概念无非是普通的按键中断按键的区别

1)原理图分析实现

A.SW5 33号物理引脚 wringpi 23 是点动按键,按下产生一个下降沿 被树莓派捕获。

B.捕获到按键动作后 进行相关继续的业务【这边我们来规定一个LED 28号物理引脚 wringpi 31 的闪烁作为按键的目标现象

C.按键如果需要功能稳定且快捷,中断和消抖是必须要考虑的两个点。

我们分三种类型来实现这个代码及效果

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖_第2张图片09_树莓派_树莓派外设板_GPIO_按键的中断与消抖_第3张图片

A.简单的捕获按键 不使用中断和消抖

Github源码可能会有调整,这里的实现重在理解含义

代码

#include 
#include 

#define BUTTON_PIN 23
#define LED_PIN 28

int main(void)
{
    if (wiringPiSetup() == -1) { // 初始化wiringPi失败,打印错误信息并退出
        printf("setup wiringPi failed !");
        return 1;
    }

    pinMode(BUTTON_PIN, INPUT);
    pinMode(LED_PIN, OUTPUT);

    int buttonState = HIGH; // 初始按键状态为未按下
    int ledState = LOW; // 初始LED状态为关闭

    while(1) {
        int currentButtonState = digitalRead(BUTTON_PIN); // 读取当前按键状态

        if(buttonState == HIGH && currentButtonState == LOW) { // 检测到按键下降沿
            ledState = !ledState; // 改变LED状态
            digitalWrite(LED_PIN, ledState); // 设置LED状态
        }

        buttonState = currentButtonState; // 更新按键状态

        delay(10); // 延时10ms,减少CPU占用率
    }

    return 0;
}

流程图

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖_第4张图片

这个代码很大的问题是,按键处于一个持续的检测状态,如果按下的时候,程序没有运行到,按键检测的位置很可能会导致,按键检测失灵。

B.中断的捕获按键 不使用消抖

代码

#include 
#include 

#define BUTTON_PIN 23
#define LED_PIN 28

volatile int ledState = LOW;

void buttonInterrupt(void) {
    // 按键下降沿触发,改变LED状态
    ledState = !ledState;
    digitalWrite(LED_PIN, ledState);
}

int main(void) {
    if (wiringPiSetup() == -1) { 
        printf("setup wiringPi failed!\n");
        return -1; 
    }
    
    pinMode(BUTTON_PIN, INPUT);
    pinMode(LED_PIN, OUTPUT);
    
    // 设置按键中断,下降沿触发
    if (wiringPiISR(BUTTON_PIN, INT_EDGE_FALLING, &buttonInterrupt) < 0) {
        printf("setup interrupt failed!\n");
        return -1;
    }

    while(1) {
        delay(1000);  // 延时1s
    }

    return 0;
}

流程图

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖_第5张图片

这段代码能够保证按键无论什么时候,发生下降沿,都可以捕获,因为中断触发是及时的,使程达到一个并行运行的效果。但是还存在的问题是按键可能会存在误操作,所以这个时候我们需要去使用消抖。

C.中断的捕获按键 使用消抖

程序

#include 
#include 

#define BUTTON_PIN 23
#define LED_PIN 28
#define DEBOUNCE_DELAY 200 // 消抖延迟时间,单位毫秒

volatile int ledState = LOW;

void buttonInterrupt(void) {
    static unsigned long lastInterruptTime = 0;
    unsigned long interruptTime = millis(); // 获取当前时间

    // 如果中断不是由于抖动引起的
    if (interruptTime - lastInterruptTime > DEBOUNCE_DELAY) {
        // 按键下降沿触发,改变LED状态
        ledState = !ledState;
        digitalWrite(LED_PIN, ledState);
    }
    lastInterruptTime = interruptTime; // 更新时间戳
}

int main(void) {
    if (wiringPiSetup() == -1) { 
        printf("setup wiringPi failed!\n");
        return -1; 
    }
    
    pinMode(BUTTON_PIN, INPUT);
    pinMode(LED_PIN, OUTPUT);
    
    // 设置按键中断,下降沿触发
    if (wiringPiISR(BUTTON_PIN, INT_EDGE_FALLING, &buttonInterrupt) < 0) {
        printf("setup interrupt failed!\n");
        return -1;
    }

    while(1) {
        delay(1000);  // 延时1s
    }

    return 0;
}

流程图

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖_第6张图片

如此下来我们可以实现一个消抖+中断的按键,稳定。

4)编译过程参考此CSDN
05-树莓派-基于Wringpi的树莓派PWM_RGB_彩虹灯C程序【外设接口对应&编译过程&git仓库地址&实际演示】_wiringpi 2.70-CSDN博客

3.实现效果

C程序可以很及时的响应并作出相应的变化

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖_第7张图片

你可能感兴趣的:(Linux_树莓派_环境搭建,单片机,嵌入式硬件)