ESP01S连接STM32实现阿里云云平台控制小灯的亮灭

目录

一、ESP01S与STM32的连接

二、接收阿里云平台发来的数据

 三、解析数据

四、根据数据进行状态判断

五、可视化界面的设计


一、ESP01S与STM32的连接

        ESP01S与STM32的通信方式为串口通信,连线方式ESP01S的TXD,RXD与STM32的TXD,RXD交叉互连,VCC接3V3,GND接GND。

二、接收阿里云平台发来的数据

        在使用STM32代替串口调试助手给ESP01S传数据之前,先用串口调试助手来分析云平台给STM32所发的数据格式,附AT指令集(ESP-AT 系列: AT+MQTT 使用)。

        首先通过AT指令连接到阿里云平台,这个指令在我的上一篇博客有写(ESP-01S通过AT MQTT连接阿里云),连接到云平台以后,在云平台中设置一个灯的属性。

         然后添加设备,自己取一个设备名字。

         之后查看设备的三元组信息,并将三元组信息在阿里云配置软件中赋值,生成相应的MQTT参数,此处不懂的可以参考我的上一篇博客。

        创建产品并成功连接到阿里云以后,通过AT+MQTTSUB=0,”订阅的TOPIC“指令订阅一个具有set权限的TOPIC。

         进入在线调试,通过在阿里云平台设置参数,观察串口调试助手中接收到的数据。

        可以观察到,其实STM32就是要解析这个数据,并通过解析这个数据完成开关灯的设置。

 三、解析数据

        实验次数多以后会发现每次的id值不同,且位数也不相同,这就表明该数据是一个不定长的数据,而STM32接收不定长数据可以通过串口的接收中断和空闲中断来实现。以下是USART1的初始化配置。

void uart_init(u32 bound)
{
	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟

	//USART1_TX   GPIOA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

	//USART1_RX	  GPIOA.10初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

	//USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	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(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接收中断
	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口空闲中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

         重点是要开启USART1的接收中断和空闲中断

        当串口每接收到一个数据后就会进入USART1的接收中断,当一帧数据接收完成后,在没收到数据的这段期间,会进入空闲中断,在空闲中断中,就可以判断该数据的长度,并且在空闲中断中还可以判断该数据是不是阿里云发来的,而不是ESP01S收到数据后给STM32返回的OK。

char MQTT_Head[]="+MQTTSUBRECV";
	
void USART1_IRQHandler(void)                	//串口1中断服务程序
{

	uint8_t uart1RecvFlag = 0;		//接收完成标志位

	static uint8_t uart1RecvLen = 0;			//接收数据的长度
	extern char MQTT_Receive_Data[176];

		if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)  //接收中断
		{
				USART_RX_BUF[uart1RecvLen] = USART1->DR;
				USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
				uart1RecvLen++;
		}

	else if(USART_GetITStatus(USART1,USART_IT_IDLE) ==SET)		//空闲中断
	{
			USART1->SR;
			USART1->DR;	//作用是清除IDLE标志位, 根据规格要求, 清除IDLE是要先读取SR后读DR, 因为中断是IDLE, 所以从DR读出来的是没意思的数据,
				
		for(int i=0;i<11;i++)
		{
				if( USART_RX_BUF[i] != MQTT_Head[i])		//接收到的数据不是云平台发来的
					{
						memset(USART_RX_BUF,0x00,sizeof(USART_RX_BUF));
						uart1RecvFlag = 0;			
						break;
					}
					else uart1RecvFlag = 1;				//接收到的数据是云平台发来的
		}
    if(uart1RecvFlag == 1 )			
		{	
			for(int i = 0;i < uart1RecvLen;i++)
				{	
				    MQTT_Receive_Data[i] = USART_RX_BUF[i];	//将缓冲区数据传给另一个数组					
				}		
		}	
	uart1RecvLen = 0;
}

        判断完数据是云平台发出的以后,就可以在应用层层面来进行状态判断,从而实现灯的亮灭。

四、根据数据进行状态判断

void Receive_Deal(void)
{
	int i = 0,index;	
	
    char MQTT_Power_State[]="powerstate";
    char *p;
    	
	p = MQTT_Receive_Data;					//指针p指向接受数组的第一个元素
	for(i=0;i<sizeof(MQTT_Receive_Data);i++)
	{
		
		if(*(p+i)=='p' && *(p+i+1)=='a' && *(p+i+2) == 'r')
		{
			index = i+10; 
			break;
		}
	}

	for(i=0;i<10;i++,index++)
	{
		ESP01SStruct.MQTT_Param[i] = MQTT_Receive_Data[index];
	}
	
	ESP01SStruct.MQTT_Param_Value = MQTT_Receive_Data[index+2];	
	
	//param_compare
	for(i=0;i<10;i++)
	{
		if(ESP01SStruct.MQTT_Param[i] != MQTT_Power_State[i])
		{
			ESP01SStruct.Led_State_flag=0;
			break;
		}
		else
			ESP01SStruct.Led_State_flag=1;
	}

	//paramvalue_compare
	if(ESP01SStruct.Led_State_flag==1)
	{
	  
		switch (ESP01SStruct.MQTT_Param_Value)
		{
			case 0x30:
			{	
				ESP01SStruct.Led_flag=0; 
				break;
			}
			case 0x31:
			{		
				ESP01SStruct.Led_flag=1;	
				break;
			}				
		}
	}	
	
	//led_work
	if(ESP01SStruct.Led_State_flag==1 && ESP01SStruct.Led_flag==1)
			Led_ON();
	if(ESP01SStruct.Led_State_flag==1 && ESP01SStruct.Led_flag==0)
		 Led_OFF();

}	

        由于要实现的不仅仅是灯的亮灭,还有其他一些功能待完善,如:温湿度的实时上报以及控制电机的转动等等。如果只用于点灯的话,状态判断部分的代码不必这么复杂,读者自行设计即可。

五、可视化界面的设计

        登录阿里云IOT Studio平台,创建新的Web开发界面。

         进入到页面以后,即可添加自己所需的组件,点击相应的组件,在右侧对应的交互中,配置数据与阿里云平台中的数据一致即可。

         这样点击页面上方的预览,按一下按钮即可实现灯的打开啦!

         后续将会把温湿度实时上报部分的数据处理也加上。

        感谢你的耐心观看,本人水平有限,代码写的不一定最优,有其他方法也可以共同探讨。

  • 18
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 要将STM32ESP01S连接阿里云,您需要完成以下步骤: 1. 首先,您需要在阿里云上创建一个IoT实例,并在其中创建一个设备。 2. 然后,您需要在STM32上编写代码,以便它可以与ESP01S通信,并将数据发送到阿里云。 3. 接下来,您需要在ESP01S上编写代码,以便它可以连接到WiFi网络,并将数据从STM32发送到阿里云。 4. 最后,您需要在阿里云上设置规则,以便它可以接收来自ESP01S的数据,并将其存储在云端。 请注意,这是一个复杂的过程,需要一定的编程和网络知识。如果您不熟悉这些技术,建议您寻求专业帮助或参考阿里云的文档和示例代码。 ### 回答2: STM32ESP01S是当前市场上非常流行的嵌入式开发板,而连接阿里云则是一种实现远程控制及数据采集的重要手段。在本文中,我们将为大家介绍STM32ESP01S如何连接阿里云的过程,以及需要注意的一些细节和问题。 一、为什么需要连接阿里云? 为了更好地实现远程操控和数据采集,许多企业和开发者需要将嵌入式设备与云端进行连接阿里云是国内领先的云服务商,可以为嵌入式设备提供稳定的云端支持,实现远程控制、云端存储、数据分析等功能。 二、硬件准备 在实现STM32ESP01S连接阿里云之前,我们需要准备好以下硬件: 1、STM32F103C8T6开发板及USB线 2、ESP01S WiFi模块 3、杜邦线若干 4、5V电源 三、软件方案 1、阿里云平台设置 在阿里云平台上进行设备注册和配置 **引入阿里云SDK** 我们可以通过阿里云的IoT物联网平台搭建自己的物联网设备。我们需要在自己的账号下创建产品及设备。创建设备时需要选择设备的鉴权方式,通常采用的是阿里云SDK的鉴权方式。这就需要我们在代码中引入阿里云SDK库,进行操作。 将阿里云SDK添加到工程中 2、STM32的开发环境准备 我们需要选择合适的开发环境,例如:Keil、IAR、MDK等。 3、STM32ESP01S连接准备 将ESP01S模块与STM32开发板进行串口连接,将ESP01S模块上的TXD接入STM32的RXD口,将ESP01S模块上的RXD接入STM32的TXD口。最后将模块上的VCC和GND分别接入开发板的5V和GND口。 4、阿里云平台上的设备配置 配置设备的三元组:设备名称,ProductKey和SecretKey。 5、在STM32开发板中配置WiFi连接 使用AT指令,将ESP01S模块连接WiFi网络,并实现阿里云平台通讯。 四、总结 以上就是STM32ESP01S连接阿里云的方法,遵循以下步骤: 1、在阿里云平台上进行设备注册和配置。 2、在STM32的开发环境中添加阿里云SDK。 3、进行硬件准备,将STM32ESP01S进行相应的连接。 4、在阿里云平台中配置设备三元组。 5、在STM32开发板中进行WiFi链接,实现阿里云平台的通讯。 需要注意,实现连接阿里云存在一定的技术难度,需要前期做好相关的准备以及学习相关的开发知识。同时,在代码实现过程中,对错误的处理和调试非常重要,需要细致仔细。通过不断学习实践,相信您一定能够成功实现连接阿里云的目标。 ### 回答3: STM32+ESP01S连接阿里云需要进行以下步骤: 1、注册阿里云账号并登录。 2、在控制台上创建物联网平台实例,获取ProductKey和ProductSecret。同时创建一个设备。 3、下载开源的阿里云MQTT客户端库,将其导入到Keil软件中。 4、根据实际需求,设置MQTT客户端的连接参数,包括服务器地址、端口号、设备ID、ProductKey、ProductSecret等。 5、将所需的STM32驱动程序导入到Keil软件中,建立STM32程序工程。 6、进行代码编写,完成STM32ESP01S的通讯,实现数据传输。具体实现可以根据阿里云提供的示例代码进行修改,包括订阅主题、发布主题、处理消息等。 7、在阿里云物联网平台上配置物模型和数据流,以便与STM32设备进行交互,实现控制和监测等功能。 需要注意的是,在使用ESP01S连接阿里云时,应该选择合适的通信协议,例如TLS加密协议,以确保数据的安全性。同时应该进行实际测试,验证连接的可靠性和稳定性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值