Enhiker 是一款小巧的 3D 打印设备,旨在帮助户外运动爱好者对他们的环境做出明智的决定。基于 DFRobot的行空板(UNIHIKER),集成了环境传感器和 GNSS 传感器(全球导航卫星系统),以评估实时天气状况和位置数据。
Enhiker会根据健康和安全指数为用户提供关于是否可以露营或继续户外活动的明确安全建议。
该设备采用触摸屏,显示全面的天气和环境指标,包括当前UTC日期和时刻、温度、湿度、紫外线强度、光照度、气压、高度、经纬度、海拔、热指数、卫星。当连接到WiFi时,Enhiker会从openweathermap API访问额外的数据,显示:空气质量,风速,风向,日出和日落,云量。
除了天气监测功能外,Enhiker 还可用作应急移动电源,通过太阳能电池板充电,使其成为任何户外探险的必备工具。此外,它还将所有收集的数据连同时间戳和位置坐标记录到一个 CSV 文件中,使其对气象和农业研究很有价值。
对户外探索和活动者来说,Enhiker 是一个可靠的多功能伙伴,确保在任何环境中做好安全的准备。
用品清单
组件
1x 行空板
1x Gravity:GNSS GPS 北斗定位模块
1x Gravity: 五合一环境传感器
1x 2路18650电池座
2x Type-C L型公对母转接线
1x 紧固件套装(螺丝、螺帽、垫片)
1x 180mm公母头跳线
2x 18650电芯
工具
焊接套件
螺丝刀具
3D 打印机
软件
Autodesk Fusion 360
Ultimaker Cura
项目过程
CAD和3D打印
首先,用 Fusion 360 设计Enhiker。大家可以直接在浏览器中查看设计,并下载设计以在 Fusion 360 中打开可以任意修改,随意定制和增强设计。
设计文件:https://a360.co/3XfKDYa
3D打印 STL 文件可以点击文末左下角的“阅读原文”获取。
本项目使用了带有哑光黑 PLA 灯丝的 Anycubic Kobra 打印机进行打印。
连接电源
使用“2 路 18650 电池座”给 Enhiker 供电。由于行空板可以通过 USB Type-C 供电,因此使用了 Type-C 延长线,该电缆已经过修改,用于从电池供电和连接到 PC 以访问行空板并对其进行编程。
如需修改延长线,可执行以下步骤:
1.将两根公对母跳线对半剪开。
2.从延长线的母侧取下热缩管。
3.如下图所示焊接公跳线。
4.焊接后,用热缩管覆盖外露部件以确保安全。
组装天线
将天线放置在指定位置,确保天线线路在壳体内部布线。
将 3D 打印的天线盖放在天线上。
使用螺丝将盖子固定到位。
组装板
准备板,它是项目的骨架和所有元件的安装底座。
以 3D 打印的 4 个垫片为例。
使用 M3 螺丝将每个垫片固定到板的底部。
组装传感器
将环境传感器和 GNSS 传感器安装在底板上。
将 GNSS 传感器放置在底板中心朝向底部的位置。
将传感器上的孔与底板上的孔对齐。
用 4 个 M3 螺丝固定 GNSS 传感器。
将环境传感器放在底板上的指定支架上,并用 2 个 M3 螺丝将其固定住。
组装行空板
安装前,插入之前备好的 Type-C 延长线。
将行空板放在底板上,将其与三个指定的孔对齐。
将电缆通过底板上设计的槽口引出。
用 M3 螺丝将行空板固定到位。
连接传感器
得益于行空板即插即用的防呆接口,可以将传感器轻松连接 DFRobot 传感器。
如图所示,用行空板附带的两个4pin白色硅胶线将环境和 GNSS 传感器插入行空板。
这些传感器将通过 I2C 协议与行空板通信。确保每个传感器上的小开关都朝向“I2C”设置。
组装外壳
首先将 3D 打印的按钮放入外壳上的指定孔中。暂时将纽扣用遮蔽胶带固定到位。小心地将底板组件放置在外壳内,对齐按钮并布置天线。使用 4 个 M3 螺丝将底板固定到外壳上。固定底板后,撕下固定按钮的遮蔽胶带。最后,将天线连接到 GNSS 传感器。
组装电池
将之前剪断的两根母跳线焊接到电池的 GND(棕色/黑色)和 5V(红色)端子上,以保持电线的颜色代码。
将 Type-C 延长线插入电池。此电缆将用于为电池充电。
将行空板的 Type-C 母连接器放入外壳主体的中间槽中,并使用热熔胶固定连接器。
将 3D 打印的按钮插入外壳中的指定插槽中。
将 USB 端口与外壳中的相应开口对齐,将电池管理器板放在垫片上,并用 4 个 M3 螺丝固定板。
将母跳线连接到行空板的公跳线。
注意,连接前要仔细检查行空板和电池的连接,因为错误的连接可能会永久损坏组件!
将电池的 Type-C 数据线插入外壳的指定插槽中,并用热熔胶将数据线固定到位。
确保电池管理板上的开关位于 Hold(保持)状态。
最终组装
在最终组装前,打开系统电源以确保正常运行。若行空板通电,则表明所有连接已正确。若主板未通电,请仔细检查所有连接以识别并纠正任何问题。小心地将所有电线塞入外壳中,确保它们排列整齐且没有被夹住,然后将盖子卡在外壳上,确保其牢固安装。以上,Enhiker 组装完成。
设计和编程
对电路板进行编程:下载并安装 Mind+。用 USB 数据线将行空板(或“Enhiker”)连接到 PC。
打开除 Internet Explorer 以外的浏览器,输入 http://10.1.2.3 以访问行空板上的本地页菜单。
转到网页上的“网络设置”,然后输入网络凭证将行空板连接到 Wi-Fi 网络。
打开 Mind+ 。
单击屏幕左下角的 “Extensions”。选择“行空板”,然后单击“返回”。点击 Mind+ 中的“代码”,然后连接远程终端。连接后,会在屏幕右侧看到行空板的文件系统。从 GitHub 存储库下载代码并解压缩文件。将文件夹复制到行空板:将整个 Enhiker 文件夹拖放到行空板的文件系统中。在行空板的文件系统中打开 main.py 文件。转到 OpenWeatherMap 并登录帐户。导航到“我的 API 密钥”并复制 API 密钥。将 API 密钥粘贴到 main.py 文件中
你的 API 密钥:
API_Key = '***************************'
运行 main.py 文件。
因为使用的包是预装在行空板上的默认包,程序应该可以执行无误。若出现问题,请检查文件夹结构和已安装的软件包。
代 码
"""
Project: Enhiker - A Portable Weather Decision Maker
Author: Mukesh Sankhla
Website: https://www.makerbrains.com
Social Media: Instagram @mukesh.diy
Description:
This Python script interfaces with an environmental sensor and a GNSS (Global Navigation Satellite System) sensor,
displaying real-time data on a Pygame-powered graphical user interface (GUI). The script is designed to monitor
various environmental parameters such as temperature, humidity, UV intensity, atmospheric pressure, and light intensity.
It also gathers location data using the GNSS sensor and evaluates the environmental conditions, providing a health rating
based on the collected data.
"""
import time
import os
import csv
from pinpong.board import Board
from lib.DFRobot_Environmental_Sensor import *
from lib.DFRobot_GNSS_I2C import DFRobot_GNSS_I2C, MODE_GPS_BEIDOU_GLONASS
from decision_maker import evaluate_conditions
from advance_decision_maker import evaluate_advance_conditions
from heat_index import calculate_heat_index
from internet_data import get_weather_data
from display import display_loading_screen, display_data
API_Key = '***************************'
Board().begin()
SEN0501 = DFRobot_Environmental_Sensor_I2C(bus=0x01, addr=0x22)
GNSS = DFRobot_GNSS_I2C()
GNSS.set_gnss_mode(MODE_GPS_BEIDOU_GLONASS)
GNSS.set_enable_power()
MINIMUM_SATELLITES = 3
DELAY_SECONDS = 5
def check_wifi():
return os.system("ping -c 1 google.com") == 0
def setup():
while not SEN0501.begin():
print("Sensor initialization failed!")
time.sleep(1)
print("Sensor initialization successful!")
def loop():
while True:
num_satellites = GNSS.get_num_sta_used()
if num_satellites > MINIMUM_SATELLITES:
break
print(f"Searching... Satellites found: {num_satellites}")
display_loading_screen()
time.sleep(1)
temperature = SEN0501.get_temperature(TEMP_C)
humidity = SEN0501.get_humidity()
uv_intensity = SEN0501.get_ultraviolet_intensity()
light_intensity = SEN0501.get_luminousintensity()
pressure = SEN0501.get_atmosphere_pressure(HPA)
elevation = SEN0501.get_elevation()
heat_index = calculate_heat_index(temperature, humidity)
latitude, longitude, altitude = None, None, None
current_date, current_time = None, None
if num_satellites > MINIMUM_SATELLITES:
lat_data = GNSS.get_lat()
lon_data = GNSS.get_lon()
alt_data = GNSS.get_alt()
latitude = f"{lat_data[0]:.6f}° {lat_data[1]}"
longitude = f"{lon_data[0]:.6f}° {lon_data[1]}"
altitude = f"{alt_data:.2f} m"
current_date = GNSS.get_date()
current_time = GNSS.get_time()
wifi_connected = check_wifi()
air_quality, wind_speed, wind_direction, sunrise, sunset, clouds = None, None, None, None, None, None
if wifi_connected:
air_quality, wind_speed, wind_direction, sunrise, sunset, clouds = get_weather_data(latitude, longitude, API_Key)
if wifi_connected:
rating, message = evaluate_advance_conditions(current_time, temperature, humidity, uv_intensity, light_intensity, pressure, elevation, heat_index, air_quality, wind_speed, wind_direction, clouds)
else:
rating, message = evaluate_conditions(temperature, humidity, uv_intensity, light_intensity, pressure, elevation, heat_index)
display_data(wifi_connected, current_date, current_time, num_satellites, temperature, humidity, heat_index, light_intensity, uv_intensity, pressure, elevation, latitude, longitude, rating, message, air_quality, wind_speed, wind_direction, sunrise, sunset, clouds)
with open('data_log.csv', mode='a', newline='') as file:
writer = csv.writer(file)
writer.writerow([wifi_connected, current_date, current_time, num_satellites, temperature, humidity, heat_index, light_intensity, uv_intensity, pressure, elevation, latitude, longitude, rating, message, air_quality, wind_speed, wind_direction, sunrise, sunset, clouds])
time.sleep(DELAY_SECONDS)
if __name__ == "__main__":
setup()
while True:
loop()
总 结
在快速发展的智能手机和现代技术革命中,Enhiker 可能并不是一项突破性创新,但它通过在 IoT、通信和离线功能方面提供宝贵的经验来发挥一些现代设备常忽略的功能的一些独特作用。这个项目的特色在于它能够断网运行,使其成为那些进入野外联网困难区域的探险者的可靠伙伴。
无论你是户外运动爱好者、工程师,还是气象学者或农业专业人士,Enhiker 都是一个值得考虑的实用工具。它搭建了技术与自然之间的桥梁,在传统技术无法覆盖的环境中提供了必要的数据支持和行动建议。
感谢阅读!下次见 ;)