STM32F103C8T6+ATK-ESP8266连接原子云


前言

最近在做毕业设计,题目是关于STM32的一个智能电梯控制系统,其中用到了WiFi模块。我最开始使用的是ESP8266-01S这款模块去连接onenet、天工、阿里云这些,但都以失败告终。但在博主的不懈努力下(其实愁坏了),最后找到了正点原子的这款ATK-ESP8266模块成功连接了原子云并实现了远程控制功能。

所以在这里呢也是给大家分享一下博主的连云过程,也算是记录一下,以免后来自己忘了怎么连的了。
本文视频教程参见B站:
https://www.bilibili.com/video/BV165411f7CT?spm_id_from=333.999.0.0
相关软件例程代码我会放在文章末尾


提示:以下是本篇文章正文内容,下面案例可供参考

一、原子云是什么?

原子云是正点原子推出的一款物联网云平台,我个人觉得要比其他的云平台稍微好用一点,使用起来不那么复杂,连接简单,对于小白来说及其友好。并且原子哥官方也会有一定的技术支持(有一说一,原子哥不愧是原子哥,真不是吹的,属实好用,真香)。

二、如何实现远程控制?

其实远程控制对于许多小白来说是一个很难的功能,感觉很“高大上”,其实不然。
远程控制常见的无非蓝牙控制和WiFi控制,蓝牙控制没有什么好说的,距离有限,难度也不大。我们这里主要讲述WiFi控制。
WiFi控制顾名思义,通过WiFi来实现远程控制我们的设备。要实现远程控制,那么首先我们就需要知道WiFi模块的三种模式:

1、AP模式(无线接入点)
AP模式就是WiFi模块自己成为一个热点,此时他就像是一个服务器(server),能够让手机、电脑等设备连入,组成一个局域网。
!!!注意是手机主动去连接模块。

2、STA模式(无线终端)
STA(Station)模式的ESP8266就像是一个客户端(client)他可以去连接手机的热点或者其他的WiFi。
!!!注意是模块主动去连接WiFi。

3、STA+AP模式(共存)
共存,指的是既可以通过路由器连接到互联网,也可以作为一个热点被其它设备连接,从而实现广域网和局域网的无缝切换。

那么在本文例程中,我们主要使用STA模式,因为我们需要让模块接入互联网上云。
具体的远程控制见下图:
移动端控制ATK-ESP8266模块当我们远程控制时,我们需要通过原子云demo发送数据到原子云服务器,原子云服务器接收数据之后再下发给ATK-ESP8266模块。同样,接收来自ATK-ESP8266模块的消息时,我们也需要将数据从ATK-ESP8266发送至原子云服务器,再由原子云服务器下发到我们的移动端上。

三、具体步骤

1.硬件准备

1、ATK-ESP8266
2、STM32F103C8T6
3、USB-TLL(调试信息打印)
4、蜂鸣器(模拟执行机构)
5、杜邦线若干
6、STLINK
ATK-ESP8266上面是正点原子的ATK-ESP8266模块。

USB-TTL
这是USB-TTL,主要用于调试信息的打印。

2.总体连线

ATK-ESP8266与STM32F103C8T6的连接关系
只需用到模块的4个引脚

STM32F103C8T6 ATK-ESP8266
5V VCC
GND GND
PB11(USART3_RX) TXD
PB10(USART3_TX) RXD

ATK-ESP8266的RST引脚与IO-0引脚默认高电平,可以不接。
RST引脚是复位引脚,如果需要软件复位的话,可以接上,将其拉低即可。
IO-0引脚是烧写固件时使用的,烧写时将其拉低。
VCC引脚我问过官方的技术支持,他们说3.3V也可以给模块供电,但是我个人建议用5V供电。
串口一定要反接,模块的TX接单片机RX,模块的RX接单片机的TX。

USB-TTL与STM32F103C8T6的连接关系

STM32F103C8T6 USB-TTL
PA9(USART1_TX) RXD
PA10(USART1_RX) TXD
GND GND

在这里我们不需要接USB-TTL的5V

单片机使用串口3来通过WiFi模块与云端进行收发数据,使用串口1来输出调试信息。

下面是总体连线图
总体连线图

3.原子云设置

首先我们进入原子云 https://cloud.alientek.com/ ,没有账号的需要先注册一个账号。

注册好之后就进入了以下页面,我们首先点击设备管理注册一个设备。
在这里插入图片描述

点击新增设备选择ESP8266
在这里插入图片描述

设备名称随便输入
在这里插入图片描述

创建好设备之后就像下面一样,记住这个编号,后面会用到。可以看到现在状态是断开的。
在这里插入图片描述

创建好设备之后,我们需要再创建一个分组。
我们点击分组管理,选择创建分组,分组名称自己填写
在这里插入图片描述
然后我们还需要将我们创建好的设备添加进分组,刚创建好的分组,设备数量是0个,当我们把设备添加进分组之后,设备数量会变成1,如下图:
在这里插入图片描述
在这里插入图片描述
最后,我们点击账号信息,记住这个API,这是我们登录原子云demo的”账号密码“
在这里插入图片描述
至此,云端的设置就大功告成了!

4.WiFi代码部分

由于目前博主的项目还没有完善,暂时项目源码不会给出来,后面完善之后在放出源码,这里只给出WiFi部分的相关例程代码,希望能给大家一些启发。
WiFi部分代码也可参考这位嵌入式@hxydj博主的博客。这位博主的博客给了我非常大的启发,非常感谢这位博主。

首先是ESP8266配置

printf ( "\r\n正在配置 ESP8266 ......\r\n" );
    //1、向模块发送测试指令 AT
ESP8266_AT_Test ();
    //2、设置模块模式为STA模式 AT+CWMODE=1
ESP8266_Net_Mode_Choose ( STA );
    //3、设置要连接路由器的 ID 和密码  AT+CWJAP=“HUAWEI_nova_3”,”yl2000420”
while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );
    //4、连接原子云 发送设备编号和密码  AT+ATKCLDSTA="74483614072935543578","12345678"
while ( ! ESP8266_ConnectYuanziyun ( yuanziyun_DeviceID, yuanziyun_DevicePassWord ) );

printf ( "\r\n配置 ESP8266 完毕\r\n" );

AT指令测试函数,这个函数将发送AT指令到ATK-ESP8266模块,看是否能接收到回复。

/*
 * 函数名:ESP8266_AT_Test
 * 描述  :对WF-ESP8266模块进行AT测试启动
 * 输入  :无
 * 返回  : 无
 * 调用  :被外部调用
 */
void ESP8266_AT_Test ( void )
{
    char count = 0;

    macESP8266_RST_HIGH_LEVEL();
    Delay_ms ( 1000 );
    while ( count < 10 )
    {
        if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return;				//如果接收到模块返回的OK指令,就直接返回
        ESP8266_Rst();																						//否则复位模块,重新发送AT测试指令
        ++ count;
    }
}

设置ATK-ESP8266模式为STA模式

/*
 * 函数名:ESP8266_Net_Mode_Choose
 * 描述  :选择WF-ESP8266模块的工作模式
 * 输入  :enumMode,工作模式
 * 返回  : 1,选择成功
 *         0,选择失败
 * 调用  :被外部调用
 */
bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{
    switch ( enumMode )
    {
    case STA:
        return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 );
    case AP:
        return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 );
    case STA_AP:
        return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 );
    default:
        return false;
    }
}

ATK-ESP8266模块连接热点

/*
 * 函数名:ESP8266_JoinAP
 * 描述  :WF-ESP8266模块连接外部WiFi
 * 输入  :pSSID,WiFi名称字符串
 *       :pPassWord,WiFi密码字符串
 * 返回  : 1,连接成功
 *         0,连接失败
 * 调用  :被外部调用
 */
bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
    char cCmd [120];
    sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
    return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );
}

ATK-ESP8266模块连接原子云

/*
 * ESP8266_ConnectYuanziyun
 * 描述  :WF-ESP8266模块连接原子云
 * 输入  :pSSID,原子云上设备ID
 *       :pPassWord,原子云上设备密码
 * 返回  : 1,连接成功
 *         0,连接失败
 * 调用  :被外部调用
 */
bool ESP8266_ConnectYuanziyun ( char * pSSID, char * pPassWord )
{
    char cCmd [120];
    sprintf ( cCmd, "AT+ATKCLDSTA=\"%s\",\"%s\"", pSSID, pPassWord );
    return ESP8266_Cmd ( cCmd, "OK", "CONNECTED", 5000 );
}

以上是ATK-ESP8266模块配置部分,下面是数据收发部分

while ( 1 )
{
	sprintf ( cStr, "\r\nNow Floor:1 \r\n");
    printf ( "%s", cStr );                                             //打印数据
    ESP8266_SendString ( ENABLE, cStr, 0, Single_ID_0 );               //通过透传模式 发送信息到原子云
    Delay_ms ( 1500 );
    if ( strEsp8266_Fram_Record .InfBit .FramFinishFlag )
    {
		USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, DISABLE ); //禁用串口接收中断
		strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';		//接收到的数据末尾添加结束符

		printf ( "\r\n%s\r\n", strEsp8266_Fram_Record .Data_RX_BUF );										//调试口打印接收到的数据
//strstr是C语言中的函数,作用是返回字符串中首次出现子串的地址。
// 若接收到的字符串中包含字符串  "1" 蜂鸣器响一次
	if ( ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "1" ) ) != 0 )
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_11);
		Delay_ms ( 500 );
		GPIO_ResetBits(GPIOA,GPIO_Pin_11);
	}
// 若接收到的字符串中包含字符串  "2" 蜂鸣器响两次
	else if ( ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "2" ) ) != 0 )
	{
		for(i = 0 ; i < 2 ; i++)
		{
            GPIO_SetBits(GPIOA,GPIO_Pin_11);
			Delay_ms ( 500 );
            GPIO_ResetBits(GPIOA,GPIO_Pin_11);
			Delay_ms ( 500 );
		}
	}
            // 若接收到的字符串中包含字符串  "3" 蜂鸣器响三次
	else if ( ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "3" ) ) != 0 )
    {
		for(i = 0 ; i < 3 ; i++)
		{
            GPIO_SetBits(GPIOA,GPIO_Pin_11);
			Delay_ms ( 500 );
            GPIO_ResetBits(GPIOA,GPIO_Pin_11);
			Delay_ms ( 500 );
		}
	}
	strEsp8266_Fram_Record .InfBit .FramLength = 0;
	strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;

	USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断
	} 
}

5.测试部分

ATK-ESP8266模块已经成功上云。

在这里插入图片描述
可以看到,WiFi模块已经能够和原子云进行数据交互了,原子云能够收到来自模块的信息,并且模块也能够收到来自原子云的信息。
在这里插入图片描述

下面我们再来试一试移动端的控制。
移动端我们需要用到原子云demo这个软件,大家可以找官方的技术支持要。我们需要通过原子云demo将数据上传到原子云,原子云在将数据下发到模块,从而实现远程控制。
首先我们打开原子云demo这个软件:
在这里插入图片描述
打开后填入我们前面提到的的API
在这里插入图片描述
点击登录之后就可以进入原子云,并且能够我们创建的设备在线,并且连入了手机热点
在这里插入图片描述
我们点击这个设备,将进入以下界面,然后,我们点击订阅设备消息,将会提示订阅成功,如图:
在这里插入图片描述
至此,我们的手机就能够远程与ATK-ESP8266模块进行数据收发了,下面我们来试一下:
在这里插入图片描述
可以看到,我们通过手机发送“3”,串口输出打印了“3”,说明ATK-ESP8266模块已经成功收到了来自手机的数据并且单片机能够正常处理。同时单片机发送给手机的信息,在APP上也能够正常显示。
说明我们已经基本实现了WiFi远程控制这个功能!
但是这个例程代码在接收数据部分有一个小bug,就是strstr函数是检索子串在字符串中首次出现的位置的,所以即使输入了一些其他的无关字符,但如果包括了你想要的子串,那么仍然会执行相应函数。
因此,要解决这个问题我们只需要将strstr函数更改为字符串比较函数strcmp即可。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了如何使用ATK-ESP8266连接原子云,其中可能有讲的不好的,甚至讲错的地方,希望大家理解,因为博主也是学生党一枚,因为做毕业设计所以才接触这个模块没多久(轻点喷)。有许多大神都讲得比我好,我也参考过许多大神的文章,确实感觉自己有许多不足,这里只是给大家分享一下我的经验,也是我本人第一次写文章,不足之处多见谅。(如有侵权,请在评论区留言,会马上删除)。

下面我会把可能用到的软件与例程代码放出来,有需要的可以自行下载。
https://wws.lanzouo.com/iuWvYz6wb7g
视频讲解请看B站:
https://www.bilibili.com/video/BV165411f7CT?spm_id_from=333.999.0.0

版权声明:本文为CSDN博主「贼大一个猫腻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56620512/article/details/122635279

贼大一个猫腻

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

串口不定长接收

一、保留接收区和开启接收的语句    uint8_t buffer[5];HAL_UART_Transmit_IT(&huart1,buffer,3); 二、写入开启空闲中断的语句    __HAL_UART_ENABLE_IT(&huart

基于STM32单片机的电子密码锁设计

一.硬件方案 本设计采用STM32F103C8T6单片机作为主控芯片,结合外围的矩阵按键输入、LCD1602液晶显示、报警、开锁等电路模块实现开锁、上锁、报警、密码更改等功能,设计了一款可以多次修改密码并且具有报警