Raspberry Pi长按与短按可控制LED

如何解决Raspberry Pi长按与短按可控制LED

首先,免责声明,我对Raspberry Pi和Python绝对是陌生的,所以我可能在这里做了些废话,抱歉。

作为第一个练习,我尝试制作一个二进制计数器,该计数器通过按下物理GPIO按钮来逐个点亮4个LED,每次都会增加一个,我已经成功做到了,我想要添加更多功能,例如,如果我按住按钮的时间更长(在这种情况下为2秒),则计数器将重置为0,并且所有LED都将熄灭。

这是我现在所做的代码,但是行为与我的意图不完全相同...

import RPi.GPIO as GPIO
from time import sleep,time

led0 = 40
led1 = 35
led2 = 33
led3 = 31
btn = 7

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

GPIO.setup(led0,GPIO.OUT)
GPIO.setup(led1,GPIO.OUT)
GPIO.setup(led2,GPIO.OUT)
GPIO.setup(led3,GPIO.OUT)
GPIO.setup(btn,GPIO.IN,pull_up_down=GPIO.PUD_UP)

start_time = 0
counter = 0
time_counter = 0

time_flag = False
button_flag = True


try:
    while True:
        if GPIO.input(btn) == 0: # Button is pressed
            if time_flag == True:
                time_counter = time() - start_time
                #print (f"time_counter = {round(time_counter,2)}s")            
                
            if button_flag == True:
                time_flag = True
                start_time = time()

                counter += 1
                #print (time_counter)
                
                if time_counter > 2:
                    counter = 0
                if counter == 16:
                    counter = 0
                    
                print (format(counter,'02d'),format(counter,'04b')) # bin(counter)[2:].zfill(4)
                button_flag = False
                sleep(0.05)
                
                GPIO.output(led0,counter & 0x01)
                GPIO.output(led1,counter & 0x02)
                GPIO.output(led2,counter & 0x04)
                GPIO.output(led3,counter & 0x08)
        else:
            button_flag = True
            time_counter = 0


except KeyboardInterrupt:
    GPIO.cleanup()

问题是我希望长时间按住按钮才能执行特定的代码,但是依次发生的是,如果我长时间按住按钮,一开始什么都没有发生,因此我需要按一下再次使其执行我想要的操作,并重置计数器以关闭所有LED。

这是一个演示该问题的GIF,在第一部分中,我只是使用快速单击进行增量操作,之后我按住该按钮很长时间(2秒钟),但是该按钮无法正常工作,因此我必须单击再次使其生效。

Raspberry LED Issue GIF

将感谢您的任何建议!

解决方法

我认为问题是当您按住按钮时,button_flag将在1次循环后设置为False。这样,当仍按下按钮时,if button_flag == True块下的代码将不再运行。释放按钮后,else块将运行并将time_counter设置为0。那么您的if time_counter > 2条件将永远不会满足,因此也就不会将counter设置为0。>

,

您应该将时间检查移到time_flag检查块中。而且,如果time_counter达到其极限,则在发生超时后立即将LED的变化反映出来

import RPi.GPIO as GPIO
from time import sleep,time

led0 = 40
led1 = 35
led2 = 33
led3 = 31
btn = 7

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

GPIO.setup(led0,GPIO.OUT)
GPIO.setup(led1,GPIO.OUT)
GPIO.setup(led2,GPIO.OUT)
GPIO.setup(led3,GPIO.OUT)
GPIO.setup(btn,GPIO.IN,pull_up_down=GPIO.PUD_UP)

start_time = 0
counter = 0
time_counter = 0

time_flag = False
button_flag = True


try:
    while True:
    if GPIO.input(btn) == 0: # Button is pressed
        if time_flag == True:
            time_counter = time() - start_time
            #print (f"time_counter = {round(time_counter,2)}s")            
            
            if time_counter > 2:
                counter = 0
                GPIO.output(led0,counter & 0x01)
                GPIO.output(led1,counter & 0x02)
                GPIO.output(led2,counter & 0x04)
                GPIO.output(led3,counter & 0x08)


        if button_flag == True:
            time_flag = True
            start_time = time()

            counter += 1
            #print (time_counter)
            
            if counter == 16:
                counter = 0
                
            print (format(counter,'02d'),format(counter,'04b')) # bin(counter)[2:].zfill(4)
            button_flag = False
            sleep(0.05)
            
            GPIO.output(led0,counter & 0x01)
            GPIO.output(led1,counter & 0x02)
            GPIO.output(led2,counter & 0x04)
            GPIO.output(led3,counter & 0x08)
    else:
        button_flag = True
        time_counter = 0


except KeyboardInterrupt:
    GPIO.cleanup()
,

希望这段代码能帮到你

import RPi.GPIO as GPIO
from time import sleep,time
btn = 8

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(btn,pull_up_down=GPIO.PUD_DOWN)
while True:
    if(GPIO.input(btn) == 1):
        start = time()
        sleep(0.02)
        while(GPIO.input(btn) == 1):
            sleep(0.01)
        length = time() - start
        print("press : "+str(length))
    else:
        print("await")
    sleep(1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-