ESP-01S 入门指南:从烧录到运行的嵌入式开发教程

以下是一个适合初学者的 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的GNDIO0都能接到USB转TTL模块的GND

重点:反正ESP-01S的GNDIO0都能接到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服务上能正常看到已连接上的客户端截图:

相关推荐
不脱发的程序猿10 小时前
常见的CAN总线协议面试题
嵌入式·can·汽车电子
SY师弟2 天前
51单片机——计分器
c语言·c++·单片机·嵌入式硬件·51单片机·嵌入式
网易独家音乐人Mike Zhou2 天前
【无人机】MavLink通讯协议的回调解析函数及状态机
单片机·mcu·物联网·嵌入式·无人机·iot
小柯博客3 天前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(十二)
c语言·stm32·单片机·嵌入式硬件·php·嵌入式
SY师弟3 天前
台湾TEMI协会竞赛——0、竞赛介绍及开发板介绍
c语言·单片机·嵌入式硬件·嵌入式·台湾temi协会
憧憬一下3 天前
FreeRTOS同步和互斥
嵌入式·freertos
zhuhit3 天前
FASTDDS的安全设计
分布式·机器人·嵌入式
憧憬一下4 天前
FreeRTOS任务之深入篇
stm32·嵌入式·freertos
scoone4 天前
四款主流物联网操作系统(FreeRTOS、LiteOS、RT-Thread、AliOS)的综合对比分析
嵌入式
Evan_ZGYF丶4 天前
【PCIe总线】 -- PCI、PCIe相关实现
linux·嵌入式·pcie·pci