回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

#决赛#我和我的物联网 简单

头像 云天 2023.08.15 1019 3

【项目背景】

    第三轮我盲盒抽到的是云雀气象仪,为了完成比赛,我在DF商城上又购置了SCI采集模块,随手还购置了一块行空板和白色硅胶套。

    第三轮让参赛选手大开脑海洞,唉!我的脑袋像海绵一样,全是洞!

    脑洞1:SCI采集模块与加速度计结合,安装在拖鞋上,并运动数据上传到物联网,来统计居家时运行步数等。因SCI采集模块支持的I2C加速度计暂时手上没有,计划日后完成。

    脑洞2:SCI采集模块与光线传到器+行空板+LED灯带,安装到雨伞手柄上。功能:雨天当遇到光线黑暗时,雨伞自动亮灯照明。因未想到如何结合使用物联网,搁置。

    以下是本项目要制作的脑洞3和脑洞4.

【脑洞3——风速车】

IMG_20230816_072622.jpg

    我将云雀气象仪与自行车结合,你可能认为我只是做了一个“行走的气象站”,不对,我可是开了脑洞的。除了采集气象信息,我还利用云雀气象仪上的风速传感器来测量我的骑行速度。我在日常骑行时发现,尽管在无风的天气情况下,我骑行地越快,我感受的“风”越大。

IMG_20230816_071524.jpg

    并通过LED灯带将“风速”转化为点亮灯珠的数量。

IMG_20230815_224047.jpg

    并通过云雀气象仪采集骑行时的温湿度保存到行空板SIOT物联网平台。通过SCI采集模块+北斗模块采集位置信息,后期进行数据分析,并在地图上显示运动轨迹。

IMG_20230816_071546.jpg

    模型二,根据实时温湿信息,利用LED显示红色(不适合长时间运动),绿色(适合长时间运动)

    人和各种其他生命体一样,主要是由蛋白质和水构成的。蛋白质在54℃凝固,水在0℃结冰,就是说若无特殊保护性构造,所有生命只能存在于0—54℃之间。15—25℃是许多生命适宜的温度;35℃以上各项生命活动“钝化”,40℃会有破坏作用。

    生命活动包括体育运动是靠体内氧化反应产生的热量,多余的热量要通过体表排出体外,故而要求环境温度比体温低。体育运动产生热量较多,有较多的热量要排出体外,所以要求环境温度更低一些;但是,也不能过低,温度太低不利于肌肉能量的发挥。

    温度与湿度的不同配合对体育运动有不同的影响,例如:相对湿度为30%时,温度40℃则体能难以发挥,甚至中暑;而相对湿度为50%时,温度38℃则体能难以发挥,甚至中暑;若相对湿度为85%,则温度为30—31℃就会使体能难以发挥,甚至中暑。

    湿度主要是影响排汗、体热散发和水及盐分的代谢。在正常温度下,湿度低对跳跃运动有利;湿度大对需氧量大、排汗量大的运动,如长跑等不利。一般的体育运动,在温度适宜的情况下,要求相对湿度在50—60%最为合适。

    骑自行车运动时间长,能量消耗大,需氧和散热多,最好在温度为8—15℃,相对湿度为30—60%。

IMG_20230815_224021.jpg

程序编写

开启行空板SIOT,并配置主题。

image.png

开启行空板WIFI,连接手机热点(非5G信号),并获取IP地址。

screenshots-风速车.mp-1692174658961.png

程序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)


 

运动轨迹

 

IMG_20230816_071546.jpg

通过SCI采集模块+北斗模块采集位置信息。将经纬度信息处理成如下形式,保存到Mind+.txt文件中。

image.png

编写类文件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


生成如下地图轨迹

image.png

记录轨迹骑行视频

演示视频

 

【脑洞4:风向标】

    行空板1+云雀气象仪采集风向信息,通过物联网Easy Iot平台,将信息传给行空板2+舵机,转动显示风向。

IMG_20230815_160839.jpg

行空板1连接手机热点,到室外。行空板2连接室内WIFI。

IMG_20230815_162337.jpg

程序编写

行空板1采集风向程序

screenshots-风向标2.mp-1692176388685.png

行空板2控制舵机程序

screenshots-行空板风向标.mp-1692176266888.png

演示视频

评论

user-avatar
  • 腿毛利小五郎

    腿毛利小五郎2023.10.25

    666

    0
    • 少东

      少东2023.08.31

      太赞了吧~~~

      0
      • hacker_

        hacker_2023.08.22

        666

        0