基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

这篇具有很好参考价值的文章主要介绍了基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

一、基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁
二、基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发
三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方
四、基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块
五、基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距



前言

我在上一篇文章中驱动了HC-SR501红外人体传感模块,但在测试过程中发现,这个模块的热释电探头过于灵敏了,甚至有的时候往上哈气,会因为检测到类似于人体的温度而误判为感应到人体,所以为了减少误判概率,我打算再添加一个测距模块,在红外感应到人体时,再次判断人体与传感器的距离,在满足预设的距离范围时,才确定有人体接近,进行后续操作。

一、模块简介

HC-SR501红外人体感应模块资料介绍:
探究人体红外传感器HC-SR501

HC-SR04超声波测距模块资料介绍:

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

引脚名称 引脚作用
VCC 3-5.5V供电(实测发现可以3.3V供电,但没有5V供电测得准)
GND 接地
Trig 外部触发信号输入,输入一个高于10μs的高电平即可触发模块测距
Echo 回响信号输出,测距结束时此管脚输出一个高电平,电平宽度反映超声波往返时间之和

工作原理:

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

简而言之:
给Trig一个10μS以上的高电平,模块开始工作,模块内自动发送八个40khz方波,并自主检测是否有电波返回。此时需要检测Echo处的电平,当为高电平的时候记一个时间;当Echo出为低电平的时候再记一个时间,这两个时间的差就是高电平持续的时间,最后用测距公式进行计算

二、配置CubeMX

1、新建工程;
2、配置时钟源,在RCC里面的HSE配置的是晶振时钟;
3、配置程序烧录引脚SYS为SWD模式;
4、配置GPIO输出口,配置一个LED灯(我的板子是PC13),起到检测到人体时的指示作用;
5、配置GPIO输入口,用来读取HC-SR501模块的输出电平,我选的是PA1口;

6、配置GPIO输入口,用来检测HC-SR04超声波测距模块的回响信号输出,我选择PB5口,命名为HC_SR04_Echo_Pin;
7、配置GPIO输出口,用来触发HC-SR04超声波测距模块,我选择PB4口,命名为HC_SR04_Trig_Pin;
8、使能定时器,用来实现微秒延时,和测量HC-SR04模块高电平时间,我选择TIM2,并使能TIM2中断;

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
TIM2挂载在APB1,时钟来源频率为36MHz,故取预分频系数PSC=36-1,计数周期Counter设为60000-1。即此时定时器频率为36M/36=1MHz,每60ms进一次中断,60000μs对应实际测距范围大概为10m,远远超过我的需求。

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

9、配置串口收发引脚;
10、配置时钟树,我还是开到最高的72MHz;
11、进行项目设置,最后生成代码,CubeMX部分就大功告成了

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

三、硬件连线部分

CH340 ↔ STM32F103C8T6最小系统板:
 TX    ↔        RX
 RX    ↔        TX

DAP-LINK ↔ STM32F103C8T6最小系统板
  3.3V    ↔         VCC
  GND    ↔         GND
  SWIO   ↔         SWIO
 SWCLK  ↔        SWCLK

HC-SR501模块 ↔ STM32F103C8T6最小系统板
    OUT      ↔           PA1
    GND      ↔           GND

HC-SR501模块 ↔ DAP-LINK (这里注意模块供电范围为4.5V-20V,用3.3V无法驱动)
     VCC     ↔    5V

HC-SR04模块   ↔  CH340
     VCC      ↔    5V

HC-SR04模块   ↔ STM32F103C8T6最小系统板
     Trig       ↔          PB4
     Echo      ↔          PB5
     GND      ↔          GND

四、逻辑代码部分

代码框架是基于上一篇HC-SR501红外人体感应模块修改而成的,想要完整代码的话可以和上篇文章一起看。

HC_SR04.c

#include "main.h"
#include "HC_SR04.h"
#include "stm32f1xx_hal.h"
#include "stm32f1xx_it.h"
 
static float distance_result;
/*
*********************************************************
函数原型:void Delay_us(uint16_t time)
函数输入:无符号整形
函数输出:无
函数功能:利用定时器实现微秒级延时
*********************************************************
*/
void Delay_us(uint16_t time)
{
	uint16_t a1=TIM2->CNT;
	while(TIM2->CNT-a1<time);
}
/*
*********************************************************
函数原型:void HC_SR04_startrange(void)
函数输入:无
函数输出:无
函数功能:从trig引脚生成一个不小于10us的高电平触发测距,触发后模块自动产生8个40kHz方波,自动检测是否有信号返回
*********************************************************
*/
void HC_SR04_startrange(void)
{
	HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_SET);
	//HAL_Delay(5);
	Delay_us(10);
	HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_RESET);
	
}
/*
*********************************************************
函数原型:uint16_t HC_SR04_gettime(void)
函数输入:无
函数输出:无符号整型
函数功能:通过定时器获取当前时间
*********************************************************
*/
uint16_t HC_SR04_gettime(void)
{
	uint32_t a;
	a=TIM2->CNT;
	return a;
}
/*
*********************************************************
函数原型:float HC_SR04_getdistance(void)
函数输入:无
函数输出:浮点型
函数功能:获取与目标之间的距离
*********************************************************
*/
float HC_SR04_getdistance(void)
{   
	uint16_t time_node1;
 	uint16_t time_node2;
  	uint16_t measure;
	
  HC_SR04_startrange();
	
	TIM2->CNT = 0;
	
	//有信号返回则通过IO口Echo输出高电平,高电平持续时间即为超声波从发射到返回的时间,测试距离=( 高电平时间*声速(340m/s) )/ 2 
  	while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin)==RESET);
	time_node1=HC_SR04_gettime();
	
	while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin)==SET);
	time_node2=HC_SR04_gettime();
	
	measure=time_node2-time_node1;
	
	distance_result = measure * 17.0/1000;//距离=计数差值(us) / 1000000 * 340(m/s) * 100 / 2 = measure * 17/1000

  return distance_result;
}

HC_SR04.h

#ifndef _HC_SR04_H_
#define _HC_SR04_H_
void Delay_us(uint16_t time);
void HC_SR04_startrange(void);
float HC_SR04_getdistance(void);
uint16_t HC_SR04_gettime(void);
#endif

main.c

  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == 1)
		{
			//HAL_Delay(50);
			HC_SR04_distance=HC_SR04_getdistance();
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);//灭灯
			printf("有人,目前距离为:%.2f cm\r\n",HC_SR04_distance);
			HAL_Delay(100);
		}

		else  
		{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);//亮灯
			printf("没人\r\n");
			HAL_Delay(1000);
		}
		
//		  printf("hellp\r\n");
//			HAL_Delay(1000);
  }
	
  /* USER CODE END 3 */
}

现象:

感应到人体,板载LED绿灯亮,同时串口打印测距结果。
基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

注意:
重定义printf后,必须在target里面勾选上MicroLIB,调用一下这个微型库,不然一直卡在里面。

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

参考博客:
stm32f1驱动HC-SR04超声波测距模块文章来源地址https://www.toymoban.com/news/detail-416725.html

到了这里,关于基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

    (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) (1)某宝买的超声波模块   (2)F1的板子,本例使用经典F103C8T6 (3)ST-link 下载器 (4)USB-TTL模块 (5)杜邦线若干 (1)模块简介:         超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射

    2024年02月02日
    浏览(20)
  • WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)

    目录 一、摘要 二、WS2812B介绍 三、CUBEMX配置 四、程序介绍(KEIL编译器) 五、数据手册         1、本文使用示例单片机型号为 stm32f103c8t6 ,RGB型号为 WS2812B ;          2、主要实现功能是实现用 PWM+DMA 使RGB_LED亮起不同颜色的灯光;         3、目的:简单调通该型号

    2024年02月03日
    浏览(16)
  • STM32F103C8T6基础开发教程(HAL库)—点亮第一颗LED灯

    STM32F103C8T6基础开发教程(HAL库)—开发环境配置 STM32F103C8T6基础开发教程(HAL库)—Keil添加注释的快捷键 STM32F103C8T6基础开发教程(HAL库)—点亮第一颗LED灯 STM32F103C8T6基础开发教程(HAL库)—LED灯交替闪烁 STM32F103C8T6基础开发教程(HAL库)—LED灯呼吸闪烁 STM32F103C8T6基础开发

    2024年01月18日
    浏览(29)
  • 【基于STM32F103C8T6的智能风扇控制】

    本次分享的是基于STM32F103的智能风扇的制作,相关的硬件和部分源码可看下面哦,需要成品的可私(创作不易,拒绝白嫖) 喜欢就给小殷一个关注和点赞吧 演示视频链接 1、按键模式下通过按键进行风扇档数改变一共设置为4档 2、自动模式下根据环境温度而改变温度的转速和

    2024年02月12日
    浏览(26)
  • STM32CubeIDE + HAL + STM32f103C8T6 系列教程1 ---板载PC13LED闪烁

    之前的系列教程都是基于Arduino的,但是公司招聘51和stm32的开发还是多些,所以特别开了一个stm32的系列。 这个系列特点是注重了 Arduino 编程思维和习惯下向STM32开发的过渡 。前期没有涉及到太多寄存器相关的知识,利用HAL库和STM32CubeIDE快速入手STM32的数字输入/输出、模拟输

    2024年02月16日
    浏览(15)
  • 基于stm32f103c8t6连接阿里云上传信息

    很抱歉,作为一个AI助手,我无法提供一篇基于STM32F103C8T6连接阿里云上传信息的完整博客文章。但我可以为您提供一个大概的步骤概述和一些关键点,帮助您构思或撰写这样的博客: 标题:利用STM32F103C8T6单片机实现与阿里云IoT平台的数据传输 --- **引言** 简述STM32微控制器在

    2024年01月16日
    浏览(19)
  • STM32项目设计:基于stm32f103c8t6智能电梯系统

    资料链接:待更新~ 哔哩哔哩视频链接:https://www.bilibili.com/video/BV17D4y1V7HG/?vd_source=e5082ef80535e952b2a4301746491be0(bilibili:化作尘my) 资料链接:https://pan.baidu.com/s/1qObK7KBl50RmFrAtoX12kw 提取码:iih4 实物链接:https://m.tb.cn/h.5h5mDXI?tk=MdxLWYHgKnz CZ0001 1、OLED显示当前楼层、目标楼层等信息

    2024年02月03日
    浏览(20)
  • 基于STM32F103C8T6的超声波测距应用

    #一、超声波HC_SR04简介 #二、超声波工作原理 #三、超声波测距步骤 #四、硬件接线 #五、项目代码 一、超声波HC_SR04简介 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应) 工作电压与电流

    2024年02月03日
    浏览(15)
  • 基于stm32f103c8t6的fft频率计

    之前项目中需要用到正弦信号的频率测量,也参考了几个大佬的博客(链接如下),但可能是由于stm32的型号不匹配,虽然也在网上查了一些需要修改的地方,但结果一直不太对,后来经过自己摸索结果终于对了,在这里给大家分享下,具体原理不在赘述。 参考的部分大佬博

    2024年02月14日
    浏览(16)
  • 基于STM32F103C8T6的HC-06蓝牙通信

    如果朋友们 遇到了如下问题 ,可以仔细借鉴本文章和另一篇专门讲解 蓝牙通信问题 的文章,一定能够解决你在蓝牙通信时遇到的诸多困难 1.在调试蓝牙模块AT指令时无返回值 2.身边 无USB转TTL模块 可以直接调试蓝牙模块(本人就是由于无模块花了了整整一天才调试成功)

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包