ESP32物联网开发实战:基础环境搭建

确保开发环境配置正确是ESP32开发的第一步。安装Arduino IDE或PlatformIO,添加ESP32开发板支持。以Arduino IDE为例,需在首选项中添加以下开发板管理器网址:

https://dl.espressif.com/dl/package_esp32_index.json

安装完成后,选择ESP32开发板型号(如ESP32 Dev Module)。


连接Wi-Fi网络

ESP32作为物联网设备的核心功能是联网。以下代码演示如何连接Wi-Fi:

#include <WiFi.h>

const char* ssid = "你的Wi-Fi名称";
const char* password = "你的Wi-Fi密码";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\n连接成功,IP地址: ");
  Serial.println(WiFi.localIP());
}

void loop() {}

代码说明:

  • WiFi.begin()初始化连接,WiFi.status()检查状态,成功后会打印本地IP地址。

MQTT协议通信实例

MQTT是物联网常用的轻量级协议。以下代码使用PubSubClient库实现MQTT消息发布:

#include <WiFi.h>
#include <PubSubClient.h>

const char* mqtt_server = "mqtt.eclipseprojects.io";
WiFiClient espClient;
PubSubClient client(espClient);

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("收到消息 [");
  Serial.print(topic);
  Serial.print("]: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      client.subscribe("test/topic");
    } else {
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) reconnect();
  client.loop();
  client.publish("test/topic", "Hello from ESP32");
  delay(2000);
}

代码说明:

  • PubSubClient库实现MQTT客户端功能,callback处理接收到的消息,reconnect确保断线重连。

传感器数据采集与上传

以DHT11温湿度传感器为例,采集数据并上传至MQTT服务器:

#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>

#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.begin(ssid, password);
  client.setServer(mqtt_server, 1883);
}

void loop() {
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("读取传感器失败");
    return;
  }
  
  char msg[50];
  snprintf(msg, 50, "温度: %.2f°C, 湿度: %.2f%%", temperature, humidity);
  client.publish("sensor/data", msg);
  delay(10000);
}

代码说明:

  • DHT库读取传感器数据,snprintf格式化字符串后通过MQTT发布。

OTA远程固件更新

ESP32支持OTA(Over-The-Air)更新,无需物理连接:

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiClient.h>
#include <ArduinoOTA.h>

void setup() {
  ArduinoOTA
    .onStart([]() { Serial.println("开始更新"); })
    .onEnd([]() { Serial.println("\n更新完成"); })
    .onError([](ota_error_t error) { Serial.printf("错误[%u]: ", error); });

  ArduinoOTA.begin();
  Serial.println("OTA就绪");
}

void loop() {
  ArduinoOTA.handle();
}

代码说明:

  • ArduinoOTA库实现远程更新功能,需与Wi-Fi配合使用,可通过IDE或espota.py工具上传固件。

以上实例覆盖了ESP32物联网开发的核心场景,可根据实际需求扩展功能(如HTTPS加密、数据存储等)。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐