本帖最后由 方老师好 于 2022-8-23 11:23 编辑
【行空板】运动小助手,行空板陪你一起记录运动次数
在日常锻炼过程中总是感觉很无聊,不能一直坚持下去?
在我运动的时候我经常在想,要是有一个机器人能够实时记录我的运动次数,在做完之后给我鼓励,还能根据我自己的需求调整运动目标那该多好啊!
行空板是一个非常强大的工具,我们可以通过其结合其他传感器实现日常生活中很多的创意作品,让我们一起来看一下吧。
我们通过一个行空板,碰撞模块,来实现一个运动记录屏。
任务目标
使用行空板来记录腹肌轮运动的次数,并可以设定运动次数,过程之中实时显示剩余次数,显示有趣的表情。完成之后给予提示和鼓励。
知识点
1、认识碰撞模块
2、学习使用Pinpong库控制碰撞模块
3、了解行空板GUI显示方法
4、学习使用行空板GUI制作界面
5、学习使用pingpong库初始化引脚
6、学习使用行空板自带按钮
7、学习if语句和循环语句进行实时显示运动次数
材料清单
硬件清单:
软件使用:Mind+编程软件x1
知识储备
1、什么是碰撞模块
是一款微动碰撞开关。该碰撞传感器采用惯性式机械结构,端口兼容传感器扩展板,用于碰撞检测、限位等。
2、Pinpong库连接引脚记录碰撞开关是否按下
Pinpong库
- from pinpong.board import Board,Pin # 导入Pinpong库
- Board("UNIHIKER").begin() #初始化,选择板型,不输入板型则进行自动识别
- pin1 = Pin(Pin.P24, Pin.IN)
- if pin1.read_digital()==0:
- #这时碰撞模块已经按下,执行相应的操作
- else:
- #这时没有按下,执行相应的操作
复制代码
其中“P24”指的是板子上碰撞版块所连接的引脚,“pin1=Pin(Pin.P24,Pin.In)”是将24号引脚以数字输入的方式输入,这时我们通过pin1.read_digital( )方法检测被按下的时候数字是多少(数字输入只有0和1)。
3、什么是行空板的GUI
行空板作为一个python学习工具,有一个专门的unhiker第三方库,自带了一套适配行空板显示界面的方法。具体教程可以参考以下链接:
https://mc.dfrobot.com.cn/thread-312557-1-1.html
4、如何设置运动目标、并实时更新运动数据
首先要根据实际运动设定目标值,比如在本项目中我设定了两个模式,简单模式(目标20个)和困难模式(目标50个),现在就可以用两个变量保存
首先要根据实际运动设定目标值,比如在本项目中我设定了两个模式,简单模式(目标20个)和困难模式(目标50个),现在就可以用两个变量保存。 sport_goal1=20 sport_goal2=50 在按下确认选择按钮之后,还需要一个变量 cur_sport #现在的运动目标
利用这三个现有的变量,就可以结合行空板自带的按钮实现之后的操作。
- if button_a.is_pressed()==True:
- cur_sport=sport_goal1
- text_sport.config(text ="开始")
复制代码
- if button_b.is_pressed()==True:
- cur_sport=sport_goal2
- text_sport.config(text ="开始")
复制代码
以上代码就可以实现按下A键,将当前的运动模式设定为goal1(简单模式),当按下B键,将当前的运动模式设定为goal2(复杂模式) - if cur_sport-count==0:
- text_sport.config(text = "恭喜你完成",font_size=20)
- time.sleep(2)
- break
复制代码
以上代码可以实现,当碰撞模块受到碰撞时,记录的变量增加1,并且把文本实时更新。当完成目标之后,就提示“恭喜你完成”。
5、完善程序,增加趣味性。
- if 0.6*cur_sport<=cur_sport-count<=0.8*cur_sport:
- emj1.config(emoji="Nerve")
- elif 0.4*cur_sport<=cur_sport-count<0.6*cur_sport:
- emj1.config(emoji="Sweat")
- elif 0<=cur_sport-count<0.4*cur_sport:
- emj1.config(emoji="Angry")
复制代码 以上程序可以根据完成总量,来变化显示的表情。
6、以下是完整的代码
- from unihiker import GUI # 导入unihiker库中的GUI模块
- import time # 导入time库
- from pinpong.extension.unihiker import *
- from pinpong.board import Board,Pin
- Board().begin()
- gui = GUI() # 实例化GUI类,创建gui对象
- # 显示填充矩形
- gui.fill_rect(x=75, y=30, w=90, h=30, color="#00ff00") # 显示第一个填充矩形
- gui.fill_rect(x=0, y=70, w=240, h=30, color="#00ff00") # 显示第二个填充矩形
- gui.fill_rect(x=50, y=170, w=150, h=120, color="#00ff00") # 显示第二个填充矩形
- # 显示文字
- text1 = gui.draw_text(x=120, y=30, text='运动助手:', origin = 'top')
- text2 = gui.draw_text(x=120, y=70, text='请按A\B选择模式', origin = 'top')
- text3 = gui.draw_text(x=120, y=100, text='A简单,B困难', origin = 'top')
- text_sport = gui.draw_text(x=120, y=180, text='', font_size=60, origin = 'top') # 显示此模式的次数
- # 显示表情
- emj1 = gui.draw_emoji(x=82, y=120, w=100, h=100, emoji="Smile", duration=0.1) # 显示初始表情
- #运动次数
- sport_goal1=20
- sport_goal2=50
- cur_sport=0
- pin1 = Pin(Pin.P24, Pin.IN)
- count = -1
- while True:
- if button_a.is_pressed()==True:
- cur_sport=sport_goal1
- text_sport.config(text ="开始")
- time.sleep(0.5)
- text_sport.config(text = cur_sport)
- if button_b.is_pressed()==True:
- cur_sport=sport_goal2
- text_sport.config(text ="开始")
- time.sleep(0.5)
- text_sport.config(text = cur_sport)
- if (pin1.read_digital() == 0):
- count=count+1
- text_sport.config(text = cur_sport-count)
- time.sleep(0.5)
- if 0.6*cur_sport<=cur_sport-count<=0.8*cur_sport:
- emj1.config(emoji="Nerve")
- elif 0.4*cur_sport<=cur_sport-count<0.6*cur_sport:
- emj1.config(emoji="Sweat")
- elif 0<=cur_sport-count<0.4*cur_sport:
- emj1.config(emoji="Angry")
- if cur_sport-count==0:
- text_sport.config(text = "恭喜你完成",font_size=20)
- time.sleep(2)
- break
- time.sleep(0.1) # delay 0.1 秒
复制代码 7、视频演示
|
-
-
|
|
|
|
|