Skip to content

Arduino - 网络通信

Arduino - 使用 ESP8266/ESP32 进行现代网络通信

Section titled “Arduino - 使用 ESP8266/ESP32 进行现代网络通信”

本教程已完全更新,以使用现代、强大且经济高效的硬件。原有的CC3000 WiFi模块已过时。如今,ESP8266和ESP32微控制器已成为为物联网(IoT)项目添加WiFi的标准。它们功能强大,内置WiFi,并且可以直接从Arduino IDE进行编程,通常无需单独的Arduino开发板。

我们将构建一个WiFi控制的开关。ESP8266将托管一个Web服务器,您可以从网络上的任何设备(手机、电脑)访问该服务器来控制LED的开关。这个项目是无数智能家居和物联网应用的基础。

  • 1 × ESP8266开发板(例如,NodeMCU或WEMOS D1 Mini)
  • 1 × LED
  • 1 × 220欧姆电阻
  • 1 × 面包板和跳线

先决条件: 您必须设置您的Arduino IDE来编程ESP8266。请按照标准指南将ESP8266开发板URL添加到IDE的开发板管理器中。

电路非常简单。我们将LED连接到ESP8266的一个GPIO引脚。在WEMOS D1 Mini上,引脚D1是一个不错的选择。

WEMOS D1 Mini Pin Component
---------------------------------------------
GND ---------------- (-) LED (short leg)
D1 ----------------- (220 Ohm Resistor) --- (+) LED (long leg)

许多ESP8266开发板,如NodeMCU和WEMOS D1 Mini,也带有一个内置LED(通常在引脚D4或GPIO2上)。您可以先用它来测试代码,跳过外部LED。

此代码创建一个WiFi接入点和一个带有简单端点的Web服务器,用于控制LED。这使得项目自包含且易于演示。

/*
* ESP8266 网页控制LED
*
* 此草图在ESP8266上创建了一个Web服务器来控制LED。
* 它提供了一个带有按钮的简单HTML界面。
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
// --- 配置 ---
// 替换为您的网络凭据
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const int ledPin = D1; // LED的引脚(或使用 LED_BUILTIN)
// 在端口80上创建一个Web服务器对象
ESP8266WebServer server(80);
// --- 网页HTML ---
// 存储在闪存中以节省RAM
const char HTML_CONTENT[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<title>ESP8266 LED Control</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: Arial, sans-serif; text-align: center; margin: 50px; }
.btn { display: inline-block; padding: 20px 40px; font-size: 24px; margin: 10px; cursor: pointer; }
.on { background-color: #4CAF50; color: white; }
.off { background-color: #f44336; color: white; }
</style>
</head>
<body>
<h1>LED Control</h1>
<button class="btn on" onclick="location.href='/on'">ON</button>
<button class="btn off" onclick="location.href='/off'">OFF</button>
</body>
</html>
)rawliteral";
void handleRoot() {
server.send(200, "text/html", HTML_CONTENT);
}
void handleOn() {
digitalWrite(ledPin, LOW); // LED通常是低电平有效
server.sendHeader("Location", "/");
server.send(302, "text/plain", "Redirecting...");
}
void handleOff() {
digitalWrite(ledPin, HIGH); // 设置为HIGH以关闭
server.sendHeader("Location", "/");
server.send(302, "text/plain", "Redirecting...");
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH); // 初始状态LED关闭
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// 定义服务器路由
server.on("/", handleRoot);
server.on("/on", handleOn);
server.on("/off", handleOff);
server.begin();
Serial.println("HTTP server started.");
}
void loop() {
// 处理传入的客户端请求
server.handleClient();
}
  • ESP8266WebServer:在ESP8266上创建Web服务器的核心库。
  • R"rawliteral(...)rawliteral":这是一个C++原始字符串字面量。这是一种现代的方式,用于定义多行字符串(如我们的HTML),而无需转义引号或反斜杠等字符。
  • 服务器路由:server.on("/path", function)将URL路径映射到C++函数。当客户端请求http://<IP>/时,会调用handleRoot。对于http://<IP>/on,会调用handleOn。
  • 重定向:在打开或关闭LED后,我们发送一个302 Found重定向响应,将用户的浏览器重定向回主页。这提供了无缝的用户体验。
  1. 将"YOUR_WIFI_SSID"和"YOUR_WIFI_PASSWORD"替换为您的WiFi凭据。
  2. 在工具菜单中选择您的ESP8266开发板(例如,“WEMOS D1 R1 & mini”)和正确的COM端口。
  3. 上传草图。
  4. 打开串口监视器(将波特率设置为115200)。连接到WiFi后,它将打印IP地址。
  5. 在连接到同一WiFi网络的设备上打开Web浏览器并输入IP地址。您应该会看到控制页面。
  6. 点击ON和OFF按钮来控制LED!

电气安全: 本教程使用低压LED。如果您将LED替换为继电器来控制市电供电设备(如灯具),您将处理致命电压。这需要深入的电气安全知识、正确的接线和绝缘。除非您具备相关资质,否则请勿尝试控制市电电压。

深入学习: 对于更健壮的IoT应用,请考虑使用MQTT而非Web服务器。MQTT是一种轻量级消息协议,专为设备间通信设计,是IoT的行业标准。您还可以探索使用mDNS(ESP8266mDNS库)来通过http://led-control.local这样的友好名称访问您的设备,而不是IP地址。