【CW32F030CxTx StartKit开发板】利用超声波传感器实现智能灯控

目录

1、超声波传感器

2、硬件连线

3. 程序开发

3.1 超声波测距

3.2 LED控制

4. 演示视频


本文首发于21ic。

感谢21ic和武汉芯源提供的测试机会。
在上一篇帖子中介绍了CW32F030CxTxStartKit 评估板的环境构建。本次介绍如何利用超声波传感器实现人来灯亮,人走灯灭的智能灯控。

1、超声波传感器

HC-SR04是一款广泛使用的超声波测距模块,特别适用于机器人、无人车等领域。它利用超声波的发射和接收原理,通过测量超声波从发射到接收的时间来计算物体与传感器之间的距离。
HC-SR04的工作原理基于超声波的发射和接收。它主要由两个压电陶瓷片组成,其中一个用于发射超声波(T),另一个用于接收反射回来的超声波信号(R)。工作时,Trig引脚(触发端)发送一个10us的高电平信号,模块内部随后发出8个40KHZ的周期电平信号,并自动检测是否有信号返回。当有信号返回时,Echo引脚(接收端)会输出一个高电平信号,其脉冲宽度与所测距离成正比。

2、硬件连线

CW32F030CxTxStartKit 评估板把所有I/O口都引出来了,有个好处就是可以方便地进行接口之间的连接,做各种测试。我们把PA01连接到Trig引脚,将PA02连接到Echo引脚。同时将HC-SR04的VCC和GND引导开发板的VDD和GND上。

3. 程序开发

3.1 超声波测距

使用HC-SR04时,只需提供一个10uS以上的脉冲触发信号,模块内部将自动发出超声波并检测回波。通过测量Echo引脚高电平持续的时间,结合声速(340m/s),即可计算出物体与传感器之间的距离。具体计算公式为:距离 = (高电平时间 * 声速) / 2。
在程序中我们开启了BTIM1定时器,并在其中断函数中进行计时,从而用于测量Echo引脚高电平持续的时间。主要的程序代码如下:

//UARTx
#define  DEBUG_USARTx                   CW_UART1
#define  DEBUG_USART_CLK                RCC_APB2_PERIPH_UART1
#define  DEBUG_USART_APBClkENx          RCC_APBPeriphClk_Enable2
#define  DEBUG_USART_BaudRate           9600
#define  DEBUG_USART_UclkFreq           8000000//UARTx GPIO
#define  DEBUG_USART_GPIO_CLK           RCC_AHB_PERIPH_GPIOA
#define  DEBUG_USART_TX_GPIO_PORT       CW_GPIOA
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_PIN_8
#define  DEBUG_USART_RX_GPIO_PORT       CW_GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_PIN_9//GPIO AF
#define  DEBUG_USART_AFTX               PA08_AFx_UART1TXD()
#define  DEBUG_USART_AFRX               PA09_AFx_UART1RXD()#define LED_GPIO_PORT CW_GPIOB
#define LED_GPIO_PINS GPIO_PIN_8 | GPIO_PIN_9#define SetTrig()    PA01_SETHIGH()
#define ResetTrig()  PA01_SETLOW()
#define ReadEcho()   GPIO_ReadPin(CW_GPIOA, GPIO_PIN_2)/******************************************************************************* Global variable definitions (declared in header file with 'extern')******************************************************************************/
extern unsigned int time;/******************************************************************************* Local type definitions ('typedef')******************************************************************************//******************************************************************************* Local function prototypes ('static')******************************************************************************//******************************************************************************* Local variable definitions ('static')                                      *******************************************************************************/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void UART_Configuration(void);
unsigned int Measure_Distance(void);#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;/******************************************************************************* Local pre-processor symbols/macros ('#define')******************************************************************************//****************************************************************************** Function implementation - global ('extern') and local ('static')******************************************************************************/void BTIM_Init(void)
{RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_BTIM, ENABLE);  //使能APB外设时钟BTIM_TimeBaseInitTypeDef BTIM_Initstruct;BTIM_Initstruct.BTIM_Mode = BTIM_Mode_TIMER;  //工作模式-->定时模式BTIM_Initstruct.BTIM_OPMode = BTIM_OPMode_Repetitive;//连续计数模式BTIM_Initstruct.BTIM_Period = 80-1;  //计数重载周期,16bit自动重载寄存器ARR,ARR的值最大为65535BTIM_Initstruct.BTIM_Prescaler = BTIM_PRS_DIV8;        //预分频BTIM_TimeBaseInit(CW_BTIM1, &BTIM_Initstruct);//定时时长=预分频/计数器时钟源频率*(计数重载周期+1),即T=8/64000000*800s=10usBTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE); //设置ARR溢出引发中断BTIM_Cmd(CW_BTIM1, ENABLE); //BTIM使能NVIC_EnableIRQ(BTIM1_IRQn);//中断使能
}/*** [url=home.php?mod=space&uid=247401]@brief[/url] 配置RCC**/
void RCC_Configuration(void)
{//SYSCLK = HSI = 8MHz = HCLK = PCLKRCC_HSI_Enable(RCC_HSIOSC_DIV6);//外设时钟使能RCC_AHBPeriphClk_Enable(DEBUG_USART_GPIO_CLK, ENABLE);__RCC_BTIM_CLK_ENABLE();DEBUG_USART_APBClkENx(DEBUG_USART_CLK, ENABLE);
}/*** [url=home.php?mod=space&uid=247401]@brief[/url] 配置GPIO**/
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_HSI_Enable(RCC_HSIOSC_DIV6);__RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.IT = GPIO_IT_NONE;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pins = LED_GPIO_PINS;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);__RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.IT = GPIO_IT_NONE;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pins = GPIO_PIN_1; // Trig引脚初始化GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;GPIO_Init(CW_GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pins = GPIO_PIN_2; // Echo引脚初始化GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLDOWN;GPIO_InitStruct.IT   = GPIO_IT_NONE;GPIO_Init(CW_GPIOA, &GPIO_InitStruct);GPIO_InitTypeDef GPIO_InitStructure;//UART TX RX 复用DEBUG_USART_AFTX;DEBUG_USART_AFRX;GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
}unsigned int Measure_Distance(void) //测距
{unsigned int distance=0;SetTrig();     //10us的脉冲触发信号delay10us(1);ResetTrig();while(ReadEcho() == 0); //等待Echo输出高电平time = 0;               //开始记录回波信号脉宽while(ReadEcho() == 1); //等待Echo输出低电平           distance = time * 1.7;//根据声速和时间计算距离,即distance=time*340/2/100/*关于分辨力(mm):定时器每次对time加1是10us,10us=0.01ms,340m/s=340mm/ms计算距离时,最小分辨力为:0.01(ms) * 340(mm/ms) / 2 = 1.7(mm)小于模块标准精度3mm,故测距结果十分精准*/return distance; //返回距离,单位mm
}

在interrupts_cw32f030.c中加入如下代码:

unsigned int time = 0;/*** [url=home.php?mod=space&uid=247401]@brief[/url] This funcation handles BTIM1*/
void BTIM1_IRQHandler(void)
{/* USER CODE BEGIN */if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV))  {BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); //清除标志位time++;}/* USER CODE END */
}

3.2 LED控制

我们在while循环中不断进行测距工作,当发现测量的距离值小于100mm,就认为有人靠近,从而打开LED灯,否则就关闭LED灯。
代码如下:

  unsigned int distance;while (1){distance = Measure_Distance();printf("Distance is : %dmm\r\n", distance);if(distance > 100){GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Pin_RESET);}else{GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Pin_SET);}delay1ms(500);}

 完整的代码可以点此下载:  hrsr04.zip (1.49 MB)


4. 演示视频

演示视频已经发在B站了:【CW32+超声波传感器实现智能灯控】

CW32+超声波传感器实现智能灯控

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于DPU的云原生计算资源共池管理解决方案

1. 方案背景和挑战 在传统的云环境中,通常存在着不同的技术栈,支撑多样化的计算服务,具体如下: ① OpenStack环境与虚拟化云主机及裸金属服务 OpenStack是一个开源的云计算管理平台项目,它提供了部署和管理大规模计…

深入理解 RTOS 中断处理机制:实战项目与代码解析

中断,如同嵌入式系统的神经反射,实时响应着外部事件,是保证系统实时性和可靠性的关键。在实时操作系统(RTOS)中,中断处理机制更是重中之重。本文将结合一个具体的项目案例,深入剖析 RTOS 中断处…

LabVIEW高能质子束流密度分布测试系统

LabVIEW平台开发的高能质子束流密度分布测试系统。该系统主要应用于电子器件的抗辐射加固试验,旨在精确测量高能质子束的密度分布,以评估电子器件在辐射环境下的性能表现和耐受能力。 系统组成与设计 硬件组成: 法拉第杯探测器:…

【ARMv8/v9 GIC 系列 2.4 -- GIC SGI 和 PPI 中断的启用配置】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC SGI 和 PPI 中断的使能配置GICR_ISENABLER0 操作使用举例SummaryGIC SGI 和 PPI 中断的使能配置 GICR_ISENABLER0寄存器(中断设置-使能寄存器0)用于启用相应的SGI(软件生成中断)或PPI(专用外设中断)向CPU接口的转发。每个…

Vue基础知识:Vue3.3出现的defineOptions,如何使用,解决了什么问题?

1.那么为什么会出现defineOptions? 原因说明&#xff1a; 有<script setup></script>语法糖应用之前&#xff0c;如果要定义 props&#xff0c;emits 可以轻而易举地添加一个与 setup 平级的属性。但是用了<script setup>后&#xff0c;就没法这么干了整个…

成长过程,摔倒不要紧,爬起来、改过、前进

无论何时何地&#xff0c;我们都有重头再来的能力&#xff0c;这份生生不息的力量来自天之灵根&#xff1b; 学习过程会有跌倒&#xff0c;这是很正常的节奏次序&#xff0c;不能掩盖自己的过失、自欺欺人&#xff0c;这不是过失&#xff0c;摔倒了就拍拍身上的灰尘&#xff…

算法题:用JS实现删除链表的倒数第N个节点

学习目标&#xff1a; 删除链表的倒数第N个节点 leetcode原题链接 学习内容&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点 示例 1: 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2: 输入&a…

谷粒商城学习笔记-2-分布式组件-SpringCloud Alibaba-Nacos注册中心

文章目录 一&#xff0c;Nacos简介1&#xff0c;简介2&#xff0c;Nacos原理剖析 二&#xff0c;Nacos服务端安装1&#xff0c;下载 nacos-server2&#xff0c;解压启动nacos-server3&#xff0c;验证 三&#xff0c;服务注册步骤1&#xff0c;引用Nacas客户端的Jar包2&#xf…

c++之命名空间详解(namespace)

引例 在学习之前我们首先了来看这样一个情形: 在c语言下&#xff0c;我们写了两个头文件&#xff1a;链表和顺序表的。我们会定义一个type(typedef int type)方便改变数据类型&#xff08;比如将int改成char&#xff09;&#xff0c;来做到整体代换。 但是我们两个头文件里面…

python实现接口自动化

代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码&#xff1a; 优点&#xff1a;代码灵活方便缺点&#xff1a;学习成本高 工具&#xff1a; 优点&#xff1a;易上手缺点&#xff1a;灵活度低&#xff0c;有局限性。 总结&#xff1a; 功能脚本&#xff1a;工…

【C++】BMP图片结构深度解析及其在C++中的操作与应用

引言 BMP&#xff08;Bitmap Image File&#xff09;是一种与设备无关的图像文件格式&#xff0c;它采用了一种非常直接的方式来存储图像数据&#xff0c;即按照图像的行和列顺序&#xff0c;逐像素地存储颜色值。由于其简单性和可移植性&#xff0c;BMP文件在图像处理、图像分…

windows电脑桌面便签在哪里找?

在忙碌的工作中&#xff0c;我们经常会有很多事情需要记住。这时&#xff0c;电脑桌面便签就成为了我们的好帮手。那么&#xff0c;在Windows电脑上&#xff0c;我们该如何找到桌面便签呢&#xff1f;下面&#xff0c;就让我来为大家详细介绍一下。 其实&#xff0c;Windows电…

告别盲目跟风!1688竞品数据分析实战指南(图文解析)

不管是哪个行业&#xff0c;想把这个做起来&#xff0c;做下去&#xff0c;第一就要学会模仿&#xff0c;不要自己盲目瞎做&#xff0c;因为别人的数据&#xff0c;都是得到了认可的&#xff0c;先模仿后超越&#xff0c;1688运营里面模仿就是要学会看竞品&#xff0c;店雷达总…

基于AD8232的心电图套件的测试

基于AD8232的心电图套件的测试 1、测试设备2、电源的选择3、 用于测试心电图套件的模拟心电图电路基本4017B的电路基于multisim的电路仿真基于STM32F103RCT6 参考测试数据 1、测试设备 1、AD8232心电模块 2、手持示波器 3、心电信号模拟发生器 4、NI multisim 14.3 5、实物待补…

django后台定制

Django 后台&#xff08;Admin&#xff09;是一个强大的工具&#xff0c;用于管理 Django 项目中的数据模型。然而&#xff0c;默认的 Django Admin 可能无法满足所有项目的需求&#xff0c;因此经常需要进行定制。以下是一些关于 Django 后台定制的推荐、介绍以及技术实现的建…

全卷积网络之FCN图像语义分割

前言 FCN是一种用于图像语义分割的全卷积网络&#xff0c;可以端到端进行像素级预测。 语义分割 图像语义分割是图像处理和机器视觉技术中的重要一环&#xff0c;旨在对图像中的每个像素进行分类。与普通的分类任务不同&#xff0c;语义分割任务输出与输入大小相同的图像&…

鸿蒙语言基础类库:【@ohos.uri (URI字符串解析)】

URI字符串解析 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…

亿康源精英盛宴暨亿康源启动成功举办

&#xff08;本台记者报&#xff09;2024年7月7日下午&#xff0c;亿康源精英盛宴暨启动仪式在杭州市中维歌德大酒店盛大举行。此次盛会不仅吸引了行业内的专业人才、著名投资界大咖和科技领域的杰出企业家&#xff0c;还汇聚了众多关注大健康产业的各界人士&#xff0c;共同见…

软件设计之Java入门视频(13)

软件设计之Java入门视频(13) 视频教程来自B站尚硅谷&#xff1a; 尚硅谷Java入门视频教程&#xff0c;宋红康java基础视频 相关文件资料&#xff08;百度网盘&#xff09; 提取密码&#xff1a;8op3 idea 下载可以关注 软件管家 公众号 学习内容&#xff1a; 该视频共分为1-7…

【在线词典】项目实现

15_Dictionary 在线词典 搭建客户端-服务器架构 准备必要的资源 整理原始数据 整理英汉双语对照表&#xff0c;将XLSX格式转换成CSV格式&#xff0c;准备好vocabulary_list.csv文件备用 注意&#xff1a;CSV格式的文件必须使用UTF-8的字符集&#xff1b; 建立mydatabase.…