【硬件模块】ESP-01SWiFi模块基于AT指令详解(WiFi,TCP/IP,MQTT)

ESP-01S

ESP-01S是由安信可科技开发的一款Wi-Fi模块。其核心处理器是ESP8266,该处理器在较小尺寸的封装中集成了业界领先的Tensilica L106超低功耗32位微型MCU,带有16位精简模式,主频支持80MHz和160MHz,并集成了Wi-Fi MAC/BB/RF/PA/LNA。

ESP-01S具有多种特性和功能:

  • 尺寸小巧,设计紧凑,适用于空间有限的应用。
  • 支持标准的IEEE802.11 b/g/n协议和完整的TCP/IP协议栈,可以方便地与其他设备或网络进行通信。
  • 可以通过路由器连接到互联网,使手机或电脑能够实现对设备的远程控制(STA模式)。
  • 也可以作为热点,使其他设备能够连接到它(AP模式)。
  • 提供了多个可编程的GPIO引脚,可以用于控制外部设备,如传感器和执行器等。

在硬件连接方面,ESP-01S模块需要与主控制器(如Arduino、STM32等)进行连接,通过串行UART接口与主控制器进行数据传输。同时,该模块通常工作在3.3V的电压下,建议使用2节干电池或经过LDO转换后的3.3V进行供电,而不应使用USB转TTL的3.3V或5V进行供电。

在软件方面,初始情况下,ESP-01S通常预装了Espressif提供的AT指令固件,这意味着可以通过发送简单的AT指令来控制模块的Wi-Fi连接和数据传输。此外,用户还可以根据需要进行固件烧录和配置,以满足特定的应用需求。

总的来说,ESP-01S是一款功能强大、易于使用的Wi-Fi模块,适用于各种物联网和智能家居应用,为设备添加联网功能或构建独立的网络控制器提供了方便和灵活的选择。

以上介绍来自文心一言。

上面就是我买的ESP-01S,它的芯片是ESP8266,但是看得出来引脚少的可怜,不过我买的价格是六块。

也就是说如果我们的项目仅仅只是需要联网的话,那么选择ESP-01S的性价比会比直接整一块NodeMCU更高。

使用它的原理跟我们之前的蓝牙模块一样,都是AT指令,也就是通过串口来进行交互。

还有要注意的就是供电问题。

不能用USB转TTL供电,不能用ST-Link供电,不能用STM32供电。

建议用电池供电。

也可以像我一样买个底座。一般卖ESP-01S的店家都会有配件一起卖。

AT指令

ESP8266系列模组出厂自带AT固件,默认波特率为115200。虽然文档里没写其他配置,但是测试之后得出了其他的配置要求:八位数据位,一位停止位,无校验。也是最常见的配置了。

接下来我们直接就拿串口助手来进行AT指令的实验。

串口助手可以上网搜,随便一搜都有,也可以跟着我之前的文章动手敲一个。

200行C++代码写一个QT串口助手-CSDN博客文章浏览阅读1k次,点赞21次,收藏29次。今天分享一个用QT写的串口助手,关键代码会直接在文章的对应位置贴出,完整的工程文件(用的VS 2019)可以进入我的主页免费下载,也可以关注我的公众号“折途想要敲代码” 回复关键词“qt串口助手”免费获取。如果是使用QTCreator的小伙伴在项目配置完毕后可以通过复制我提供的工程文件中的.cpp和.h文件来达到同样的效果。要配置的就是在配置文件中加上串口对应的部分。使用VS的需要再拓展插件中找到模块管理再加上串口的模块。需要包含以下头文件。https://blog.csdn.net/m0_63235356/article/details/135283060?spm=1001.2014.3001.5501有个小问题就是我写这个串口助手的时候没有115200这个选项,因此需要改两个地方来支持115200的波特率。

也可以使用之前实验蓝牙模块的AT指令的时候用的串口助手,那个功能相对齐全一些,虽然是跟蓝牙模块配套的,但是在我们这里也能用。

在安信可的手册里只有很少一部分的AT指令。

提供的网站也打不开(用了魔法也打不开,看来是服务器停了)。

于是我直接杀到ESP-01S的老家——乐鑫,找到了完整版的文档(在线的,跟ESP-IDF的编程指南不一样,这个不需要魔法就可以直接访问)。

基础 AT 命令 — ESP-AT 用户指南 文档 (readthedocs-hosted.com)icon-default.png?t=N7T8https://espressif-docs.readthedocs-hosted.com/projects/esp-at/zh-cn/release-v2.2.0.0_esp8266/AT_Command_Set/Basic_AT_Commands.html

基础AT命令 

基础的AT指令有上面这些,我们挑几个常用的来介绍一下。

需要注意的是不是所有指令都是可以用的。

有一些是ESP32用的。

也有一些是需要额外烧录一些AT固件才能使用的(例如flash)。可以通过发送“指令+?”来判断一些具体的指令能不能用。

测试启动

AT

先来个简单的,直接通过串口发送“AT”,会得到响应“OK”,表示我们的ESP-01S在正常地工作着。

重启命令

AT+RST

发送重启命令,ESP-01S回复OK之后进行重启,重启之后会打印一堆调试信息,可以不用管。

进入休眠

AT+GSLP=<time>

发送命令进入休眠之后可以省电,这一点在嵌入式应用中还是很重要的。过了休眠时间之后又会自动启动,我们也可以通过拉低RST引脚强制唤醒。

我们的ESP-01S用的是8266,因此一次最多只能休眠3个小时,不过硬件层面解决不了的问题可以通过软件解决。

说是说按照毫秒为单位进行休眠,

但是我一旦发送这个命令之后ESP-01S就醒不来了,得手动拉低RST进行重启才行。

大家可以拿自己的模块进行测试,实在不行我们就当没有参数,发送这个命令就是进入睡眠,要拉低RST进行重启才行。

打开关闭回显

ATE0ATE1

回显是什么东西呢,比如说上面的“AT”,ESP-01S回复的应该的“OK”,但是我们收到的却是“AT”和一行空白和“OK”。其中“AT”就是回显,也就是我们发送的命令。

关闭回显之后我们就只会收到响应了。平时应用的时候可以关闭方便接收响应而不需要过滤。

不过后面的演示我们还是打开回显,这样方便对照AT命令。

修改串口配置

一共有两个修改命令。

一个是临时修改,也就是说重启之后又回到默认配置了。

AT+UART_CUR=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>

另一个是直接修改falsh里的默认配置,重启之后也是修改过后的配置了。

AT+UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>

AT+UART_CUR?AT+UART_DEF?

查看当前配置的话就是上面两个命令不加参数,改为加个“?”。

一般不建议修改这个,都是用默认的。

但是以防大家看到这么多参数感到害怕,就小小的演示一下。

其实参数就是用逗号隔开就行。

恢复出厂设置

AT+RESTORE

如果配置了太多想改回去,但是又嫌麻烦的话,可以直接恢复出厂设置。

这个命令直接把flash中保存的参数都删掉。并且会重启ESP-01S。

WiFi命令

WiFi相关的命令有上面这么多,但是常用的就那几个,我们一样是挑着演示。 

查看/设置模式

AT+CWMODE?AT+CWMODE=<mode>[,<auto_connect>]

我们一般是要连接WiFI的,而不是释放热点。

因此我们常用的模式是1(Station)或者3(SoftAP+Station)。

并且默认情况下ESP-01S会帮助我们把连接过的WiFi记录在flash,之后如果还是Station模式就会自动连接。

连接WiFi

AT+CWJAP=[<ssid>],[<pwd>][,<bssid>][,<pci_en>][,<reconn_interval>][,<listen_interval>][,<scan_mode>][,<jap_timeout>][,<pmf>]

这个命令的参数很多,但是我们只需要配置上前两个,WiFi名和密码即可,剩下的都用默认值就行。

确实是可以连接上我的热点。

断开连接

AT+CWQAP

如果我们自动连接上了上次连接过的WiFi,但是这次我们想要换一个WiFi来连接,那么我们可以选择断开连接。

查询STA模式下的MAC/IP地址

AT+CIPSTAMAC?

上面这个是查询MAC地址的。

需要注意的是需要为STA模式,如果是AP模式则是另一个命令。

另一个就是需要先连上网。

下面这个是查询IP地址的。

AT+CIPSTA?

扫描当前可用WiFi

AT+CWLAP

这个命令实际上可以有参数,但是参数太长而且基本上用不上,这里就不贴出来了,感兴趣的小伙伴可以自己去文档里看。

TCP/IP命令

连上了网,我们自然是要通信的。

那么必然是离不开TCP/IP协议栈的。

建立TCP连接

// 单连接 (AT+CIPMUX=0):
AT+CIPSTART=<"type">,<"remote host">,<remote port>[,<keep alive>][,<"local IP">]// 多连接 (AT+CIPMUX=1):
AT+CIPSTART=<link ID>,<"type">,<"remote host">,<remote port>[,<keep alive>][,<"local IP">]

测试发现了一个奇怪的问题。

那就是我尝试连接网络调试助手的TCP服务器的时候死活连不上。

但是乐鑫提供的测试服务器却一下就连上去了。

我的电脑和ESP-01S连的都是我手机的热点,因此不是不在一个局域网的问题。

具体是什么原因我还没有找到,知道的小伙伴可以在评论区分享一下。

断开连接

AT+CIPCLOSE

如果是多连接模式,那么断开连接需要对应的ID号(0~4)。

如果是单连接模式那么不需要参数。

发送数据

// 单连接:(AT+CIPMUX=0)
AT+CIPSEND=<length>// 多连接:(AT+CIPMUX=1)
AT+CIPSEND=<link ID>,<length>// UDP 传输可指定对端主机和端口
AT+CIPSEND=[<link ID>,]<length>[,<"remote host">,<remote port>]

有上面三种发送情况,分别是TCP单连接,TCP多连接,UDP(UDP不需要连接)。

link ID是连接ID号(0~4)。

length是发送数据的长度。

当我们发送完命令,ESP-01S回复OK之后,我们就可以发送数据了。

当数据达到length这个长度之后就会开始发送数据。

查询/设置接收数据模式

AT+CIPRECVMODE?AT+CIPRECVMODE=<mode>

简单来说是分为两种,一种主动,一种被动。

主动模式下,TCP服务器发来数据,ESP-01S马上就会通过串口打印出来。

被动模式下则是需要我们手动去获取。

因为本地的网络调试助手连接不上,无法模拟出服务器发来信息,因此只能连接上乐鑫的测试服务器,等连接久了没有发送任何消息然后断开连接之后接收断开连接的通知。

手动获取接收数据

// 单连接:(AT+CIPMUX=0)
AT+CIPRECVDATA=<len>// 多连接:(AT+CIPMUX=1)
AT+CIPRECVDATA=<link_id>,<len>

查询MAC地址和IP地址

AT+CIFSR

这个命令可以直接获取到MAC地址和IP地址。比上面的命令方便一些。

MQTT命令

重头戏来啦,没想到吧,它居然支持MQTT。

但是问题在于我们需要去烧录MQTT的AT固件,你买来ESP-01S,卖家大概率是不会给你烧好的。

所以我们需要自己去烧录。

烧录软件和固件可以去安信可官网去找。

也可以关注我的公众号“折途想要敲代码”回复关键词“ESP01S”免费下载,我会把所有资料打包好,包括串口助手,网络调试助手。

配置MQTT

AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_ID>,<CA_ID>,<"path">

参数看着多,实际上很多是没得选的。比如第一个就选0,第二个就是1。倒数第二和第三都填0。

大家可以自行去找一些免费的公用的MQTT服务器,然后连接服务器用的ID一般是用自己的MAC地址,因为不能和别人重复。

另外还有一堆命令是单独配置MQTT的单项配置的,这个大家去文档里看就行,这边就不重复介绍了,用这一个总和的配置命令即可。

查询/连接MQTT服务器

AT+MQTTCONN?AT+MQTTCONN=<LinkID>,<"host">,<port>,<reconnect>

配置完之后我们就可以连接了。

断开MQTT服务器连接

AT+MQTTCLEAN=<LinkID>

参数只能填0,因为目前只支持0。

发布信息

AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>AT+MQTTPUBRAW=<LinkID>,<"topic">,<length>,<qos>,<retain>

发布信息分为两种,第一种是发布字符串信息,第二种是发布二进制信息。

只是命令名字不一样而已,参数是一样的。

ESP-01S一个显著的缺点就是MQTT发布是数据长度受限,不过也是够我们正常使用的。

通过电脑端的MQTT客户端,发现可以正常接收到来自ESP-01S发布的信息。

订阅&取消订阅主题

AT+MQTTSUB=<LinkID>,<"topic">,<qos>AT+MQTTUNSUB=<LinkID>,<"topic">

订阅和取消订阅相比,除了命令名字不一样,订阅还多一个参数,那就是指定订阅的主题的等级,一般就是0或者1。

当我们收到来自订阅的主题的信息时,ESP-01S会通过串口打印出来。就不像之前TCP那样可以选择是主动接收还是被动接收了。

可以发现,我们的ESP-01S可以正常接收订阅的主题的信息。

收到数据后串口打印的数据格式为“+MQTTSUBRECV:0,主题名,数据长度,数据”

结尾

那么差不多到这边就结束啦。

相信通过上面这堆命令的介绍,各位小伙伴应该都可以使用ESP-01S了。

上面我是拿串口助手来进行实验的,大家在实际项目中只需要把单片机对ESP-01S进行串口通信即可实现一样的效果。

还有一点就是ESP-01S的供电问题,最好就是听官方文档的,拿俩干电池来供电。

另外文中涉及的所有资料,包括串口助手,MQTT固件,固件烧录软件,MQTT客户端软件等,我都已经打包好了。大家可以关注我的公众“折途想要敲代码”,回复关键词“ESP01S”即可免费下载。

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

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

相关文章

Django性能之道:缓存应用与优化实战

title: Django性能之道&#xff1a;缓存应用与优化实战 date: 2024/5/11 18:34:22 updated: 2024/5/11 18:34:22 categories: 后端开发 tags: 缓存系统Redis优点Memcached优缺点Django缓存数据库优化性能监控安全实践 引言 在当今的互联网时代&#xff0c;用户对网站和应用…

一个优秀 Maven 项目,各 Model 间最佳继承设计方案

1.单一职责原则 (Single Responsibility Principle): 每个模块应该专注于执行一个清晰且明确定义的功能&#xff0c;遵循单一职责原则&#xff0c;以降低模块的复杂性。 2.高内聚性 (High Cohesion): 模块内的组件和类应该紧密相关&#xff0c;共同实现模块的目标。高内聚性…

macOS DOSBox 汇编环境搭建

正文 一、安装DOSBox 首先前往DOSBox的官网下载并安装最新版本的DOSBox。 二、下载必备的工具包 在用户目录下新建一个文件夹&#xff0c;比如 dosbox: mkdir dosbox然后下载一些常用的工具。下载好了后&#xff0c;将这些工具解压&#xff0c;重新放在 dosbox 这个文件夹…

【基础绘图】 09.小提琴图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;生成随机数组 2. 数据处理&#xff1a;计算四分位数、中位数、均值、最大最小值 3. 图像绘制&#xff1a;绘制小提琴图 详细代码&#xff1a;着急的直接拖到最后有完整代码 步骤一&#xff1a;导入库包及…

作为一名新能源汽车热管理仿真工程师需要具备哪些素养与技能

作为一名新能源汽车热管理仿真工程师&#xff0c;需要具备多方面的素养与技能&#xff0c;才能胜任这一岗位的工作。从工程素养到技术技能&#xff0c;再到沟通能力和团队合作&#xff0c;以下是对这些方面的探讨。 理论知识基础 首先&#xff0c;工程素养是新能源汽车热管理仿…

SQL分库分表

一、介绍 问题分析 随着互联网及移动互联网的发展&#xff0c;应用系统的数据量也是成指数式增长&#xff0c;若采用单数据库进行数据存储&#xff0c;存在以下性能瓶颈: 1. IO瓶颈:热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#xff0c;效率较低。…

Python 开发 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)

什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库&#xff0c;使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”&#xff08;模型-模板-视图&#xff09;的设计模式&#xff0c;将应用程序的不同组件分离开来&#x…

【图论 回溯 广度优先搜索】126. 单词接龙 II

本文涉及知识点 图论 回溯 深度优先搜索 广度优先搜索 图论知识汇总 LeetCode 126. 单词接龙 II 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化&#xff0c;一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 这样的单词序…

新能源行业网间数据交换,更好用更专业的工具是什么?

新能源行业涵盖了多个方面&#xff0c;包括但不限于新能源汽车、可再生能源技术等。新能源行业发展具有重要的意义&#xff0c;新能源企业的研发数据极其重要&#xff0c;为了保障网络安全和数据安全&#xff0c;许多新能源企业采用逻辑隔离的方式进行网络隔离&#xff0c;此时…

【网络基础】网络层 之 IP协议与分片、网段划分、IP地址分类、子网掩码与路由

文章目录 网络层1. IP协议段格式1.1 分片1.2 *为什么存在分片 / 分片是什么 ?*1.3 *如何理解 / 实现 分片与组装*1.4 深入具体&#xff1a;分片 和 组装 的过程1.5 为什么不推荐 分片 2. 网段划分2.1 举例&#xff1a;国际间通信 && 国家内通信2.2 理解网段划分 3. IP…

[Kubernetes] Istio on Kubernetes 实践

文章目录 1.Kubernetes 创建2.Istio 部署2.1 下载 Istio2.2 安装 Istio 3.Istio on Kubernetes 实践3.1 部署 Bookinfo 示例应用3.2 确定入站 IP 和端口 1.Kubernetes 创建 主机名内部ip外部ipmaster192.168.66.2139.198.36.40node1192.168.66.3139.198.1.192node2192.168.66.…

Ps 滤镜:粉笔和炭笔

Ps菜单&#xff1a;滤镜/滤镜库/素描/粉笔和炭笔 Filter Gallery/Sketch/Chalk & Charcoal 粉笔和炭笔 Chalk & Charcoal滤镜可以模拟传统的粉笔和炭笔画风格&#xff0c;通过特定的纹理和线条重绘图像的高光、中间色调和阴影区域。此滤镜非常适合于为数字图像添加手绘…

璩静是为了薅百度羊毛

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 百度副总裁璩静离职了&#xff0c;网传她的年薪是1500万&#xff0c;而璩静在4月24日注册了一个文化传媒公司&#xff0c;大家都认为璩静是在为离职做准备。但松松我认为不是。 我认为&#xff1a;璩静成立新公司是…

组织机构树形列表实现

源码地址&#xff1a;https://www.lanzouw.com/itjDc1ydraof 本来上传了源码&#xff0c;但是发现只能VIP才能下载&#xff0c;所以重新上传到蓝奏云上了&#xff0c;链接如下&#xff1a; 先看下效果图&#xff1a; 可以自己写HTML来自定义每一项的内容显示&#xff0c;包括…

物联网到底物联了个啥?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网&#xff0c;这个听起来似乎颇具科技感和未来感的词汇&#xff0c;其实早已悄然渗透到我们生活的方方面面。从智能家居到智慧城市&#xff0c;从工业自动化到医疗健康&#xff0c;物联网技术正在以其独特的魅力改变着我们的生活方式…

鸿蒙开发-ArkTS语言-XML

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 鸿蒙开发-ArkTS语言-非线性容器 文章目录 前言 一、XML概述 二、XML生成 三、XML解析 1.解析XML标签和标签值 2.解析XML属性…

conan2 基础入门(05)-(静态库动态库)(DebugRelease)

conan2 基础入门(05)-(静态库&动态库)(Debug&Release) 文章目录 conan2 基础入门(05)-(静态库&动态库)(Debug&Release)⭐准备预备文件和Code ⭐静态库&动态库静态库动态库 ⭐Debug&ReleaseReleaseDebug END视频教学settings.yml ⭐准备 本文均在windo…

5.神经网络-激活函数

目录 1. 激活函数不是阶跃函数 1.1 激活函数和阶跃函数都是非线性函数 1.2 激活函数不是阶跃函数 2. sigmoid 函数 2.1 sigmoid 函数表达式 2.2 sigmoid 函数 Python 实现 2.4 sigmoid 函数图 3. ReLU 函数 3.1 ReLU 函数表达式 3.2 ReLU 函数 Python 实现 3.4 ReLU…

线性集合:ArrayList,LinkedList,Vector/Stack

共同点&#xff1a;都是线性集合 ArrayList ArrayList 底层是基于数组实现的&#xff0c;并且实现了动态扩容&#xff08;当需要添加新元素时&#xff0c;如果 elementData 数组已满&#xff0c;则会自动扩容&#xff0c;新的容量将是原来的 1.5 倍&#xff09;&#xff0c;来…

Rust使用HashSet对Vec类型的元素进行去重

在Rust语言中&#xff0c;对Vec类型的元素进行去重&#xff0c;一种常见的方法是使用一个HashSet来帮助我们快速检查元素是否已经存在。以下是使用HashSet对Vec进行去重的示例代码&#xff1a; use std::collections::HashSet;fn main() {let vec_numbers vec![1, 2, 2, 3, 4…