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服务上能正常看到已连接上的客户端截图:

相关推荐
zandy10111 小时前
嵌入式BI开发指南:如何通过衡石API将分析能力集成到业务系统?
开发语言·python·嵌入式
网易独家音乐人Mike Zhou1 天前
【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)
linux·stm32·mcu·物联网·嵌入式·iot
憧憬一下1 天前
stm32之EXIT外部中断详解
stm32·单片机·嵌入式·中断
念风2 天前
移植Tensorflow Lite Micro源码到ArmClang Cortex-M
嵌入式
塞尔维亚大汉3 天前
【鸿蒙南向开发】OpenHarmony小型系统内核(LiteOS-A)【文件系统】下
物联网·嵌入式·harmonyos
塞尔维亚大汉3 天前
【鸿蒙南向开发】OpenHarmony小型系统内核(LiteOS-A)【扩展组件】下
物联网·嵌入式·harmonyos
司六米希4 天前
【操作系统】双缓冲机制(含原理、优势、实现方式、应用场景)
嵌入式
时光の尘5 天前
FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32
c语言·数据结构·stm32·单片机·嵌入式硬件·嵌入式
憧憬一下5 天前
搭建stm32工程
stm32·单片机·嵌入式
FreakStudio5 天前
一文速通Python并行计算:09 Python多进程编程-进程之间的数据同步-基于互斥锁、递归锁、信号量、条件变量、事件和屏障
单片机·嵌入式·大学生·面向对象·多进程·技术栈·并行计算·电子diy