前言
本文主要介绍了esp8266固件的烧写和基本AT指令,然后结合stm32开发板实现三个实验。分别是手机远程控制开发板LED;开发板温度传感器数据和光强上传到云平台实时监控;从云平台获取数据来控制开发板板载资源。每个实验我都保留了工程源和效果演示视频,有需要的可以参考。
一:硬件平台基本介绍
esp8266我选用的是下面这款
相关管脚介绍
3V3 | 接3.3V电源 |
RX | 接其他串口的TX |
RST | ESP8266复位管脚 |
IO0 | GPIO0 为高电平代表从 FLASH 启动, GPIO0 为低电平代表进入系 统升级状态,此时可以经过串口升级内部固件。 |
EN | 使能管脚,高电平有效 |
IO2 | 此管脚为 ESP8266 引出的一个 IO 口 |
TX | 接其他串口的RX |
GND | 接地 |
开发板我就是用我大二时候买的普中玄武开发板,其实其他开发板芯片带串口就好,开发板我就主要用到了两个串口,一个和esp8266通信,另一个接PC的串口调试助手来打印一些调试信息。
二:esp8266烧录固件和测试
esp8266模块我是从普中那买的,他们提供了烧录工具和一些文档资料,具体的资料连接在下方。
普中科技--各型号产品资料下载链接 - STM8单片机 - 普中开源电子分享网 - Powered by Discuz! (prechin.net)
先将esp8266模块和一块有串口的开发板进行连线
esp8266 | 开发板 |
3V3 | 3V3 |
RX | UTXD |
IO0 | GND |
EN | 3V3 |
TX | URXD |
GDN | GND |
实物图如下:
然后根据资料,找到固件烧写软件。一些出厂就已经烧好了,可以发送AT指令来查看是否有应答,我的没有就重新烧写了一遍。
到配置选项卡下更改要烧写的固件
回到操作选项卡,选择好串口之后就可以点击烧写,进度条会变化
烧写成功后的界面
烧写成功之后可以使用串口调试发AT指令进行测试,这时要将IO0置为高电平,串口的波特率是9600。
发送AT之后可以正常返回OK,这时固件就已近成功烧录进去了。
三:单连接TCP client
首先我没有先直接写代码通过32串口来控制esp8266,我先直接使用串口调试助手给esp8266发送AT指令。
我笔记本连接路由器得到的ip,此时笔记本做服务器
在网络调试助手也选择这个ip
使用AT+CIPSTART="TCP", "192.168.10.46", 8080指令,成功将esp8266和电脑成功连接
AT+CIPSTATUS查看连接状态
使用AT+CIPSEND=5设置要传送数据的长度,esp8266(client)发送数据,网络调试助手(server)成功接收
TCP Server发送数据,esp8266成功接收
AT+CIPMODE=1,切换到透明传输模式
透传,即透明传输功能。Host 通过 uart 将数据发给 ESP8266,ESP8266 再通过无线网络将数据传出去;ESP8266 通过无线网络接收到的数据,同理通过uart 传到 Host。ESP8266 只负责将数据传到目标地址,不对数据进行处理,发送方和接收方的数据内容、长度完全一致,传输过程就好像透明一样
在透传发送数据过程中,若识别到单独的⼀一包数据 “ +++ ”,则退出透传发送
使用AT+CIPCLOSE断开TCP连接
四:esp8266作为TCP Server
此时esp8266工作在AP模式下,即类似于一个路由器,其他设备可以通过wifi进行连接
此时通过网络调试助手连接到esp8266之前要先连上esp8266产生的wifi,要不然会无法连接
手机端连接方式
手机电脑连接是要先断开已近连上的无线局域网,要先连上esp8266产生的wifi
手机连接esp8266之后,查看连接状态
AT+ CIPSTATUS命令解释
五:手机通过esp8266远程控制开发板板载资源
整体思路:esp8266工作在AP模式下(相当于一个路由器),然后手机连接到相应wifi,使得esp8266和手机在同一个网段内,可以网络通信。手机通过TCP软件给esp8266发送信息,esp8266接收到不同的信息然后通过串口和32进行通信,使得32根据串口接收到不同的信息来控制LED的亮灭。
开发板主控是stm32f103zet6,我使用的是USART2,PA2是TX,PA3是RX
这里我就是通过手机发送字符'a'控制LED0电平翻转,发送字符'b'来控制LED1电平翻转。
效果如下
手机通过esp8266来控制开发板板载资源
esp8266.h代码如下
#ifndef _ESP8266_H
#define _ESP8266_H
#include "./SYSTEM/sys/sys.h"
/* 初始化 */
#define USART_TX_PORT GPIOA
#define USART_TX_PIN GPIO_PIN_2
#define USART_TX_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */
#define USART_RX_PORT GPIOA
#define USART_RX_PIN GPIO_PIN_3
#define USART_RX_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */
#define USART_ESP8266 USART2
#define USART_ESP8266_IRQn USART2_IRQn
#define USART_ESP8266_IRQHandler USART2_IRQHandler
#define USART_ESP8266_CLK_ENABLE() do{ __HAL_RCC_USART2_CLK_ENABLE(); }while(0) /* USART2 时钟使能 */
void usart_esp8266_init(uint32_t baudrate);
#endif
esp8266.c代码如下
#include "./BSP/ESP8266/esp8266.h"
#include "./BSP/LED/led.h"
#include <string.h>
#include "./SYSTEM/delay/delay.h"
UART_HandleTypeDef g_uart2_handle;
uint8_t esp8266_rx_buffer[1] = {0};
void usart_esp8266_init(uint32_t baudrate)
{
/*UART 初始化设置*/
g_uart2_handle.Instance = USART_ESP8266; /* USART_UX */
g_uart2_handle.Init.BaudRate = baudrate; /* 波特率 */
g_uart2_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */
g_uart2_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */
g_uart2_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */
g_uart2_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */
g_uart2_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */
HAL_UART_Init(&g_uart2_handle);
/* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */
HAL_UART_Receive_IT(&g_uart2_handle, (uint8_t *)esp8266_rx_buffer, 1);
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if (huart->Instance == USART_ESP8266)
{
USART_TX_CLK_ENABLE();
USART_RX_CLK_ENABLE();
USART_ESP8266_CLK_ENABLE();
gpio_init_struct.Pin = USART_TX_PIN;
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
gpio_init_struct.Pull = GPIO_PULLUP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(USART_TX_PORT, &gpio_init_struct);
gpio_init_struct.Pin = USART_RX_PIN;
gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;
HAL_GPIO_Init(USART_RX_PORT, &gpio_init_struct);
HAL_NVIC_EnableIRQ(USART_ESP8266_IRQn);
//HAL_NVIC_SetPriority(USART_ESP8266_IRQn, 3, 3);
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART_ESP8266){
if(esp8266_rx_buffer[0] == 'a'){
LED0_TOGGLE();
}
else if(esp8266_rx_buffer[0] == 'b'){
LED1_TOGGLE();
}
}
}
void USART_ESP8266_IRQHandler(void)
{
HAL_UART_IRQHandler(&g_uart2_handle); /* 调用HAL库中断处理公用函数 */
while (HAL_UART_Receive_IT(&g_uart2_handle, (uint8_t *)esp8266_rx_buffer, 1) != HAL_OK) /* 重新开启中断并接收数据 */
{
/* 如果出错会卡死在这里 */
}
}
串口相关弄完之后,在通信之前要先对esp8266的工作模式进行设置,发送一些AT指令
将esp8266设置成TCP Server需要三步
1:AT+CWMODE=3
2:AT+CIPMUX=1
3:AT+CIPSERVER=1
在初始化esp8266之后可以发送这些指令,发送完一个的时候要记得加回车换行
笔记本连接esp8266的wifi使用网络调试助手也可以实现相同的效果
工程的完整代码在下方链接
门牙会稍息 / 手机通过esp8266控制开发板板载LED · GitCode
六:ESP8266连接OneNet云平台
首先要在OneNet云平台新建一个产品和设备,这个的操作可以查看其他的博客,这里就不细说了。
下面列举了esp8266和云平台之间进行数据交换前的AT指令和POST、GET报文,大家可以按照自己产品和设备的情况进行修改。
AT+CWMODE=3 ---设置esp8266工作在ap和station模式下
AT+CWJAP="D","aaaaaaaa" ---将esp8266加入到自家网络中
AT+CIPSTART="TCP","183.230.40.33",80 ---使用TCP远程连接到OneNet,端口号是80
AT+CIPMODE=1 ---使能透明传输
AT+CIPSEND ---开始发送
POST /devices/1104114893/datapoints?type=3 HTTP/1.1
api-key:FZK8hHp5JDWnXxjW9r2L8FoX4zc=
Host:api.heclouds.com
Content-Length:21
{"temp":89}
---1104114893是设备号,apikey就是Master-APIkey,POST是将数据传送到OneNet
GET /devices/1104114893/datastreams/temp HTTP/1.1
api-key:FZK8hHp5JDWnXxjW9r2L8FoX4zc=
Host: api.heclouds.com
Connection:close
---GET获取数据流
POST成功将温度数据发送到OneNet云平台
GET成功从OneNet得到数据流数据
补充:http协议数据格式
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议。它使用TCP/IP作为传输协议,通过客户端和服务器之间的请求和响应来进行通信。
1. 请求行:包含请求方法、请求的URL和HTTP协议的版本。例如:GET /index.html HTTP/1.1
2. 请求头:包含一些附加的信息,如请求的主机、用户代理、内容类型等。每个头字段都以键值对的形式出现,用冒号分隔。例如:Host: www.example.com
3. 空行:请求头和请求体之间需要有一个空行。
4. 请求体:可选的,用于传输请求的数据,如表单数据、文件等。
5. 响应行:包含响应的状态码和状态消息。例如:HTTP/1.1 200 OK
6. 响应头:与请求头类似,包含一些附加的信息,如服务器类型、内容长度、响应时间等。
7. 空行:响应头和响应体之间需要有一个空行。
8. 响应体:包含服务器返回的数据,如HTML页面、图片、JSON数据等。
以上是HTTP协议的基本数据格式,不同的请求和响应可能会有不同的头字段和数据内容
OneNet云平台成功接收到数据
发送多个数据后可以看到
将数据传送到云平台并实时监控
七:OneNet中可视化项目构建
具体操作可以直接到OneNet试一下,很快就可以上手
下面这个可视化界面有温度数据和光强数据,下面按钮添加控制板载蜂鸣器
八:32开发板+esp8266+OneNet云平台三个工程代码
工程一:esp8266从OneNet云平台数据流读温度数据,若温度低于50,就会声光报警
门牙会稍息 / esp8266-beep-OneNet · GitCode
工程二:本工程先通过串口给esp8266发送AT指令进行相关配置,然后将ds18b20采集到的温度数据通过串口先发送给esp8266,最后再通过esp8266发送到OneNet云平台,可以实时监控温度变化,当成功发送数据之后,esp8266会返回数据,LED1会闪烁进行提示。
门牙会稍息 / esp8266-ds18b20-OneNet · GitCode
工程三:和工程二几乎一样,就是将温度改成了光强
门牙会稍息 / esp8266-light-OneNet · GitCode
具体的介绍可以到仓库去看,每个工程都有视频效果演示。这几个工程主要实现了esp8266和OneNet云平台交换数据,知道了怎么发数据和读数据,之后还想添加其他的功能就和esp8266没什么关系了,大家可以添加自己想要的功能和效果。
总结
以上就是本文的全部内容了,主要记录了这几天学习esp8266物联网的过程,希望对你有帮助。