1、在机智云上创建项目和数据集

①、进入机智云官网,点击进入开发者模式;
机智云官网链接
在这里插入图片描述②、进入开发者模式后,注册账号并登录;
在这里插入图片描述③、点击创建新产品;
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述然后生成代码包:
在这里插入图片描述

2、WIFI模块烧写固件

①、选择固件烧写工具

在这里插入图片描述
②、设置对应的密钥

在这里插入图片描述
③、固件烧写

WIFI模VCCGNDTXDRXD
MCU—STM32VCCGNDPB11PB10
USB to TTL模块VCCGNDRXDTXD

如果买了正点原子的开发板和WiFi模块可以使用如下连接方式下载固件
在这里插入图片描述
④、配置好密钥后开始下载密钥

在这里插入图片描述

3、移植到MCU上

在STM32上移植

①、在工程中添加定时器驱动、串口3驱动
在这里插入图片描述②、定时器驱动代码
定时器源文件

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
#include "stm32f10x_tim.h"


void TIM3_Int_Init(u16 arr,u16 psc);
 
#endif

定时器头文件

#include "timer.h"
#include "gizwits_product.h"

//	 
//定时器 驱动代码	   
//   	 

//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
		gizTimerMs();
	}
}


③、串口3驱动代码
串口3源文件

#ifndef __USART3_H
#define __USART3_H	 
#include "sys.h"  
//	 
//串口3驱动代码	   					  
// 	   


void usart3_init(u32 bound);			//串口3初始化 

#endif

串口3头文件

#include "usart3.h"
#include "gizwits_product.h"
 
//	 

//串口3驱动代码	   
  
// 	   

//串口3中断服务函数
void USART3_IRQHandler(void)
{
	u8 res;	      
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
	{	 
		res =USART_ReceiveData(USART3);		 
		gizPutData(&res, 1);//数据写入到缓冲区
	}  				 											 
}   


//初始化IO 串口3
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率	  
void usart3_init(u32 bound)
{  

	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	                       //GPIOB时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);                          //串口3时钟使能

 	USART_DeInit(USART3);  //复位串口3
	//USART3_TX   PB10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                     //PB10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	                               //复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //初始化PB10
   
    //USART3_RX	  PB11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                          //浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //初始化PB11
	
	USART_InitStructure.USART_BaudRate = bound;                                    //波特率一般设置为9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;                    //字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;                         //一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;                            //无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	               //收发模式
  
	USART_Init(USART3, &USART_InitStructure);       //初始化串口3
  

	USART_Cmd(USART3, ENABLE);                      //使能串口 
	
	//使能接收中断
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  //开启中断   
	
	//设置中断优先级
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
}


②、在工程中添加Gizwits、Utils文件并修改

#include <stdio.h>
#include <string.h>
#include "gizwits_product.h"
//1、第一处添加
#include "usart3.h" //第一处添加

static uint32_t timerMsCount;

//2、第二处修改
/** Current datapoint */
extern dataPoint_t currentDataPoint;
extern  u8 wifi_sta;  //第二处修改

//3、将此函数注释
//void userHandle(void)
//{
// /*

//    */
//    
//}

//4、在第267-280行代码处添加四行代码用于循坏发送
for(i=0; i<len; i++)
    {
        //USART_SendData(UART, buf[i]);//STM32 test demo
        //Serial port to achieve the function, the buf[i] sent to the module
        
        		//此处添加下列两行代码
				USART_SendData(USART3,buf[i]);
				while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET)//循坏发送,直到发送完毕			        
			if(i >=2 && buf[i] == 0xFF)
        {
          //Serial port to achieve the function, the 0x55 sent to the module
          //USART_SendData(UART, 0x55);//STM32 test demo
          
          //此处添加下列两行代码
			USART_SendData(USART3, 0x55);//STM32 test demo
			while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); 
				}
    }
    

主函数代码

//	 
//  文 件 名   : main.c
//  版 本 号   : v2.0
//  作    者   : Kevin
//  生成日期   : 2021-1-3
//  最近修改   : 
//  功能描述   :演示例程(STM32F103系列)
// 修改历史   :
// 日    期   : 
// 作    者   : Kevin
//******************************************************************************/
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
#include "key.h"
#include "timer.h"
#include "gizwits_product.h"
#include "usart3.h"
#include "usart.h"

/* 用户区当前设备状态结构体*/
dataPoint_t currentDataPoint;

//WIFI连接状态
//wifi_sta 0: 断开
//         1: 已连接
u8 wifi_sta=0;

//协议初始化
void Gizwits_Init(void)
{	
	TIM3_Int_Init(9,7199);//1MS系统定时
  usart3_init(9600);//WIFI初始化
	memset((uint8_t*)&currentDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
	gizwitsInit();//缓冲区初始化
}


int main(void)
{
//	float t=0;
//	u8 t=0;	
	u8 wifi_con=0;//记录wifi连接状态 1:连接 0:断开
	uart_init(115200);	 	//串口初始化为115200
	delay_init();
	LED_Init();//LED初始化
	LCD_Init();//LCD初始化
	KEY_Init();          	//初始化与按键连接的硬件接口
	LED=0;
	Gizwits_Init();         //协议初始化  要在定义
	printf("--------传感器监测----------\r\n");
	while(1)
	{
		if(wifi_con!=wifi_sta)
		{
			 wifi_con=wifi_sta;
			 wifi_con?printf("connect"):printf("close"); //三元运算符如果成立则:打印connect否则:close
		 }	 
		
	if(currentDataPoint.valuedeng == 0)
		{
			LED = 1;
		}
	else
	{
		LED = 0;
	}
	gizwitsHandle((dataPoint_t *)&currentDataPoint);  //协议处理
	
		key = KEY_Scan(0);
		if(key==KEY0_PRES)//KEY0按键
		{
			printf("WIFI进入SOFTAP_MODE连接模式\r\n");
			gizwitsSetMode(WIFI_SOFTAP_MODE);//WIFI_SOFTAP_MODE模式接入可以进这个函数修改模式
		}		
	}
}


重点说明几处,也是创建项目必不可少的几个地方
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

设备连接

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述然后就会进入配对模式,显示设备配对成功。

4、总结

写这篇博客的意义在于总结一下自己玩 WiFi上云平台的过程,记得自己是2019年8月份的时候玩WiFi模块的,当时花了几天一直没有连上云平台,刚好最近有位朋友也遇到了这种问题,就总结一下,以后以免出现同样的问题;
遇到过的玄学问题:
1、设置第一次连接成功后在同一WiFi坏境下出现连接不成功的问题;
2、设置在不同WiFi坏境下连接不成功
3、有的手机能够连接上设备,有的手机不能连接设置
4、最后设置成了SOFTAP_MODE模式,直接去连接设备生成的WiFi,这样就避免了以上的坑,所有用SOFTAP_MODE很重要;不然你可能会崩溃!
后面也会写一些上onenet、华为云的文档;推荐一个讲STM32上机智云平台讲的比较细的视频教程:机智云(MCU方案)

关于固件下载工具以及工程源码可在:Kevin的学习站 中获取,输入关键字:机智云 即可!

在这里插入图片描述

更多推荐