项目介绍:
我参加的是主题二:健康学习空间探究,得到的参赛硬件包中包含有以下物料:空气温湿度传感器、空气质量传感器、分贝传感器、环境光传感器、氧气传感器、行空板、SCI采集模块。加上自己之前购置过的一些传感器,针对本主题,进行了一个简单的设计与制作。整个项目大致思路是:使用手头上的传感器,打造一间健康、科学、有趣的工作室。我和媳妇儿把小卧室改成了一间书房,每天加班或者周末打游戏都会在这里,有时候一忙起来,就会忘记喝水、起身活动、休息眼睛,我俩身体也不是很好,房间如果太热、太干燥鼻子就会很难受,大家应该多少也会有这样的烦恼吧?下面先上两张图,然后详细讲一讲制作过程。
图1 智能工作室环境系统V1.0
图2 智能工作室环境系统可视化界面
材料清单
- 行空板 X2
- Arduino主控板 X1
- 扩展板 X2
- 二哈识图 X1
- SCI数据采集模块 X1
- 模拟分贝计 X1
- 氧气浓度传感器 X
- 光线传感器 X
- 继电器 X2
- 温湿度传感器 X1
- 空气质量传感器 X
- LED X2
- 扩音器 X1
- ws2812灯带 X2
- 蓝牙音箱 X1
- 柔性薄膜压力传感器 X2
- USB加湿器 X1
- USB风扇 X1
- OBLOQ物联网模块 X1
步骤1 首先理清楚思路,根据手头上的硬件物料,设计功能,绘制思维导图。
步骤2 硬件测试
硬件测试-传感器
首先是对各种传感器进行测试,利用print串口输出,与网站的说明文档进行比对,检查传感器是否都可以正常工作。这里有几个小地方需要注意:
1. 收到的几个传感器中,模拟分贝计、光线传感器、氧气浓度传感器由于pingpong库中暂时没有,所以需要和SCI数据采集模块绑定,才能够正常接入程序;
2.关于模拟分贝计,直接插在SCI上面是无法读取分贝值的,需要在SET里面进行设置,具体操作如下SET-SELECT SKU-SEN0232 DECIBEL
3.另外还是关于模拟分贝计,我是用手机(iPhone14pro)上的分贝测试软件与分贝计同时检测,发现得到的结果总是相差15分贝左右……
4.接着就是常规的方法测试压力薄膜传感器、灯带、扩音器、风扇、加湿器、而哈摄像头等……
硬件测试-改装
这里主要需要焊接以下几个地方:
1. 继电器的电源线
2.柔性薄膜压力传感器需要加一个上拉电阻来确保信号的稳定
硬件测试-蓝牙音箱
行空板可以对音频进行录放,但是有一个前提条件——必须外接音箱。有两种解决办法——usb音箱或者蓝牙音箱。之前考虑后面要用usb口接摄像头,所以选择使用蓝牙音箱进行音频的播放,但是这种方法也是比较麻烦的,需要进入cmd中获取行空板的权限,然后在一堆设备中找到蓝牙音箱的名字并且进行绑定,这里不再赘述,参考资料如下:
非常感谢Ski前辈的帖子!
步骤3 编写程序
程序编写-Arduino主控板部分
核心器材:柔性薄膜压力传感器、Arduino主控板、OBLOQ物联网模块
这里说一说柔性薄膜压力传感器
再说一下OBLOP物联网模块
因为Arduino没有WiFi,所以需要使用这个模块进行网络通信,并且可以根据需要,选择不同的服务器,不过遗憾的是,最多只能绑定5个Topic,如下图所示
原理:通过柔性薄膜压力传感器检测座位是否有人坐下,根据国家体育总局的一篇文章《世卫组织发布《关于身体活动和久坐行为指南》 只要动起来都有益健康》,我设定每过30min提醒一次起身活动(为演示方便,设置为10秒),活动时间为一首轻音乐的时间,并且会播放轻音乐。如下图所示:
程序:
程序编写-行空板B部分
核心器材:行空板、二哈识图摄像头
为什么不从行空板A部分开说呢?因为行空板B部分是所有部分的核心!
先看看二哈识图摄像头,这是一款很棒的产品:
原理:
这里只录入了我自己的人脸信息,不过大家可以看看讲解视频,这一部分配合语音说明,还是挺好玩的!
程序:
程序编写-行空板A部分
核心器材:行空板、各种传感器、继电器、USB风扇、USB加湿器、SCI采集模块
重点说一下SCI采集模块:
连接的是IIC口,可以获取2525种传感器模块的信息,注意是包括电压转换之后的实际物理量,而且还有对应的单位,配合移动电源,可以实时快速方便的获取当前环境的参数,并显示在屏幕上,真的是很赞的一款产品,希望后续多支持一些传感器,再来一个wifi传输功能就更棒啦!
原理:通过接收SIot的信息,实现风扇、加湿器、灯光的自动控制,通过SIot将传感器获取的环境参数分享给其他主控板,实现联动功能。
程序:
步骤4 组合搭建与美化
1. 先把硬件统统连起来
2. 加外包装
之前想着使用3D打印做,但是3D打印机坏了,而且3D打印需要的时间也比较久,又自己特别忙(加班工作+二手房装修改造),所以决定使用DF快递的盒子,纸壳的话,DIY也真的很方便。
正面
侧面
里面
这里一定注意:布线一定要提前规划好,反正我这边连完测试发现出问题了,但是线又不好弄,最后索性全部拆掉重新布线,最终如下图:
里面
侧面
前面
步骤5 SIot与可视化面板
SIot平台
首先我们需要明白,SIot就是一个物流集散地,可以存储各种需要收发信息,行空板自带WIFI,连接上SIot之后就是快递员,进行信息的收发。前提条件是:在同一网络环境下!
这里牵扯两个步骤:
1. 行空板使用USB数据线连接电脑,登陆10.1.2.3之后,先进行一次网络设置,这样之后就可以扔掉数据线了!
2. 需要在SIot平台上设置对应的Topic(在应用开关-SIot中选择打开页面)
之后就可以点击“新建主题”创建不同的Topic用来收发不同的数据啦!
可视化面板
可视化界面可以将SIot平台接收到的数据以文字、图标等方式进行直观的展示,并且还可以使用各种文字、开关、按钮等方式发送信息,是非常棒的一个功能,虽然目前还存在图标指针不够灵活自由、模块缩放自由度不够、层级关系设置、分辨率设置等问题,但是已经可以做出比较好看的界面了。
这是可视化界面的样子:
这次挑战赛,我也是最后时间节点前才开始制作可视化面板(太忙太忙了),虽然不是很完美,但我真的尽力啦~
总结
这次挑战赛最终成品和我想象中还是有一定差别的,给大家看看我之前的设计:
这两部分需要使用opencv,程序部分需要一直循环执行,会和其他功能有冲突,在下才疏学浅,没能找到完美解决办法,所以就腰斩了……
总的来说,利用这一套系统,我发现自己家的书房算是能学习,但是还是应该多通风的水平,需要注意的地方①噪音②总挥发性有机化合物,尤其是第二点,还是挺害怕的,之前都没什么感觉,这次借着实验器材测试才发现,这里把搜到的资料分享给大家,如下图:
说一下收获:
1. 能够进入挑战赛第二轮,非常开心,能和全国那么多优秀的老师们同台竞技,让我觉得有一种亲切的感觉,同时也见识了各种各样厉害的作品,大开眼界;
2. 在项目创作过程中,时间其实很紧张,因为临近期末开始的,学校工作是最忙的时候,直到7月9号,我才忙完学校工作,期间只能下班回家一边学习一边创作,说实话,很累,但是也发自内心的开心,因为这段时间是很有意义的;
3. 再就是在创作的过程中,大家都能发现一些产品软件上的小问题,DF的技术们也都能及时解释或者解决这些小问题,这是一个非常愉快和有意义的过程;
4. 白嫖了RMB1500+的创客硬件,血赚!
说完收获,分享一下自己记的一些笔记:
(1) 使用压力薄膜传感器时,必须把底部垫起来才能正常读取压力值
木板+厚胶带+压力薄膜+木板+胶带
厚胶带+压力薄膜传感器
(2) 起身活动时可以播放轻音乐
(3) “读取模拟引脚”获得的是字符串
(4) 使用外接扩音器需要重新定向引脚
(5) 喝水提醒不使用音乐(AI合成)是为了避免与久坐提醒相冲突,使用扩音器是为了让音量大一些
(6) 文件名后缀也要注意大小写
(8) 只有需要接收siot的信息才必须订阅,否则可以不订阅!
因为论坛对附件大小的限制,我没法上传行空板B部分程序,现在把它放到蓝奏云,供大家下载查看。
在最后再说一下改进设想:
1.加入坐姿矫正系统,这个需要好好研究一下OpenCV;
2.找到可以多线程并行不会报错的方法,任重道远……
3.向智能门锁一样,加入管理员和普通用户,分别赋予不同权限;
4.在可视化界面将所有用户的自拍展示,并且在线的用户是彩色,离线的是黑白;
5.加入喝水量统计与分析;
6.加入学习时长统计与分析;
以上是我这次挑战赛的全部内容,还请大家多提宝贵意见!不吝赐教!
#行空板A部分
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.libs.dfrobot_ens160 import Ens160
from pinpong.libs.dfrobot_sht31 import SHT31
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from pinpong.board import NeoPixel
from dfrobot_rp2040_sci import *
from pinpong.board import Board
import siot
import time
# 自定义函数
def YangQiNongDu():
if (SCI1.get_valueFloat0("O2") >= 20.9):
siot.publish_save(topic="siot/氧气浓度", data="氧气浓度合适!")
else:
siot.publish_save(topic="siot/氧气浓度", data="氧气过低,请注意!")
def GuangXian():
if (SCI1.get_valueFloat0("Light") < 50):
p_p22_out=Pin(Pin.P22, Pin.OUT)
p_p22_out.write_digital(1)
siot.publish_save(topic="siot/光线", data="房间昏暗,已为您开灯!")
else:
p_p22_out=Pin(Pin.P22, Pin.OUT)
p_p22_out.write_digital(0)
siot.publish_save(topic="siot/光线", data="光线充足,适宜学习!")
def ShengYin():
if (SCI1.get_valueFloat0("Sound") < 60):
siot.publish_save(topic="siot/声音", data="安静,适宜学习!")
else:
siot.publish_save(topic="siot/声音", data="注意!轻声细语!")
def KongQiZhiLiangZhiShu():
if (p_ens160.get_aqi() == 1):
siot.publish_save(topic="siot/空气质量指数", data=(str((str("空气质量指数:") + str("1,"))) + str("环境非常好哦!")))
elif (p_ens160.get_aqi() == 2):
siot.publish_save(topic="siot/空气质量指数", data=(str((str("空气质量指数:") + str("2,"))) + str("请保持充分通风!")))
elif (p_ens160.get_aqi() == 3):
siot.publish_save(topic="siot/空气质量指数", data=(str((str("空气质量指数:") + str("3,"))) + str("请贾强通风,空气不太好喔!")))
elif (p_ens160.get_aqi() == 4):
siot.publish_save(topic="siot/空气质量指数", data=(str((str("空气质量指数:") + str("4,"))) + str("空气质量很差,快解决污染源!")))
else:
siot.publish_save(topic="siot/空气质量指数", data=(str((str("空气质量指数:") + str("5,"))) + str("空气质量极差,请离开!!")))
def TVOCNongDu():
if (p_ens160.get_tvoc() < 50):
siot.publish_save(topic="siot/TVOC浓度", data="正常")
elif ((50 < p_ens160.get_tvoc()) and (p_ens160.get_eco2() <= 750)):
siot.publish_save(topic="siot/TVOC浓度", data="可能急躁不安和不舒服")
elif ((750 < p_ens160.get_tvoc()) and (p_ens160.get_eco2() <= 6000)):
siot.publish_save(topic="siot/TVOC浓度", data="可能急躁不安和头疼")
elif (6000 < p_ens160.get_tvoc()):
siot.publish_save(topic="siot/TVOC浓度", data="产生头疼等神经问题")
def CO2NongDu():
if ((400 < p_ens160.get_eco2()) and (p_ens160.get_eco2() <= 600)):
siot.publish_save(topic="siot/CO2浓度", data="CO2浓度合适,很棒喔!")
elif ((600 < p_ens160.get_eco2()) and (p_ens160.get_eco2() <= 800)):
siot.publish_save(topic="siot/CO2浓度", data="CO2浓度合适,很棒喔!")
elif ((800 < p_ens160.get_eco2()) and (p_ens160.get_eco2() <= 1000)):
siot.publish_save(topic="siot/CO2浓度", data="CO2浓度偏高,请适当通风!")
elif ((1000 < p_ens160.get_eco2()) and (p_ens160.get_eco2() <= 1500)):
siot.publish_save(topic="siot/CO2浓度", data="CO2浓度过高,请通风!")
else:
siot.publish_save(topic="siot/CO2浓度", data="CO2浓度极高,请及时通风!!")
# 事件回调函数
def on_message_callback(client, userdata, msg):
global QiDong
if (msg.topic == "siot/启动"):
if (msg.payload.decode() == "启动"):
QiDong = 1
if (msg.topic == "siot/通知"):
np1.brightness(255)
buzzer.play(buzzer.CHASE,buzzer.Once)
for index in range(10):
time.sleep(0.05)
np1.brightness(255)
time.sleep(0.05)
np1.brightness(0)
if (msg.topic == "siot/警报"):
if (msg.payload.decode() == "警报"):
np1.brightness(255)
np1.range_color(0,59,0xFF0000)
for index in range(10):
np1.brightness(255)
buzzer.pitch(131,1)
time.sleep(0.05)
np1.brightness(0)
time.sleep(0.05)
if (msg.payload.decode() == "OFF"):
np1.rainbow(0,59,1,360)
np1.brightness(0)
Board().begin()
siot.init(client_id="940759934624213",server="192.168.2.18",port=1883,user="siot",password="dfrobot")
siot.set_callback(on_message_callback)
siot.connect()
siot.loop()
np1 = NeoPixel(Pin((Pin.P8)),60)
np1.brightness(0)
np1.rainbow(0,59,1,360)
siot.getsubscribe(topic="siot/启动")
siot.getsubscribe(topic="siot/通知")
siot.getsubscribe(topic="siot/警报")
buzzer.redirect(Pin.P0)
p_sht31 = SHT31(0x44)
SCI1 = DFRobot_RP2040_SCI_IIC(addr=0x21)
while SCI1.begin() != 0:
print("Initialization Sensor Universal Adapter Board failed.")
time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")
p_ens160 = Ens160(0x52)
p_ens160.set_temp_hum(p_sht31.temp_c(), p_sht31.humidity())
p_ens160.set_pwr_mode(p_ens160.ENS160_STANDARD_MODE)
QiDong = 0
print("初始化成功,等待启动系统……")
while not ((QiDong == 1)):
pass
print("启动系统……")
p_p22_out=Pin(Pin.P22, Pin.OUT)
p_p22_out.write_digital(0)
p_p12_out=Pin(Pin.P12, Pin.OUT)
p_p12_out.write_digital(1)
p_p23_out=Pin(Pin.P23, Pin.OUT)
p_p23_out.write_digital(0)
while True:
YangQiNongDu()
GuangXian()
ShengYin()
CO2NongDu()
TVOCNongDu()
KongQiZhiLiangZhiShu()
siot.publish_save(topic="siot/温度", data=p_sht31.temp_c())
siot.publish_save(topic="siot/湿度", data=p_sht31.humidity())
siot.publish_save(topic="siot/温湿度", data=(str((str(p_sht31.temp_c()) + str(","))) + str(p_sht31.humidity())))
if (p_sht31.temp_c() >= 29):
p_p12_out=Pin(Pin.P12, Pin.OUT)
p_p12_out.write_digital(0)
else:
p_p12_out=Pin(Pin.P12, Pin.OUT)
p_p12_out.write_digital(1)
if (p_sht31.humidity() <= 60):
p_p23_out=Pin(Pin.P23, Pin.OUT)
p_p23_out.write_digital(1)
else:
p_p23_out=Pin(Pin.P23, Pin.OUT)
p_p23_out.write_digital(0)
#行空板B部分
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.libs.dfrobot_huskylens import Parameter
from pinpong.libs.dfrobot_huskylens import Huskylens
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from pinpong.board import NeoPixel
from pinpong.board import Board
from unihiker import Audio
from unihiker import GUI
import time
import siot
# 事件回调函数
def on_message_callback(client, userdata, msg):
if (msg.topic == "siot/压力座椅"):
if (msg.payload.decode() == "起身休息"):
u_audio.play("起身活动.mp3")
u_audio.play("Letter From Heaven.mp3")
u_audio.play("去学习.mp3")
siot.publish_save(topic="siot/压力座椅", data="休息结束")
if (msg.topic == "siot/通知"):
背景=u_gui.draw_image(image="背景_彩色.jpg",x=0,y=0)
文字_初始化3=u_gui.draw_text(text="系统启动成功!",x=0,y=50,font_size=14, color="#FF0000")
文字_初始化1=u_gui.draw_text(text="欢迎使用",x=0,y=0,font_size=14, color="#FFFFFF")
文字_初始化2=u_gui.draw_text(text="智能工作室环境系统v1.0",x=0,y=25,font_size=14, color="#FFFFFF")
文字_初始化4=u_gui.draw_text(text="智能工作室环境系统启动!",x=0,y=75,font_size=14, color="#FF0000")
文字_初始化5=u_gui.draw_text(text="祝你学有所获!",x=0,y=100,font_size=14, color="#FF6666")
文字_初始化6=u_gui.draw_text(text=(str("通知:") + str(msg.payload.decode())),x=0,y=125,font_size=14, color="#FFFFFF")
u_gui=GUI()
siot.init(client_id="36625455661329553",server="192.168.2.18",port=1883,user="siot",password="dfrobot")
Board().begin()
u_audio = Audio()
siot.connect()
siot.loop()
p_p21_analog=Pin(Pin.P21, Pin.ANALOG)
p_p2_analog=Pin(Pin.P2, Pin.ANALOG)
siot.set_callback(on_message_callback)
背景=u_gui.draw_image(image="背景_黑白.png",x=0,y=0)
文字_初始化1=u_gui.draw_text(text="欢迎使用",x=0,y=0,font_size=14, color="#FFFFFF")
文字_初始化2=u_gui.draw_text(text="智能工作室环境系统v1.0",x=0,y=25,font_size=14, color="#FFFFFF")
文字_初始化3=u_gui.draw_text(text="初始化中……",x=0,y=50,font_size=14, color="#FF0000")
print("初始化MQTT……")
print("连接网络……")
print("网络连接成功!")
siot.getsubscribe(topic="siot/压力座椅")
siot.getsubscribe(topic="siot/通知")
siot.publish_save(topic="siot/范范老师状态", data="离开ing")
print("初始化灯带……")
np1 = NeoPixel(Pin((Pin.P8)),60)
np1.brightness(0)
文字_初始化3.config(text="系统说明……")
print("系统说明……")
u_audio.play("初始化.mp3")
p_huskylens = Huskylens()
print("Hello World")
p_huskylens.command_request_algorthim("ALGORITHM_FACE_RECOGNITION")
time.sleep(0.5)
print("1")
文字_初始化3.config(text="开始扫脸授权……")
buzzer.play(buzzer.JUMP_UP,buzzer.Once)
print("开始扫脸授权……")
while not (p_huskylens.is_appear_direct("blocks")):
pass
time.sleep(0.5)
while not ((p_huskylens.read_block_center_parameter_direct(Parameter.id, "blocks") == 1)):
p_huskylens.command_request()
文字_初始化3.config(text="授权失败,重新尝试……")
u_audio.play("授权失败.mp3")
print("授权失败,重新尝试……")
文字_初始化3.config(text="授权成功,系统即将启动!")
print("授权成功,系统即将启动!")
siot.publish_save(topic="siot/范范老师状态", data="学习ing")
u_audio.play("喝水说明.mp3")
np1.brightness(255)
np1.rainbow(0,59,1,360)
文字_初始化3.config(text="等待放置水杯……")
print("等待放置水杯……")
while not ((p_p21_analog.read_analog() < 2800)):
pass
文字_初始化3.config(text="已放置水杯,正在正式启动系统……")
print("已放置水杯,正在正式启动系统……")
siot.publish_save(topic="siot/启动", data="启动")
背景=u_gui.draw_image(image="背景_彩色.jpg",x=0,y=0)
文字_初始化3=u_gui.draw_text(text="系统启动成功!",x=0,y=50,font_size=14, color="#FF0000")
文字_初始化1=u_gui.draw_text(text="欢迎使用",x=0,y=0,font_size=14, color="#FFFFFF")
文字_初始化2=u_gui.draw_text(text="智能工作室环境系统v1.0",x=0,y=25,font_size=14, color="#FFFFFF")
文字_初始化4=u_gui.draw_text(text="智能工作室环境系统启动!",x=0,y=75,font_size=14, color="#FF0000")
文字_初始化5=u_gui.draw_text(text="祝你学有所获!",x=0,y=100,font_size=14, color="#FF6666")
print("系统启动成功!智能工作室环境系统启动,祝你学有所获!")
while True:
print("等待放置水杯……")
while not ((p_p21_analog.read_analog() < 2800)):
pass
buzzer.play(buzzer.POWER_UP,buzzer.Once)
np1.brightness(0)
HeShuiDaoJiShi = 13
while not ((HeShuiDaoJiShi <= 0)):
print((str("当前水杯参数:") + str(p_p21_analog.read_analog())))
print((str((str("喝水还剩:") + str(HeShuiDaoJiShi))) + str("秒")))
time.sleep(1)
HeShuiDaoJiShi = (HeShuiDaoJiShi - 1)
if (not (p_p21_analog.read_analog() < 2800)):
time.sleep(0.05)
if (not (p_p21_analog.read_analog() < 2800)):
print("提前补水,不错不错!")
np1.brightness(255)
np1.rainbow(0,59,1,360)
while not ((p_p21_analog.read_analog() < 2800)):
pass
HeShuiDaoJiShi = 13
else:
np1.brightness(0)
print("补水时间到!")
np1.brightness(255)
np1.range_color(0,59,0xFF0000)
buzzer.play(buzzer.POWER_DOWN,buzzer.Once)
while not ((not (p_p2_analog.read_analog() < 2800))):
pass
np1.rainbow(0,59,1,360)
//Arduino部分
/*!
* MindPlus
* uno
*
*/
#include <UNO_Obloq.h>
#include <SoftwareSerial.h>
// 动态变量
volatile float mind_n_sitting_countdown, mind_n_eyes;
// 函数声明
void DF_JiuZuoTiXing();
// 静态常量
const String topics[5] = {"siot/启动","siot/压力座椅","","",""};
// 创建对象
UNO_Obloq olq;
SoftwareSerial softSerial(2, 3);
// 主程序开始
void setup() {
Serial.begin(9600);
softSerial.begin(9600);
olq.startConnect(&softSerial, "xiaohanhu", "xhh901129", "siot", "dfrobot", topics, "192.168.2.18", 1883);
Serial.println("OBLOQ初始化完毕");
mind_n_sitting_countdown = 5;
mind_n_eyes = 9;
Serial.println("等待启动信息……");
while (!(olq.getMessage(olq.topic_0)=="启动")) {}
Serial.println("久坐提醒模式启动……");
}
void loop() {
DF_JiuZuoTiXing();
}
// 自定义函数
void DF_JiuZuoTiXing() {
Serial.println(analogRead(A0));
while (!(analogRead(A0)>100)) {}
mind_n_sitting_countdown = 10;
while (!(mind_n_sitting_countdown<=0)) {
Serial.println(analogRead(A0));
Serial.println(mind_n_sitting_countdown);
delay(1000);
mind_n_sitting_countdown -= 1;
if ((!(analogRead(A0)>100))) {
delay(50);
while (!(analogRead(A0)>100)) {}
mind_n_sitting_countdown = 10;
}
}
olq.publish(olq.topic_1, "->起身休息");
digitalWrite(13, HIGH);
while (!(!(analogRead(A0)>100))) {}
digitalWrite(13, LOW);
while (!(olq.available(olq.topic_1))) {}
while (!(olq.getMessage(olq.topic_1)=="休息结束")) {}
}
三春牛-创客2024.03.24
学习学习!
三春牛-创客2024.03.24
好棒啊~
许培享2024.01.14
学习学习大神
小含糊online2024.01.19
互相学习,共同进步!
hacker_2023.07.26
666
小含糊online2024.01.19
互相学习,共同进步!
少东2023.07.24
腻害腻害,膜拜大神!
小含糊online2024.01.19
互相学习,共同进步!
hacker_2023.07.16
666
DFHkrhgVBz22023.07.15
cycc😑👌💰👀
小含糊online2024.01.19
互相学习,共同进步!
SeanXiao2023.07.15
w
小含糊online2024.01.19
互相学习,共同进步!
春秋大仙2023.07.14
6666666
小含糊online2024.01.19
互相学习,共同进步!