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。
适用于ESP8266的现代Arduino草图
Section titled “适用于ESP8266的现代Arduino草图”此代码创建一个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 ---// 存储在闪存中以节省RAMconst 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重定向响应,将用户的浏览器重定向回主页。这提供了无缝的用户体验。
- 将
"YOUR_WIFI_SSID"和"YOUR_WIFI_PASSWORD"替换为您的WiFi凭据。 - 在
工具菜单中选择您的ESP8266开发板(例如,“WEMOS D1 R1 & mini”)和正确的COM端口。 - 上传草图。
- 打开串口监视器(将波特率设置为115200)。连接到WiFi后,它将打印IP地址。
- 在连接到同一WiFi网络的设备上打开Web浏览器并输入IP地址。您应该会看到控制页面。
- 点击ON和OFF按钮来控制LED!
后续步骤与最佳实践
Section titled “后续步骤与最佳实践”电气安全: 本教程使用低压LED。如果您将LED替换为继电器来控制市电供电设备(如灯具),您将处理致命电压。这需要深入的电气安全知识、正确的接线和绝缘。除非您具备相关资质,否则请勿尝试控制市电电压。
深入学习: 对于更健壮的IoT应用,请考虑使用MQTT而非Web服务器。MQTT是一种轻量级消息协议,专为设备间通信设计,是IoT的行业标准。您还可以探索使用mDNS(ESP8266mDNS库)来通过http://led-control.local这样的友好名称访问您的设备,而不是IP地址。