负责控制和联网的单片机为 ESP-01S,其核心是乐鑫科技(ESPRESSIF)设计的 ESP8266,也是大部分嵌入式开发发烧友常用的 WiFi 模块。
外观和引脚分布如下图:
具体引脚定义如下表:
脚序 | 名称 | 功能说明 |
---|---|---|
1 | GND | 接地 |
2 | IO2 | GPIO2/UART1_TXD |
3 | IO0 | GPIO0;下载模式:外部拉高;运行模式:悬空或者外部拉高 |
4 | RXD | UART0_RXD/GPIO3 |
5 | TXD | UART0_TXD/GPIO1 |
6 | EN | 芯片使能端,高电平有效 |
7 | RST | 复位 |
8 | VCC | 3.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>");
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/30e30ec648d68a934157bc77c72973bc.png)
![img](https://img-blog.csdnimg.cn/img_convert/11fa7cf5ebfa3a2e02beabd9bf6277d4.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/eeed4d1d1e6dc81e7e3366628ef01674.png)
![img](https://img-blog.csdnimg.cn/img_convert/f23beb3bec51c61a2db6a05206b351ec.png)
![img](https://img-blog.csdnimg.cn/img_convert/0b9c42d9ce7d83a7df140cd9de29b9ed.png)
![img](https://img-blog.csdnimg.cn/img_convert/53523691593e1ed8fd3a32ede53cdb36.png)
![](https://img-blog.csdnimg.cn/img_convert/ecb508a4c178d28a3c414a2b6877dfa4.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
3C-1715557234666)]
[外链图片转存中...(img-0guB0MRd-1715557234667)]
[外链图片转存中...(img-QllkGbHq-1715557234667)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!