Mind+Python编程进阶系列课程—04 穿戴计步器
本帖最后由 木子呢 于 2021-11-9 16:53 编辑可穿戴计步器
课程目录:
[*]Python编程进阶系列教程—序章
[*]Python编程进阶系列课程—01 趣味数字电导仪
[*]Python编程进阶系列课程—02 简易气象站
[*]Python编程进阶系列课程—03 自制通信设备(上)
[*]Python编程进阶系列课程—03 自制通信设备(下)
[*]Python编程进阶系列课程—04 穿戴计步器
一、实践情境
近年来,随着国务院《“健康中国2030”规划纲要》和全民健身计划的逐步落实,越来越多的国人开始意识到运动对健康管理的重要性。而在各个运动项目中,跑步深受大众喜爱,慢跑也成了时下城市青少年健身锻炼的流行方式。为此,本节课上,我们将自制一个可穿戴的计步器,在我们慢跑时,它能帮助我们实时监测步数,并且在运动后对数据情况进行跟踪分析。
二、实践目标
本实践项目运用micro:bit自带的三轴加速度传感器制作一个计步器,实时检测运动步数并通过按键控制将数据上传至物联网平台加以分析。
三、知识目标
1、理解三轴加速度传感器的功能和原理
2、掌握运用micro:bit作为智能终端,通过 Python 编程采集板载三轴加速度传感器数据的方法
3、掌握在SIoT物联网平台上实现数据实时可视化的方法
四、实践准备
硬件清单:
五、实践过程
在本项目中,我们将分两步利用micro:bit自带的三轴加速度传感器制作一个可穿戴计步器,将其绑在手臂上,实时监测跑步时的步数,并将数据上传至物联网平台中。
1、读取加速度的值
2、计步并上传步数至SIoT物联网平台
任务1:加速度实时检测
1.分析设计
在本任务中,我们将手握micro:bit主控板,实时监测加速度传感器的数值。这里,我们可通过USB线将micro:bit与计算机相连接,继而获取加速度数据信息并将其打印显示在软件终端。
2.硬件搭建
通过USB连接线将micro:bit接到计算机。
3.软件编写
在编写代码之前,我们需要先对软件进行一些设置,之后再编写Python程序。
软件设置:
STEP1:创建与保存项目文件
启动Mind+软件,选择“Python模式”,另存项目并命名为“m可穿戴计步器”。
STEP2:创建与保存python文件
创建一个python程序文件“任务一.py”,双击打开。
程序编写、运行及回顾:
STEP1:编写Python程序
import time#导入时间库
from pinpong.board import Board#导入pinpong.board包中Board模块
from pinpong.extension.microbit import * #导入pinpong.extension.microbit包中的所有模块
Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
while True:#永久循环
x = accelerometer.get_x()/1000#获取x方向加速度的值
y = accelerometer.get_y()/1000#获取y方向加速度的值
z = accelerometer.get_z()/1000#获取z方向加速度的值
strength = round(accelerometer.get_strength()/1000,3)#获取强度的值
print("x:",x,"g")#终端打印显示
print("y:",y,"g")
print("z:",z,"g")
print("强度:",strength,"g")
print("-------------")
time.sleep(1)#延时等待1秒
STEP2:运行程序并观察效果
(1)将micro:bit主控板水平放置在桌面上,
(2)运行程序,观察软件终端
点击mind+软件右上方的运行按钮,我们可以看到在终端中显示了x,y,z三个方向加速度的值以及强度的数值。
(3)将micro:bit板子分别往前后,左右以及上下移动,可以看到,相应的x,y,z的数值有所变化
STEP3:回顾程序
1、读取加速度值
from pinpong.extension.microbit import * #导入pinpong.extension.microbit包中的所有模块
x = accelerometer.get_x()/1000#获取x方向加速度的值
y = accelerometer.get_y()/1000#获取y方向加速度的值
z = accelerometer.get_z()/1000#获取z方向加速度的值
在对micro:bit板子检测加速度值时,我们首先需要导入“micro:bit”包,之后使用accelerometer对象的“get_x()”、“get_y()”、“get_z()”三个方法来分别进行x轴、y轴、以及z轴的加速度值检测。
2、读取强度值
strength = round(accelerometer.get_strength()/1000,3)#获取强度的值
在读取强度值时,我们一方面可以借助内置传感器accelerometer对象的“get_strength()”方法来进行检测,同时,通过“round()”函数,可以使结果值保留三位小数。
“round()”函数的使用方法:
round(number, num_digits),其中,
[*]
number必需。表示要四舍五入的数字。
[*]
num_digits必需。表示要进行四舍五入运算的位数。
3.调试修改
虽然已经测得了加速度传感器上x,y,z三个方向以及强度的数值,但是哪个最适合用来计步呢?
STEP1:将micro:bit主控板通过细绳绑在手上
STEP2:观察摆臂时,终端显示的数据中哪一个值的变化最大,并填写在下表中
变化最大的值是:
任务2:计步并上传物联网平台
通过观察时跑步加速度传感器x,y,z,和强度的值,我们发现变化最明显的是强度值。因为强度值是综合x,y,z三个方向的值得到的矢量和,任一方向的值发生变化,强度值都会变化。所以我们选择强度值变化作为计步标准。
1.分析设计
在本任务中,我们将对步数进行实时统计,并将结果值上传至物联网平台以图表形式呈现。这里,我们可在之前的基础上,以强度作为计步标准,再进行实验。
2.平台搭建
SIoT物联网平台的搭建方法可参考第三课,这里我们不再赘述。
3.软件编写
在编写代码之前,我们依旧需要先对软件进行一些设置。
软件设置:
STEP1:创建与保存python文件
创建一个python程序文件“任务二.py”,双击打开。
程序编写、运行:
STEP1:编写python程序
import siot#导入siot库
import time#导入时间库
from pinpong.board import Board#导入pinpong.board包中Board模块
from pinpong.extension.microbit import * #导入pinpong.extension.microbit包中的所有模块
Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
SERVER = "192.168.9.66"#MQTT服务器IP地址
CLIENT_ID = ""#创建空消息队列
IOT_UserName ='siot'#用户名
IOT_PassWord ='dfrobot'#密码
IOT_pubTopic= 'microbit/002'#“topic”为“项目名称/设备名称”
siot.init(CLIENT_ID, SERVER, user=IOT_UserName, password=IOT_PassWord)#初始化,确定输入的用户名和密码正确
siot.connect()#连接
siot.loop()#循环
run = 0#添加变量用以计步
while True:#永久循环
strength = round(accelerometer.get_strength()/1000,3)#获取强度值
if strength > 1.5:#强度判别
run += 1 #记录一次步数
siot.publish(IOT_pubTopic, run) #发送消息
print("步数:",run)#打印显示在终端
time.sleep(0.5)#延时等待
Tips:上述“SERVER”中输入的是自己电脑的IP地址。
STEP2:运行程序并观察效果
(1)运行程序,观察软件终端
点击运行,可以看到终端内显示“连接成功”的提示字样,之后一直显示步数为0。
(2)物联网平台网页端查看步数消息
首先找到我们的设备“microbit/002”,接着点击“查看消息”,
之后单击“显示/隐藏图表”和“自动刷新消息”,我们可以看到步数值实时自动刷新呈现在页面上,并以图表形式呈现了出来。
(3)挥动手臂,观察网页端和软件终端的变化情况
可以明显看到步数值开始上升,同时软件终端内也有同样的步数显示
(4)导出数据
对于生成的数据,我们可以点击图中的“导出查询结果”将其导出成表格。
(5)保存图片
对于可视化得到的图形,我们也可以点击下载按键将其保存
4.调试修改
在程序运行后,计步器就已经开始工作了,并且在跑前当我们轻轻挥动手臂时同样记了一步,那如何才能精准控制计步的开始时间呢?
STEP1:修改程序,通过按下按键来控制计步的开始
import siot#导入siot库
import time#导入时间库
from pinpong.board import Board#导入pinpong.board包中Board模块
from pinpong.extension.microbit import * #导入pinpong.extension.microbit包中的所有模块
Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
SERVER = "192.168.9.66"#MQTT服务器IP地址
CLIENT_ID = ""#创建空消息队列
IOT_UserName ='siot'#用户名
IOT_PassWord ='dfrobot'#密码
IOT_pubTopic= 'microbit/002'#“topic”为“项目名称/设备名称”
siot.init(CLIENT_ID, SERVER, user=IOT_UserName, password=IOT_PassWord)#初始化,确定输入的用户名和密码正确
siot.connect()#连接
siot.loop()#循环
run = 0#添加变量用以计步
flag = 0#添加标志位flag记录按钮按压次数
while True:#永久循环
if button_a.is_pressed() == 1:#按键A按下
time.sleep(0.2)
flag = flag + 1
if flag % 2 == 1: #按压按钮次数为奇数
strength = round(accelerometer.get_strength()/1000,3)#记录强度
if strength > 1.5:#强度判别
run += 1 #记录一次步数
siot.publish(IOT_pubTopic, run) #发送消息
print("步数:",run)#打印显示在终端
time.sleep(0.4)
time.sleep(0.1)
六、巩固提高
1.项目小结
本节课我们以micro:bit自带的三轴加速度传感器制作了一个计步器实时统计运动步数。首先读取了micro:bit主控板内置的三轴加速度传感器在x,y,z三个方向的加速度值和强度,之后以强度值为标准进行计步并将数据上传至搭建的SIoT平台上,最后将上传的数据以图表形式呈现并进行导出。
2.项目拓展
在跑步的过程中,不仅能够消耗热量,帮助控制体重,还可以增强心肺功能,锻炼人体心肌能力,增强体质。但是,每个人的运动能力各不相同,我们需合理适度得进行锻炼。接下来,让我们自己试一试,在此基础上,添加提示功能,每一千步,使点阵屏显示一次爱心,并看看慢跑1万步总共需要多少时间呢?
附录
附录1
拓展阅读
什么是加速度
加速度是描述物体速度变化快慢的物理量。
牛顿第一定律告诉我们:物体如果没有受到力的作用,运动状态不发生改变。由此可知,力是物体运动状态发生改变的原因,也即是产生加速度的原因。
通过测量由于重力引起的加速度,可以计算出设备相对于水平面的倾斜角度。通过分析动态加速度,可以分析出设备移动的方式。为了测量并计算这些物理量,便产生了加速度传感器。
附录2
项目拓展程序:import siot#导入siot库
import time#导入时间库
from pinpong.board import Board#导入pinpong.board包中Board模块
from pinpong.extension.microbit import * #导入pinpong.extension.microbit包中的所有模块
Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
#display = MBScreen()#创建屏幕对象
SERVER = "192.168.9.66"#MQTT服务器IP地址
CLIENT_ID = ""#创建空消息队列
IOT_UserName ='siot'#用户名
IOT_PassWord ='dfrobot'#密码
IOT_pubTopic= 'microbit/002'#“topic”为“项目名称/设备名称”
siot.init(CLIENT_ID, SERVER, user=IOT_UserName, password=IOT_PassWord)#初始化,确定输入的用户名和密码正确
siot.connect()#连接
siot.loop()#循环
run = 0#添加变量用以计步
flag = 0#添加标志位flag记录按钮按压
while True:#永久循环
if button_a.is_pressed() == 1:#按键A按下
time.sleep(0.2)
flag = flag + 1
if flag % 2 == 1: #按压按钮次数为奇数
strength = round(accelerometer.get_strength()/1000,3)#记录强度
if strength > 1.5:#强度判别
run += 1 #记录一次步数
siot.publish(IOT_pubTopic, run) #发送消息
print("步数:",run)#打印显示在终端
time.sleep(0.4)
time.sleep(0.1)#延时等待
if run % 1000 == 0:#步数除上1000余数为0#每千次执行一次
display.show(Image.HEART)#显示图案
time.sleep(0.1)#延时等待
display.clear() #关闭所有点阵
time.sleep(0.1)#延时等待
有一点比较困惑,为什么在静止状态,Z轴方向的加速度维持在接近1,这样强度值也接近1;如果一直静止状态,岂不是矢量加速度一直在1左右?实际上应该是0啊 steed 发表于 2023-1-3 11:02
有一点比较困惑,为什么在静止状态,Z轴方向的加速度维持在接近1,这样强度值也接近1;如果一直静止状态, ...
静止时z轴方向有1g的加速度值,这是由地球引力引起的重力加速度,因此此时强度也近1g,并不是0。 本帖最后由 steed 于 2023-1-29 13:57 编辑
木子呢 发表于 2023-1-4 11:21
静止时z轴方向有1g的加速度值,这是由地球引力引起的重力加速度,因此此时强度也近1g,并不是0。 ...
谢谢!静止时重力加速度为1g可以理解,问题是此时强度也为1,然后据此再去计算速度和距离,岂不是数值一直在增加,可明明是静止状态啊! 厉害厉害 不错,学习了 感谢分享 厉害厉害 学习了,感谢分享!
页:
[1]