基于STM32單片機(jī)的汽車防撞與控制系統(tǒng) - 嵌入式 物聯(lián)網(wǎng)(含代碼)

基于STM32單片機(jī)的汽車防撞與控制系統(tǒng)

  • 難度系數(shù):4分
  • 工作量:4分
  • 創(chuàng)新點(diǎn):3分

1 簡介

基于單片機(jī)的汽車防撞與控制系統(tǒng)設(shè)計(jì)

2 主要器件

  • STM32F103C8T6主控芯片
  • HC-SR04超聲波模塊
  • 光敏傳感器
  • ESP-01S WIFI模塊
  • 蜂鳴器
  • OLED屏
  • 紅外傳感器模塊

3 實(shí)現(xiàn)效果

前后有兩個(gè)HC-SR04超聲波模塊,可以檢測車前和車后是否有障礙物,實(shí)驗(yàn)中拿手機(jī)擋住前面的超聲波模塊,蜂鳴器會(huì)報(bào)警。

紅外感應(yīng)模塊可檢測車前是否有人,當(dāng)紅外感應(yīng)模塊前面有障礙是,顯示屏上由N->Y,代表檢測到人。

顯示屏上顯示超聲波模塊探測距離

4 設(shè)計(jì)原理

4.1HC-SR04超聲波模塊

簡介

HC-SR04超聲波模塊常用于機(jī)器人避障、物體測距、液位檢測、公共安防、停車場檢測等場所。HC-SR04超聲波模塊主要是由兩個(gè)通用的壓電陶瓷超聲傳感器,并加外圍信號(hào)處理電路構(gòu)成的。如圖:

兩個(gè)壓電陶瓷超聲傳感器,一個(gè)用于發(fā)出超聲波信號(hào),一個(gè)用于接收反射回來的超聲波信號(hào)。由于發(fā)出信號(hào)和接收信號(hào)都比較微弱,所以需要通過外圍信號(hào)放大器提高發(fā)出信號(hào)的功率,和將反射回來信號(hào)進(jìn)行放大,以能更穩(wěn)定地將信號(hào)傳輸給單片機(jī)。模塊整體電路如圖:

模塊參數(shù)

(1)模塊主要電氣參數(shù)

  • 使用電壓:DC—5V
  • 靜態(tài)電流:小于2mA
  • 電平輸出:高5V
  • 電平輸出:底0V
  • 感應(yīng)角度:不大于15度
  • 探測距離:2cm-450cm
  • 高精度 可達(dá)0.2cm

(2)模塊引腳
超聲波模塊有4個(gè)引腳,分別為Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V電源, Trig(控制端)控制發(fā)出的超聲波信號(hào),Echo(接收端)接收反射回來的超聲波信號(hào)。模塊如圖

4.2 ESP-01S WIFI模塊

簡介

ESP8266 系列模組是深圳市安信可科技有限公司開發(fā)的一系列基于樂鑫ESP8266的低功耗UART-WiFi芯片模組,可以方便地進(jìn)行二次開發(fā),接入云端服務(wù),實(shí)現(xiàn)手機(jī)3/4G全球隨時(shí)隨地的控制,加速產(chǎn)品原型設(shè)計(jì)。

尺寸、管腳定義

ESP8266的指令介紹

AT指令可以細(xì)分四種類型:
1.測試指令:AT+=?
該命令用于查詢?cè)O(shè)置指令的參數(shù)以及取值的范圍

2.查詢指令:AT+?
該命令用于返回參數(shù)的當(dāng)前值

3.設(shè)置指令:AT+=<’’’>
該命令用于設(shè)置用戶自定義的參數(shù)

4.執(zhí)行指令:AT+
該命令用于執(zhí)行受模塊內(nèi)部程序控制的變參數(shù)不可變的功能

ESP8266的指令測試
可以通過STM開發(fā)板轉(zhuǎn)為電平轉(zhuǎn)換的功能連接上ESP8266模塊在通過串口顯示窗口在PC機(jī)上熱輸入AT指令來進(jìn)行操作。

ESP8266的AT指令一覽

4.3 光照傳感器

簡介
光敏傳感器是最常見的傳感器之一,它的種類繁多,主要有:光電管、光電倍增管、光敏電阻、光敏三極管、太陽能電池、紅外線傳感器、紫外線傳感器、光纖式光電傳感器、色彩傳感器、CCD和CMOS圖像傳感器等。光傳感器是目前產(chǎn)量最多、應(yīng)用最廣的傳感器之一,它在自動(dòng)控制和非電量電測技術(shù)中占有非常重要的地位。光敏傳感器是利用光敏元件將光信號(hào)轉(zhuǎn)換為電信號(hào)的傳感器,它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限于對(duì)光的探測,它還可以作為探測元件組成其他傳感器,對(duì)許多非電量進(jìn)行檢測,只要將這些非電量轉(zhuǎn)換為光信號(hào)的變化即可。
總結(jié):照射光敏二極管的光強(qiáng)不同,通過光敏二極管的電流大小就不同,所以可以通過檢測電流大小,達(dá)到檢測光強(qiáng)的目的。利用這個(gè)電流變化,我們串接一個(gè)電阻,就可以轉(zhuǎn)換成電壓的變化,從而通過ADC讀取電壓值,判斷外部光線的弱。

優(yōu)點(diǎn)

  • 采用靈敏型光敏電阻傳感器
  • 比較器輸出,信號(hào)干凈,波形好,驅(qū)動(dòng)能力超過15mA。
  • 配可調(diào)電位器可調(diào)節(jié)檢測光線亮度
  • 工作電壓3.3V-5V
  • 輸出形式 :數(shù)字開關(guān)量輸出(0和1)
  • 設(shè)有固定螺栓孔,方便安裝

原理圖

5 部分核心代碼

//hc_sr04.c源文件: #include"stm32f10x.h" #include"hc_sr04.h" #include"stdio.h" //hc_sr04引腳初始化 void HC_SR04_Init(void)//初始化hc_sro4的連接引腳 {
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟GPIOB時(shí)鐘 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//將hc_sr04的Trig引腳連接到單片機(jī)的PB5引腳上,單片機(jī)給HC_SR04提供至少10us的脈沖 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//將hc_sr04的Echo引腳連接到單片機(jī)的PB6引腳上,HC_SR04反饋高電平信號(hào)給單片機(jī) GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
} //通用定時(shí)器Tim2初始化 void Time2_Init(u32 Period , u32 Prescaler) {
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//開啟定時(shí)器TIM2的時(shí)鐘 TIM_TimeBaseStructure.TIM_Period = Period;//自動(dòng)重裝載寄存器的值 TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;//時(shí)鐘預(yù)分頻數(shù) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//采樣分頻 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計(jì)數(shù) TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除溢出中斷標(biāo)志位 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//TIM2中斷使能 //	TIM_Cmd(TIM2,ENABLE);//使能定時(shí)器Tim2  } //NVIC配置 void NVIC_Config(void) {
	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//中斷通道號(hào)配置為TIM2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//無占先優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//無副優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中斷使能 NVIC_Init(&NVIC_InitStructure);//NVIC初始化 } //給hc_sr04一個(gè)啟動(dòng)信號(hào) void hc_sr04_start(void) {
	Trig=1;
	delay_us(20);
	Trig=0;
} //計(jì)算hc_sr04測出來的值 void hc_sr04_calculate(void) { float temp; while(Echo==1);
	hc_sr04_start();//啟動(dòng)hc_sr04超聲波傳感器 while(Echo==0); printf("收到20us的脈沖,開始發(fā)送8個(gè)40KHz的方波信號(hào)!\r\n");
	delay_ms(500); printf("hc_sr04正在開始測距.......\r\n");
	TIM_SetCounter(TIM2,0);//清空計(jì)數(shù)器 TIM_Cmd(TIM2,ENABLE);//開啟定時(shí)器 while(Echo==1);//如果hc_sr04返回低電平說明還未檢測到前面有障礙物,就一直執(zhí)行該程序 TIM_Cmd(TIM2,DISABLE);//停止計(jì)數(shù) temp=TIM_GetCounter(TIM2)*340/(2*1000); printf("距離:%6.2fm\n",temp);
} //hc_sr04.h頭文件: #ifndef _HC_SRO4_H #define _HC_SR04_H #include "stm32f10x.h" #include "delay.h" #define Trig PBin(5) #define Echo PBout(6) void HC_SR04_Init(void); void Time2_Init(u32 Period , u32 Prescaler); void NVIC_Config(void); void hc_sr04_start(void); void hc_sr04_calculate(void); void delay_init(); void uart_init(u32 bound); #endif 
//wifi模塊部分 #include "esp8266.h" #include "string.h" #include "usart.h" #include "usart3.h" #include "stm32f10x.h" #include "sys.h"  #include "delay.h" //ESP8266模塊和PC進(jìn)入透傳模式 void esp8266_start_trans(void) { //設(shè)置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式 esp8266_send_cmd("AT+CWMODE=1","OK",50); //讓W(xué)ifi模塊重啟的命令 esp8266_send_cmd("AT+RST","ready",20);
	
	delay_ms(1000); //延時(shí)3S等待重啟成功 delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000); //讓模塊連接上自己的路由 while(esp8266_send_cmd("AT+CWJAP=\"111\",\"11111111\"","WIFI GOT IP",600)); //=0:單路連接模式     =1:多路連接模式 esp8266_send_cmd("AT+CIPMUX=0","OK",20); //建立TCP連接  這四項(xiàng)分別代表了 要連接的ID號(hào)0~4   連接類型  遠(yuǎn)程服務(wù)器IP地址   遠(yuǎn)程服務(wù)器端口號(hào) while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200)); //是否開啟透傳模式  0:表示關(guān)閉 1:表示開啟透傳 esp8266_send_cmd("AT+CIPMODE=1","OK",200); //透傳模式下 開始發(fā)送數(shù)據(jù)的指令 這個(gè)指令之后就可以直接發(fā)數(shù)據(jù)了 esp8266_send_cmd("AT+CIPSEND","OK",50);
} //ESP8266退出透傳模式   返回值:0,退出成功;1,退出失敗 //配置wifi模塊,通過想wifi模塊連續(xù)發(fā)送3個(gè)+(每個(gè)+號(hào)之間 超過10ms,這樣認(rèn)為是連續(xù)三次發(fā)送+) u8 esp8266_quit_trans(void) {
	u8 result=1;
	u3_printf("+++");
	delay_ms(1000); //等待500ms太少 要1000ms才可以退出 result=esp8266_send_cmd("AT","OK",20);//退出透傳判斷. if(result) printf("quit_trans failed!"); else printf("quit_trans success!"); return result;
} //向ESP8266發(fā)送命令 //cmd:發(fā)送的命令字符串;ack:期待的應(yīng)答結(jié)果,如果為空,則表示不需要等待應(yīng)答;waittime:等待時(shí)間(單位:10ms) //返回值:0,發(fā)送成功(得到了期待的應(yīng)答結(jié)果);1,發(fā)送失敗 u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime) {
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd); //發(fā)送命令 if(ack&&waittime) //需要等待應(yīng)答 { while(--waittime) //等待倒計(jì)時(shí) {
			delay_ms(10); if(USART3_RX_STA&0X8000)//接收到期待的應(yīng)答結(jié)果 { if(esp8266_check_cmd(ack))
				{ printf("ack:%s\r\n",(u8*)ack); break;//得到有效數(shù)據(jù)  }
					USART3_RX_STA=0;
			} 
		} if(waittime==0)res=1; 
	} return res;
} //ESP8266發(fā)送命令后,檢測接收到的應(yīng)答 //str:期待的應(yīng)答結(jié)果 //返回值:0,沒有得到期待的應(yīng)答結(jié)果;其他,期待應(yīng)答結(jié)果的位置(str的位置) u8* esp8266_check_cmd(u8 *str) { char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了 { 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結(jié)束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
	} return (u8*)strx;
} //向ESP8266發(fā)送數(shù)據(jù) //cmd:發(fā)送的命令字符串;waittime:等待時(shí)間(單位:10ms) //返回值:發(fā)送數(shù)據(jù)后,服務(wù)器的返回驗(yàn)證碼 u8* esp8266_send_data(u8 *cmd,u16 waittime) { char temp[5]; char *ack=temp;
	USART3_RX_STA=0;
	u3_printf("%s",cmd); //發(fā)送命令 if(waittime) //需要等待應(yīng)答 { while(--waittime) //等待倒計(jì)時(shí) {
			delay_ms(10); if(USART3_RX_STA&0X8000)//接收到期待的應(yīng)答結(jié)果 {
				USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結(jié)束符 ack=(char*)USART3_RX_BUF; printf("ack:%s\r\n",(u8*)ack);
				USART3_RX_STA=0; break;//得到有效數(shù)據(jù)  } 
		}
	} return (u8*)ack;
} 

完整代碼可進(jìn)群免費(fèi)領(lǐng)取。

嵌入式物聯(lián)網(wǎng)的學(xué)習(xí)之路非常漫長,不少人因?yàn)閷W(xué)習(xí)路線不對(duì)或者學(xué)習(xí)內(nèi)容不夠?qū)I(yè)而錯(cuò)失高薪offer。不過別擔(dān)心,我為大家整理了一份150多G的學(xué)習(xí)資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學(xué)習(xí)的所有內(nèi)容。點(diǎn)擊下方鏈接,0元領(lǐng)取學(xué)習(xí)資源,讓你的學(xué)習(xí)之路更加順暢!記得點(diǎn)贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦!

點(diǎn)擊這里找小助理0元領(lǐng)取:掃碼進(jìn)群領(lǐng)資料

the end

評(píng)論(0)