ESP8266 系列——ESP-01S 控制继电器模块

在一些物联网的项目中,我们可能需要使用控制一些使用交流电的高压设备,如灯、风扇或其他家用电器。然而,单片机一般都是在直流电 5V(DC5V)的电压供电运行,它无法直接控制这些高压电器。

这时候就需要用到继电器模块了。继电器的价格低廉,连接简单,非常适合需要切换适量交流电或直流电的物联网小项目。如果需要达到无线远程控制,ESP-01S 继电器模块无疑是最佳的选择。

在这里插入图片描述

本教程将引导大家完成 ESP-01S 继电器模块的代码编写,通过浏览器访问该模块核心控制器 ESP8266 单片机的 IP 地址,在 Web 界面中,控制灯或其他设备。

本教程建立在学习者有一定嵌入式编程基础的前提,关于模块的一些原理,以及软件的安装等问题,这样不做阐述。

一、硬件准备

1. ESP-01S 模块

负责控制和联网的单片机为 ESP-01S,其核心是乐鑫科技(ESPRESSIF)设计的 ESP8266,也是大部分嵌入式开发发烧友常用的 WiFi 模块。

在这里插入图片描述

外观和引脚分布如下图:
在这里插入图片描述
在这里插入图片描述

具体引脚定义如下表:

脚序名称功能说明
1GND接地
2IO2GPIO2/UART1_TXD
3IO0GPIO0;下载模式:外部拉高;运行模式:悬空或者外部拉高
4RXDUART0_RXD/GPIO3
5TXDUART0_TXD/GPIO1
6EN芯片使能端,高电平有效
7RST复位
8VCC3.3V 供电(VDD);外部供电电源输出电流建议在 500mA 以上

2. ESP-01S 专用继电器模块

ESP-01S WiFi Relay Module 是专门为 ESP-01S 量身定制的继电器模块,可以直接插入 ESP-01S,省去复杂的接线。

在这里插入图片描述

插入时需要注意插入的方向(正确插入方向看前言的照片),不要插反了,否则上电后可能会导致芯片烧毁。

该模块有一个复位按钮,可以重启 ESP-01S。控制继电器的引脚连接在 ESP-01S 的 IO0(GPIO0),控制方式是,GPIO0 输出低电平时,继电器线圈得电;GPIO0 输出高电平时,继电器线圈失电。

3. 烧录器和 USB to TTL 模块

把写好的代码下载到 ESP-01S,我建议直接用 ESP-01S 专用的烧录器——ESP01 PROG,以下两种都可以。直接把 ESP-01S 插入 8PIN 的接口处(模块天线和 USB 接口同向),USB 插入电脑即可烧录(前提是有对应的驱动)。

在这里插入图片描述

如果手上没有这种烧录器,可以用 USB to TTL 模块代替,下图是两种不同芯片的 USB to TTL 模块,任意一种都可以,就是接线相对麻烦,最好有面包板。后面再具体讲解一下如何烧录的问题。

在这里插入图片描述

二、开发环境和代码解析

1. 开发环境的搭建

编辑和下载代码使用的 IDE 是 Arduino IDE,我使用的版本是Arduino IDE 2(用 1.8 以上的版本都可以)。

下载链接:Software | Arduino

在这里插入图片描述

还需要安装 ESP8266 对应的软件包,在 Arduino IDE 中输入以下 URL 作为其他开发板管理 URL:
https://arduino.esp8266.com/stable/package_esp8266com_index.json

具体操作为先在 Arduino IDE 的菜单栏选择“File”,再点击“Preferences”。

在这里插入图片描述

把 URL 粘贴到 Additional boards manager URLs 旁边的输入框,点击“OK”保存。

在这里插入图片描述

在侧边栏中点击“开发板管理”的图标,在搜索框中输入“ESP8266”,会出现 ESP8266 的软件包,点击“INSTALL”安装即可。

在这里插入图片描述

成功安装后,重启 Arduino IDE,就可以在开发板列表中找到“Generic ESP8266 Module”了。

在这里插入图片描述

2. 代码解析

开发需求就是,用 ESP-01S 实现一个简单的 Web 服务器,通过局域网的 IP 地址,可以在任何接入相同局域网的设备的浏览器上远程控制一个继电器的开关状态。

2-1. 包含的头文件和定义

ESP-01S 的核心是 ESP8266,所以需要加载头文件ESP8266WiFi.h。前面提到继电器模块的控制引脚接在 ESP-01S 的 GPIO0上,可以用宏定义或者常量来设置这个引脚。

#include <ESP8266WiFi.h>

#define RELAY 0    //connected to GPIO0

2-2. WiFi连接设置

接着就是连接局域网的 WiFi,可以用常量或者宏定义来设置,输入局域网的 WiFi 名和密码。

const char *ssid = "WiFi SSID";    // Enter your router or WiFi SSID here
const char *password = "WiFi password";    // Enter your router or WiFi password here

2-3. 全局变量和对象的声明

创建一个WiFiServer对象,用于监听 HTTP 请求,这里用全局变量声明。这里的传入了参数 80,表示该 WiFiServer 对象将监听的端口号。在 Web 开发中,通常使用端口号 80 来传输 HTTP 协议。HTTP 协议的默认端口是80。

WiFiServer server(80);

2-4. 初始化

接着就是初始化串口、GPIO0 的输出模式和初始电平、以及接入局域网的操作。成功接入局域网后,启动了一个 HTTP 服务器,并在串口输出中打印了服务器的 IP 地址。

void setup()
{
    Serial.begin(115200); 
    pinMode(RELAY, OUTPUT);    //Set GPIO0 to output mode.
    digitalWrite(RELAY, HIGH);    //Set the GPIO0 output level to high.

    /* Connect to the WiFi network. */
    Serial.println("");
    Serial.print("Conneting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {    // If the connection to WiFi fails, retry every 500 milliseconds.
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");

    /* Start the Server. */
    server.begin();
    Serial.println("Server started.");

    /* Output of the IP address. */
    Serial.print("Use this URL to connect: ");
    Serial.print("http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");
}

2-5. 读取 HTTP 请求连接

loop函数中,ESP8266 不断检查是否有用户连接。如果有,它将读取 HTTP 请求,并根据请求的内容控制继电器的状态。然后,它会返回一个 HTML 响应,其中包含继电器的当前状态和两个超链接,分别用于打开和关闭继电器。

void loop()
{
    /* Check whether a user has established a connection. */
    WiFiClient client = server.available();
    if (!client)
        return;

    /* Wait until the user sends data. */
    while (!client.available())
        delay(1);

    /* The code for handling HTTP requests has been omitted below. */
}

2-6. HTTP 请求处理

通过读取 HTTP 请求的第一行,程序提取了请求的内容。然后,它检查请求是否包含/RELAY=ON/RELAY=OFF,根据请求的不同来控制继电器的状态。

/* Reading the first line of the request. */
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();

/* Assignment of the request. */
int value = HIGH;
if (request.indexOf("/RELAY=ON") != -1) {
    Serial.println("RELAY=ON");
    digitalWrite(RELAY, LOW);
    value = LOW;
}
if (request.indexOf("/RELAY=OFF") != -1) {
    Serial.println("RELAY=OFF");
    digitalWrite(RELAY, HIGH);
    value = HIGH;
}

2-7. 完整代码

以下是完整的代码示例:

#include <ESP8266WiFi.h>

#define RELAY 0    //connected to GPIO0

const char *ssid = "WiFi SSID";    // Enter your router or WiFi SSID here
const char *password = "WiFi password";    // Enter your router or WiFi password here

WiFiServer server(80);

void setup()
{
    Serial.begin(115200);
    pinMode(RELAY, OUTPUT);    //Set GPIO0 to output mode.
    digitalWrite(RELAY, HIGH);    //Set the GPIO0 output level to high.

    /* Connect to the WiFi network. */
    Serial.println("");
    Serial.print("Conneting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {     // If the connection to WiFi fails, retry every 500 milliseconds.
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");

    /* Start the Server. */
    server.begin();
    Serial.println("Server started.");

    /* Output of the IP address. */
    Serial.print("Use this URL to connect: ");
    Serial.print("http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");
}

void loop()
{
    /* Check whether a user has established a connection. */
    WiFiClient client = server.available();
    if (!client)
        return;

    /* Wait until the user sends data. */
    Serial.println("new client.");
    while (!client.available())
        delay(1);

    /* Reading the first line of the request. */
    String request = client.readStringUntil('\r');
    Serial.println(request);
    client.flush();

    /* Assignment of the request. */
    int value = HIGH;
    if (request.indexOf("/RELAY=ON") != -1) {
        Serial.println("RELAY=ON");
        digitalWrite(RELAY, LOW);
        value = LOW;
    }
    if (request.indexOf("/RELAY=OFF") != -1) {
        Serial.println("RELAY=OFF");
        digitalWrite(RELAY, HIGH);
        value = HIGH;
    }

    /* Return the answer. */
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("");
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.println("<meta name='viewport' content='width=device-width, inital-scale=1'>");
    client.println("<head><title>ESP8266 RELAY Control</title></head>");
    client.println("<style>");
    client.println("* {text-align: center; font-family: Conso-las;}");
    client.println("");
    client.println(".container {position: absolute; top: 45%;");
    client.println("left: 50%; transform: translateX(-50%) translateY(-50%);}");
    client.println("");
    client.println(".inner {font-size: 40px;}");
    client.println("");
    client.println("a {display: inline-block; width: 300px; height: 100px;");
    client.println("color: #FFFF00; background-color: #275C6B;");
    client.println("margin-top: 20px; padding: 10px 20px;");
    client.println("text-decoration: none; border-radius: 5px;");
    client.println("font-weight: 800; font-size: 70px;}");
    client.println("</style>");
    client.println("<div class='container'>");
    client.println("<div class='inner'>");
    client.print("RELAY if now: ");

    if (value == HIGH)
        client.print("OFF");
    else
        client.print("ON");

    client.println("<br>");
    client.println("<a href=\"/RELAY=OFF\">OFF</a>");
    client.println("<a href=\"/RELAY=ON\">ON</a>");
    client.println("<style>");
    client.println(".footer-text { font-size: 25px; }");
    client.println(".bold-text { font-weight: bold; }"); 
    client.println("</style>");
    client.println("<div class='footer'>");
    client.println("<p class='footer-text'>This software was written by <span class='bold-text'>Grayson Zheng</span>.</p>");
    client.println("</div>");
    client.println("</div>");
    client.println("</html>");
    client.println("");
}

三、烧录代码

1. 使用专用烧录器烧录代码

如下图所示,把 ESP-01S 插在烧录器上,再插入电脑。

在这里插入图片描述

选择定义的 COM 口。
在这里插入图片描述

点击“Upload”的图标即可。

在这里插入图片描述

烧录完成后,复位 ESP-01S,在通过串口监视器可以查看接入局域网后,ESP-01S 的 IP 地址。

在这里插入图片描述

做到这一步,你已经完成了 99% 的进度了!

2. 使用 USB to TTL 模块烧录代码

如果你没有专用的烧录器,手里刚好有 USB to TTL 模块,也可以把代码烧录进去。

根据 ESP-01S 的手册提供,ESP-01S 有两种启动模式:下载模式和运行模式。两种模式对 GPIO 口要求的电平状态不同,具体如下表所示:

模式ENRSTGPIO15GPIO0GPIO2UART0_TXD
下载模式HIGHHIGHLOWLOWHIGHHIGH
运行模式HIGHHIGHLOWHIGHHIGHHIGH

部分引脚在芯片内部已经上拉,根据我实践出来的结果,下载程序时只需要把 EN 引脚拉高,把 GPIO0 脚拉低即可。具体接下图如下:

在这里插入图片描述

接线完成后,其他操作跟专用烧录器的操作一样,这里不做赘述。在烧录完成后,拔掉 IO0 的引脚线。RST 引脚用杜邦线接一下 GND,再拿开可以完成重启,或者拔掉 3V3 引脚线,再接入也是一样的效果。

四、硬件连接与效果展示

通过串口获得 ESP-01S 的 IP 地址之后,取下 ESP-01S,安装到继电器模块上。继电器模块有五个接线端,其中 2PIN 的接线端是芯片和继电器线圈的供电接口,可以通入直流电 512V(DC512V)。

在这里插入图片描述

3PIN 的接线端只需要接COM端(公共端)和NO端(常开触点),具体如下图。

在这里插入图片描述

完成接线后,在相同局域网下的设备(手机或者电脑),打开浏览器,在地址输入栏输入 ESP-01S 的IP 地址。可以看到ESP-01S 的 Wed 界面。

下图为电脑的浏览器看到的效果:

在这里插入图片描述

下图为手机的浏览器看到的效果:

在这里插入图片描述

通过浏览器点击上面两个按钮,即可控制继电器进行点灯的操作。

具体效果如下:

WeChat_20231227204656

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grayson Zheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值