【项目背景】
第三轮我盲盒抽到的是云雀气象仪,为了完成比赛,我在DF商城上又购置了SCI采集模块,随手还购置了一块行空板和白色硅胶套。
第三轮让参赛选手大开脑海洞,唉!我的脑袋像海绵一样,全是洞!
脑洞1:SCI采集模块与加速度计结合,安装在拖鞋上,并运动数据上传到物联网,来统计居家时运行步数等。因SCI采集模块支持的I2C加速度计暂时手上没有,计划日后完成。
脑洞2:SCI采集模块与光线传到器+行空板+LED灯带,安装到雨伞手柄上。功能:雨天当遇到光线黑暗时,雨伞自动亮灯照明。因未想到如何结合使用物联网,搁置。
以下是本项目要制作的脑洞3和脑洞4.
【脑洞3——风速车】
我将云雀气象仪与自行车结合,你可能认为我只是做了一个“行走的气象站”,不对,我可是开了脑洞的。除了采集气象信息,我还利用云雀气象仪上的风速传感器来测量我的骑行速度。我在日常骑行时发现,尽管在无风的天气情况下,我骑行地越快,我感受的“风”越大。
并通过LED灯带将“风速”转化为点亮灯珠的数量。
并通过云雀气象仪采集骑行时的温湿度保存到行空板SIOT物联网平台。通过SCI采集模块+北斗模块采集位置信息,后期进行数据分析,并在地图上显示运动轨迹。
模型二,根据实时温湿信息,利用LED显示红色(不适合长时间运动),绿色(适合长时间运动)
人和各种其他生命体一样,主要是由蛋白质和水构成的。蛋白质在54℃凝固,水在0℃结冰,就是说若无特殊保护性构造,所有生命只能存在于0—54℃之间。15—25℃是许多生命适宜的温度;35℃以上各项生命活动“钝化”,40℃会有破坏作用。
生命活动包括体育运动是靠体内氧化反应产生的热量,多余的热量要通过体表排出体外,故而要求环境温度比体温低。体育运动产生热量较多,有较多的热量要排出体外,所以要求环境温度更低一些;但是,也不能过低,温度太低不利于肌肉能量的发挥。
温度与湿度的不同配合对体育运动有不同的影响,例如:相对湿度为30%时,温度40℃则体能难以发挥,甚至中暑;而相对湿度为50%时,温度38℃则体能难以发挥,甚至中暑;若相对湿度为85%,则温度为30—31℃就会使体能难以发挥,甚至中暑。
湿度主要是影响排汗、体热散发和水及盐分的代谢。在正常温度下,湿度低对跳跃运动有利;湿度大对需氧量大、排汗量大的运动,如长跑等不利。一般的体育运动,在温度适宜的情况下,要求相对湿度在50—60%最为合适。
骑自行车运动时间长,能量消耗大,需氧和散热多,最好在温度为8—15℃,相对湿度为30—60%。
程序编写
开启行空板SIOT,并配置主题。
开启行空板WIFI,连接手机热点(非5G信号),并获取IP地址。
程序Python代码
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.board import NeoPixel
from DFRobot_Atmospherlum import *
from pinpong.board import Board
from pinpong.board import Pin
from unihiker import GUI
import time
import siot
import math
def constrain(amt,low,high):
return low if (amt)<(low) else (high if (amt)>(high) else (amt))
def numberMap(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
# 事件回调函数
def button_click1():
global BiaoShi
BiaoShi = 1
def button_click2():
global BiaoShi
BiaoShi = 2
Board().begin()
u_gui=GUI()
siot.init(client_id="",server="192.168.43.120",port=1883,user="siot",password="dfrobot")
siot.connect()
siot.loop()
pin1 = Pin(Pin.D22, Pin.OUT)
np1 = NeoPixel(pin1,120)
np1.clear()
yunque_i2c = DFRobot_Atmospherlum_I2C(0x42)
while (yunque_i2c.begin() != 0):
print("yunque_i2c initialize failed!!")
time.sleep(1)
print("Sensor initialize success!!")
yunque_i2c.set_local_time()
time.sleep(1)
QianDengShu = 0
显示=u_gui.draw_text(text="风速车",x=50,y=0,font_size=35, color="#FF0000")
风速模式=u_gui.add_button(text="风速模式",x=40,y=120,w=160,h=80,onclick=button_click1)
温湿模式=u_gui.add_button(text="温湿模式",x=40,y=220,w=160,h=80,onclick=button_click2)
BiaoShi = 1
WenShiBiaoShi = 0
YunDongShiJian = time.time()
while True:
if (BiaoShi == 1):
if (WenShiBiaoShi == 1):
np1.clear()
WenShiBiaoShi = 0
time.sleep(0.1)
CheSu = (yunque_i2c.get_value("speed"))
siot.publish_save(topic="siot/chesu", data=CheSu)
print(len(CheSu))
XianDengShu = ((float(CheSu)) * 100)
XianDengShu = (constrain((math.floor(XianDengShu)), 0, 150))
XianDengShu = (numberMap(XianDengShu, 0, 150, 0, 120))
XianDengShu = (math.floor(XianDengShu))
print(XianDengShu)
if (QianDengShu < XianDengShu):
np1.range_color(0,XianDengShu,0xFF0000)
elif (QianDengShu > XianDengShu):
np1.range_color((XianDengShu + 1),QianDengShu,0x000000)
elif (XianDengShu == 0):
np1.range_color(0,0,0x000000)
QianDengShu = XianDengShu
else:
if (((time.time() - YunDongShiJian) > 60) or (WenShiBiaoShi == 0)):
WenShiBiaoShi = 1
YunDongShiJian = time.time()
WenDu = (yunque_i2c.get_value("Temp"))
ShiDu = (yunque_i2c.get_value("Humi"))
siot.publish_save(topic="siot/wendu", data=WenDu)
siot.publish_save(topic="siot/shidu", data=ShiDu)
WenDu = (int(float(WenDu)))
ShiDu = (int(float(ShiDu)))
if (((WenDu > 8) and (WenDu < 15)) and ((ShiDu > 30) and (ShiDu < 60))):
np1.range_color(0,199,0x00FF00)
else:
np1.range_color(0,199,0xFF0000)
运动轨迹
通过SCI采集模块+北斗模块采集位置信息。将经纬度信息处理成如下形式,保存到Mind+.txt文件中。
编写类文件map.py
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
import folium
class Browser(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('云天GPS轨迹')
self.setGeometry(10, 30, 1400, 800)
self.browser = QWebEngineView()
self.show()
def draw_gps(self,locations,color):
Mymap=folium.Map(locations[0],
tiles= 'https://wprd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7',
attr='高德-常规图',
zoom_start=15,
)
folium.Marker(
location=locations[0],
popup='Home',
icon=folium.Icon(color='green')).add_to(Mymap)
folium.PolyLine( # polyline方法为将坐标用线段形式连接起来
locations, # 将坐标点连接起来
weight=10, # 线的大小为3
color=color, # 线的颜色为
opacity=0.9 # 线的透明度
).add_to(Mymap) # 将这条线添加到刚才的区域m内
Mymap.save('map.html')
def myshow(self,locations,path):
#locations.append([x,y])
self.draw_gps(locations,'red')
self.Mybrowse(path)
def Mybrowse(self,url):
self.browser.load(QUrl(url))
self.setCentralWidget(self.browser)
主程序文件,在地图上显示运动轨迹。
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit
from map import Browser
import sys,os
def upRange(start, stop, step):
while start <= stop:
yield start
start += abs(step)
def downRange(start, stop, step):
while start >= stop:
yield start
start -= abs(step)
fileObj = open("Mind+.txt", "r", encoding="UTF8")
ShuJuLieBiao = fileObj.read().split(":")
fileObj.close()
ZuoBiaoLieBiao = []
ZhuiJiaZuoBiao = [0,0]
for XuHao in (0 <= int((len(ShuJuLieBiao) - 1))) and upRange(0, int((len(ShuJuLieBiao) - 1)), 1) or downRange(0, int((len(ShuJuLieBiao) - 1)), 1):
ZuoBiao = (ShuJuLieBiao[XuHao]).split(",")
ZhuiJiaZuoBiao[0]=((float((ZuoBiao[0]))) + 0.00125)
ZhuiJiaZuoBiao[1]=((float((ZuoBiao[1]))) + 0.00645)
ZuoBiaoLieBiao.append([ZhuiJiaZuoBiao[0],ZhuiJiaZuoBiao[1]])
print(ZuoBiaoLieBiao)
app = QApplication(sys.argv)
locations = ZuoBiaoLieBiao
path = "file:///"+os.getcwd().replace("\\","/")+"/map.html"
browser =Browser()
browser.myshow(locations,path)
sys.exit(app.exec_())
while True:
pass
生成如下地图轨迹
记录轨迹骑行视频
演示视频
【脑洞4:风向标】
行空板1+云雀气象仪采集风向信息,通过物联网Easy Iot平台,将信息传给行空板2+舵机,转动显示风向。
行空板1连接手机热点,到室外。行空板2连接室内WIFI。
程序编写
行空板1采集风向程序
行空板2控制舵机程序
演示视频
橙子昂2024.08.13
666
腿毛利小五郎2023.10.25
666
少东2023.08.31
太赞了吧~~~
hacker_2023.08.22
666