一、基于STM32+ESP8266+机智云的物联网demo(含源码)

一、基于STM32+ESP8266+机智云的物联网demo

    • 1、在机智云上创建项目和数据集
    • 2、WIFI模块烧写固件
    • 3、移植到MCU上
      • 在STM32上移植
    • 4、总结

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

①、进入机智云官网,点击进入开发者模式;
机智云官网链接
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第1张图片②、进入开发者模式后,注册账号并登录;
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第2张图片③、点击创建新产品;
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第3张图片一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第4张图片
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第5张图片一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第6张图片一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第7张图片一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第8张图片
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第9张图片然后生成代码包:
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第10张图片

2、WIFI模块烧写固件

①、选择固件烧写工具

一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第11张图片
②、设置对应的密钥

一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第12张图片
③、固件烧写

WIFI模 VCC GND TXD RXD
MCU—STM32 VCC GND PB11 PB10
USB to TTL模块 VCC GND RXD TXD

如果买了正点原子的开发板和WiFi模块可以使用如下连接方式下载固件
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第13张图片
④、配置好密钥后开始下载密钥

一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第14张图片

3、移植到MCU上

在STM32上移植

①、在工程中添加定时器驱动、串口3驱动
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第15张图片②、定时器驱动代码
定时器源文件

#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 
#include 
#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模式接入可以进这个函数修改模式
		}		
	}
}


重点说明几处,也是创建项目必不可少的几个地方
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第16张图片一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第17张图片
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第18张图片

设备连接

一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第19张图片
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第20张图片一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第21张图片

一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第22张图片
一、基于STM32+ESP8266+机智云的物联网demo(含源码)_第23张图片然后就会进入配对模式,显示设备配对成功。

4、总结

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

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

在这里插入图片描述

你可能感兴趣的:(#,STM32学习笔记,物联网,stm32,单片机)