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个引脚

STM32F103C8T6ATK-ESP8266
5VVCC
GNDGND
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的连接关系

STM32F103C8T6USB-TTL
PA9(USART1_TX)RXD
PA10(USART1_RX)TXD
GNDGND
在这里我们不需要接USB-TTL的5V

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

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

3.原子云设置

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

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

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

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

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

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

4.WiFi代码部分

由于目前博主的项目还没有完善,暂时项目源码不会给出来,后面完善之后在放出源码,这里只给出WiFi部分的相关例程代码,希望能给大家一些启发。

首先是ESP8266配置

printf ( "\r\n正在配置 ESP8266 ......\r\n" );
    //1、向模块发送测试指令 AT
ESP8266_AT_Test ();
    //2、设置模块模式为STA模式 AT+CWMODE=1
ESP8266_Net_Mode_Choose ( STA );
    //3、设置要连接路由器的 ID 和密码  
while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );
    //4、连接原子云 发送设备编号和密码  
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连接原子云,其中可能有讲的不好的,甚至讲错的地方,希望大家理解,因为博主也是学生党一枚,因为做毕业设计所以才接触这个模块没多久(轻点喷)。有许多大神都讲得比我好,我也参考过许多大神的文章,确实感觉自己有许多不足,这里只是给大家分享一下我的经验,也是我本人第一次写文章,不足之处多见谅。(如有侵权,请在评论区留言,会马上删除)。

由于某些同学将无偿给代码当成我应做之事,所以今日起(2022.4.24)代码不再无偿分享
需要例程代码私聊发送

视频讲解请看B站:
https://www.bilibili.com/video/BV165411f7CT?spm_id_from=333.999.0.0

您好!要将ATK-ESP8266连接原子,您可以按照以下步骤进行操作: 1. 首先,确保您已经在原子上创建了一个账户,并且已经创建了一个设备。 2. 在ATK-ESP8266上,您需要使用Arduino IDE或类似的开发环境来编写和上传代码。确保您已经安装了适当的驱动程序和库。 3. 在代码中,您需要使用ESP8266WiFi库来连接到Wi-Fi网络。您可以使用以下代码片段作为起点: ```cpp #include <ESP8266WiFi.h> const char* ssid = "Your_WiFi_SSID"; const char* password = "Your_WiFi_Password"; void setup() { Serial.begin(9600); delay(10); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { // Your code here } ``` 请将 "Your_WiFi_SSID" 替换为您的Wi-Fi网络名称,将 "Your_WiFi_Password" 替换为您的Wi-Fi密码。 4. 编译并上传代码到ATK-ESP8266。确保ATK-ESP8266已经连接到计算机,并选择正确的端口和开发板类型。 5. 在原子上,找到您创建的设备,并获取设备的设备ID和访问密钥。 6. 在代码中,您需要使用MQTT库来连接原子,并将数据发布到设备。您可以使用以下代码片段作为参考: ```cpp #include <PubSubClient.h> const char* mqtt_server = "mqtt.atomiot.com"; const int mqtt_port = 1883; const char* device_id = "Your_Device_ID"; const char* access_key = "Your_Access_Key"; WiFiClient espClient; PubSubClient client(espClient); void setup() { // ... client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); while (!client.connected()) { if (client.connect(device_id, access_key, "")) { Serial.println("Connected to Atom IoT Cloud"); } else { Serial.print("Failed to connect to Atom IoT Cloud, rc="); Serial.print(client.state()); Serial.println(" retrying in 5 seconds"); delay(5000); } } // ... } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // Your code here } void callback(char* topic, byte* payload, unsigned int length) { // Handle incoming messages } void reconnect() { while (!client.connected()) { if (client.connect(device_id, access_key, "")) { Serial.println("Connected to Atom IoT Cloud"); } else { Serial.print("Failed to connect to Atom IoT Cloud, rc="); Serial.print(client.state()); Serial.println(" retrying in 5 seconds"); delay(5000); } } } ``` 请将 "Your_Device_ID" 替换为您的设备ID,将 "Your_Access_Key" 替换为您的设备访问密钥。 7. 编译并上传代码到ATK-ESP8266。 完成上述步骤后,您的ATK-ESP8266应该能够连接原子,并可以通过MQTT协议与其通信。您可以根据需要在 `loop()` 函数中添加更多的代码来处理传感器数据或执行其他操作。
评论 124
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值