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.mzph.cn/news/670113.shtml

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

相关文章

R语言绘图教程 | 双侧条形图绘制教程

写在前面 双侧条形图在我们的文章中也是比较常见的,那么这样的图形是如何绘制的呢? 以及它使用的数据类型是什么呢? 这些都是我们在绘制图形前需要掌握的,至少我们知道绘图的数据集如何准备,这样才踏出第一步。 今天的教程,我们会从数据的准备,以及数据如何整理,以及…

OpenCV+ moviepy + tkinter 视频车道线智能识别项目源码

项目完整源代码&#xff0c;使用 OpenCV 的Hough 直线检测算法&#xff0c;提取出道路车道线并绘制出来。通过tkinter 提供GUI界面展示效果。 1、导入相关模块 import matplotlib.pyplot as plt import numpy as np import cv2 import os import matplotlib.image as mpimg …

Halcon 缺陷检测

文章目录 开闭运算&#xff0c;腐蚀膨胀的亮点问题灰度图像的开闭运算&#xff0c;腐蚀膨胀的亮点问题算子二值化算子 Halcon blob特征处理的方法检测缺陷Halcon Blob特征差分的方法检测缺陷Halcon 极坐标变换&#xff08;环形先转换坐标&#xff09;blob特征Halcon Blob局部二…

系统分析师-22年-下午答案

系统分析师-22年-下午答案 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选其中两题作答 试题一 (25分) 说明 某软件公司拟开发一套博客系统&#xff0c;要求能够向用户提供一个便捷发布自已心得&#xff0c;及时有效的…

公有云服务器:功能与性能的完美融合

在数字化浪潮下&#xff0c;云服务器已经成为企业及个人用户存储数据、运行应用的重要基础设施。其中&#xff0c;公有云服务器凭借其诸多优势&#xff0c;更是受到了市场的广泛欢迎。上海悠远将为您详细介绍公有云服务器的功能特点&#xff0c;以及如何进行性能测试。 一、公有…

npm install express -g报错或一直卡着,亲测可解决

问题描述&#xff1a; 最近学习vue3前端框架&#xff0c;安装Node.js之后&#xff0c;在测试是否可行时&#xff0c;cmd窗口执行了&#xff1a;npm install express -g&#xff0c;发现如下图所示一直卡着不动&#xff0c;最后还报错了&#xff0c;网上找了好久&#xff0c;各…

爬虫实战--人民网

文章目录 前言发现宝藏 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚&#xff0c;文章中如果有记录错误&#xff0c;欢迎读者朋友们…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(3.详解String数据结构)

【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底层实现(2.版本区别dictEntry & redisObject详解)-CSDN博客 紧接着前两篇的总体介绍&#xff0c;从这篇开始&#x…

LLM是一个向量程序库,提示是查询语言

2013 年&#xff0c;Mikolov 等人在 Google。 注意到一些值得注意的事情。 他们正在构建一个模型&#xff0c;将单词嵌入到向量空间中——这个问题从 20 世纪 80 年代开始就已经有很长的学术历史了。 他们的模型使用了一个优化目标&#xff0c;旨在将单词之间的相关关系转化为…

Nicn的刷题日常之获得月份天数

目录 1.题目描述 描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 2.解题 1.题目描述 描述 KiKi想获得某年某月有多少天&#xff0c;请帮他编程实现。输入年份和月份&#xff0c;计算这一年这个月有多少天。 输入描述&#xff1a; 多组输入&#xff0c;一行有两…

JVM Java虚拟机入门指南

文章目录 为什么学习JVMJVM的执行流程JVM的组成部分类加载运行时数据区本地方法接口执行引擎 垃圾回收什么样的对象是垃圾呢内存溢出和内存泄漏定位垃圾的方法对象的finalization机制垃圾回收算法分代回收垃圾回收器 JVM调优参数JVM调优工具Java内存泄漏排查思路CPU飙高排查方案…

Jmeter 01 -概述线程组

1、Jmeter:概述 1.1 是什么&#xff1f; Jmeter是Apache公司使用Java 开发的一款测试工具 1.2 为什么&#xff1f; 高效、功能强大 模拟一些高并发或多次循环等特殊场景 1.3 怎么用&#xff1f; 下载安装 1、下载jmeter&#xff0c;解压缩2、安装Java环境&#xff08;jmet…

SpringBoot Security安全认证框架初始化流程认证流程之源码分析

SpringBoot Security安全认证框架初始化流程&认证流程之源码分析 以RuoYi-Vue前后端分离版本为例分析SpringBoot Security安全认证框架初始化流程&认证流程的源码分析 目录 SpringBoot Security安全认证框架初始化流程&认证流程之源码分析一、SpringBoot Security安…

BUUCTF-Real-[struts2]s2-001

漏洞描述 struts2漏洞 S2-001是当用户提交表单数据且验证失败时&#xff0c;服务器使用OGNL表达式解析用户先前提交的参数值&#xff0c;%{value}并重新填充相应的表单数据。例如&#xff0c;在注册或登录页面中&#xff0c;如果提交失败&#xff0c;则服务器通常默认情况下将返…

Linux嵌入式开发+驱动开发-中断

swi汇编指令可以产生软中断&#xff0c;以下是硬件中断的产生到执行完毕的全过程&#xff1a; 在自己设计的芯片“CPU响应中断”程序的第四个步骤可以转向“中断向量控制器”&#xff0c;中断向量控制器中存储中断元服务地址即处理中断处理程序的地址&#xff0c;而不用使用0X1…

算法学习——LeetCode力扣链表篇2

算法学习——LeetCode力扣链表篇2 24. 两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&…

ppt怎么转成pdf文件?3种超实用PPT转PDF方法分享

ppt怎么转成pdf文件&#xff1f;在日常办公中&#xff0c;将PPT转换为PDF文件具有很多实际的好处。首先&#xff0c;PDF文件是一种通用的文件格式&#xff0c;可以在各种操作系统和设备上轻松打开和查看&#xff0c;不受源文件的限制。其次&#xff0c;将PPT转换为PDF可以很好地…

龙测科技荣获2023年度技术生态构建奖

本月&#xff0c;由极客传媒举办的“有被Q到”2024 InfoQ 极客传媒合作伙伴年会顺利举办&#xff0c;龙测科技喜获2023年度技术生态构建奖。 InfoQ是首批将Node.js、HTML5、Docker等技术全面引入中国的技术媒体之一&#xff0c;秉承“扎根社区、服务社区、引领社区”的理念&…

ctfshow-web1~10-WP

web1 右键查看源码就能看到flag web2 打开网页提示无法查看源代码,右键也使用不了,那我们就在url前面加上view-source: view-source:http://83a83588-671e-4a94-9c6f-6857f9e20c2f.chall.ctf.show/ 访问后即可获得flag web3 右键源码也没看到信息,去查看一下请求头和响应…

C# Onnx GroundingDINO 开放世界目标检测

目录 介绍 效果 模型信息 项目 代码 下载 介绍 地址&#xff1a;https://github.com/IDEA-Research/GroundingDINO Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection" 效果 …