项目十三 智能保险箱 - 任务三_第1页
项目十三 智能保险箱 - 任务三_第2页
项目十三 智能保险箱 - 任务三_第3页
项目十三 智能保险箱 - 任务三_第4页
项目十三 智能保险箱 - 任务三_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《传感器应用》主讲教师:XXX

项目十三智能保险箱PART13※智能保险箱接近报警功能※智能保险箱密码开锁功能13※实现智能保险箱功能项目概述贵重物品的安全,是人身财产安全的重要一环。随着科技水平的提高,各种盗取财物的手段不断升级。因此,人们对安全稳定性好、操作便捷的智能保险柜的需求也在不断提高。某公司要设计一个智能保险箱,要求保险箱具有有人接近时报警功能、使用数字式转盘作为解锁方式,语言播报产品作为特色。小林是公司的产品研发工程师需要将其设计出来,使用树莓派开发套件编写程序调试实现上述功能,便于后续产品的研发。掌握编写智能保险箱接近报警功能方法01掌握编写智能保险箱密码开锁功能方法02学习目标objective技能目标objective掌握编写智能保险箱功能方法01掌握实现编写综合程序方法02TASKTHREE任务三实现智能保险箱功能4任务概述储备知识任务实施任务目标231本次任务:在学习掌握编写智能保险箱接近报警功能与智能保险箱密码开锁功能后,将其整合在一起实现完整的智能保险箱功能,并在代码中添加异常处理、线程语句让代码更完善。任务概述4任务概述储备知识任务实施任务目标231TASKTHREE任务三实现智能保险箱功能01.掌握异常处理语句的使用02.掌握线程的使用方法任务目标03.掌握综合程序的编写方法4任务概述储备知识任务实施任务目标231TASKTHREE任务三实现智能保险箱功能01.认识异常处理语句try…except语句储备知识02.认识线程01.认识异常处理语句try…except语句1.1.什么是异常异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。(一个事件)异常在Python无法正常处理程序时就会发生一个异常,异常是Python对象,表示一个错误,当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。一般情况下1.2.异常处理try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。捕捉异常可以使用try语句可以使用except语句如果你不想在异常发生时结束你的程序,只需在try里捕获它。1.3.语法02.认识线程2.1.为什么使用线程在获取一个数据时会卡在一个循环当中无法再获取另外一个数据,这时就需要将两个循环进行分离同时执行,就需要使用线程这个方法。在python程序的编写中有时需要在同一时间内做很多事情,如获取当前超声波的数据旋转编码器是否被转动这两件事情都需要两个while循环来实时获取。2.2.什么是线程是操作系统能够进行运算调度的最小单位。线程(英语:thread)它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流。一个进程中可以并发多个线程。每条线程并行执行不同的任务。在UnixSystemV及SunOS中被称为轻量进程(lightweightprocesses)轻量进程更多指内核线程(kernelthread),而把用户线程(userthread)称为线程。一个进程可以有很多线程。每条线程并行执行不同的任务。2.3.Python中线程的使用(1)首先需要引用类库Threading与其他使用到的类库,代码如下所示。import

threadingimporttime(2)声明一个线程事件的触发函数,代码如下所示。def

action():

whileTrue:

print("hello")

time.sleep(1)代码详解代码中的线程事件主要负责打印出hello在终端中并且不断的每秒循环打印。代码详解代码中target=action其中action为要启动线程事件的函数名称,args为启动函数时是否添加参数,本次案例未添加参数。当声明完成后即可启动线程函数job1.start(),启动成功后在终端中即每秒打印hello。#声明线程job1=threading.Thread(target=action,args=())#启动线程job1.start()(3)在主程序中声明并启动线程事件,代码如下所示。技能拓展(1)编写代码声明两个线程事件,连接三色灯模块,两个线程中一个线程为让红色灯不断闪烁1秒一次,另外一个线程绿色灯以每秒2秒闪烁一次。(2)编写代码将任务一中的接近报警功能封装至线程中,使之正常运行。4任务概述储备知识任务实施任务目标231TASKTHREE任务三实现智能保险箱功能03.Python程序实现智能保险箱任务实施03.Python程序实现旋转编码器任务所需软件如下所示:环境准备任务所需硬件如下所示:Python3PyCharm树莓派4B旋转编码器LCD1602模块三色灯模块超声波模块3.1.根据引脚说明和连线图连接设备步骤1:根据连线图连接线路(1)设备对应接口如下表说明树莓派T型转接板旋转编码器-G21SCL-G22DT-G23SW5V5VVCCGNDGNDGND树莓派T型转接板LCD1602SDASDASDASCLSCLSCLGNDGNDGNDVCC5VVCC树莓派T型转接板超声波模块-G17Trig-G18Echo5V5VVCC(+)GNDGNDGND树莓派T型转接板三色灯模块GNDGNDGND-G26R-G27G(2)如图所示,使用杜邦线将树莓派连接面包板后的GPIO与旋转传感器、LCD1602、超声波模块、三色灯模块连接起来,由板载的5V为模块供电。图:树莓派连接模块图3.2.Python程序实现智能保险箱功能步骤1:打开“Pycharm”软件(1)开启树莓派电源->打开Pycharm软件->打开工程名称为“SmartStrongbox”,等待树莓派启动成功。(2)在工程中新建一个文件名称为main.py的文件。(1)在main.py文件中逐步添加代码,首先添加模块所使用的引用库,代码如下所示。步骤2:编写Main.py主函数代码并执行importRPi.GPIOas

GPIOimport

time#引用模块类库importsupersonicimport

ledimport

ro_encodeimport

LCD1602(2)声明对应任务一、任务二所需要的全局变量,如下所示。superconic_flag=TrueRot_flag=True#当前密码password_list=[0,0,0,0,0,0,0,0]InPwd_list=[0]globalCounter=0count=0distance_min=0.2

#有人接近的最小距离变量(3)在main.py文件中main函数中编写多个模块的初始化IO函数,代码如下所示。if__name__=="__main__":

supersonic.init()#初始化超声波模块IO

led.init()#初始化LED模块IO

ro_encode.init()#初始化旋转模块IO

LCD1602.init()#初始化LCD1602IO(4)在main.py文件中编写超声波线程事件函数,代码如下所示。def

superconic_thread():

while

superconic_flag:

#获取超声波模块数据

s=supersonic.supersonic()

if

s<distance_min:#当前超声波距离到达设置范围时

led.light(led.r_open)

led.light(led.g_close)

print("有人进入!")

else:

led.light(led.g_open)

led.light(led.r_close)

time.sleep(0.5)代码详解只是将任务一的代码进行了封装,每半秒调用一次超声波获取数据。代码与任务一的代码类似False时结束线程。当superconic_flag使用superconic_flag变量作为线程的结束变量(5)在main.py文件中编写旋转编码器线程事件函数,代码如下所示。def

Rot_thread():

#获取旋转模块数据

global

globalCounter

global

password_list

global

InPwd_listglobal

count

LCD1602.init()#初始化LCD1602IO

LCD1602.write(0,0,"InputPassword:")

while

Rot_flag:

tmp=ro_encode.Rot_Deal()#旋转编码方向位判断函数

if

tmp!=globalCounter:#判断状态值发生改变

globalCounter=tmp

InPwd_list[count]=globalCounter

LCD_DISP2=''.join(str(x)for

x

in

InPwd_list)#组合密码字符串

LCD1602.write(0,1,LCD_DISP2)

#在第二行显示world!

#确定按钮判断

if

ro_encode.Rot_SW():

InPwd_list.append(globalCounter)

LCD_DISP2=''.join(str(x)for

x

in

InPwd_list)#组合密码字符串

LCD1602.write(0,1,LCD_DISP2)

#在第二行显示world!

count=count+1

if

count==(len(password_list)-1):

if

InPwd_list==password_list:print('密码正确,已为您打开保险柜!')LCD_DISP1='PASSWORDOK'LCD1602.write(0,0,LCD_DISP1)#在第一行显示Hello

breakelse:print('密码错误,请重新输入!')

count=0globalCounter=0InPwd_list=[0]LCD1602.write(0,1,"")代码详解代码与任务二相似,需要注意的是在线程中要使用全局变量,需要在事件函数中再次声明变量,使用global关键字进行申明。global

globalCounterglobal

password_listglobal

InPwd_listglobal

count(6)在main.py文件中编写声明并启动两个线程,代码如下所示。if__name__=="__main__":……

job1=threading.Thread(target=superconic_thread,args=())

job2=threading.Thread(target=Rot_thread,args=())

job1.start()

job2.start()

while

True:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论