stm32+超声波测距+蜂鸣器报警或JQ8900模块语音报警
注:文末有完整工程鏈接(包含引腳連接、代碼注釋和使用說明),已實(shí)測(cè)通過,下載打開即用。
文章目錄
- 前言
- 一、超聲波測(cè)距
- 二、短距報(bào)警模塊
- 1.使用無源蜂鳴器進(jìn)行報(bào)警
- 2.使用JQ8900語音模塊報(bào)警
- 三、完整工程鏈接
前言
本次實(shí)驗(yàn)采用的是stm32f103c8t6開發(fā)板,是比較基礎(chǔ)的一款arm主控芯片;使用超聲波傳感器HC-SR04來測(cè)量距離,當(dāng)距離小于設(shè)定距離時(shí)進(jìn)行報(bào)警;報(bào)警采用了兩種方式,一是無源蜂鳴器,二是JQ8900語音模塊,該模塊配有小喇叭,可以自行設(shè)置報(bào)警音(如前方有障礙物/警報(bào),警報(bào)/你好,請(qǐng)注意等等),我設(shè)置的是“警報(bào),注意安全”。
一、超聲波測(cè)距
具體的測(cè)距程序原理,網(wǎng)上一搜就有,簡(jiǎn)單來說就是當(dāng)超聲波傳感器的Trig引腳拉高大于10us之后觸發(fā)超聲波測(cè)距模塊,另一個(gè)Echo引腳變高電平,隨后發(fā)出超聲波,接收到返回的超聲波后Echo引腳再變低電平,因此利用公式:
距離s = 1/2*Echo引腳從高變低的時(shí)間t ? 聲速
來測(cè)得距離。大家有興趣可以查閱資料詳細(xì)學(xué)習(xí),這里直接上程序(注:部分程序注釋粘貼后亂碼如代碼第一段所示,所以這里刪去了后面的注釋。文末有完整工程,實(shí)在想看注釋可以下載工程打開查看,兩個(gè)工程超聲波測(cè)距部分程序是一樣的,下載一個(gè)即可)。
HC-SR04傳感器,該圖片來自淘寶Zave旗艦店產(chǎn)品介紹:
此模塊有四個(gè)引腳:VCC接5V或者3.3V(具體接幾伏要看你買的傳感器介紹),GND接地,Trig和Echo引腳是IO引腳,可以接開發(fā)板上對(duì)應(yīng)的GPIO引腳,這里接的是PB11和PB10。
超聲波測(cè)距程序:
#include "hc.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "led.h" #include "key.h" #include "beep.h"//3?éù2¨ó2?t?ó?ú?¨ò? #define HCSR04_PORT GPIOB #define HCSR04_CLK RCC_APB2Periph_GPIOB #define HCSR04_TRIG GPIO_Pin_11 //trig?óPB11 #define HCSR04_ECHO GPIO_Pin_10 //echo?óPB10u16 msHcCount = 0;void hcsr04_NVIC() {NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }void Hcsr04Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period = (1000-1); TIM_TimeBaseStructure.TIM_Prescaler =(72-1); TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); hcsr04_NVIC();TIM_Cmd(TIM4,DISABLE); }static void OpenTimerForHc() {TIM_SetCounter(TIM4,0);msHcCount = 0;TIM_Cmd(TIM4, ENABLE); }static void CloseTimerForHc() {TIM_Cmd(TIM4, DISABLE); }void TIM4_IRQHandler(void) {if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); msHcCount++;} }u32 GetEchoTimer(void) {u32 t = 0;t = msHcCount*1000;t += TIM_GetCounter(TIM4);TIM4->CNT = 0; delay_ms(50);return t; }float Hcsr04GetLength(void ) {u32 t = 0;int i = 0;float lengthTemp = 0;float sum = 0;while(i!=5){TRIG_Send = 1; delay_us(20);TRIG_Send = 0;while(ECHO_Reci == 0); OpenTimerForHc(); i = i + 1;while(ECHO_Reci == 1);CloseTimerForHc(); t = GetEchoTimer(); lengthTemp = ((float)t/58.0); //(1/2)*340*(t/10^6)*100 = t/58 cm sum = lengthTemp + sum ;}lengthTemp = sum/5.0; return lengthTemp; }串口距離顯示:
二、短距報(bào)警模塊
1.使用無源蜂鳴器進(jìn)行報(bào)警
注:對(duì)應(yīng)的文末工程鏈接1。
這里使用的是無源蜂鳴器,有三個(gè)引腳:VCC接5V,GND接地,IO腳接單片機(jī)IO腳(本實(shí)驗(yàn)接的是PA11)。
蜂鳴器報(bào)警對(duì)應(yīng)代碼如下:
#include "beep.h" #include "delay.h"int melody[] = {50, 50, 50, 50, 200, 200, 200, 400, 400, 500, 500, 500};void BEEP_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_11);}void Sound(u16 frq) {u32 time;if(frq != 1000){time = 200000/((u32)frq);BEEP = 1;delay_us(time);BEEP = 0;delay_us(time);}elsedelay_us(1000); } void Sound2(u16 time) {BEEP = 1;delay_ms(time);BEEP = 0;delay_ms(time); }void play_successful(void) {int id=0;for(id = 0 ;id < 12 ;id++){Sound2(melody[id]);} } void play_failed(void) {int id=0;for(id = 11 ;id >=0 ;id--){Sound2(melody[id]);} } void play_music(void) { uc16 tone[] ={250,262,294,330,350,393,441,495,525,589,661,700,786,882,990}; //?? u8 music[]={5,5,6,5,8,7,5,5,6,5,9,8,5,5,12,10,8,7,6,11,11,10,8,9,8,5,5,8,5,5,12,10,8,7,6,11,11,10,8,9,8 //????}; u8 time[] = {1,2,2,2,2,4,1,2,2,2,2,4,1,2,2,2,1,4,4,1,2,2,2,2,4,1,2,4,1,2,2,2,1,4, 4,1,2,2,2,2,4,4 //????}; u32 yanshi;u16 i,e;yanshi = 10;for(i=0;i<sizeof(music)/sizeof(music[0]);i++){for(e=0;e<((u16)time[i])*tone[music[i]]/yanshi;e++){Sound((u32)tone[music[i]]);} } }2.使用JQ8900語音模塊報(bào)警
JQ8900有三種通信模式,即兩線串口通信方式、一線串口通信方式和IO口按鍵觸發(fā)模式,本實(shí)驗(yàn)中使用的是一線串口通信方式,因?yàn)椴殚嗁Y料后發(fā)現(xiàn)一線串口通信方式程序編寫更加簡(jiǎn)便,因此最后采用這種方式編寫了短距語音報(bào)警程序,對(duì)應(yīng)文末工程鏈接2。
JQ8900模塊,此圖片來自語音產(chǎn)品商城產(chǎn)品介紹:
JQ8900語音模塊:VPP接PB11(這個(gè)必須接PB11,因?yàn)镻B11是SDA口,因?yàn)閠rig也接了PB11,所以我用了一塊面包板。當(dāng)然,也可以改變超聲波的連接引腳,trig接PB7,echo接PB6也是可以的,實(shí)測(cè)過,就是需要改程序里的引腳設(shè)置);GND接地,DC接5V,SPK+和SPK-接小喇叭正負(fù)極。
JQ8900模塊程序(部分):
#include "oneuart.h" #include "delay.h" #include "stm32f10x.h"void OnUart_GPIO(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC->APB2ENR|=1<<3; //GPIOB//GPIOB.12GPIOB->CRH&=0xFFFF0FFF; GPIOB->CRH|=0x00003000; GPIOB->ODR=~(1<<12); }void SendData ( u8 addr ) {u8 i;SDA = 1;delay_us ( 1000 );SDA = 0; delay_us ( 3200 );for ( i = 0; i < 8; i++ ) {SDA = 1;if ( addr & 0x01 ) {delay_us ( 600 );SDA = 0;delay_us ( 200 );}else {delay_us ( 200 );SDA = 0;delay_us ( 600 );}addr >>= 1;}SDA = 1;}void delay_1us(u32 nTimer) {u32 i=0;for(i=0;i<nTimer;i++){__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();} }對(duì)應(yīng)的main.c程序部分:
//2aê??÷oˉêy int main(void){ float length;OnUart_GPIO();delay_init(); NVIC_Configuration(); uart_init(9600); Hcsr04Init();//printf("′??ú2aê?\r\n"); Hcsr04Init(); //printf("3?éù2¨3?ê??ˉ3é1|!\n");while(1) { length = Hcsr04GetLength();printf(":%.2fcm\n",length);if(length<10){SendData(0x0a);SendData(0x01);SendData(0x0b);delay_ms(1000);}delay_ms(1000); } }三、完整工程鏈接
1.stm32+超聲波測(cè)距+短距蜂鳴器報(bào)警:
https://download.csdn.net/download/m0_52152690/85930149
2.stm32+超聲波測(cè)距+JQ8900語音報(bào)警+小喇叭放大聲音
https://download.csdn.net/download/m0_52152690/85930472
總結(jié)
以上是生活随笔為你收集整理的stm32+超声波测距+蜂鸣器报警或JQ8900模块语音报警的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三角兽散招实习面试题
- 下一篇: Behind the eight bal