使用RP2040自制的树莓派pico—— [6/100] 使用按键控制LED灯的亮灭

news/2024/7/5 1:43:40

目录

  • 按键消抖
    • 软件消抖
    • 定时器消抖
    • 程序延时消抖
  • main.py

按键消抖

按键的消抖是指使用软件或硬件方法去除按钮震动或松动引起的多次开关状态变动,使得程序只识别为一次开关状态变动。下面对软件消抖和硬件消抖做一下介绍:

软件消抖

软件消抖是指在程序中对按键的状态进行滤波,去除间隔过短、波动过大的状态变化。常见的软件消抖方法有定时器消抖和程序延时消抖。

定时器消抖

通过在CPU中开启一个定时器,在时间到达后再检测按钮状态,这样可以确保按钮状态已经稳定,达到软件消抖的目的。定时器消抖可以使用硬件定时器(如STM32单片机中的TIM)或者系统定时器(如Arduino中的delay()函数)。

程序延时消抖

在程序中加入一段延时,在其时间范围内检测按键状态的变化,如果变化次数不超过一定次数,则认为按键状态已经稳定,并进行单次触发。延时时间和超限次数可以根据具体实际应用情况去调节,以达到软件消抖的

main.py

以下是树莓派pico使用按键控制LED亮灭的代码,你需要有一个小按键来控制(板载的两个按键一个是重启的EN,一个是选择启动模式的BOOTSEL):

import machine

led = machine.Pin(25, machine.Pin.OUT)
button = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_DOWN)

while True:
    if button.value() == 1:
        led.value(not led.value())
        while button.value() == 1:
            pass

这份代码用起来可能会过于灵敏,因为没有按键消抖的代码,导致按下一次识别成按下了很多次

所以我建议你使用按键都用以下代码:

import machine
import time

led = machine.Pin(, machine.Pin.OUT)
button = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_DOWN)

def debounce(pin):
    state, cntr = 0, 0
    while cntr < 5:
        if pin.value() != state:
            cntr += 1
        else:
            cntr = 0
        state = pin.value()
        time.sleep_ms(5)
    return state

while True:
    if debounce(button) == 1:
        led.value(not led.value())

在以上示例代码中,我定义了一个led引脚和一个button引脚。led引脚设为输出模式,初始值为低电平;button引脚设为输入模式,带下拉电阻,以保证初始状态为低电平。

加入了按键消抖功能的定义debounce()函数,该函数返回按键当前状态。因为按键可能存在机械弹性,可能会震动多次,造成多次按下、抬起的状态。为了减少这样的情况影响,我们可以通过函数判断出按键状态稳定的次数,达到指定次数才返回状态,从而实现对按键反复触发的有效消抖。

在主程序中,调用debounce()函数获取按键状态,如果按键按下,则led引脚的电平状态取反,实现对LED的控制。

需要注意的是,在Pico开发板上,GPIO16对应程序中的16号引脚,GPIO25对应程序中的25号引脚,即我们的板载LED灯。


http://lihuaxi.xjx100.cn/news/1207774.html

相关文章

Elasticsearch基础

Elasticsearch是搜索服务器 视频地址&#xff1a;https://www.bilibili.com/video/BV1Sy4y1G7LL/?p6&spm_id_from333.880.my_history.page.click&vd_sourcefc7fa697b97f292319c5b0cde4755484 下载地址&#xff1a;[https://artifacts.elastic.co/downloads/elasticse…

chatgpt赋能python:Python地址怎么写的SEO

Python地址怎么写的SEO 随着数字化时代的到来&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为网站排名和流量的重要因素。为了让Python 相关网站在搜索引擎上更加有利的排名&#xff0c;需要了解Python地址要怎么写才能获得更好的SEO效果。 为什么地址要写好 地…

chatgpt赋能python:Python在一个程序里调用另一段程序

Python在一个程序里调用另一段程序 随着Python程序的复杂度越来越高&#xff0c;有时候一个程序难以处理所有的任务。这时候我们可能需要将任务拆分成多个脚本来执行。但是&#xff0c;这会导致代码的复杂性增加&#xff0c;同时也会增加可读性和维护成本。这时候&#xff0c;…

chatgpt赋能python:Python图片定位:优化SEO的关键技术

Python图片定位&#xff1a;优化SEO的关键技术 在现代搜索引擎优化中&#xff0c;图片已成为吸引用户眼球和提升网站排名的关键元素之一。而Python作为一种功能强大的编程语言&#xff0c;在图片定位和SEO优化方面也具备很大的优势。 Python图片定位的基本原理 在Python中&a…

操作系统(进程与线程,复习自用)

进程与线程 进程与线程进程的概念、组成、特征进程的状态与转换进程控制进程通信&#xff08;IPC&#xff09;线程概念 多线程模型线程的实现方式 多线程模型线程的状态与转换 CPU调度与上下文切换调度的概念、层次进程调度的时机 切换与过程调度方式调度器 闲逛进程调度算法的…

Redis及缓存击穿、穿透、雪崩

目录 优缺点 使用方法 使用场景 Redis缓存击穿、穿透、雪崩 Redis是一款开源的内存数据结构存储系统&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等。Redis的使用场景非常广泛&#xff0c;以下是一些常见的使用场景&#xff1a; 优…

Vue3.0 为什么采用 Proxy

Object.defineProperty() 作用&#xff1a;在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回这个对象。 1. 基本使用 语法&#xff1a;Object.defineProperty(obj, prop, descriptor) 参数&#xff1a; 要添加属性的对象 要定义或修改…

ABC304F Shift Table

ABC304F Shift Table 题目大意 小 T T T和小 A A A要做 n n n天的工作。 小 T T T的工作表表示为字符串 S S S&#xff0c;其中“#”表示当天要工作&#xff0c;“.”表示当天不需要工作。 你需要安排小 A A A的工作&#xff0c;步骤如下 选择一个 n n n的约数 m m m&…