EPS32简介

EPS32简介

简介

ESP32是一系列低成本,低功耗的单片机微控制器,集成了Wi-Fi和双模蓝牙。 ESP32系列采用Tensilica Xtensa LX6微处理器,包括双核心和单核版本,内置天线开关,RF射频模块,功率放大器,低噪声接收放大器,滤波器和电源管理模块。

ESP32由总部位于上海的中国公司乐鑫信息科技创建和开发,由台积电采用40纳米工艺制造,具有超高的射频性能、稳定性、通用性和可靠性,以及超低的功耗,满足不同的功耗需求,适用于各种应用场景。它是ESP8266微控制器的后继产品。

目前 ESP32 系列的产品型号包括 ESP32 S2(单核+2.4G wifi)、ESP32 S3(双核+2.4G wifi+蓝牙5)、ESP32 C2(单核+2.4G wifi+蓝牙5)、ESP32 C3(单核+2.4G wifi+蓝牙5)和传统的ESP32模块。

特性

性能稳定

ESP32 性能稳定,工作温度范围达到 –40°C 到 +125°C。集成的自校准电路实现了动态电压调整,可以消除外部电路的缺陷并适应外部条件的变化。

超低功耗

ESP32 专为移动设备、可穿戴电子产品和物联网 (IoT) 应用而设计。作为业内领先的低功耗芯片,ESP32 具有精细的时钟门控、省电模式和动态电压调整等特性。 例如,在低功耗 IoT 传感器 Hub 应用场景中,ESP32 只有在特定条件下才会被周期性地唤醒。低占空比可以极大降低 ESP32 芯片的能耗。射频功率放大器的输出功率也可调节,以实现通信距离、数据率和功耗之间的最佳平衡。

高集成度

ESP32 是业内领先的高度集成的 Wi-Fi+ 蓝牙解决方案,外部元器件只需大约 20 个。ESP32 集成了天线开关、射频 Balun、功率放大器、低噪声放大器、滤波器以及电源管理模块,极大减少了印刷电路板 (PCB) 的面积。 ESP32 采用 CMOS 工艺实现单芯片集成射频和基带,还集成了先进的自校准电路,实现了动态自动调整,可以消除外部电路的缺陷,更好地适应外部环境的变化。因此,ESP32 的批量生产可以不需要昂贵的专用 Wi-Fi测试设备。

Wi-Fi 和 蓝牙解决方案

ESP32 可作为独立系统运行应用程序或是主机 MCU 的从设备,通过 SPI / SDIO 或 I2C / UART 接口提供 Wi-Fi 和蓝牙功能。

不同系列的比较

我们先来看看不同模组的描述,

ESP32-S2 系列

32-bit MCU & 2.4 GHz Wi-Fi

  • 集成 ESP32-S2 芯片,Xtensa® 32-bit LX7 单核处理器,时钟频率高达 240 MHz

  • 支持多种低功耗工作状态:精细时钟门控、动态电压时钟频率调节

  • 安全机制:eFuse 存储、安全启动、Flash 加密、数字签名,支持 AES、SHA 和 RSA 算法

  • 外设包括 43 个 GPIO 口,1 个全速 USB OTG 接口,SPI,I2S,UART,I2C,LED PWM,LCD 接口,Camera 接口,ADC,DAC,触摸传感器

  • 可对接丰富的网络云平台、拥有通用的产品特性,极大缩短产品构建与上市时间

  • 通过 RF 认证以及软件协议认证

ESP32-S3 系列

32-bit MCU & 2.4 GHz Wi-Fi & Bluetooth 5 (LE)

  • Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz

  • 内置 512 KB SRAM、384 KB ROM 存储空间,并支持多个外部 SPI、Dual SPI、 Quad SPI、Octal SPI、QPI、OPI flash 和片外 RAM

  • 额外增加用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions)

  • 45 个可编程 GPIO,支持常用外设接口如 SPI、I2S、I2C、PWM、RMT、ADC、DAC、UART、SD/MMC 主机控制器和 TWAITM 控制器等

  • 基于 AES-XTS 算法的 Flash 加密和基于 RSA 算法的安全启动,数字签名和 HMAC 模块,“世界控制器 (World Controller)”模块

  • 通过 RF 认证以及软件协议认证

  • 以下是ESP32­S3 系列芯片对比,SiP flash 及 SiP PSRAM 指的是封装在芯片内部的 flash 和 PSRAM。 Octal SPI 比 Quad SPI 多占用 5 个 GPIO,即 GPIO33 ∼ GPIO37。

型号SiP flashSiP PSRAM环境温度 (°C)SPI 电压
ESP32-S3--–40 ∼ 1053.3 V/1.8 V
ESP32-S3FN88 MB (Quad SPI)-–40 ∼ 853.3 V
ESP32-S3R2-2 MB (Quad SPI)–40 ∼ 853.3 V
ESP32-S3R8-8 MB (Octal SPI)–40 ∼ 853.3 V
ESP32-S3R8V-8 MB (Octal SPI)–40 ∼ 651.8 V

ESP32-C2 系列

**32-bit RISC-V MCU & 2.4 GHz Wi-Fi & Bluetooth 5 (LE) **

  • RISC-V- 32 位单核处理器,主频高达 120 MHz

  • 行业领先的低功耗性能和射频性能

  • 内置 272 KB SRAM(其中 16 KB 专用于 cache)、576 KB ROM 存储空间

  • 14 个可编程 GPIO,支持常用外设接口如 SPI、UART、I2C、LED PWM 和 DMA

  • 通过 RF 认证以及软件协议认证

ESP32-C3 系列

**32-bit RISC-V MCU & 2.4 GHz Wi-Fi & Bluetooth 5 (LE) **

  • 集成 ESP32-C3 芯片,RISC-V 32 位单核处理器,时钟频率高达 160 MHz

  • 行业领先的低功耗性能和射频性能

  • 内置 400 KB SRAM、384 KB ROM 存储空间,并支持多个外部 SPI、Dual SPI、Quad SPI、QPI flash

  • 完善的安全机制:基于 RSA-3072 算法的安全启动、基于 AES-128-XTS 算法的 flash 加密、创新的数字签名和 HMAC 模块、支持加密算法的硬件加速器

  • 丰富的通信接口及 GPIO 管脚,可支持多种场景及复杂的应用

  • 通过 RF 认证以及软件协议认证

ESP32 系列

32-bit MCU & 2.4 GHz Wi-Fi & Bluetooth/Bluetooth LE

  • 集成 ESP32 系列芯片,两个或一个可以单独控制的 Xtensa® 32-bit LX6 处理器,时钟频率可调,范围为 80 MHz 到 240 MHz

  • +19.5 dBm 天线端输出功率,确保良好的覆盖范围

  • 传统蓝牙支持 L2CAP,SDP,GAP,SMP,AVDTP,AVCTP,A2DP (SNK) 和 AVRCP (CT) 协议

  • 低功耗蓝牙 (Bluetooth LE) 支持 L2CAP,GAP,GATT,SMP,和 GATT 之上的 BluFi,SPP-like 协议等

  • 低功耗蓝牙连接智能手机,发送低功耗信标,方便检测

  • 睡眠电流小于 5 μA,适用于电池供电的可穿戴电子设备

  • 外设包括电容式触摸传感器,霍尔传感器,SD 卡接口,以太网,高速 SPI,UART,I2S 和 I2C

  • 通过 RF 认证以及软件协议认证

开发板

ESP32-DevKitC

这个是乐鑫公司自己家的开发板产品,价格贵,通常在68到88元之间,但质量有保证。

NodeMCU ESP32

NodeMCU,有些地方也叫(AI-Thinker)是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP32的低功耗UART-WiFi芯片模组开发出来的开发板产品,价格通常二三十元,质量也不错。

技术规格书

技术规格书下载


ESP32 开发实战

1. Arduino IDE 开发环境

安装步骤

  1. 下载并安装Arduino IDE(1.8.x或2.x版本)
  2. 打开”文件” → “首选项” → “附加开发板管理器网址”
  3. 添加ESP32开发板URL:
    https://dl.espressif.com/dl/package_esp32_index.json
  4. 打开”工具” → “开发板” → “开发板管理器”
  5. 搜索”ESP32”并安装

基础示例代码

// LED闪烁示例
#define LED_PIN 2  // ESP32内置LED通常在GPIO2

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);
  Serial.println("ESP32 Started!");
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
  Serial.println("LED toggled");
}

2. WiFi 连接示例

#include <WiFi.h>

const char* ssid = "your_ssid";
const char* password = "your_password";

void setup() {
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // 您的代码
}

3. 蓝牙 BLE 示例

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  
  BLEDevice::init("ESP32_BLE");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
    CHARACTERISTIC_UUID,
    BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE
  );
  
  pCharacteristic->setValue("Hello World");
  pService->start();
  
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  
  Serial.println("Characteristic defined! Now you can read it in your phone!");
}

void loop() {
  delay(2000);
}

4. 传感器读取示例

// DHT11温湿度传感器
#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
}

void loop() {
  delay(2000);
  
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" *C");
}

5. 低功耗应用

// 深度睡眠模式
#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP  10  // 睡眠10秒

void setup() {
  Serial.begin(115200);
  
  // 配置唤醒源
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  
  Serial.println("Going to sleep now");
  Serial.flush();
  
  // 进入深度睡眠
  esp_deep_sleep_start();
}

void loop() {
  // 这行代码永远不会执行
}

6. OTA 无线更新

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

const char* ssid = "your_ssid";
const char* password = "your_password";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  ArduinoOTA.setHostname("esp32-device");
  ArduinoOTA.setPassword("admin123");
  
  ArduinoOTA.onStart([]() {
    Serial.println("Start updating");
  });
  
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });
  
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

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

7. 常见问题解决

问题1:上传失败

  • 按住BOOT按钮再按RST按钮
  • 检查USB线缆是否支持数据传输
  • 安装CP2102或CH340驱动

问题2:WiFi连接不稳定

  • 检查天线连接
  • 降低WiFi发射功率
  • 使用外部天线

问题3:内存不足

  • 使用ESP.getFreeHeap()监控内存
  • 避免大数组和字符串
  • 使用String.reserve()预分配内存

问题4:功耗过高

  • 使用深度睡眠模式
  • 关闭未使用的外设
  • 降低CPU频率

8. 性能优化技巧

// 1. 使用DMA提高SPI/I2C速度
#include <driver/spi_master.h>

// 2. 使用中断而非轮询
attachInterrupt(digitalPinToInterrupt(2), myISR, FALLING);

// 3. 使用FreeRTOS多任务
xTaskCreate(task1, "Task1", 10000, NULL, 1, NULL);
xTaskCreate(task2, "Task2", 10000, NULL, 1, NULL);

// 4. 优化ADC采样
analogReadResolution(12);  // 12位分辨率
analogSetAttenuation(ADC_11db);  // 11dB衰减

9. 项目创意

  1. 智能家居控制器:WiFi + MQTT + 传感器
  2. 气象站:温湿度、气压、风速监测
  3. 植物浇水系统:土壤湿度传感器 + 水泵控制
  4. 宠物喂食器:定时控制 + 手机APP
  5. 空气质量监测:PM2.5、CO2、VOC传感器
  6. 智能门锁:BLE + 指纹识别
  7. 运动追踪器:加速度计 + BLE + 手机APP
  8. 环境监测站:LoRa + 太阳能 + 远程传输

10. 学习资源

官方资源

社区资源

视频教程

  • Andreas Spiess YouTube频道
  • Great Scott! YouTube频道
  • Random Nerd Tutorials

希望这篇ESP32入门指南能帮助你快速上手!ESP32是一个功能强大且价格实惠的平台,适合各种物联网和嵌入式项目。开始你的ESP32之旅吧!


相关资源: