项目介绍
1.关于硬件
决赛收到的盲盒主件是编号为:SKU:EDU0157,云雀气象仪。
这是一个比较完整的小型气象站,除了空气质量检测等可以通过拓展接口获取外,基本上能满足日常需求。不过因为收到的产品是别人已经试用过的,稍有瑕疵。
但瑕不掩瑜,能够抽到还是比较欣喜的。
2. 关于比赛
但比赛中没有要求使用这个产品,而是用行空板和SCI采集模块 + (Mind+) + 脑洞,不过拿到这么新鲜的东西,怎么能不趁手用用看呢,我们可以看到云雀可以提供如下数据:
--------------------------------------------------------------------------------------------------------------------------------------
1. WindSpeed,风速:风速是由顶上的风杯测得
2. WindDirection:NW,风向:风向是由风向标测得(注意:气象仪放置的位置)
3. Voltage,工作电压
4. Altitude:94.74 m(海拔,这个估计要校准)
5. Pressure:1003.65 hPa (气压)
6. Temp:26.38 C, (温度)
7. Humi:63.84 %RH (湿度)
----------------------------------------------------------------------------------------------------------------------------------------
已经包含了温湿度数据,但为了让SCI采集模块展现它的强大性,我用精度更高的SHT31温湿度传感器替代。
3. 关于八卦:
为什么会想到八卦呢?是因为 云雀 已经显性提供了7个数据,加上时间戳正好有8个数据可以获取(实际上,还有一个隐藏数据:Percentage ,但官方也没有具体介绍,这里先忽略)
首先声明 坚信科学杜绝迷信!!
首先声明 坚信科学杜绝迷信!!
八八六十四卦,分上、中、下卦。
有了硬件、有了软件、有了脑洞、有了资料,我们就开干了。
制作过程
1.硬件连接
基本思路:
SHT31→SCI采集模块→ 行空板 ← 云雀气象仪
(为了赶进度,基本上不要脸了,各位看官请轻拍)
2. 软件使用
主体当然用的Mind+,需要添加模块:
加载云雀库:https://gitee.com/liliang9693/ext-yunque加载SCI库:https://gitee.com/liliang9693/ext-sci
Mind+切换为Python模式,扩展中选择“官方库-行空板”和“pinpong库-pinpong初始化”
3. 基本思路
使用八卦的基本思路是,根据姓名算出笔画总和余8,作为一爻:
获取笔画数,这里是用了查表。当然,为了简单点可以直接使用 unicode编码数,这不是为了显出高 * 格吗!
使用云雀的所有数据和,作为一爻:
再加上SHT31温湿度模块,获得的数据:
另外,为了增加随机性,使用time函数的时间戳毫秒数作为随机因子:
这样子,数据就有了:
作品演示
因为没有什么特殊的演示需要,所以就不搞视频了。
总结
1.本文只是用数学的方法,得出了计算结果。在过程中使用了八卦的一些资源,没有对八卦文化不敬的意思。
2. 行空板+SCI采集模块真得很强大。SCI采集模块和DF产品更配哦。
资源
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import sys
sys.path.append("/root/mindplus/.lib/thirdExtension/liliang-yunque-thirdex")
from DFRobot_Atmospherlum import *
sys.path.append("/root/mindplus/.lib/thirdExtension/liliang-gravitysci-thirdex")
from dfrobot_rp2040_sci import *
from pinpong.board import Board
import time
from unihiker import GUI
import os
Board().begin()
u_gui=GUI()
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)
SCI1 = DFRobot_RP2040_SCI_IIC(addr=0x21)
while SCI1.begin() != 0:
print("Initialization Sensor Universal Adapter Board failed.")
time.sleep(1)
def get_stroke(c):
# strokes_path: https://github.com/helmz/Corpus/blob/master/zh_dict/strokes.txt
# 按照 unicode 顺序排列的笔画数
# 如果返回 0, 则也是在 unicode 中不存在 kTotalStrokes 字
strokes = []
with open('strokes.txt', 'r') as fr:
for line in fr:
strokes.append(int(line.strip()))
unicode_ = ord(c)
if 0<= unicode_ <= 127:
return unicode_
if 13312 <= unicode_ <= 64045:
return strokes[unicode_-13312]
elif 131072 <= unicode_ <= 194998:
return strokes[unicode_-80338]
else:
print("c should be a CJK char, or not have stroke in unihan data.")
return 0
print('ky' + '-*' * 60 + 'lin')
while True:
name = input("请输入您的姓名:")
name_sum = 0
for v in name:
name_sum += get_stroke(v)
u_gui.fill_rect(x=0, y=0, w=200, h=200, color="#FFFFFF")
# 获取毫秒数
now_time_ns = int(time.time() % 1 * 1000)
Dir_dict = {'E':0, 'SE':1 , 'S':2, 'SW':3 , 'W':4, 'NW':5, 'N':6, 'NE':7}
Speed = float(yunque_i2c.get_value("Speed")) * 100
Dir = Dir_dict.get(yunque_i2c.get_value("Dir"),0)
Pressure = float(yunque_i2c.get_value("Pressure")) * 100
Voltage = float(yunque_i2c.get_value("Voltage")) * 100
Altitude = float(yunque_i2c.get_value("Altitude")) * 100
# print(type(now_time_ns),type(Speed),type(Dir),type(Pressure),type(Voltage),type(Altitude))
# 天卦:
shang={
0:"地",
1:"天",
2:"泽",
3:"火",
4:"雷",
5:"风",
6:"水",
7:"山",
}
xia={
0:"坤",
1:"乾",
2:"兑",
3:"离",
4:"震",
5:"巽",
6:"坎",
7:"艮",
}
gua = {
10: "否 中卦",
11: "乾 上上卦",
12: "履 中上卦",
13: "同人 中上卦",
14: "无妄 下下卦",
15: "姤 中上卦",
16: "讼 中下卦",
17: "遁 下下卦",
22: "兑 上上卦",
21: "夬 上上卦",
23: "革 上上卦",
24: "随 中卦",
25: "大过 中下卦",
26: "困 中上卦",
27: "咸 中上卦",
20: "萃 中上卦",
30: "晋 中上卦",
33: "离 中上卦",
31: "大有 上上卦",
32: "睽 下下卦",
34: "噬嗑 上上卦",
35: "鼎 中下卦",
36: "未济 中下卦",
37: "旅 下下卦",
40: "豫 中卦",
41: "大壮 中上卦",
42: "归妹 下下卦",
43: "丰 上上卦",
44: "震 中上卦",
45: "恒 中上卦",
46: "解 中上卦",
47: "小过 中上卦",
50: "观 中上卦",
51: "小畜 下下卦",
52: "中孚 下下卦",
53: "家人 下下卦",
54: "益 上上卦",
55: "巽 中上卦",
56: "涣 下下卦",
57: "渐 上上卦",
60: "比 上上卦",
61: "需 中上卦",
62: "节 上上卦",
63: "既济 中上卦",
64: "屯 下下卦",
65: "井 上上卦",
66: "坎 下下卦",
67: "蹇 下下卦",
70: "剥 中下卦",
71: "大畜 中上卦",
72: "损 下下卦",
73: "贲 中上卦",
74: "颐 上上卦",
75: "蛊 中卦",
76: "蒙 中下卦",
77: "艮 中下卦",
7: "谦 中卦",
1: "泰 中卦",
2: "临 中上卦",
3: "明夷 中下卦",
4: "复 中卦",
5: "升 上上卦",
6: "师 中上卦",
0: "坤 上上卦",
}
Temp_Air = SCI1.get_valueFloat0("Temp_Air") * 100
Humi_Air = SCI1.get_valueFloat0("Humi_Air") * 100
shanggua = int(time.time() % 1 * 1000) + Speed + Dir + \
Pressure + Voltage + Altitude + Temp_Air + Humi_Air
xiagua = name_sum + int(time.time() % 1 * 1000)
info = gua.get(shanggua % 8 * 10 + xiagua % 8,'天地异象 空卦')
print(info)
卦象=u_gui.draw_text(text=f'{name}:',x=40,y=110,font_size=18, color="#006b6b")
卦象=u_gui.draw_text(text=info,x=60,y=150,font_size=22, color="#FF0000")
print('ky' + '-*' * 60 + 'lin')
附件
hacker_2023.08.30
666