这是我手环系列的第二篇,最近其他的事情比较多,更新比较慢,第一篇:灵感手环第一步——0.96寸OLED显示实验
既然是手环,那么时间的准确性就是所有的前提,不然就不能称之为手环了。
之前采用DS1302芯片来作为计时模块,但是这个芯片走时不是很准确,一天大概能走快30秒的样子。我觉得这个很不精确。
但是高精度的时钟模块价格比较昂贵,所以想到利用手环上面的蓝牙模块来进行时间校准。
1、思路:
手机客户端连接手环的蓝牙,点击校准时间按钮,手机向手环发送手机上面获取的时间,手环接收到时间后,按照一定的时间格式,写入DS1302。这样就完成了一次时间校准。
2、具体实现步骤:
主要是手环上面蓝牙串口接收到时间格式 后的处理程序。
首先是串口的中断接收函数:
/*接受,在这里接收蓝牙发送过来的校准时间*/ if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //读取接收中断标志位USART_IT_RXNE { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清楚中断标志位 Rx_Buffer[Rx_Counter++] = USART_ReceiveData(USART1);//接收数据到缓冲区,这个函数会自动清除中断标志位
在清除中断标志之后,循环接收蓝牙串口发送过来的数据。
在接收完数据之后就是对接收的数据包进行处理:
//检测到这个固定长度固定格式的数据包,就认为是校准的时间,要求手机发送固定格式的时间数据包:秒 分 时 日 月 周 年 //例如:{12.12.12.05.01.07.18.T} else if(Rx_Counter == 22 && Rx_Buffer[Rx_Counter-1] == 'T') { for(i=0; i<Rx_Counter-1; i+=3) { //数字的ascii码,十进制0为48,乘16是因为他会以16进制存储。 temp[j] = (Rx_Buffer[i] - 48)*16 + (Rx_Buffer[i+1] - 48) ; j++; } memcpy(init_time,temp,j); init_time[j] = '