以下是一个适合初学者的 ESP-01S 嵌入式设备学习入门教程,介绍我第一次烧录和运行过程:
我的体验是:不要接错线,否则会烧录不成功。
1. ESP-01S 简介
1.1 ESP-01S的特点和用途
ESP-01S 是一款基于 ESP8266 芯片的小型 Wi-Fi 模块,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。支持IEEE 802.11 b/g/n 标准,1MB的板载Flash存储,支持 Arduino IDE 开发环境。
1.2 ESP-01S硬件规格和引脚功能
引脚 | 功能 |
---|---|
3.3 | 3.3V供电,避免使用5V供电 |
RX | UART_RXD,异步串口接受端 |
RST | 外部复位引脚,低电平有效,默认高电平 |
IO0 | GPIO 0引脚;状态:1.悬空:Flash下载模式和工作模式;2.下拉:串口下载模式 |
EN | 使能端口,高电平工作,低电平模块不工作 |
IO2 | GPIO2引脚,开机上电时禁止下拉,默认高电平 |
UTXD | UART_TXD,异步串口发送端 |
GND | GND接地引脚 |
规格说明书:docs.ai-thinker.com/_media/esp-...
2. 开发环境搭建
软件环境:
- | 名称 | 备注 |
---|---|---|
操作系统 | rockylinux 9.5桌面版本 | 我的开发电脑 |
代码开发工具 | Arduino IDE 2.3.4 | 编程工具 |
自建MQTT服务 | emqx | MQTT服务(可选) |
准备材料:
材料 | 名称 | 备注 |
---|---|---|
烧录器 | USB转TTL CH340 | 1块 |
线缆 | 准备至少10根杜邦线(母対母) | 至少10根 |
调试模块 | USB转ESP8266模块 | 1块 |
其他板件 | 万能洞洞板 | 1片 |
建议准备魔法,要不然github可能打不开。
2.1 USB转TTL CH340模块和esp-01s、USB转ESP8266模块图样
esp-01s
USB转TTL CH340图
USB转ESP8266模块
2.2 安装 Arduino IDE
下载地址:www.arduino.cc/en/software...
2.2 配置 ESP8266 开发板支持
-
打开Arduino IDE
-
进入
文件(File)
->首选项(Perferences)
-
在
附加开发板管理器网址(Additional boards manager URLS)
中添加:http://arduino.esp8266.com/stable/package_esp8266com_index.json
。我是配置了我自己的魔法代理网络,所以下载快了些。网上也有直接下载别人打包好的包。 -
点击"确定(OK)"。
- 进入
工具(Tools)
->开发板(Borad)
->开发板管理器
,搜索"ESP8266"并安装(Install);或者点击左边栏第二图图标,也能呼出开发板管理器
。
备注:esp8266 github仓库:github.com/esp8266/Ard...
- 配置 ESP8266参数
重点关注这几个参数: Upload Speed
=115200,Crystal Frequency
=26MHZ,Flash Size
=1MB,FS: 64KB,OTA:~470KB,Flash Mode
=DIO
3. 安装MQTT相关库PubSubClient(可选)
由于我这次要编写的代码是将ESP-01S连接到EMQX MQTT服务器,所以需要安装这个库。
进入工具(Tools)
-> 管理库(Manage Libraries)
,搜索PubSubClient
并安装;或者直接点击左边栏第三个图标,也能呼出。
备注:自建MQTT服务的话,请看这里。github.com/emqx/emqx,或 docs.emqx.com/en/emqx/lat...
4. 安装esptool
安装了python,再安装esptool。
shell
sudo yum install python3
pip install esptool
这个工具很方便擦除已上传的程序,然后重新上传新的代码。
5. 连接ESP-01S进行编程
5.1 ESP-01S的连接方式(使用USB转TTL适配器):
ESP-01S 板上引脚 | 对应连接的USB转TTL模块引脚 | 备注 |
---|---|---|
3.3v | 3.3V | ------ |
GND | GND | ------ |
TX | RXD | ------ |
RX | TXD | ------ |
IO0 | GND | 编程烧录模式 |
注意:编程时需要将USB转TTL适配器引脚IO0
接地,上传完成后断开此连接。实际的接线,可以参考我的,我用了一个万能洞洞板,焊在洞洞板上的每排排针都是用焊锡连通,这样就能实现ESP-01S的GND
和IO0
都能接到USB转TTL模块的GND
。
重点
:反正ESP-01S的GND
和IO0
都能接到USB转TTL模块的GND
,要不然烧录失败。
5.2 擦除代码
说明:如果出现上传失败,才执行这一步骤。请关闭Arduino IDE
软件,然后再去执行擦除esp-01s上已有程序或固件。
命令行终端执行的方式擦除最快捷。
/dev/ttyUSB0
是esp-01s在我电脑上的串口端口。
shell
[xxxxx@rockylinux95 ~]$ esptool.py --port /dev/ttyUSB0 flash_id
esptool.py v4.8.1
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting...
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: (我隐藏了)
Uploading stub...
Running stub...
Stub running...
Manufacturer: 20
Device: 4014
Detected flash size: 1MB
Hard resetting via RTS pin...
看到这样的返回,这样就表示擦除成功。
5.3 写一个程序
备注
:除了下面的代码,Arduino IDE 默认也带了很多示例 ,在文件(File)
-> 示例(Examples)
,可以选择文件(File)
-> 示例(Examples)
->ESP8266
->Blink
。
点击文件(File)
-> sketch(项目)
,下面程序的内容是连接上wifi并发送数据到自建的MQTT服务。
代码如下:
C++
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Wi-Fi 配置
const char* ssid = "wifi名称"; // wifi名称
const char* password = "wifi密码"; // wifi密码
// EMQX MQTT 配置
const char* mqttServer = "EMQX 服务器 IP"; // EMQX 服务器 IP
const int mqttPort = MQTT端口; // MQTT 端口,我用的我自建的emqx MQTT服务,用的tcp端口
const char* mqttUser = "MQTT用户名"; // MQTT 用户名(可选)
const char* mqttPassword = "MQTT密码"; // MQTT 密码(可选)
// MQTT Topic
const char* topicPublish = "esp01s/temperature"; // 发布消息的 Topic
const char* topicSubscribe = "esp01s/control"; // 订阅消息的 Topic
WiFiClient espClient;
PubSubClient client(espClient);
// 模拟传感器数据
float readTemperature() {
return 25.5; // 替换为实际传感器读取代码
}
// Wi-Fi 连接
void setupWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
}
// MQTT 回调函数
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// 处理订阅消息
if (strcmp(topic, topicSubscribe) == 0) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("Received command: " + message);
}
}
// MQTT 连接
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP01S_Client", mqttUser, mqttPassword)) {
Serial.println("MQTT connected");
client.subscribe(topicSubscribe); // 订阅 Topic
} else {
Serial.print("MQTT connection failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds...");
delay(5000);
}
}
}
// 发布传感器数据
void publishSensorData() {
float temperature = readTemperature();
String payload = String(temperature);
client.publish(topicPublish, payload.c_str());
Serial.println("Temperature published: " + payload);
}
void setup() {
Serial.begin(115200);
setupWiFi();
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 每 10 秒发布一次数据
static unsigned long lastPublish = 0;
if (millis() - lastPublish > 10000) {
publishSensorData();
lastPublish = millis();
}
}
备注:MQTT 用户名、密码,在emqx管理后台的【客户端认证】,我用的是Password-Based
。
5.4 执行代码验证
编写完成代码,接下来执行验证,检查代码是否有编译错误:点击项目(Sketch)
->验证/编译(Verify/Compile)
。
5.5 开始烧录
接下来上传代码。如果上一步执行了擦除操作,请重新插拔USB转TTL适配器,要不然出现上传不了代码。点击项目(Sketch)
->上传(Upload)
。
出现Hash of data verified.
,就烧录成功了。
5.6 验证烧录好的设备运行情况
-
点击右上角的串口监控器(Serial Monitor),串口监控器(Serial Monitor)的波特率也要是
115200
,否则无法正常运行。 -
将esp-01s插到
USB转ESP8266模块
上,然后将USB转ESP8266模块
插到电脑USB上;
Arduino IDE的串口监控器(Serial Monitor)截图:
EMQX服务上能正常看到已连接上的客户端截图: