这是一款基于ESP32开发板,集成了ESP32-WOROOM-32模组,是一款通用型的WIFI加蓝牙开发板,引脚兼容Arduino。有丰富的外设,包括霍尔传感器,高速SDIO/SPI、UART、I2S和I2C等,适用于搭配传感器模块进行学习。并且可以搭载freeRTOS操作系统,非常适用于物联网、智能家居方案。
注意事项:
- 某些引脚有启动/下载模式特殊用途(如 GPIO0、GPIO2、GPIO15),上电时请避免外接影响启动的电路。
- GPIO34~39 只能做输入,不能输出。
- ADC2 在 WiFi 工作时部分通道不可用。
- 某些引脚与板载外设(如LED、Flash)复用,使用时需注意冲突。
GPIO(General Purpose Input/Output,通用输入输出)是单片机、开发板(如 ESP32、树莓派等)上最常见的一类引脚。
中文常译为“通用输入输出口”。
GPIO 的主要作用:
典型应用举例:
ESP32 上的 GPIO:
以下是 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编号,控制不同引脚。
在 MicroPython 中,Pin.OUT
和 Pin.IN
用于设置 GPIO 引脚的工作模式:
输入模式读取按键的代码示例:
from machine import Pin
button = Pin(4, Pin.IN) # GPIO4 连接按键
if button.value() == 1:
print("按钮被按下")
else:
print("按钮未按下")
说明:button.value()
读取引脚电平,1为高电平(通常表示按下),0为低电平。
S/V/G 三线接口广泛用于传感器、舵机等模块,方便快速接线。
数字引脚(Digital Pin)和模拟引脚(Analog Pin)是开发板上最常用的两类引脚:
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 机制,不能用于其他用途。此端口目前不支持虚拟定时器。
使用 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()
方法,具有不同的对应安全最大源/汇电流和近似内部驱动电阻:
hold=
关键字参数到 Pin()
和 Pin.init()
将启用ESP32的"引脚保持"功能。当设置为 True
时,引脚配置(方向、上拉电阻和输出值)将被保持,任何进一步的更改(包括更改输出电平)都不会被应用。设置 hold=False
将立即应用任何未完成的引脚配置更改并释放引脚。
有一个更高级的抽象 machine.Signal
,可用于反转引脚。对于使用 on()
或 value(1)
点亮低电平有效的LED很有用。
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都开启
重要说明:
在 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%
在 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 使用注意事项:
read_uv()
方法。