核心概念:它如何工作?

想象一下,你的 Arduino 是一个“大脑”,它很聪明,但不擅长说“网络语言”(TCP/IP),而 Wi-Fi 模块(ESP8266 或 ESP32)就是一个“翻译官”和“网络接口卡”,它专门负责处理所有的网络通信。

整个工作流程是这样的:

  1. Arduino (发送指令) -> (通过串口 UART) -> Wi-Fi 模块 (翻译成网络数据包) -> -> Wi-Fi 路由器 -> 互联网 -> 云服务器/网站 API

  1. 互联网 (返回数据) -> -> Wi-Fi 路由器 -> (翻译成串口指令) -> Wi-Fi 模块 -> (通过串口 UART) -> Arduino (接收并处理数据)

关键在于:

  • 硬件:一个能连接 Wi-Fi 的微控制器(或微控制器 + Wi-Fi 模块的组合)。
  • 通信协议:Arduino 和 Wi-Fi 模块之间通过 串口 进行通信。
  • 网络协议:Wi-Fi 模块使用 TCP/IP 协议族(如 HTTP, MQTT, TCP Client/Server 等)与互联网交互。

核心硬件选择

选择合适的硬件是成功的第一步,目前主要有两大主流方案:

Arduino如何接入WiFi实现互联网通信?

集成 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。

  • 缺点

    Arduino如何接入WiFi实现互联网通信?

    • 接线复杂(需要分压,因为 ESP-01 的 TX 电压是 3.3V,而 Arduino Uno 是 5V)。
    • 占用 Arduino 的硬件串口,调试不便。
    • 体积更大,功耗更高。
    • 性能不如集成方案。

除非你有特殊需求(比如复用现有 Arduino 项目),否则不推荐新手使用此方案


编程实现(以 ESP32/ESP8266 为例)

编程的核心是使用 Arduino IDE 中预置的 WiFi 库和相关的网络库。

环境准备

  1. 安装 Arduino IDE
  2. 添加 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" 或 "esp8266" 包。
  3. 选择正确的开发板和端口工具 -> 开发板 -> 选择你的具体型号(如 "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);