这个项目的目标是用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); //读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; //防止越界
}
}
}