树莓派Python 按键实验

您所在的位置:网站首页 树莓派如何编程 树莓派Python 按键实验

树莓派Python 按键实验

2023-09-09 06:51| 来源: 网络整理| 查看: 265

第一课:什么是树莓派 第二课:树莓派能做什么 第三课:购买您的第一个树莓派 第四课:如何安装树莓派系统 第五课:树莓派Python编程手册 第六课:树莓派Python Led实验 第七课:树莓派Python 按键实验 视频链接

如果要实现按下一个按钮让灯亮,再按下让灯灭这样的功能,就需要实现按键编程了,按键编程属于输入设备范畴。

什么是输入设备,什么是输出设备

参考**第六课:树莓派Python Led实验

用什么做实验

我们一般用第一种按键(左边),淘宝上几毛钱就可以买到,右边的按键,还需要自己去加电阻搭电路,不方便。 在这里插入图片描述

编程思路

很多学生总是喜欢看,迟迟不动手,我发现原因是他还没有思路,就是不知如何动手,或者有几种方法,不确定用哪一种比较好,所以在茫茫博客中找到理论依据,其实这种情况,还是动手比较好,编程就是要多写,即时尝试的方法不是最好的,也可以让你搞清楚这种方法的弊端在哪里,然后一步步逼近正确方法,如果没有经验,没有人能够一步到位,所以不尝试是最好的,也最直接的学习方法。 这里的编程思路,其实就是要搞清楚这个按键的工作原理。 我先上一张图: 在这里插入图片描述 我们这里拿S1来说明,当我们按下时,有什么现象,不按的时候有什么现象呢? 这里的p0.4就是我们树莓派接线时候的引脚,所以现象就是当不按的时候,p0.4这个点是高电平(比3.3v低一点),按下的时候,p0.4是低电平,因为跟GND(地)连通了。这样我们就可以写程序来读取p0.4引脚的电平,当读到高,说明没有按键,当读到低说明按键了。 ——这就是编程思路,了解到这里,你应该迫不及待了吧!

如何连线

VCC接5V,out接wiringPi的第1脚。 在这里插入图片描述

开始写程序了

程序的步骤还是跟led的控制差不多,但是因为这里是要控制输入设备,稍微有些不同,步骤如下: 1)包含导入GPIO模块 import RPi.GPIO as GPIO #这是第一条语句,不然你不能调用控制IO口的函数 import time #导入时间模块,为了下面做延时用,不然看不到一闪一闪的效果 2) 设置编码模式 gpio.setmode(gpio.BCM)#设置引脚编码模式,c语言一般使用wiringPi编码模式,python一般使用BCM编码模式 #这些函数不知道什么意思的,可以参考第五课:树莓派Python编程手册 3)设置引脚功能 GPIO.setup(18,GPIO.IN,GPIO.PUD_UP)#设置18号引脚为输入功能,并且上拉 4) 循环控制 while 1: time.sleep(0.05) if(GPIO.input(KEY)==1): #判断是否按下 print “key press” 最后的完整代码:

pi@xiajiashan:~/pi-python-blog$ cat key.py #-*-coding:utf-8-*- //支持中文注释 import RPi.GPIO as GPIO #导入RPi模块 import time #使用延时功能 GPIO.setmode(GPIO.BCM) #设置BCM编码 KEY = 18 #BCM第18引脚 GPIO.setup(KEY,GPIO.IN,GPIO.PUD_UP)#设置输入,上拉 while 1: time.sleep(0.05) if(GPIO.input(KEY)==1): #判断是否按下 print "key press" 编译运行

编译运行会出现很多打印语句,可以说是铺天盖地,就像这样 在这里插入图片描述

甚至,手一碰过去,就出现了一大波打印语句。

如何解决按键不灵敏的问题

上面的问题,其实是正常现象,造成这一现象的原因,是按键有机械抖动,怎么解决这个问题呢? 我们先来看一张图: 在这里插入图片描述 之所以我们的程序出现很多的打印语句,是因为在前沿抖动区间,这个区间是10~20ms,感觉很短,但是对树莓派cpu来说,足可以执行几千次了。 所以,我们需要想办法绕过这段时间,思路是: 先判断低电平,然后延时20ms,跨到稳定区间,再判断一次,如果还是低电平,那么就确认是一个真实的按键了。 代码如下:

pi@xiajiashan:~/pi-python-blog$ cat key_noshake.py #-*-coding:utf-8-*- import RPi.GPIO as GPIO #导入RPi.GPIO模块 import time #导入时间模块,用于延时 GPIO.setwarnings(False) #屏蔽警告信息 #---第一步:设置引脚编码模式 GPIO.setmode(GPIO.BCM) #设置引脚为BCM编码 #---第二步:设置引脚方向---- KEY = 18 #定义18脚作为按键使用 GPIO.setup(KEY,GPIO.IN) #设置按键为输入 #----第三步:循环判断按键是否按下 while 1: if GPIO.input(KEY)==1:#按下(该按键模块,当松开的时候是低电平,按下时高电平) time.sleep(0.02) #延时20ms 绕过抖动区间,为了防抖 if(GPIO.input(KEY)==1): #再次判断是否在按下的状态(判断是否在稳定区间) while(GPIO.input(KEY)==1): #等待松手 pass #占位行 #实现按键要做的事情 print('key precess') pi@xiajiashan:~/pi-python-blog$

这里的20行,是等待手松开的意思。

如何让按键控制灯或者蜂鸣器

我在这里贴出控制蜂鸣器的代码,因为单个的原理已经讲过了,led单独控制知道了,按键知道了,这里只是整合问题,大家还有不懂的可以购买我的教学视频: https://edu.csdn.net/course/play/28043/383532?spm=1002.2001.3001.4143

pi@xiajiashan:~/pi-python-blog$ cat key_beep.py #!/usr/bin/python #-*-coding:utf-8-*- import RPi.GPIO as GPIO #导入RPi.GPIO模块 import time #导入时间模块,用于延时 GPIO.setwarnings(False) #屏蔽警告信息 #---第一步:设置引脚编码模式 GPIO.setmode(GPIO.BCM) #设置引脚为BCM编码 #---第二步:设置引脚方向---- KEY = 18 #定义18脚作为按键使用 BEEP = 27 #定义27脚为蜂鸣器使用 GPIO.setup(KEY,GPIO.IN) #设置按键为输入 GPIO.setup(BEEP,GPIO.OUT,initial=GPIO.LOW) #设置BEEP为输出,并且初始化为低电平 #----第三步:循环判断按键是否按下 Flag = 0 while 1: if GPIO.input(KEY)==1:#按下(该按键模块,当松开的时候是低电平,按下时高电平) time.sleep(0.02) #延时20ms 绕过抖动区间,为了防抖 if(GPIO.input(KEY)==1): #再次判断是否在按下的状态(判断是否在稳定区间) while(GPIO.input(KEY)==1): #等待松手 pass #占位行 #实现按键要做的事情 print('key precess') if Flag == 0: GPIO.output(BEEP,GPIO.HIGH) Flag = 1 else: GPIO.output(BEEP,GPIO.LOW) Flag = 0 pi@xiajiashan:~/pi-python-blog$ 如何实现长按三秒,让树莓派重启

如何用C实现长按3秒重启树莓派,感觉很复杂高深,其实原理非常简单。 完整代码如下:

pi@xiajiashan:~/pi-python-blog$ cat key_reboot.py #!/usr/bin/python #-*-coding:utf-8-*- import RPi.GPIO as GPIO #导入RPi.GPIO模块 import time #导入时间模块,用于延时 import os #导入系统模块,用于调用system GPIO.setwarnings(False) #屏蔽警告信息 #---第一步:设置引脚编码模式 GPIO.setmode(GPIO.BCM) #设置引脚为BCM编码 #---第二步:设置引脚方向---- KEY = 27 #定义27脚作为按键使用 LED = 18 #定义18脚为led灯使用 GPIO.setup(KEY,GPIO.IN) #设置按键为输入 GPIO.setup(LED,GPIO.OUT,initial=GPIO.LOW) #设置LED为输出,并且初始化为低电平 #----第三步:循环判断按键是否按下 Flag = 0 counter = 0 while 1: if GPIO.input(KEY)==1:#按下(该按键模块,当松开的时候是低电平,按下时高电平) time.sleep(0.02) #延时20ms 绕过抖动区间,为了防抖 if(GPIO.input(KEY)==1): #再次判断是否在按下的状态(判断是否在稳定区间) while(GPIO.input(KEY)==1): #等待松手 counter+=1 time.sleep(0.01) #等待10ms if(counter>300):#保证按下时间大于3秒 os.system("sudo reboot") #重启树莓派 #实现按键要做的事情 print('key precess') if Flag == 0: GPIO.output(LED,GPIO.HIGH) Flag = 1 else: GPIO.output(LED,GPIO.LOW) Flag = 0 pi@xiajiashan:~/pi-python-blog$

想系统学习的同学可以购买我的教学视频: 长按3秒实现树莓派重启视频Python版

END

希望这篇文章对大家有价值,如果有帮助就收藏吧!

第一课:什么是树莓派 第二课:树莓派能做什么 第三课:购买您的第一个树莓派 第四课:如何安装树莓派系统 第五课:树莓派Python编程手册 第六课:树莓派Python Led实验 第七课:树莓派Python 按键实验 视频链接



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3