定位系统

一、引脚配置

引脚 含义 有效值
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);
}

发布了97 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_32460819/article/details/104011557