一、引脚配置
引脚 | 含义 | 有效值 |
---|---|---|
A7 | 蜂鸣器 | 低电平点亮 |
C13 | LED | 低电平点亮 |
B7 B8 | OLED | SCL SDA |
A2 A3 | Air868 定位 | 串口2 |
A9 A10 | 打印信息 | 串口1 |
B10 B11 | esp8266 | 串口3 |
二、功能
-
1、开机启动,显示学生姓名,学号,联系方式,连接wifi(可跳过),使用air868判断当前经纬度, led闪烁一下, 蜂鸣器响一次
-
2、系统启动后,每隔3秒查询一下当前位置是否超出设定范围, led闪烁一次, 查询是否wifi已经连接;
-
3、当该装置被移动时,LED常亮, 蜂鸣器长鸣
三、实现
3.1、 开机显示OLED, IIC通信, 设置 OLED096_display_init()函数
3.2、 实现wifi判断是否连接, 模式使用STA, 开机就开始连接wifi, 可以使用手机开热点,但是提前在程序中设置好参数 wifista_ssid和wifista_password
3.3、完成3.2wifi连接之后,初始化Air868, 进行12次获取当前位置,去掉最大值和最小值,其他取平均值, 系统初始化完毕
3.4、每隔3s查询一下Air868和wifi连接情况。
四、硬件
- AD绘图
- STM32最小系统、OLED模块、Air868模块、两个按键、一个蜂鸣器、esp8266模块(注意:将A9 A10引脚引出,蜂鸣器使用3.3v驱动,Air868的VCC接5v,转3.3接STM32, 系统完成后,只需要连接usb接Air868供电,就能给整个系统供电了。)
五、重要代码
串口
串口负责接收数据,不管数据出现任何问题,只负责接收
//每次发送命令后,等待200毫秒用于接收反馈数据
void USART2_IRQHandler(void)
{
u8 Res;
/////////////////////////////////////////////////////////////
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART2); //读取接收到的数据
USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
USART2_RX_STA++;
if(USART2_RX_STA>(USART2_REC_LEN-1)){
USART2_RX_STA=0;//接收数据错误,重新开始接收
memset(USART2_RX_BUF,0,sizeof(USART2_RX_BUF));//清除buffer
}
}
}
命令发送并确定通信成功
u8 air868_send_cmd(char *cmd,u8 *ack)
{
USART2_RX_STA=0; //清空接收
memset(USART2_RX_BUF,0,sizeof(USART2_RX_BUF));//清除buffer
printf2("%s\r\n",cmd); //发送命令
delay_ms(400); //等待设备返回信息
if(strstr((const char*)USART2_RX_BUF,(const char*)ack)) //判断字符串ack是否是buf的子串
{
printf("ack:%s ..end\r\n",USART2_RX_BUF);
return 0;
}else{
printf("未得到想要的数据\r\n");
return 1;
}
}
分解buffer 确定经纬度
double longitude=0;
double latitude=0;
double longitude_init=0;
double latitude_init=0;
//分解USART2_RX_BUF得到经纬度
void get_longitude_latitude(double *longi, double *lati){ //经东西-180:180 纬南北-90:90latitude
char *token; //中转值
char *str;
int i=0;
char *location[5]; //用于保存经纬度数据
double a = 0;
token = strtok(USART2_RX_BUF, ","); //注意这里使用双引号
while(token != NULL){
location[i++] = token;
printf("%s\n",token);
token = strtok(NULL, ",");
}
*longi = atof(location[1]);
*lati = atof(location[2]);
// sprintf(str, "LG:%0.4f", *longi);
// OLED096_p8x16str(0,0,str);
//
// sprintf(str, "LT:%0.4f", *lati);
// OLED096_p8x16str(0,2,str);
printf("经度%.4f\r\n",*longi);
printf("纬度%.4f\r\n",*lati);
}