本文主要是介绍用STM32制作汽车蓝牙OBD转速/车速表(带LED转速指示),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个项目的目标是用STM32F103C8T6制作汽车蓝牙OBD转速/车速表,在OLED屏上显示当前转速和车速,同步在OLED灯带上显示转速(按预设的最高转速的比例显示),转速超出预设的最高转速后,灯带开始闪烁,可以用于换挡提示。
系统结构框图如下:
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<INIT_SEQ_LEN;i++){USART2_SendStr(init_strs[i]);ret=USART2_wait_for_response(response_strs1[i],response_strs2[i]);if(!ret) return 0; }return ret;
}
/****************UART2接收中断处理
*****************/
void USART2_IRQHandler(void)
{u8 data;//接收中断//溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) != RESET) //溢出{USART_ClearFlag(USART2,USART_FLAG_ORE); //读SRdata=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转速/车速表(带LED转速指示)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!