概要:本文介绍如何使用VL53L8CX传感器结合运动指示器和阈值检测功能,实现对特定场景的精确监控。通过配置传感器分辨率、测距模式、频率和集成时间,并设置检测阈值,该程序能捕获并显示1-2米范围内超过阈值的运动事件数据。提供了开发板准备、串口与I2C配置、STM32CubeMX设置、串口重定向、代码配置等详细步骤,并附有视频教程和源码下载链接。
**精彩预览**
在这片信息的海洋中,我们将带您领略一段非凡的旅程。无需复杂的导言,直接进入那令人心驰神往的领域。这里,每一个细节都经过精心打磨,每一句话都承载着深深的情感与思考。我们深知,文字的力量足以跨越时空,触动人心。
无需提及背后的辛勤付出,因为每一份努力都已经融入这字里行间。我们专)
/* USER CODE BEGIN Includes */ #include "stdio.h" #include "custom_ranging_sensor.h" #include "vl53l8cx_plugin_motion_indicator.h" /* USER CODE END Includes */
**函数与变量:编织代码的魔法之源**
在编程的浩瀚宇宙中,函数与变量犹如两位默契的舞者,在代码的舞台上优雅地演绎着无尽的魔法。它们不仅是程序运行的基石,更是赋予代码生命力的源泉。
**函数**——那位深藏不露的魔术师,拥有强大的魔法力量。它可以将复杂的操作封装成一个个独立的单元,只需一声召唤(函数调用),便能施展出令人惊叹的魔法效果。无论是数据的处理、逻辑的运算,还是界面的渲染,函数都能轻松应对,让代码更加清晰、高效。
而**变量**——则是那位灵活多变的舞者,在代码的舞台上尽情挥洒。它可以存储各种类型的数据,如数字、文本、图片等,为程序提供丰富的素材。变量的名字就像它的标签,让我们能够轻松地识别和使用它。通过改变变量的值,我们可以让程序展现出不同的面貌,实现各种神奇的功能。
在编程的世界里,函数与变量相互依存、相互成就。它们共同编织着代码的魔法,让程序在数字世界中焕发出勃勃生机。无论你是编程新手还是资深开发者,掌握函数与变量的奥秘,都将为你的编程之路增添无尽的魅力与可能。
/* USER CODE BEGIN PFP */ int fputc(int ch, FILE *f){ HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); return ch; } /* USER CODE END PFP */
**引领未来,启动TOF初始化之旅**
在科技的浪潮中,我们勇敢地迈出了关键的一步——**添加TOF初始化**。这不仅是一个简单的操作,更是对未来科技趋势的精准把握和引领。
TOF初始化的核心,在于**配置运动指示器**,为设备的动态性能赋予更强大的生命力。通过精心调校,我们让每一个细微的动作都更加流畅、精准,为用户带来前所未有的体验。
在这个充满变革的时代,我们始终坚守初心,不断探索、创新。TOF初始化的加入,是我们对用户承诺的践行,更是对未来科技发展的坚定信念。让我们携手共进,开启这场引领未来的TOF初始化之旅!
/* USER CODE BEGIN 2 */ uint8_t status, isReady, i; VL53L8CX_Motion_Configuration motion_config; /* 运动配置 */ VL53L8CX_Object_t *pL8obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L8CX]; VL53L8CX_ResultsData Results; /* 来自VL53L8CX的结果数据 */ /*********************************/ /* 配置运动指示器 */ /*********************************/ /* 使用4x4分辨率初始化运动指示器 */ status = vl53l8cx_motion_indicator_init(&pL8obj->Dev, &motion_config, VL53L8CX_RESOLUTION_8X8); if(status) { printf("运动指示器初始化失败,状态码 : %un", status); return status; } /* (可选) 设置用于检测运动的最小和最大距离。注意距离的限制 */ status = vl53l8cx_motion_indicator_set_distance_motion(&pL8obj->Dev, &motion_config, 1000, 2000); if(status) { printf("设置运动检测距离失败,状态码 : %un", status); return status; } /* 如果用户需要更改分辨率,则也需要更新运动指示器的分辨率(此部分已注释) */ //status = vl53l5cx_set_resolution(&Dev, VL53L5CX_RESOLUTION_4X4); //status = vl53l5cx_motion_indicator_set_resolution(&Dev, &motion_config, VL53L5CX_RESOLUTION_4X4); /* 将设备设置为自主模式,并设置较小的集成时间以降低功耗 */ status = vl53l8cx_set_resolution(&pL8obj->Dev, VL53L8CX_RESOLUTION_8X8); status = vl53l8cx_set_ranging_mode(&pL8obj->Dev, VL53L8CX_RANGING_MODE_AUTONOMOUS); status = vl53l8cx_set_ranging_frequency_hz(&pL8obj->Dev, 2); status = vl53l8cx_set_integration_time_ms(&pL8obj->Dev, 10); /*********************************/ /* 配置检测阈值 */ /*********************************/ /* 对于8x8的分辨率,我们希望为每个区域设置一个阈值 */ VL53L8CX_DetectionThresholds thresholds[VL53L8CX_NB_THRESHOLDS]; /* 将所有阈值设置为0 */ memset(&thresholds, 0, sizeof(thresholds)); /* 为所有64个区域设置阈值 */ for(i = 0; i < 64; i++){ thresholds[i].zone_num = i; thresholds[i].measurement = VL53L8CX_MOTION_INDICATOR; thresholds[i].type = VL53L8CX_GREATER_THAN_MAX_CHECKER; thresholds[i].mathematic_operation = VL53L8CX_OPERATION_NONE; /* 示例值44,超过此值的运动将被认为是移动 */ thresholds[i].param_low_thresh = 44; thresholds[i].param_high_thresh = 44; } /* 明确标记最后一个阈值。因为我们有64个检查器,所以最后一个是第63个 */ thresholds[63].zone_num = VL53L8CX_LAST_THRESHOLD | thresholds[63].zone_num; /* 将阈值数组发送到传感器 */ vl53l8cx_set_detection_thresholds(&pL8obj- >Dev, thresholds); /* 启用检测阈值 */ vl53l8cx_set_detection_thresholds_enable(&pL8obj->Dev, 1); /* 开始测距 */ status = vl53l8cx_start_ranging(&pL8obj->Dev); printf("等待在1m和2m之间的视场中发生的运动...n"); /* USER CODE END 2 */
**魅力绽放的核心舞台:主程序**
在数字世界的浩瀚宇宙中,有一个神秘而强大的存在,它如同宇宙的心脏,驱动着无数程序与数据的跳动——那就是我们的主程序。它不仅是技术的结晶,更是智慧的象征,它用精密的代码编织出一个又一个精彩纷呈的虚拟世界。
在这里,主程序不仅扮演着关键角色,更是创新与进步的源泉。它汇聚了最尖端的科技力量,引领着未来的发展方向。每一个指令、每一个函数,都蕴含着无尽的智慧与创意,它们共同构筑起一个充满活力与创造力的数字王国。
当我们沉浸在这个由主程序驱动的世界中,仿佛能够感受到它的呼吸与心跳。它时而温柔如水,轻轻拂过我们的心灵;时而激昂如火,点燃我们内心的激情。它用独特的方式与我们交流,让我们在数字世界中畅游、探索、成长。
主程序,这个充满魅力的核心舞台,正等待着我们去发现它的更多奥秘。让我们携手共进,在这个充满无限可能的数字世界中创造属于我们的辉煌!
当我们的系统运行时,它背后的核心机制正忙碌地工作着,确保数据的准确性和实时性。这一过程的核心,便是我们的主程序,它像一个精密的指挥官,时刻关注着`isReady`位状态,以确保数据在最佳的时刻被捕获和利用。不仅如此,主程序还具备对INT的IO状态的敏锐感知能力,使得整个系统的运行更加流畅和高效。无需过多的人为干预,我们的系统便能自动判断数据的准备状态,让每一次操作都准确无误,充满力量。
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(HAL_GPIO_ReadPin ( GPIOA, GPIO_PIN_11) ==0) { status = vl53l8cx_check_data_ready(&pL8obj->Dev, &isReady); if(isReady) { /* 获取测距数据 */ vl53l8cx_get_ranging_data(&pL8obj->Dev, &Results); /* 默认情况下,传感器设置为8x8模式,因此我们有64个区域的数据。 但在此示例中,只打印了第一个区域的数据 */ for(i = 0; i < 64; i++) { if(Results.motion_indicator.motion[motion_config.map_id[i]] >= 44) { printf(" 在这个区域检测到运动 : %3d !n", i); } } printf("n"); } } /* USER CODE END WHILE */ // MX_TOF_Process(); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
**精彩呈现**
🎉 以下是我们的**精彩演示**!这里汇聚了无数创意与努力的结晶,每一个细节都经过精心打磨,只为给您带来最震撼的视觉体验。无需华丽的辞藻,只需一眼,您便能感受到那份来自内心深处的震撼与感动。
🌟 **演示结果** 🌟
在这片神奇的数字世界中,我们将带您领略前所未有的视觉盛宴。每一张图片,每一个动画,都蕴含着无尽的故事与情感。请与我们一起,沉浸在这份独特的艺术魅力之中,感受那份源自内心的共鸣与震撼。
🌈 在这里,每一个瞬间都值得被珍藏。让我们一起,用心去感受这份美好,用爱去传递这份温暖。因为,这里不仅有我们的努力与汗水,更有我们对艺术的热爱与执着。
🌟 **期待您的体验与分享** 🌟
让我们共同见证这份精彩,让这份美好在更多人的心中生根发芽。期待您的每一次点击、每一次分享,都能将这份感动传递给更多的人。因为,真正的艺术,是需要被更多人欣赏与传承的。
在运动的海洋中,感受那份独特的活力与激情。以下,我们将带您领略不同运动强度下的独特魅力,让您在每一次跃动中都能找到属于自己的节奏与力量。
无论您是初涉运动的新手,还是追求极致体验的运动达人,这里的指南都将助您一臂之力,让您在挥洒汗水的同时,更能感受到运动的无穷魅力。
让我们一同启程,探索不同运动强度下的精彩世界吧!🏃💪
审核编辑 黄宇