第一课:什么是树莓派
第二课:树莓派能做什么
第三课:购买您的第一个树莓派
第四课:如何安装树莓派系统
第五课:树莓派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 = 1else:  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+=1time.sleep(0.01)   #等待10msif(counter>300):#保证按下时间大于3秒os.system("sudo reboot")  #重启树莓派#实现按键要做的事情print('key precess') if Flag == 0:   GPIO.output(LED,GPIO.HIGH)Flag = 1else:  GPIO.output(LED,GPIO.LOW)Flag = 0
pi@xiajiashan:~/pi-python-blog$

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

END

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

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

树莓派Python 按键实验相关推荐

  1. 树莓派Python开发:led实验

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

  2. 《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  3. 《树莓派Python编程入门与实战》——2.3 使用Raspbian图形用户界面

    本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第2章,第2.3节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  4. 树莓派+python flask 调用天气api接口实现天气数据web

    *注:树莓派我用的是在Win10上面的虚拟机镜像 * 文章目录 前言 一.flask是什么? 二.使用步骤 1.引入库 2.写一个简单的flask 3.实验准备 4.实验开始 5.结尾调试 总结 前言 ...

  5. 树莓派科学小实验4B--06_AD温度传感器

    系列文章目录 树莓派科学小实验 001 点亮第一盏LED灯 002 点亮LED灯组 003_开关控制LED灯 004_获取温湿度 005_跑马灯(ws2812b)) 006_数字温度传感器(PCF85 ...

  6. python实现树莓派监控_用树莓派 + Python + OpenCV 实现家庭监控和移动目标探测(下)...

    哇,上周那篇关于做一个基本运动检测系统的文章真是赞.写这篇文章很有乐趣,而且从像您一样的读者那里获得反馈,使我的努力变得很值得. 对于那些刚看到这篇文章的朋友,上周那篇文章是关于使用计算机视觉来建立一 ...

  7. 《树莓派Python编程指南》—— 1.3 树莓派快速指南

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第1章,第1.3节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  8. 《树莓派Python编程指南》——2.3 小结

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.3节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  9. python上机实验报告读取文件_Python程序设计实验报告:实验八 文件

    安徽工程大学 Python程序设计 实验报告 班级 物流192姓名陶俊 学号3190505235 成绩 日期 2020.6.3 指导老师修宇 实验八 文件 [实验目的] 掌握读写文本文件或 CSV 文 ...

  10. 《树莓派Python编程入门与实战》——3.5 关于Python交互式shell

    本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第3章,第3.5节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

最新文章

  1. 域名跳转301-LAMP环境搭建
  2. new一个新对象的时候,各属性方法的操行顺序
  3. MATLAB图像函数 块和邻域的处理
  4. win10上安装opencv详细教程
  5. 通过Rancher Desktop在桌面上运行K8s
  6. RC4加密解密java算法
  7. 2017-08-14 前端日报
  8. AOP拦截器 表达式写法
  9. oracle blob查重,如何解决oracle blob字段 的乱码问题
  10. 文件上传漏洞原理/方式/防护
  11. 解决Tensorflow2.0出现:AttributeError: module ‘tensorflow‘ has no attribute ‘get_default_graph‘的问题
  12. 理论+示例,三个问题系统捋清UGC平台的玩法
  13. 利用SolidWorks解决方案取得健身器材市场的领先地位!
  14. java求职面试指南
  15. 怎么成为抖音本地生活服务商家?需要哪些资质条件?
  16. c语言括号表示法画树怎么画,各种树的画法,这篇文章写得太详细了,值得收藏!...
  17. 2017百度AI开发者大会召开,智能云计算分论坛聚焦ABC
  18. unity2D横版游戏教程-3 Cinemachine镜头移动
  19. 用GUI自动控制键盘和鼠标
  20. @Value注解获取不到配置值

热门文章

  1. 从零开始学USB(十五、USB的设备状态)
  2. Java SE day02 pm
  3. C语言入门练习— —累乘
  4. crontab 每天凌晨12点定时器_每天爆卖10000只生蚝!西安这家烧烤界扛把子,吃到凌晨2点都不尽兴!...
  5. [python库]psd文件操作库--psd_tools
  6. Vue学习记录(三)——脚手架的使用和Vuex
  7. 驱动精灵显示服务器去火星了,“用驱动精灵发现不了声卡,设备管理器上面正常”的解决方案...
  8. 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法
  9. 提高测试工作效率的硬技能和软技能
  10. java中j是什么意思_i 1 j 是什么意思 i.j.k是什么意思