核心概念:它如何工作?
想象一下,你的 Arduino 是一个“大脑”,它很聪明,但不擅长说“网络语言”(TCP/IP),而 Wi-Fi 模块(ESP8266 或 ESP32)就是一个“翻译官”和“网络接口卡”,它专门负责处理所有的网络通信。
整个工作流程是这样的:
- Arduino (发送指令) -> (通过串口 UART) -> Wi-Fi 模块 (翻译成网络数据包) -> -> Wi-Fi 路由器 -> 互联网 -> 云服务器/网站 API

- 互联网 (返回数据) -> -> Wi-Fi 路由器 -> (翻译成串口指令) -> Wi-Fi 模块 -> (通过串口 UART) -> Arduino (接收并处理数据)
关键在于:
- 硬件:一个能连接 Wi-Fi 的微控制器(或微控制器 + Wi-Fi 模块的组合)。
- 通信协议:Arduino 和 Wi-Fi 模块之间通过 串口 进行通信。
- 网络协议:Wi-Fi 模块使用 TCP/IP 协议族(如 HTTP, MQTT, TCP Client/Server 等)与互联网交互。
核心硬件选择
选择合适的硬件是成功的第一步,目前主要有两大主流方案:

集成 Wi-Fi 的微控制器(推荐)
这是目前最流行、最方便的方案,将主控和 Wi-Fi 功能集成在一块芯片上。
| 型号 | 特点 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| ESP8266 | - 价格极其低廉(几块钱) - 32位 Tensilica L106 处理器 - 内置 Wi-Fi (802.11 b/g/n) - 可作为主控或从机(AT指令模式) |
性价比之王,社区支持极其庞大,资源丰富 | 内存较小(通常几十KB RAM),处理复杂逻辑稍吃力 | 简单的物联网设备、传感器数据上传、远程开关、智能家居入门 |
| ESP32 | - 双核 32位 LX6 处理器 - 内置 Wi-Fi & 蓝牙 - 更大的 RAM 和 ROM - 更高的性能和更多外设(ADC, DAC, Touch等) |
功能强大,性能媲美高端Arduino,蓝牙功能是巨大加分项 | 价格比ESP8266稍高 | 对性能要求高的项目、需要蓝牙的项目、复杂的网关、图像处理边缘计算 |
对于绝大多数 Arduino Wi-Fi 项目,直接使用 ESP32 或 ESP8266 开发板 是最佳选择,你可以像使用普通 Arduino 一样用 Arduino IDE 对它们进行编程。
Arduino 主控 + 外置 Wi-Fi 模块(传统方案)
这是早期的方式,将一个标准的 Arduino(如 Uno, Nano)和一个独立的 Wi-Fi 模块(如 ESP-01)结合使用。
-
Arduino 主控:负责处理传感器逻辑、执行控制命令。
-
Wi-Fi 模块:通常是一个 ESP-01 模块,工作在 AT指令模式,Arduino 通过串口发送简单的文本指令(如
AT+CIPSTART=...)给模块,模块执行网络连接和数据收发。 -
优点:灵活性高,可以用熟悉的 Arduino Uno/Nano。
-
缺点:

- 接线复杂(需要分压,因为 ESP-01 的 TX 电压是 3.3V,而 Arduino Uno 是 5V)。
- 占用 Arduino 的硬件串口,调试不便。
- 体积更大,功耗更高。
- 性能不如集成方案。
除非你有特殊需求(比如复用现有 Arduino 项目),否则不推荐新手使用此方案。
编程实现(以 ESP32/ESP8266 为例)
编程的核心是使用 Arduino IDE 中预置的 WiFi 库和相关的网络库。
环境准备
- 安装 Arduino IDE。
- 添加 ESP32/ESP8266 开发板支持:
文件->首选项->附加开发板管理器网址,添加对应链接:- ESP32:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - ESP8266:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
- ESP32:
工具->开发板->开发板管理器,搜索并安装 "esp32" 或 "esp8266" 包。
- 选择正确的开发板和端口:
工具->开发板-> 选择你的具体型号(如 "ESP32 Dev Module")。工具->端口-> 选择连接的 COM 端口。
连接 Wi-Fi
这是所有网络功能的基础,使用 WiFi 库。
#include <WiFi.h> // 对于 ESP32
// #include <ESP8266WiFi.h> // 对于 ESP8266
const char* ssid = "你的Wi-Fi名字"; // 你的 Wi-Fi 名称
const char* password = "你的Wi-Fi密码"; // 你的 Wi-Fi 密码
void setup() {
Serial.begin(115200); // 初始化串口,用于调试
Serial.println("正在连接 Wi-Fi...");
WiFi.begin(ssid, password);
// 等待连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi 连接成功!");
Serial.print("IP 地址: ");
Serial.println(WiFi.localIP()); // 打印开发板的 IP 地址
}
void loop() {
// ...
}
常用网络功能
连接上 Wi-Fi 后,你就可以实现各种互联网功能了。
A. 发送 HTTP 请求(GET/POST)
这是最常见的需求,比如将传感器数据上传到云平台(如 Thingspeak, Blynk)或自己的服务器。
#include <WiFi.h>
#include <HTTPClient.h> // HTTP 请求库
const char* ssid = "你的Wi-Fi名字";
const char* password = "你的Wi-Fi密码";
const char* serverUrl = "http://example.com/api/data?value=123"; // 示例 URL
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { // 确保还连着网
HTTPClient http;
// 配置 URL
http.begin(serverUrl);
// 或者 POST 请求
// http.begin("http://example.com/api/post");
// http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// 发送 GET 请求
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("HTTP GET 响应码: ");
Serial.println(httpResponseCode);
String payload = http.getString(); // 获取服务器返回的数据
Serial.println("返回的数据: " + payload);
} else {
Serial.print("HTTP GET 失败,错误码: ");
Serial.println(httpResponseCode);
}
http.end(); // 关闭连接
}
delay(10000); // 每 10 秒发送一次
}
B. 建立 TCP 客户端/服务器
TCP 是更底层的协议,速度更快,延迟更低,适合需要实时、双向通信的场景(如远程控制、数据流)。
-
TCP 客户端:Arduino 主动连接到一台服务器(如电脑上运行的程序)。
// ... (省略 WiFi 连接代码) ... const char* host = "192.168.1.100"; // 服务器 IP 地址 const int port = 8080; // 服务器端口 void setup() { // ... (WiFi 连接代码) ... } void loop() { if (WiFi.status() == WL_CONNECTED) { WiFiClient client; if (client.connect(host, port)) { Serial.println("连接到服务器成功"); client.println("Hello from Arduino!"); // 发送数据 client.stop(); // 断开连接 } else { Serial.println("连接服务器失败"); } } delay(5000);
