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

目录

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

2.第一部分 按键矩阵

GPIO_按键与中断

3.实现效果


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

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

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

软件仓库:GitHub - ikuuil45/Linux_Wringpi_Example

3)硬件架构

4)板子全貌

背面:

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

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

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

接好的塔板

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.按键如果需要功能稳定且快捷,中断和消抖是必须要考虑的两个点。

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

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

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

代码

#include <wiringPi.h>
#include <stdio.h>#define BUTTON_PIN 23
#define LED_PIN 28int 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;
}

流程图

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

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

代码

#include <wiringPi.h>
#include <stdio.h>#define BUTTON_PIN 23
#define LED_PIN 28volatile 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;
}

流程图

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

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

程序

#include <wiringPi.h>
#include <stdio.h>#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;
}

流程图

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

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

3.实现效果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/456395.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片文件转化成二进制流 (防止出现“图像因其本身有错无法显示‘的问题)

$image E:/www/logo.png; //图片文件地址 $type getimagesize($image)[mime]; //获取图片类型 $imgData file_get_contents($image); //获取图片二进制流 //输出二进制图片 ob_clean(); //清除缓冲区&#xff0c;防止出现“图像因其本身有错无法显示的问题 header(&quo…

酷开系统 | 拓展内容营销边界,酷开科技大屏价值全面升维

丰富的内容是智能大屏吸引消费者的关键。随着智能大屏各类垂直应用的增多&#xff0c;和长、短视频等多元内容的加入&#xff0c;使消费者的使用需求进一步激发和释放&#xff0c;这些流量的加入&#xff0c;也使大屏成为了营销的天然宝藏。酷开科技一直致力于OTT大屏营销&…

使用Windows自带PowerShell远程连接服务器

鼠标右键点击左下角开始或者Windows图标&#xff0c;选择Windows PowerShell 输入命令连接&#xff0c;命令格式为&#xff1a; ssh 用户名IP地址例如 ssh admin127.0.0.1输入连接命令之后再输入密码即可连接成功

掌握Linux du命令:高效查看文件和目录大小

今天我们在生产环境中的服务器上收到了有关/var磁盘目录使用率较高的警报。为了解决这一问题&#xff0c;我们进行了/var目录下一些大文件的清理和转移操作。在查找那些占用磁盘空间较多的文件时&#xff0c;我们频繁使用了du命令。在Linux系统中&#xff0c;du命令是一款功能强…

SHELL编程三剑客之awk详解

SHELL编程三剑客之awk详解 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言&#xff1a; AWK 程序设计语言 &#xff0c; 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的…

机器学习 | 探索朴素贝叶斯算法的应用

朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。它被广泛应用于文本分类、垃圾邮件过滤、情感分析等领域&#xff0c;并且在实际应用中表现出色。 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法&#xff1a; 1&#xff09;对于给定的待分类项r…

C++ STL精通之旅:向量、集合与映射等容器详解

目录 常用容器 顺序容器 向量vector 构造 尾接 & 尾删 中括号运算符 获取长度 清空 判空 改变长度 提前分配好空间 代码演示 运行结果 关联容器 集合set 构造 遍历 其他 代码演示 运行结果​编辑 映射map 常用方法 构造 遍历 其他 代码演示1​编…

【AWS】step-functions服务编排

文章目录 step-functionsState machine typeStandard workflowsExpress workflows design skillsError handlingsaga Transaction processing控制分布式系统中的并发性 收费 作为AWS Serverless无服务器的一个重要一环 使用step-functions方法将 AWS 服务链接在一起 step-funct…

网络故障的排错思路

一、网络排错必备知识 1、网络通信的基础设备和其对应的OSI层次 在网络通信中&#xff0c;了解基础设备如交换机、三层交换机、路由器和防火墙以及它们在OSI七层模型中 的作用至关重要。对于网络管理员和工程师来说&#xff0c;深入了解这些设备在OSI模型中的位置和功能可 …

【软考设计师笔记】一篇文章带你了解数据库

【考证须知】IT行业高含金量的证书(传送门)&#x1f496; 【软件设计师笔记】计算机系统基础知识考点(传送门) &#x1f496; 【软件设计师笔记】程序语言设计考点(传送门) &#x1f496; 【软件设计师笔记】操作系统考点(传送门)&#x1f496; 【软件设计师笔记】什么是软…

【大模型】万亿级别的大语言模型训练,基础设施如何支持

万亿级别的大语言模型训练&#xff0c;基础设施如何支持 前言1&#xff09;培训百万亿参数的LLM是可行的&#xff0c;但需要每个GPU高达1 TiB的次级内存池&#xff0c;双向带宽为100 GB/s。2&#xff09;对于1T模型的强扩展在约12288个GPU左右停滞&#xff0c;因为矩阵乘法变得…

JavaScript运行机制

在web前端开发中&#xff0c;JavaScript无疑是一种非常重要的编程语言。它能够为网页添加动态交互功能&#xff0c;提升用户体验。然而&#xff0c;要充分发挥JavaScript的威力&#xff0c;我们需要对它的运行机制有一定的了解。 JavaScript是一种解释执行的脚本语言&#xff…