在物联网应用中,ESP32 是一种功能强大且成本低廉的微控制器,支持 Wi-Fi 和蓝牙通信。然而,通过使用 ESP32-ETH 等扩展模块,我们还可以让 ESP32 接入有线网络(以太网)。本文将详细介绍如何利用 ESP32 实现以太网通信,并接入有线网络。
ESP32 本身并不直接支持以太网通信,但可以通过外接以太网 PHY 芯片(例如 LAN8720)来实现这一功能。LAN8720 是一种常见的以太网 PHY 芯片,它与 ESP32 的 RMII 接口配合使用,可以实现 10/100Mbps 的以太网连接。
为了简化开发,Espressif 提供了 esp_eth
驱动库,该库封装了底层硬件接口和协议栈,使开发者能够轻松配置和使用以太网功能。
要实现 ESP32 的以太网通信,需要以下硬件组件:
ESP32 和 LAN8720 的引脚连接如下表所示:
ESP32 引脚 | 功能 | LAN8720 引脚 |
---|---|---|
GPIO17 | RMII_TXD0 | TXD0 |
GPIO18 | RMII_TXD1 | TXD1 |
GPIO19 | RMII_TX_EN | TX_EN |
GPIO23 | RMII_RXD0 | RXD0 |
GPIO22 | RMII_RXD1 | RXD1 |
GPIO21 | RMII_CRS_DV | CRS_DV |
GPIO0 | RMII_MDC | MDC |
GPIO25 | RMII_MDIO | MDIO |
3.3V | 电源输入 | VDD |
GND | 地 | GND |
注意:LAN8720 模块需要一个额外的电压转换电路(通常为 25MHz 振荡器和电平转换芯片),确保其与 ESP32 的信号兼容。
以下是一个简单的示例程序,展示如何配置 ESP32 使用以太网模块并接入有线网络。
#include <Arduino.h>
#include <ETH.h>
void setup() {
Serial.begin(115200);
// 初始化以太网
ETH.begin();
while (!ETH.linkUp()) {
Serial.println("等待以太网连接...");
delay(1000);
}
Serial.print("IP 地址: ");
Serial.println(ETH.localIP());
}
void loop() {
// 在此处编写以太网通信逻辑
}
ETH.begin()
方法启动以太网模块。ETH.linkUp()
判断物理层是否已连接。ETH.localIP()
获取设备分配的 IP 地址。ESP32 的以太网模块支持两种模式:DHCP 和静态 IP。
默认情况下,ESP32 会通过 DHCP 自动获取 IP 地址。无需额外配置。
如果需要手动设置静态 IP,可以使用以下代码:
#include <Arduino.h>
#include <ETH.h>
IPAddress static_ip(192, 168, 1, 100); // 设备 IP 地址
IPAddress gateway(192, 168, 1, 1); // 网关地址
IPAddress subnet(255, 255, 255, 0); // 子网掩码
void setup() {
Serial.begin(115200);
ETH.config(static_ip, gateway, subnet);
ETH.begin();
while (!ETH.linkUp()) {
Serial.println("等待以太网连接...");
delay(1000);
}
Serial.print("IP 地址: ");
Serial.println(ETH.localIP());
}
void loop() {}
以下是 ESP32 以太网初始化的流程图:
flowchart TD A[开始] --> B{检查硬件连接}; B --正常--> C[加载以太网驱动]; B --异常--> D[检查硬件问题]; C --> E[初始化以太网模块]; E --> F{是否连接成功?}; F --是--> G[获取 IP 地址]; F --否--> H[重试或调试]; G --> I[完成];