本帖最后由 zoey不种土豆 于 2025-1-22 09:27 编辑  Enhiker 是一款小巧的 3D 打印设备,旨在帮助户外运动爱好者对他们的环境做出明智的决定。基于 DFRobot 的行空板(UNIHIKER),集成了环境传感器和 GNSS 传感器(全球导航卫星系统),以评估实时天气状况和位置数据。Enhiker会根据健康和安全指数为用户提供关于是否可以露营或继续户外活动的明确安全建议。 用品清单 组件 1x 行空板 Gravity:GNSS GPS 北斗定位模块 Gravity: 五合一环境传感器 2路18650电池座 Type-C L型公对母转接线 紧固件套装(螺丝、螺帽、垫片) 180mm公母头跳线  工具 焊接套件 螺丝刀具 3D 打印机 软件 Autodesk Fusion 360 Ultimaker Cura 项目过程 1.CAD和3D打印  首先,用 Fusion 360 设计Enhiker。大家可以直接在浏览器中查看设计,并下载设计以在 Fusion 360 中打开可以任意修改,随意定制和增强设计。 设计文件: https://a360.co/3XfKDYa 对于 3D 打印,可直接下载以下 STL 文件: 下载链接:Enhiker/CAD  1x  Cover.stl 1x  Board_Plate.stl 1x  Antenna_Cover.stl 3x  Button1.stl 1x  Button2.stl 4x Spacer.stl 本项目使用了带有哑光黑 PLA 灯丝的 Anycubic Kobra 打印机进行打印。 2.连接电源 使用“2 路 18650 电池座”给 Enhiker 供电。由于行空板可以通过 USB Type-C 供电,因此使用了 Type-C 延长线,该电缆已经过修改,用于从电池供电和连接到 PC 以访问行空板并对其进行编程。 如需修改延长线,可执行以下步骤: 1.将两根公对母跳线对半剪开。 2.从延长线的母侧取下热缩管。 3.如下图所示焊接公跳线。 4.焊接后,用热缩管覆盖外露部件以确保安全。 3.组装天线 将天线放置在指定位置,确保天线线路在壳体内部布线。 将 3D 打印的天线盖放在天线上。 使用螺丝将盖子固定到位。 4.组装板 准备板,它是项目的骨架和所有元件的安装底座。 以 3D 打印的 4 个垫片为例。 使用 M3 螺丝将每个垫片固定到板的底部。 5.组装传感器 将环境传感器和 GNSS 传感器安装在底板上。 将 GNSS 传感器放置在底板中心朝向底部的位置。 将传感器上的孔与底板上的孔对齐。 用 4 个 M3 螺丝固定 GNSS 传感器。 将环境传感器放在底板上的指定支架上,并用 2 个 M3 螺丝将其固定住。 6.组装行空板 安装前,插入之前备好的 Type-C 延长线。 将行空板放在底板上,将其与三个指定的孔对齐。 将电缆通过底板上设计的槽口引出。 用 M3 螺丝将行空板固定到位。 7.连接传感器 得益于行空板即插即用的防呆接口,可以将传感器轻松连接 DFRobot 传感器。 如图所示,用行空板附带的两个4pin白色硅胶线将环境和 GNSS 传感器插入行空板。 这些传感器将通过 I2C 协议与行空板通信。 确保每个传感器上的小开关都朝向“I2C”设置。 8.组装外壳 首先将 3D 打印的按钮放入外壳上的指定孔中。 暂时将纽扣用遮蔽胶带固定到位。 小心地将底板组件放置在外壳内,对齐按钮并布置天线。 使用 4 个 M3 螺丝将底板固定到外壳上。 固定底板后,撕下固定按钮的遮蔽胶带。 最后,将天线连接到 GNSS 传感器。 9.组装电池 将之前剪断的两根母跳线焊接到电池的 GND(棕色/黑色)和 5V(红色)端子上,以保持电线的颜色代码。 将 Type-C 延长线插入电池。此电缆将用于为电池充电。 将行空板的 Type-C 母连接器放入外壳主体的中间槽中,并使用热熔胶固定连接器。 将 3D 打印的按钮插入外壳中的指定插槽中。 将 USB 端口与外壳中的相应开口对齐,将电池管理器板放在垫片上,并用 4 个 M3 螺丝固定板。 将母跳线连接到行空板的公跳线。 *连接前要仔细检查行空板和电池的连接,因为错误的连接可能会永久损坏组件! 将电池的 Type-C 数据线插入外壳的指定插槽中,并用热熔胶将数据线固定到位。 确保电池管理板上的开关位于 Hold(保持)状态。 10.最终组装 在最终组装前,打开系统电源以确保正常运行。 若行空板通电,则表明所有连接已正确。 若主板未通电,请仔细检查所有连接以识别并纠正任何问题。 小心地将所有电线塞入外壳中,确保它们排列整齐且没有被夹住,然后将盖子卡在外壳上,确保其牢固安装。 以上,Enhiker 组装完成。 11.设计和编程 对电路板进行编程:下载并安装 Mind+。 用 USB 数据线将行空板(或“Enhiker”)连接到 PC。 打开除 Internet Explorer 以外的浏览器,输入  http://10.1.2.3  以访问行空板上的本地页菜单。 转到网页上的“网络设置”,然后输入网络凭证将行空板连接到 Wi-Fi 网络。 打开 Mind+  。GitHub 存储库 下载代码并解压缩文件。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
  
 # Your API Key
 API_Key = '***************************'
  
 # Initialize the board
 Board().begin()
  
 # Initialize sensors
 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()
  
 # Define constants
 MINIMUM_SATELLITES = 3  # Minimum number of satellites required for reliable data
 DELAY_SECONDS = 5  # Delay between each loop iteration
  
 # Function to check Wi-Fi connection status
 def check_wifi():
     return os.system("ping -c 1 google.com") == 0
  
 # Setup function to initialize sensors
 def setup():
     while not SEN0501.begin():
         print("Sensor initialization failed!")
         time.sleep(1)
     print("Sensor initialization successful!")
  
 # Main loop function to read sensor data, evaluate conditions, and display the data
 def loop():
     # Wait until the required number of satellites is found
     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)
  
     # Read data from sensors
     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)
  
     # Get GNSS data if the satellite count is sufficient
     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"
  
         # Get the date and time from GNSS
         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:
          # Evaluate environmental advance conditions based on sensor and internet data
         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:
         # Evaluate environmental conditions based on sensor data
         rating, message = evaluate_conditions(temperature, humidity, uv_intensity, light_intensity, pressure, elevation, heat_index)
     # Display data
     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)
     
     # Log data into csv
     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])
     
     # Delay before the next loop iteration
     time.sleep(DELAY_SECONDS)
  
 if __name__ == "__main__":
     setup()  # Initialize the sensors
     while True:
         loop()  # Continuously read and display sensor data 复制代码  总结 这个项目的特色在于它能够断网运行,使其成为那些进入野外联网困难区域的探险者的可靠伙伴。 无论你是户外运动爱好者、工程师,还是气象学者或农业专业人士,Enhiker 都是一个值得考虑的实用工具。它搭建了技术与自然之间的桥梁,在传统技术无法覆盖的环境中提供了必要的数据支持和行动建议。 作者: Mukesh Sankhla 发布时间: 2024.08.27 文章来源: Enhiker | A Portable Smart Weather Decision Maker