最近刚考完试,小学弟找我帮他完成个项目,完成接入云的一些功能,S具体有STM32搭载S1216 GPS+北斗 双模定位模块采集经纬度,占用串口2;BMP180气压监测模块采集气压,占用IIC1,;ESP8266 WIFI模块与机智云通信,占用串口3,同时也占用了IIC2,;DHT11采集温湿度,占用PG11;MPU6050采集加速度,需要再占用一个IIC,但是STM32的IIC已经全部被占用了,正好小学弟熟悉K60,所以包括MPU6050在内的剩余模块在K60上实现;空气质量(我也没见过的模块,不是MQ系列的,头上还有个对管), 编码器采集速度。K60的数据通过串口发送给串口1。
代码如下:
因为我不熟悉K60,所以K60的东西我就不叙述了。本来小学弟是让我在STM32上实现所有功能的,奈何我想把ESP8266放到UART4上使用,但是无论怎么调试,还是没办法像USART1、USART2、USART3那样使用(USART是同步、异步串行通信,而UART是异步串行通信),ESP8266接到UART4上就是没有办法接入机智云,所以最终放弃了,改成了用K60去搭载MPU6050、编码器、空气质量模块,然后通过K60的串口将数据发送到STM32的串口1,在用STM32把数据发送到机智云。
把主函数的代码贴一下:
dataPoint_t currentDataPoint; u8 USART1_TX_BUF[USART2_MAX_RECV_LEN]; //串口1,发送缓存区 nmea_msg gpsx; //GPS信息 __align(4) u8 dtbuf[50]; //打印缓存器 u8 wifi_sta=0; //协议初始化 void Gizwits_Init(void) { TIM3_Int_Init(9,7199);//1MS系统定时 usart3_init(9600);//WIFI初始化 memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化 gizwitsInit();//缓冲区初始化 } //显示GPS定位信息 void Gps_Msg_Show(void) { float tp; tp=gpsx.longitude; //sprintf((char *)dtbuf,"Longitude:%.5f %1c ",tp/=100000,gpsx.ewhemi); //得到经度字符串 printf("Longitude:%.5f %1c\r\n",tp/=100000,gpsx.ewhemi); currentDataPoint.valueLongitude = tp; tp=gpsx.latitude; //sprintf((char *)dtbuf,"Latitude:%.5f %1c ",tp/=100000,gpsx.nshemi); //得到纬度字符串 printf("Latitude:%.5f %1c \r\n",tp/=100000,gpsx.nshemi); currentDataPoint.valueLatitude = tp; } int main(void) { u16 i,rxlen; int x1=0,x2=0,x3=0; int keys; u8 wifi_con=0;//记录wifi连接状态 1:连接 0:断开 u8 key=0XFF; u8 upload=0; u8 temperature; u8 humidity; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为9600 USART2_Init(38400); //初始化串口2波特率为115200 LED_Init(); //LED初始化 KEY_Init(); //按键初始化 Gizwits_Init(); //协议初始化 DHT11_Init(); BMP_Init(); BMP_ReadCalibrationData(); // POINT_COLOR=RED; if(SkyTra_Cfg_Rate(5)!=0) //设置定位信息更新速度为5Hz,顺便判断GPS模块是否在位. { do { USART2_Init(9600); //初始化串口3波特率为9600 SkyTra_Cfg_Prt(3); //重新设置模块的波特率为38400 USART2_Init(38400); //初始化串口3波特率为38400 key=SkyTra_Cfg_Tp(100000); //脉冲宽度为100ms }while(SkyTra_Cfg_Rate(5)!=0&&key!=0);//配置SkyTraF8-BD的更新速率为5Hz delay_ms(500); } while(1) { delay_ms(1); if(USART2_RX_STA&0X8000) //接收到一次数据了 { rxlen=USART2_RX_STA&0X7FFF; //得到数据长度 for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i]; USART2_RX_STA=0; //启动下一次接收 USART1_TX_BUF[i]=0; //自动添加结束符 GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串 Gps_Msg_Show(); //显示信息 if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//发送接收到的数据到串口1 } if(wifi_con!=wifi_sta) { wifi_con=wifi_sta; wifi_con?printf("connect"):printf("close"); } gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理 if(USART_RX_STA&0x8000)//如果串口收到数据 { x1=(USART_RX_BUF[0]-'0')*100+(USART_RX_BUF[1]-'0')*10+(USART_RX_BUF[2]-'0'); x2=(USART_RX_BUF[3]-'0')*100+(USART_RX_BUF[4]-'0')*10+(USART_RX_BUF[5]-'0'); x3=(USART_RX_BUF[6]-'0')*100+(USART_RX_BUF[7]-'0')*10+(USART_RX_BUF[8]-'0'); USART_RX_STA=0; } currentDataPoint.valueSpeed = x1; currentDataPoint.valueAcceleration = x2; currentDataPoint.valueAir = x3; DHT11_Read_Data(&temperature,&humidity); //读取温湿度值 currentDataPoint.valueTemperature = temperature; currentDataPoint.valueHumidity = humidity; BMP_UncompemstatedToTrue(); currentDataPoint.valuePressure = bmp180.p; //printf("\r\nPress:%ld\r\n",bmp180.p); /* LCD_ShowxNum(50,50,x1,3,24,0); LCD_ShowxNum(50,80,x2,3,24,0); LCD_ShowxNum(50,110,x3,3,24,0); */ keys = KEY_Scan(0); if(keys==KEY1_PRES)//KEY1按键 { printf("WIFI进入AirLink连接模式\r\n"); gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入 } if(keys==WKUP_PRES)//KEY_UP按键 { printf("WIFI复位,请重新配置连接\r\n"); gizwitsSetMode(WIFI_RESET_MODE);//WIFI复位 wifi_sta=0;//标志wifi已断开 } } }
硬件连接如下:
使用山外k60芯片采集数据,以固定格式发送:AABAABAAA,B表示小数部分,每三位数一个参数,分别是:速度、加速度、空气质量
APP界面如下
至此,教程结束,谢谢大家,也欢迎大家关注我的个人技术与资源分享公众号“linkutures”