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

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的学习站 中获取,输入关键字:机智云 即可!

在这里插入图片描述

  • 22
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
STM32F103RC是一种常用的ARM微控制器,而ESP8266模块则是一种常用的物联网WiFi模块,而机智云则是一种平台提供端服务的平台。下面是一个关于如何使用这些技术成功实现远程控制的例子: 我们可以使用STM32F103RC控制器连接ESP8266模块来实现远程控制。首先,我们需要在STM32F103RC上编写嵌入式代码,用于与ESP8266模块进行通信。该代码可以通过串口或SPI等通信接口与ESP8266进行通信,并发送命令或接收数据。 然后,我们需要将ESP8266模块连接到机智云平台的端服务器。该平台允许我们创建设备和数据通道,以便与设备进行交互。我们可以在机智云平台上创建一个远程控制通道,并定义需要传输的数据格式。 一旦设备和通道准备就绪,我们可以通过STM32F103RC控制器向ESP8266发送命令或请求,然后ESP8266模块将这些命令或请求传递给机智云端服务器。服务器将处理这些命令,并根据定义的规则和条件执行相应的操作。 例如,我们可以创建一个远程控制通道,用于控制家庭灯光。在STM32F103RC控制器上,我们编写代码以接收来自用户的命令(例如打开或关闭灯光)。当用户发送命令时,STM32F103RC将使用ESP8266模块将命令传递给机智云端服务器。服务器将解析命令并根据定义的规则向家庭中的灯光设备发送指令。 这样,我们就可以远程控制家庭灯光。如果用户在机智云手机应用程序上点击“打开灯光”按钮,服务器将发送打开灯光的指令到设备,然后STM32F103RC控制器通过ESP8266模块将该指令传递给家庭灯光设备进行操作。 这是一个成功的远程控制实例,其中STM32F103RC、ESP8266模块和机智云平台协同工作,使得用户可以远程控制家庭灯光。这样的技术在物联网和智能家居等领域具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin的学习站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值