esp8266学习记录

news2024/11/17 8:40:47

前言

本文主要介绍了esp8266固件的烧写和基本AT指令,然后结合stm32开发板实现三个实验。分别是手机远程控制开发板LED;开发板温度传感器数据和光强上传到云平台实时监控;从云平台获取数据来控制开发板板载资源。每个实验我都保留了工程源和效果演示视频,有需要的可以参考。

一:硬件平台基本介绍

esp8266我选用的是下面这款

相关管脚介绍

3V3接3.3V电源
RX接其他串口的TX
RSTESP8266复位管脚
IO0GPIO0 为高电平代表从 FLASH 启动, GPIO0 为低电平代表进入系
统升级状态,此时可以经过串口升级内部固件。
EN使能管脚,高电平有效
IO2此管脚为 ESP8266 引出的一个 IO 口
TX接其他串口的RX
GND接地

开发板我就是用我大二时候买的普中玄武开发板,其实其他开发板芯片带串口就好,开发板我就主要用到了两个串口,一个和esp8266通信,另一个接PC的串口调试助手来打印一些调试信息。

  

二:esp8266烧录固件和测试

esp8266模块我是从普中那买的,他们提供了烧录工具和一些文档资料,具体的资料连接在下方。

普中科技--各型号产品资料下载链接 - STM8单片机 - 普中开源电子分享网 - Powered by Discuz! (prechin.net)

 先将esp8266模块和一块有串口的开发板进行连线

esp8266开发板
3V33V3
RXUTXD
IO0GND
EN3V3
TXURXD
GDNGND

 实物图如下:

然后根据资料,找到固件烧写软件。一些出厂就已经烧好了,可以发送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物联网的过程,希望对你有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[AJAX]原生AJAX——自定义请求头

客户端 <script>// 1、创建对象const xhr new XMLHttpRequest();// 2、初始化&#xff1a;设置请求类型和urlxhr.open(POST, http://127.0.0.1:8000/server);// 设置请求头// Content-Type&#xff1a;设置请求体内容类型// application/x-www-form-urlencoded&#xf…

分布式服务一篇概览

分布式服务开发复杂于服务间交互&#xff0c;协调&#xff0c;治理等。服务的复杂性由应用本身转移到了网络交互层。 一、关于12-factor问题 在开发分布式服务时&#xff0c;我们通常会考虑如12-factor 问题&#xff0c;如配置中心、无状态化、日志等。 一个代码库&#xff…

数通王国历险记之地址分析协议(ARP)

系列文章目录 数通王国历险记&#xff08;4&#xff09; 目录 前言 一&#xff0c;什么是地址解析协议&#xff08;ARP&#xff09; 二&#xff0c;封装和解封装 三&#xff0c;为什么需要地址解析协议&#xff08;ARP&#xff09; 四&#xff0c;ARP的验证实验 4.1&#x…

线程池ThreadPoolExecutor详解以及多种线程池的实现

1、线程池状态含义 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态&#xff0c;低 29 位表示线程数量&#xff0c;之所以将信息存储在一个变量中&#xff0c;是为了保证原子性。 具体的高三位与线程池状态如下&#xff0c;引用自网课的图片&#xff1a; 2、构…

【数据库编程】最新版MySQL的JDBC编程(图文演示)

数据库系列文章 1. 零基础带你快速上手SQL语言 2. 玩转表及其数据 3. 上手表设计 4. 索引和事务 5. 最新版MySQL的JDBC编程 文章目录 前言1. 数据库编程的必备条件2. Java的JDBC编程3. JDBC工作原理3.1 数据库驱动包从哪里来 4. JDBC编程4.1 创建 Java 项目4.2 导入数据库驱动包…

使用wkhtmltopdf实现HTML转PDF

wkhtmltopdf注意事项 1.webkit内核的&#xff0c;所以建议使用之前用谷歌浏览器开发好网页 2.目前这个插件不再更新&#xff0c;所以内核老旧&#xff0c;只支持ES5的代码&#xff0c;所以ES6及以上的代码统统不支持&#xff0c;还有字符串拼接的 符号也不能使用&#xff0c…

JMeter录制HTTPS脚本解决办法

目录 前言&#xff1a; 背景 解决方法 前言&#xff1a; 在使用JMeter录制HTTPS脚本时&#xff0c;可能会遇到一些问题&#xff0c;例如SSL证书错误或请求失败等。解决这些问题的一种常见的方法是通过安装并信任服务器的SSL证书来解决。 背景 在对某项目进行脚本录制的时…

银河麒麟服务器v10 sp1 部署 Net6.0 项目

上一篇已经部署了Net6.0环境&#xff0c;本节将实现Net6.0程序部署&#xff0c;打开或新建项目&#xff0c;修改appsettings.json配置&#xff1a; 添加&#xff1a;"urls": "http://*:8061",//linux部署使用&#xff0c;端口可根据需求修改为自己的 在项…

快速幂与64位整数乘法(位运算)

矩阵快速幂和64位整数乘法 矩阵快速幂64位整数乘法 矩阵快速幂 问题链接&#xff1a; AcWing 90. 64位整数乘法 问题描述&#xff1a; 分析 快速幂需要用到位运算的思想&#xff0c;求 a b a^b ab&#xff0c;我们将 b b b转换成二进制的形式&#xff0c;假设 b 7 b7 b7&…

GB50254-2014电气装置安装工程低压电器施工及验收规范

为保证低压电器的安装质量,促进施工安装技术进步&#xff0c;确保设备安装后的安全运行,制定本规范。 本规范适用于交流 50Hz或60Hz额定电压为 1000V 及以下&#xff0c;直流额定电压为 1500V 及以下通用低压电器的安装与验收。不适用于: 1、无需固定安装的家用电器、电工仪器…

数据结构第一章 绪论——走进数据的世界

名人说&#xff1a;唯一可以确定的是&#xff0c;明天会使我们所有人大吃一惊。——阿尔文托夫勒 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; ✔ 课件资料及视频课程学习&#xff1a;王道 数据结构&#xff08…

哪家好用?四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk

一、前言 远程桌面软件对于职场人来说并不陌生&#xff0c;可以说是必备的办公软件之一。在经历过新冠疫情后&#xff0c;大家对于远程办公的认识越来越深入&#xff0c;也就在这段期间&#xff0c;远程桌面软件大范围的应用起来&#xff0c;真正走进大众视野并融入我们的工作和…

探索RabbitMQ的特色功能:释放RabbitMQ尖端特性的潜力

d1、简介 RabbitMQ 是一个功能强大的开源消息中间件&#xff0c;采用 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议来实现可靠的消息传递。它提供了可靠性、灵活性和可扩展性&#xff0c;被广泛应用于分布式系统、微服务架构和异步通信等场景。本文将介…

前台-GoEasy即时通讯

1.先去GoEasy官网下载源码 第一步 App.vue <script setup lang"ts">import { watch, ref, markRaw, reactive, nextTick, provide, InjectionKey } from vueimport headerIndex from /Layout/header/headerIndex.vueimport purchaseHeaderBig from /Layout/hea…

OpenCV(Mat类)

目录 1、什么是Mat类 2、Mat类组成 3、Mat类能存储的数据类型 4.Mat类的创建 4.1 利用矩阵宽、高和类型参数创建 4.2 利用矩阵Size()结构和数据类型参数来创建 4.3 利用已有Mat类来创建 5、Mat类的赋值 5.1 创建时赋值 5.2 类方法赋值 5.3 枚举赋值 6、Mat类数据的读取 …

【Linux】Redis 集群部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Redis 集群部署 Redis 主从复制主从复制的作用主从复制的流程搭建Redis 主从复制安装 Redis修改 Redis 配置文件&#xff08;Master节点操作&#xff09;修改 Redis 配置文件…

基于redhat发行版mysql8.0的卸载与重装mysql5.7

文章目录 一、软件的选择与下载二、卸载mysql8.01.查看my.cnf中的部署信息2.卸载mysql8.03.卸载完毕安装包后删除相关数据 三、mysql5.7的安装1.解压安装包2.初始化mysql数据库3.修改root密码 四、安装mysql5.7客户端附&#xff1a;创建数据库以及用户 本次案例是卸载mysql8.0然…

Michael.W基于Foundry精读Openzeppelin第1期——Address.sol

Michael.W基于Foundry精读Openzeppelin第1期——Address.sol 0. 版本0.1 Address.sol 1. 目标合约2. 代码精读2.1 isContract(address)2.2 sendValue(address, uint256)2.3 functionCall(address, bytes memory) && functionCall( address, bytes memory, string memor…

JavaSE基础(上)

目录 第一章 java入门 环境配置 常用cmd命令 打开cmd 安装JDK&#xff1a;Java工具包 IDEA 1 IDEA概述&#xff08;1&#xff09;IDEA概述&#xff1a;IDEA全称IntelliJ IDEA&#xff0c;是用于Java语言开发的集成环境&#xff0c;是业界公认的目前用于Java程序开发最…

ABeam News | 乘云而上,扬帆起航——ABeam Consulting 2023 RISE+BTP私享会圆满落幕

当今中国&#xff0c;数字经济大潮风起云涌&#xff0c;数字化转型已经成为企业发展的“必修课”。对于企业来说&#xff0c;如何在数字化浪潮中奋楫扬帆&#xff0c;借助技术和管理手段助力企业“提质、降本、增效”&#xff0c;成为发展中所亟待解决的问题。 6月1日&#xf…