stm32学习之esp8266连接阿里云

文章内容仅个人的理解,如有错误还请各位多多包涵

参考:b站:海创电子工作室,漫天飞羽zz

硬件

单片机:stm32f103c8t6、esp8266模块

一、首先,让esp8266作为客户端,连接上WiFi。

        (这里使用手机开热点,注意热点设置AP频段选择2.4Ghz,否则连接不上)

        1.1先用串口调试助手(xcom)进行调试

硬件连接

在串口调试助手输入相关AT指令,发送时记得勾选 换新行

除了第二步返回的是redy,其他成功都是返回ok的。这样就完成了

        1.2通过单片机发送指令给esp8266,连接上WiFi

首先要明白,回车换行,相当于串口调试助手勾选新行

想相关代码(后续会附上所有代码)

要知道 \ 转义符的使用,print(“        ”)括号里只能有一个引号,如果要有多个引号要在引号前加转义符 \,例如print(“    \"  \"    ”)这样就不会出错

void WIFI_config()
{
	printf ("AT\r\n");//会去执行接收中断,执行完之后才会继续下一个代码
	 end_wait(3);
  u2_printf ("1 End wait\r\n");
	
	printf ("AT+CWMODE=1\r\n");//配置WiFi模式
end_wait(3);
  u2_printf ("2 End wait\r\n");
	
	printf ("AT+RST\r\n");//重启
end_wait(3);
  u2_printf ("3 End wait\r\n");
	
	printf("AT+CWJAP=\"%s\",\"%s\"\r\n","aaaa","123456789");//连接WiFi
end_wait(3);
  u2_printf ("5 End wait\r\n");

}

二、esp8266连接阿里云

        2.1先串口调试发送AT指令连接

自己在阿里云创建产品,设备,设备点击查看就知道用户名和密码了

相关AT指令

        2.2通过单片机发送指令连接阿里云

相关代码 

void WIFI_connect_aliyun(void)
{
	printf("AT+CIPSNTPCFG=1,8,\"%s\"\r\n", "ntpl.aliyun.com");
	end_wait(3);
  u2_printf ("4 End wait\r\n");
	
	printf("AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"%s\"\r\n","NULL","esp88266&k14s6MVFIVB","d8fb3900cdb6cd8415042b418ff2171626448bd45e4626465ebbd0b76fce0bc3","");
  end_wait(3);
  u2_printf ("6 End wait\r\n");
	
	printf("AT+MQTTCLIENTID=0,\"%s\"\r\n", "k14s6MVFIVB.esp88266|securemode=2\\,signmethod=hmacsha256\\,timestamp=1713436406272|");
	end_wait(3);
	u2_printf ("7 End wait\r\n");
	
	printf("AT+MQTTCONN=0,\"%s\",1883,1\r\n","iot-06z00bu1jeo8uwc.mqtt.iothub.aliyuncs.com");
	end_wait(3);
	u2_printf ("8 End wait\r\n");
	
	printf("AT+MQTTSUB=0,\"%s\",1\r\n","/k14s6MVFIVB/esp88266/user/get");
	end_wait(3);
	u2_printf ("9 End wait\r\n");
	
	
}

三、单片机成功连接上阿里云后

        3.1发送数据给阿里云

void send_mcu_aliyun(char *wifi_data)
{
	printf("AT+MQTTPUB=0,\"/k14s6MVFIVB/esp88266/user/update\",\"%s\",1,0\r\n", wifi_data); 
	end_wait(3);
	u2_printf ("10 End wait\r\n");
}

        3.2接收云端传来的数据,通过回车换行,能够判断数据是否传输完整

/*			参考整点原子
  云端返回数据的格式: asdfgdghjh...(0x0d)(ox0a)结尾 
*/
u8 USART_RX_BUF[USART_REC_LEN];     
u16 USART_RX_STA=0;      
void judge_receive_end()
{			
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 
}

四、使用

1.显示接收从云端接收到的数据
			for(t=0;t<len;t++)
			{
				USART_SendData(USART2,USART_RX_BUF[t]);
			while (USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待发送结束
			}
2.判断云端数据
if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			if(strstr((const char*)USART_RX_BUF,"on"))
			{
				u2_printf("ture");
			}
3.使用接收函数记得将
USART_RX_STA=0;标志为清零
memset (USART_RX_BUF,0,USART_REC_LEN);上次所得数据清零

五、esp8266.h和esp8266.c,usart.h在另一个文章

#ifndef _WIFI_H
#define _WIFI_H
#include "stm32f10x.h"                 
#include "delay.h"                  
#include "usart.h" 
#include "string.h" 
#define USART_REC_LEN  			200  	//定义最大接收字节数 200
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART_RX_STA;         		//接收状态标记	

void WIFI_config(void);//esp8266连上wifi
void WIFI_connect_aliyun(void);//连接上aliyun
void send_mcu_aliyun(char *wifi_data);//发送数据到云端
void send_dht11_to_aliyun(int t,int h);//发送温湿度数据给阿里云
void end_wait(int t);//等待串口发送后esp8266再返回数据
void judge_receive_end(void);//将云端发来的字符串存在USART_RX_BUF里

#endif

.c

#include "wifi.h"                  // Device header

void WIFI_config()
{
	printf ("AT\r\n");//会去执行接收中断,执行完之后才会继续下一个代码
	 end_wait(3);
  u2_printf ("1 End wait\r\n");
	
	printf ("AT+CWMODE=1\r\n");//配置WiFi模式
end_wait(3);
  u2_printf ("2 End wait\r\n");
	
	printf ("AT+RST\r\n");//重启
end_wait(3);
  u2_printf ("3 End wait\r\n");
	
	printf("AT+CWJAP=\"%s\",\"%s\"\r\n","aaaa","123456789");//连接WiFi
end_wait(3);
  u2_printf ("5 End wait\r\n");

}
void WIFI_connect_aliyun(void)
{
	printf("AT+CIPSNTPCFG=1,8,\"%s\"\r\n", "ntpl.aliyun.com");
	end_wait(3);
  u2_printf ("4 End wait\r\n");
	
	printf("AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"%s\"\r\n","NULL","esp88266&k14s6MVFIVB","d8fb3900cdb6cd8415042b418ff2171626448bd45e4626465ebbd0b76fce0bc3","");
  end_wait(3);
  u2_printf ("6 End wait\r\n");
	
	printf("AT+MQTTCLIENTID=0,\"%s\"\r\n", "k14s6MVFIVB.esp88266|securemode=2\\,signmethod=hmacsha256\\,timestamp=1713436406272|");
	end_wait(3);
	u2_printf ("7 End wait\r\n");
	
	printf("AT+MQTTCONN=0,\"%s\",1883,1\r\n","iot-06z00bu1jeo8uwc.mqtt.iothub.aliyuncs.com");
	end_wait(3);
	u2_printf ("8 End wait\r\n");
	
	printf("AT+MQTTSUB=0,\"%s\",1\r\n","/k14s6MVFIVB/esp88266/user/get");
	end_wait(3);
	u2_printf ("9 End wait\r\n");
	
	
}
void send_mcu_aliyun(char *wifi_data)
{
	printf("AT+MQTTPUB=0,\"/k14s6MVFIVB/esp88266/user/update\",\"%s\",1,0\r\n", wifi_data); 
	end_wait(3);
	u2_printf ("10 End wait\r\n");
}
void send_dht11_to_aliyun(int t,int h)
{
  printf("AT+MQTTPUB=0,\"/k14s6MVFIVB/esp88266/user/update\",\"{\\\"temperature\\\": %d\\\,\\\"humidity\\\": %d}\",1,0\r\n",t,h);
	end_wait(3);
	u2_printf ("11 End wait\r\n");

}


void end_wait(int t)
{	
	int ti=0;
	while(!((USART_GetITStatus(USART1, USART_IT_RXNE) == RESET)&&(ti>t)))//不接收消息3秒后再继续,
	{
		
		delay_ms(1000);
		ti++;
	
	}
}


/*			参考整点原子
  云端返回数据的格式: asdfgdghjh...(0x0d)(ox0a)结尾 
*/
u8 USART_RX_BUF[USART_REC_LEN];     
u16 USART_RX_STA=0;      
void judge_receive_end()
{			
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 
}



### 回答1: 整点原子 HAL库是一个用于MCU(微控制器单元)的开发工具,使开发人员能够更简便地编写和调试硬件相关的代码。下面是整点原子 HAL库开发指南的概要。 整点原子 HAL库的开发指南分为以下几个部分: 1. 简介:这一部分简要介绍了整点原子 HAL库的背景、功能和优势。它解释了为什么使用HAL库以及它如何简化了MCU的开发过程。 2. 环境设置:在这一部分,您将学习如何设置开发环境,包括安装整点原子 HAL库和配置开发工具。它还涵盖了驱动程序和示例代码的安装步骤。 3. HAL库的基本概念:在这一部分,您将了解HAL库的基本概念,例如GPIO(通用输入输出)、定时器、中断和串口通信。它解释了每个概念的作用和如何使用HAL库进行编程。 4. HAL库的使用:这是整个指南的核心部分,详细介绍了HAL库的各种功能和用法。从GPIO的控制到定时器的配置,从中断的处理到串口通信的编程,您将学会如何使用HAL库进行各种操作和任务。 5. 高级主题:这一部分涵盖了一些高级的主题,例如外设接口、功耗管理和RTOS(实时操作系统)的集成。它展示了如何在复杂的项目中使用HAL库,并提供了一些调试技巧和最佳实践。 6. 示例项目:整点原子 HAL库提供了一些示例项目,用于演示各种功能和用法。在这一部分,您将学习如何使用这些示例项目,并将它们作为起点,快速开始自己的项目开发。 整点原子 HAL库开发指南是一个详细而实用的参考资料,可以帮助开发人员快速上手和精通整点原子 HAL库。无论是初学者还是有经验的开发人员,都可以从这个指南中获得帮助,加快MCU开发的速度和效率。 ### 回答2: 整点原子Hal库是一个用于开发原子层面功能的库。它提供了一套丰富的API和工具,帮助开发者更轻松地构建和管理原子的各种操作。 首先,整点原子Hal库提供了一套用于创建和管理原子的API。开发者可以使用这些API来创建、销毁和访问原子。这些API还允许开发者设定原子的状态和属性,并进行原子间的通信和同步操作。整点原子Hal库的API设计友好、易用,让开发者可以快速上手并实现自己的功能。 其次,整点原子Hal库还提供了一些辅助工具,帮助开发者更好地管理原子的资源和性能。开发者可以使用这些工具来监控和调优原子的运行情况,以确保其高效稳定地运行。这些工具还提供了一些诊断功能,可以帮助开发者快速定位和解决原子运行过程中的问题。 此外,整点原子Hal库还支持一些高级功能,如原子的自动回退、事务管理和原子群组等。这些功能可以大大简化开发者的工作,减少编写重复代码的时间和精力。通过整点原子Hal库,开发者可以更加专注于原子的业务逻辑,而无需过多关注底层细节。 总结来说,整点原子Hal库是一个功能强大、易用的开发库,它能帮助开发者快速构建和管理原子的各种操作。无论是构建原子层面的应用还是进行原子层面的研究,整点原子Hal库都是一个不可或缺的工具。希望这个简短的回答对您有所帮助。 ### 回答3: 整点原子(Chrono)是一个用于处理时间和日期的库,支持精确的时间测量和操作。它是C++11标准库中的一部分,并且还提供了额外的功能和功能。 整点原子库提供了一组丰富的类和函数,用于表示和操作时间和日期。它具有高度的精度,并且可以进行各种计算和转换。它可以处理从纳秒到天的时间范围,并且可以在不同的时区之间进行转换。 使用整点原子库开发应用程序时,首先需要包含头文件,并根据需要使用命名空间。然后,可以使用该库提供的类和函数来创建、操作和计算时间和日期。 整点原子库中的一个重要类是std::chrono::system_clock,它提供了和系统相关的时钟时间。可以使用它来获取当前的系统时间,并进行相应的操作和计算。另一个重要的类是std::chrono::duration,用于表示时间间隔,例如一秒或一小时。通过使用这些类,可以对时间进行计算和测量。 整点原子库还提供了一些方便的函数来进行日期和时间的格式化,比如从字符串中解析日期和时间,或将日期和时间格式化为字符串。 总结来说,整点原子是一个功能强大的时间和日期库,它提供了丰富的功能和灵活性。通过使用这个库,可以轻松地处理和操作时间和日期,并进行各种计算和转换。无论是开发桌面应用程序还是嵌入式系统,整点原子都是一个非常有用的工具。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值