ESP32开发板介绍


介绍

这是一款基于ESP32开发板,集成了ESP32-WOROOM-32模组,是一款通用型的WIFI加蓝牙开发板,引脚兼容Arduino。有丰富的外设,包括霍尔传感器,高速SDIO/SPI、UART、I2S和I2C等,适用于搭配传感器模块进行学习。并且可以搭载freeRTOS操作系统,非常适用于物联网、智能家居方案。

参数

输出电压3.3V-5V
输出电流MAX:1.2A
最大功率最大输出10W
工作温度范围-10~50摄氏度
尺寸69*54*14.5mm
重量25.5g
定位孔直径3.2mm
环保属性ROHS

接口图

KEYES ESP32 Plus接口图

原理图

原理图1
原理图2
原理图3
原理图4
原理图5

常用引脚功能说明

引脚名称主要功能说明
3V3/5V电源为开发板和外部模块供电(3.3V/5V)
GND地线电路公共地
EN使能复位/使能引脚,低电平复位芯片
GPIO0~GPIO39通用输入输出可配置为数字输入/输出,部分引脚有特殊功能
ADC1/ADC2模拟输入模拟信号采集(12位ADC),如电压检测
DAC1/DAC2模拟输出数模转换输出(8位DAC),如音频信号
UART0/UART1/UART2串口通信用于与电脑、模块通信(如 TXD, RXD)
SPI串行外设接口高速通信(如连接屏幕、SD卡)
I2C串行总线连接传感器、OLED 屏等(SDA, SCL)
PWM脉宽调制控制舵机、电机、LED 灯亮度等
Touch电容触摸支持触摸检测(如触摸按键)
SDIOSD卡接口连接 SD 卡进行数据存储
MTDI/MTCK/MTMS/MTDOJTAG调试用于硬件调试
SENSOR_VP/SENSOR_VN模拟输入ADC1 的专用输入通道
VN/VP模拟输入也用于 ADC1
  • GPIO0:启动模式选择/普通IO
  • GPIO1 (TX0):UART0 TX,默认串口输出
  • GPIO3 (RX0):UART0 RX,默认串口输入
  • GPIO2:普通IO,常用于板载LED
  • GPIO4/5/12/13/14/15/16/17:常用作普通IO、PWM、I2C、SPI等
  • GPIO34~39:仅支持输入(不能输出),常用于ADC采集

注意事项:
- 某些引脚有启动/下载模式特殊用途(如 GPIO0、GPIO2、GPIO15),上电时请避免外接影响启动的电路。
- GPIO34~39 只能做输入,不能输出。
- ADC2 在 WiFi 工作时部分通道不可用。
- 某些引脚与板载外设(如LED、Flash)复用,使用时需注意冲突。

什么是 GPIO?

GPIO(General Purpose Input/Output,通用输入输出)是单片机、开发板(如 ESP32、树莓派等)上最常见的一类引脚。
中文常译为“通用输入输出口”。

GPIO 的主要作用:

  • 通用:每个 GPIO 引脚都可以通过程序配置为“输入”或“输出”模式,灵活适配各种应用。
  • 输入模式:可以读取外部信号(如按钮、传感器的高低电平),判断外部设备的状态。
  • 输出模式:可以输出高低电平,控制 LED 灯、继电器、电机等外部设备的开关。

典型应用举例:

  • 读取按键/开关状态(输入)
  • 控制 LED 灯亮灭(输出)
  • 读取传感器信号(输入)
  • 控制蜂鸣器、继电器等(输出)

ESP32 上的 GPIO:

  • ESP32 有多个 GPIO 引脚(如 GPIO0~GPIO39),大部分都可以用作普通输入输出。
  • 某些 GPIO 还支持特殊功能(如 ADC、PWM、I2C、SPI 等),但本质上都可以作为 GPIO 使用。

GPIO 应用代码示例(MicroPython)

以下是 ESP32 使用 MicroPython 控制 LED 灯的简单示例:

from machine import Pin
import time

led = Pin(2, Pin.OUT)  # GPIO2 通常连接板载LED

while True:
    led.value(1)  # 点亮LED
    time.sleep(0.5)
    led.value(0)  # 熄灭LED
    time.sleep(0.5)

说明:本例让GPIO2上的LED灯每0.5秒闪烁一次。你可以将Pin(2, ...)中的数字改为其他GPIO编号,控制不同引脚。

Pin.OUT 与 Pin.IN 的区别

在 MicroPython 中,Pin.OUTPin.IN 用于设置 GPIO 引脚的工作模式:

  • Pin.OUT:将引脚设置为“输出”模式(Output),可通过代码输出高低电平,控制LED、继电器等外部设备。
  • Pin.IN:将引脚设置为“输入”模式(Input),可通过代码读取外部信号(如按钮、传感器的高低电平)。

输入模式读取按键的代码示例:

from machine import Pin

button = Pin(4, Pin.IN)  # GPIO4 连接按键

if button.value() == 1:
    print("按钮被按下")
else:
    print("按钮未按下")

说明:button.value() 读取引脚电平,1为高电平(通常表示按下),0为低电平。

S/V/G 三线接口丝印含义

丝印英文含义/说明
SSignal信号线(数据线,通常为黄色)
VVoltage电源正极(3.3V/5V,通常为红色)
GGround地线(GND,通常为黑色)

S/V/G 三线接口广泛用于传感器、舵机等模块,方便快速接线。

KEYES ESP32 Plus实物图
图:KEYES ESP32 Plus开发板实物,S/V/G三线接口排针清晰可见,便于模块快速接线。

主要接口与排针说明

  • 左上角
    RESET:复位按键,按下可重启开发板。
    USB-C接口:用于供电、程序下载和串口通信。
    DC 7-12V:外接电源插孔,支持7-12V直流输入。
  • 上方黄色排针
    SCL/SDA/5V/GND:I2C通信接口和电源。
    io13~io27等:数字IO口(GPIO),可用于数字输入输出、PWM等。
  • 中上部三排S/V/G排针
    S/V/G:信号/电源/地线,方便传感器、舵机等模块三线接入。
    S(黄色):信号线,连接到单片机的IO口。
    V(红色):电源正极(5V或3.3V)。
    G(黑色):地线(GND)。
  • 中部BUS I2C区域
    GND/V/SDA/SCL:专门为I2C总线外设准备的接口,方便多模块并联。
  • 中下部ANALOG区域
    G/V/S:分别为GND、VCC、信号线,信号线对应A0~A3(如io32、io33、io34、io35),用于模拟输入(ADC)。
  • 下方黄色排针
    IO/5V/RST/3V3/GND/VN/VP等:电源、复位、模拟输入(VN/VP)、地线等,适合扩展板或面包板连接。
  • 右上角
    TX/RX:串口通信引脚,常用于与电脑或其他串口设备通信。
  • 右侧大芯片
    ESP32-WROOM-32:主控芯片,负责所有运算和外设控制。
颜色与丝印快速识别
  • 黄色:信号线(S/Signal)
  • 红色:电源(V/Voltage,3.3V或5V)
  • 黑色:地线(G/GND)
实用建议
  • 插模块或传感器时,按 S(信号)-V(电源)-G(地线)顺序插入,颜色对齐,防止接错。
  • I2C、模拟、数字接口都已分区排好,便于快速实验和教学。
  • 复位、供电、串口等接口集中,调试方便。

数字引脚与模拟引脚

数字引脚(Digital Pin)和模拟引脚(Analog Pin)是开发板上最常用的两类引脚:

  • 数字引脚:只能识别和输出“高电平(1)”或“低电平(0)”,常用于按钮、LED、继电器等开关控制。
  • 模拟引脚:可以读取或输出连续变化的电压值,常用于采集传感器信号(如光敏电阻、温度传感器等)。
类型典型引脚主要功能典型应用
数字引脚GPIO0~39高/低电平输入输出按钮、LED、继电器
模拟引脚GPIO32~39等采集/输出连续电压传感器、音频、ADC/DAC

ESP32数字/模拟引脚代码示例:

# 数字输出:点亮LED
from machine import Pin
led = Pin(2, Pin.OUT)
led.value(1)  # 点亮LED

# 数字输入:读取按钮
button = Pin(4, Pin.IN)
print(button.value())  # 1=高电平,0=低电平

# 模拟输入:读取传感器
from machine import ADC
adc = ADC(Pin(34))
value = adc.read()  # 0~4095
print(value)

延时和定时功能

使用 time 模块进行延时操作:

import time

time.sleep(1)           # 延时1秒
time.sleep_ms(500)      # 延时500毫秒
time.sleep_us(10)       # 延时10微秒
start = time.ticks_ms() # 获取毫秒计数器
delta = time.ticks_diff(time.ticks_ms(), start) # 计算时间差

硬件定时器

ESP32 端口根据设备类型具有一个、两个或四个硬件定时器。ESP32C2 有1个定时器,ESP32C4、ESP32C6 和 ESP32H4 有2个定时器,其他型号有4个定时器。使用 machine.Timer 类,定时器ID为0、0和1,或从0到3(含):

from machine import Timer

tim0 = Timer(0)
tim0.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(0))

tim1 = Timer(1)
tim1.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(1))

说明:周期以毫秒为单位。使用 UART.IRQ_RXIDLE 时,定时器0用于 IRQ_RXIDLE 机制,不能用于其他用途。此端口目前不支持虚拟定时器。

引脚和GPIO控制

使用 machine.Pin 类控制GPIO引脚:

from machine import Pin

p0 = Pin(0, Pin.OUT)    # 在GPIO0上创建输出引脚
p0.on()                 # 将引脚设置为"开"(高电平)
p0.off()                # 将引脚设置为"关"(低电平)
p0.value(1)             # 将引脚设置为开/高电平

p2 = Pin(2, Pin.IN)     # 在GPIO2上创建输入引脚
print(p2.value())       # 获取值,0或1

p4 = Pin(4, Pin.IN, Pin.PULL_UP) # 启用内部上拉电阻
p5 = Pin(5, Pin.OUT, value=1) # 创建时设置引脚为高电平
p6 = Pin(6, Pin.OUT, drive=Pin.DRIVE_3) # 设置最大驱动强度

可用引脚范围

可用引脚范围(含):0-19, 21-23, 25-27, 32-39。这些对应ESP32芯片的实际GPIO引脚编号。注意许多终端用户板使用自己的临时引脚编号(标记为D0、D1等)。有关板逻辑引脚和物理芯片引脚之间的映射,请查阅您的板文档。

驱动强度设置

支持四种驱动强度,使用 drive 关键字参数到 Pin() 构造函数或 Pin.init() 方法,具有不同的对应安全最大源/汇电流和近似内部驱动电阻:

驱动强度最大电流内部电阻说明
Pin.DRIVE_05mA130 ohm低驱动强度
Pin.DRIVE_110mA60 ohm中等驱动强度
Pin.DRIVE_220mA30 ohm默认驱动强度
Pin.DRIVE_340mA15 ohm最大驱动强度

引脚保持功能

hold= 关键字参数到 Pin()Pin.init() 将启用ESP32的"引脚保持"功能。当设置为 True 时,引脚配置(方向、上拉电阻和输出值)将被保持,任何进一步的更改(包括更改输出电平)都不会被应用。设置 hold=False 将立即应用任何未完成的引脚配置更改并释放引脚。

重要注意事项

  • 引脚1和3分别是REPL UART TX和RX
  • 引脚6、7、8、11、16和17用于连接嵌入式闪存,不建议用于其他用途
  • 引脚34-39仅支持输入,也没有内部上拉电阻
  • 有关睡眠期间引脚行为的讨论,请参阅深度睡眠模式

高级引脚抽象

有一个更高级的抽象 machine.Signal,可用于反转引脚。对于使用 on()value(1) 点亮低电平有效的LED很有用。

PWM(脉冲宽度调制)

PWM 可以在所有支持输出的引脚上启用。基础频率范围从 1Hz 到 40MHz,但存在权衡:随着基础频率增加,占空比分辨率会降低。详情请参阅 LED 控制部分。

使用 machine.PWM 类:

from machine import Pin, PWM, lightsleep

pwm0 = PWM(Pin(0), freq=5000, duty_u16=32768) # 从引脚创建PWM对象
freq = pwm0.freq()         # 获取当前频率
pwm0.freq(1000)            # 设置PWM频率从1Hz到40MHz

duty = pwm0.duty()         # 获取当前占空比,范围0-1023(默认512,50%)
pwm0.duty(256)             # 设置占空比从0到1023,作为duty/1023的比率(现在25%)

duty_u16 = pwm0.duty_u16() # 获取当前占空比,范围0-65535
pwm0.duty_u16(65536*3//4)  # 设置占空比从0到65535,作为duty_u16/65535的比率(现在75%)

duty_ns = pwm0.duty_ns()   # 获取当前脉冲宽度(纳秒)
pwm0.duty_ns(250_000)      # 设置脉冲宽度(纳秒)从0到1_000_000_000/freq(现在25%)

pwm0.deinit()              # 关闭引脚上的PWM

pwm2 = PWM(Pin(2), freq=20000, duty=512)  # 一次性创建和配置
print(pwm2)                               # 查看PWM设置
pwm2.deinit()                             # 关闭引脚上的PWM

pwm0 = PWM(Pin(0), duty_u16=16384)            # 输出在25%的时间内处于高电平
pwm2 = PWM(Pin(2), duty_u16=16384, invert=1)  # 输出在25%的时间内处于低电平

pwm4 = PWM(Pin(4), lightsleep=True)           # 允许在浅睡眠模式下使用PWM

lightsleep(10*1000) # pwm0, pwm2关闭,pwm4在10秒浅睡眠期间保持开启
                    # 10秒浅睡眠后pwm0, pwm2, pwm4都开启

ESP芯片硬件外设规格

硬件规格ESP32ESP32-S2, ESP32-S3, ESP32-P4ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-H2
组数(速度模式)211
每组定时器数444
每组通道数886
不同PWM频率 = (组数 × 定时器)844
总PWM通道数(引脚,占空比)= (组数 × 通道)1686

重要说明:

  • 在浅睡眠模式下,ESP32 PWM 只能在低速模式下运行,因此只有4个定时器和8个通道可用。
  • ESP32 上最多有16个PWM通道(引脚),但只有8个不同的PWM频率可用,其余8个通道必须具有相同的频率。
  • 另一方面,在同一频率下可以有16个独立的PWM占空比。

DAC(数模转换)

在 ESP32 上,DAC 功能在引脚 25、26 上可用。在 ESP32S2 上,DAC 功能在引脚 17、18 上可用。

使用 DAC:

from machine import DAC, Pin

dac = DAC(Pin(25))  # 在引脚上创建DAC对象
dac.write(128)      # 设置0-255范围内的原始模拟值,现在50%

ADC(模数转换)

在 ESP32 上,ADC 功能在引脚 32-39(ADC 块 1)和引脚 0、2、4、12-15 和 25-27(ADC 块 2)上可用。

使用 machine.ADC 类:

from machine import ADC

adc = ADC(pin)        # 在引脚上创建ADC对象
val = adc.read_u16()  # 读取0-65535范围内的原始模拟值
val = adc.read_uv()   # 读取微伏单位的模拟值

ADC 使用注意事项:

  • ADC 块 2 也被 WiFi 使用,因此在 WiFi 激活时尝试从块 2 引脚读取模拟值会引发异常。
  • 内部 ADC 参考电压通常为 1.1V,但不同封装略有差异。
  • ADC 在接近参考电压时线性度较差(特别是在较高衰减时),最小测量电压约为 100mV,等于或低于此值的电压将读取为 0。
  • 为了准确读取电压,建议使用 read_uv() 方法。