WiFi 与蓝牙(ESP 版)
换上 ESP32 让作品联网:连 WiFi、上报数据到云、自己当 Web 服务器、用蓝牙遥控。
换上 ESP32 让作品联网:连 WiFi、上报数据到云、自己当 Web 服务器、用蓝牙遥控。
WiFi.begin(ssid, pass) 连接,WiFi.status()==WL_CONNECTED 判断是否连上。这是最常用的联网方式。WiFi.softAP(名, 密码) 开启。也可 STA+AP 双模式并存。HTTPClient 库,几行就能发 GET/POST 并拿到响应。这是"设备→云"上报数据的标准方式。WebServer 库注册路由(server.on("/led", handler)),简单的智能家居本地控制无需云即可实现。{"temp":25.3})。发数据时把读数拼成 JSON 字符串,收数据时用 ArduinoJson 库解析。REST API 靠 URL + HTTP 方法(GET 取、POST 传)约定接口,是物联网上报/下发指令的通用语言。PubSubClient 库。上报+远程控制的主流选择。BluetoothSerial 库,SerialBT.begin("名字") 后跟普通 Serial 用法一样。低功耗场景用 BLE(BLEDevice)。yield() 或 delay(1) 把时间片让给系统任务。联网第一步:连入路由器。连上后串口会打印分配到的 IP:
#include <WiFi.h> // ESP32;ESP8266 用 <ESP8266WiFi.h> const char* ssid = "你的WiFi名"; const char* pass = "你的WiFi密码"; void setup() { Serial.begin(115200); // ESP32 常用 115200 WiFi.begin(ssid, pass); // 发起连接 Serial.print("连接中"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); // 每半秒打个点表示还在连 } Serial.println("\n已连接!"); Serial.print("IP 地址: "); Serial.println(WiFi.localIP()); // 打印分到的 IP } void loop() {}
连上 WiFi 后,把传感器读数 POST 到云平台(此处以通用 REST 接口示意):
#include <WiFi.h> #include <HTTPClient.h> void uploadData(float temp) { if (WiFi.status() != WL_CONNECTED) return; HTTPClient http; http.begin("http://example.com/api/data"); // 目标 URL http.addHeader("Content-Type", "application/json"); // 拼一个 JSON 请求体 String body = "{\"temp\":" + String(temp) + "}"; int code = http.POST(body); // 发送,返回状态码 if (code > 0) { Serial.print("响应码: "); Serial.println(code); // 200 表示成功 Serial.println(http.getString()); // 服务器返回内容 } else { Serial.println("上报失败"); } http.end(); // 释放资源 }
不想自己搭服务器?可用 Blynk(手机 App 拖拽面板)、ThingSpeak(数据可视化)、巴法云/贝壳物联(国内、支持 MQTT+小爱同学)等平台,提供现成 API 和库,几分钟就能把数据画成曲线或接入语音助手。HTTPS 上报时 ESP32 用 WiFiClientSecure,注意证书或用 setInsecure() 跳过验证(仅测试)。
让 ESP 自己开个网页,手机浏览器访问它的 IP 就能开关 LED:
#include <WiFi.h> #include <WebServer.h> WebServer server(80); // 监听 80 端口 const int ledPin = 2; // ESP32 板载 LED 常在 GPIO2 void handleRoot() { // 返回一个带两个按钮的简单网页 String html = "<h1>ESP32 控制台</h1>" "<a href='/on'>开灯</a> | <a href='/off'>关灯</a>"; server.send(200, "text/html", html); } void setup() { pinMode(ledPin, OUTPUT); WiFi.begin("你的WiFi名", "你的WiFi密码"); while (WiFi.status() != WL_CONNECTED) delay(500); // 注册路由:不同 URL 对应不同处理函数 server.on("/", handleRoot); server.on("/on", []() { digitalWrite(ledPin, HIGH); handleRoot(); }); server.on("/off", []() { digitalWrite(ledPin, LOW); handleRoot(); }); server.begin(); // 启动服务器 } void loop() { server.handleClient(); // 必须持续调用,处理进来的请求 }
用手机蓝牙串口 App 发 '1'/'0' 控灯,像有线串口一样简单:
#include <BluetoothSerial.h> BluetoothSerial SerialBT; const int ledPin = 2; void setup() { pinMode(ledPin, OUTPUT); SerialBT.begin("ESP32-Car"); // 蓝牙名,手机搜这个连 } void loop() { if (SerialBT.available()) { char c = SerialBT.read(); if (c == '1') digitalWrite(ledPin, HIGH); if (c == '0') digitalWrite(ledPin, LOW); SerialBT.print("收到: "); SerialBT.println(c); // 回发给手机确认 } }
ESP32 的 WiFi 和经典蓝牙共用一根天线,同时全开会互相抢资源、变卡。若只需近距离遥控用蓝牙(省事、无需路由器);要上云、远程访问用 WiFi。经典蓝牙(BluetoothSerial)耗电较高且 iOS 支持差,低功耗/苹果场景优先 BLE。ESP8266 没有蓝牙,只有 WiFi。
| 方式 | 距离 | 需路由器 | 能上云 | 典型用途 |
|---|---|---|---|---|
| WiFi + HTTP | 局域网/互联网 | 是 | 能 | 数据上报、远程访问 |
| WiFi + Web 服务器 | 局域网 | 是 | 否(本地) | 网页控硬件 |
| WiFi + MQTT | 互联网 | 是 | 能 | 实时双向、海量设备 |
| 蓝牙串口/BLE | 近距离(约10m) | 否 | 否 | 手机遥控、配网 |
经典 Uno 不能联网,想做物联网直接换 ESP32/ESP8266——它们兼容 Arduino 编程却自带 WiFi(ESP32 还有蓝牙)。WiFi 两种模式:STA 连入路由器上外网(WiFi.begin(ssid,pass)+等 WL_CONNECTED),AP 自建热点用于配网/直连(WiFi.softAP)。设备当客户端用 HTTPClient 发 GET/POST 把数据(常拼成 JSON)上报云平台(Blynk/ThingSpeak/巴法云等有现成库);设备当服务器用 WebServer 注册路由,手机浏览器访问 IP 即可网页控硬件,loop 里要持续 handleClient()。物联网更主流的是 MQTT(发布/订阅、省流量、双向实时,用 PubSubClient)。近距离遥控用 蓝牙串口(BluetoothSerial,像普通 Serial;低功耗/苹果用 BLE)。关键提醒:ESP32 后台跑协议栈,loop 长阻塞会触发看门狗复位,联网代码务必用 millis 非阻塞、必要时 yield() 让出时间片;WiFi 与经典蓝牙共天线,别同时全开。