用STM32制作汽车蓝牙OBD转速/车速表(带LED转速指示)

这个项目的目标是用STM32F103C8T6制作汽车蓝牙OBD转速/车速表,在OLED屏上显示当前转速和车速,同步在OLED灯带上显示转速(按预设的最高转速的比例显示),转速超出预设的最高转速后,灯带开始闪烁,可以用于换挡提示。

系统结构框图如下:

用STM32制作汽车蓝牙OBD转速/车速表(带LED转速指示)_第1张图片

1、LED灯条和OLED屏用商家提供的驱动就好了;

2、蓝牙模块HC-05预先和蓝牙OBD配对好,HC-05连接模式需要设置CMOD为1,写入蓝牙OBD的mac地址,这样上电后HC-05就会主动连接OBD。同时需要把HC-05的状态引脚接入STM32的一个io口,用于判断蓝牙是否连接成功。

3、系统使用按键进入设置模式,可以设置提醒转速值。设置参数存储在STM32的flash内。

系统最重要的部分是OBD的初始化和OBD数据的接收:

/****************
	初始化OBD
*****************/
#define INIT_SEQ_LEN	6
char *init_strs[]={"ATD\r","ATZ\r","AT E0\r","AT L0\r","AT S0\r","AT H0\r"};
char *response_strs1[]={"OK","ELM327v1.5","OK","OK","OK","OK"};
char *response_strs2[]={"ATDOK","ATZ","ATE0OK","","",""};
u8 USART2_init_obd(void){
	u8 ret=0;
	
	for(int i=0;i
/****************
  UART2接收中断处理
*****************/
void USART2_IRQHandler(void)
{
	u8 data;
  //接收中断
	//溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
	if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) != RESET) //溢出
	{
		USART_ClearFlag(USART2,USART_FLAG_ORE);  //读SR
		data=USART_ReceiveData(USART2); //读DR  
		//gUsart2RxOk=1;	//标识已经接收完成
	}
	
 if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)  // 接收 中断
	{
		USART_ClearITPendingBit(USART2,USART_IT_RXNE); // U1RX_Clear_Intr_Status_Bit;
		data=USART_ReceiveData(USART2);
		if(data == '>'){	//'>'符号代表一行数据结束
			USART2_ParseData();	
			
			gUsart2RxOk=1;	//标识已经接收完成
			usart2_rx_buff_idx=0;//指针复位
		}  
		else if((data !=0x20) && (data!=0x0d)) {	//忽略空格和回车
			usart2_rx_buff[usart2_rx_buff_idx++]=data;	//放入缓冲区
			usart2_rx_buff_idx %= USART2_RX_BUFF_SIZE;	//防止越界
		}
		
	}
 
}

 

你可能感兴趣的:(STM32,OBD,车载)