最近刚考完试,小学弟找我帮他完成个项目,完成接入云的一些功能,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”