系列文章目录

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


文章目录

  • 系列文章目录
  • 前言
  • 一、模块简介
  • 二、配置CubeMX
  • 三、硬件连线部分
  • 四、逻辑代码部分
    • HC_SR04.c
    • HC_SR04.h
    • main.c

前言

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


一、模块简介

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

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

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

工作原理:


简而言之:
给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中断;


TIM2挂载在APB1,时钟来源频率为36MHz,故取预分频系数PSC=36-1,计数周期Counter设为60000-1。即此时定时器频率为36M/36=1MHz,每60ms进一次中断,60000μs对应实际测距范围大概为10m,远远超过我的需求。


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

三、硬件连线部分

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/1000return 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绿灯亮,同时串口打印测距结果。

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

参考博客:
stm32f1驱动HC-SR04超声波测距模块

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

  1. 蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

    系列文章目录链接 一.小车1.0--基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二.小车2.0--蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三.小车3.0--避障小车(超声波+舵机云台 ...

  2. 基于STM32F103C8T6 HAL库 配置的FreeRTOS进行多线程LED点亮

    文章目录 前言 一.cubemx配置 1.设置SYS和RCC 2.FreeRTOS设置 3.GPIO 4.时钟树 二.程序编写 1.main.h 2.freertos.c 总结 前言 FreeRTOS ...

  3. 基于STM32 HAL库的遥控小车

    目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...

  4. HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库

    HIH8121温湿度传感器代码基于STM32 HAL库 HIH8121传感器简介 驱动代码.c 驱动代码.h main函数 HIH8121传感器简介 HIH8121是霍尼韦尔公司生产的测量温湿度参数一 ...

  5. [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备

    序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...

  6. 移植Freemodbus到STM32(基于CubeMX,HAL库)-避坑篇

    具体Freemodbus移植到STM32步骤参考: STMC2CubeMX | STM32 HAL库移植FreeModbus详细步骤 基于STM32HAL库移植FreeModbus FreeModbu ...

  7. DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动

    系列文章 DW1000开发笔记(一)DW1000芯片概览 DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信 一.官方驱动 Decawave官方提 ...

  8. 基于STM32(HAL库)的水质检测(浑浊度、PH值、温度、手机APP显示、wifi上云)

    本系统由通过wifi将浑浊度.PH值.温度采集的数据发送到手机APP,超过设定的阈值报警. 一.硬件材料清单: 1.STM32C8T6:控制器 2.OLED显示屏:显示传感器采集的数据 3.PH传感器 ...

  9. 基于STM32F103 HAL库 MB85RS128 驱动程序

    前言 本驱动程序基于STM32CubeMX制作,经测试可正常记录并读写MB85RS128数据. 一.STM32CubeMX配置 1.时钟配置 2.GPIO配置 选择PB0作MB85RS128的CS引脚 ...

最新文章

  1. Ubuntu 10.10系统安装手记
  2. 一周焦点 | Dota2团战击溃AI;不如跳舞!伯克利最新人体动作迁移研究
  3. 北京搜狗已签算法30W,西安银行总包20W,要不要毁约去银行?
  4. SQL Server中的命名规范(个人使用)
  5. linux cp无法创建一般文件夹,cp: 无法创建普通文件 : 文件已存在
  6. 前端调用mysql异步_PHP 使用 Swoole – TaskWorker 实现异步操作 Mysql
  7. 采购订单收货后不能修改价格的增强
  8. 在html中取消或加上超链接的下划线
  9. Product Archive相关的标准function module
  10. 安装FFmpeg后,发现没有生成ffplay的解决办法
  11. 中国能源变革令西方相形见绌
  12. oracle 删除用户命令和部分表空间操作
  13. DSP2812入门5——使用C语言操作DSP寄存器
  14. linux ssh权限设置,linux 让ssh只允许指定的用户登录的权限设置
  15. aspcms用mysql_关于ASPCMS标签调用的一些总结
  16. SAM/BAM相关的进阶知识
  17. python代替mathematica_Mathematica 比起 Python 如今还有什么优势?
  18. 使用Java SE8 Streams 处理数据,Part 2
  19. Java 中文转拼音/汉字转拼音, 中文转五笔/汉字转五笔, 下载字典!
  20. 大话UWB技术之核心命脉:TDOA与TOF

热门文章

  1. unity code-动作系统Animator
  2. C++到底还能做什么? ----感觉说的还是很有道理的,共勉!
  3. 工作琐事太多怎么办_待办的事情太多,如何有条不紊的进行工作呢?
  4. 商业数据分析【一】概述及职业发展
  5. 牛客小白月赛25 D.抽卡
  6. 内存管理两部曲之物理内存管理
  7. python就业需要的技能_教你如何快速掌握Python就业技能
  8. [生而为人-思考] Knowledge Cooking -3rd 分享会记录
  9. 7.4 Java(农夫果园【5】:一个农场,专门种植销售各类水果,在这个系统中需要描述下列水果葡萄、草莓、苹果)
  10. java getreader_异常处理:getReader() has already been called for this request