ESP32 架构包括将一些外设配置到任何 GPIO 引脚的功能,由 IO MUX GPIO 管理。从本质上讲,此功能意味着我们可以使用 IO MUX 和 GPIO Matrix 将内部外设路由到不同的物理引脚。
Digtal pads是GPIO引脚,我们看到图上是一个双箭头,代表的是双向,既可以作为输入也可也作为输出。
IO MUX 中每个GPIO管脚有一组寄存器。每个管脚可以配置成GPIO功能(连接GPIO交换矩阵)或者直连功能(旁路GPIO交换矩阵,快速信号如以太网、SDIO、SPI、JTAG、UART等会旁路GPIO交换矩阵以实现更好的高频数字特性。所以高速信号会直接通过IOMUX输入和输出。)
GPIO交换矩阵则可以将部分外设映射到任意的I/O口上
要使用此功能,我们必须注意一些预防措施:
某些 GPIO 仅为 INPUT。
一些外设具有 OUTPUT 信号,必须在能够配置为 OUTPUT 的 GPIO 上使用。
一些外设,主要是高速外设、ADC、DAC、Touch 和 JTAG 使用专用的 GPIOs 引脚。
一些引脚用于连接模块上的闪存 - 这可以防止它们用于任何其他用途 - 如果外围设备被路由到这些引脚之一,设备将无法启动。
ESP32共有34个物理GPIO管脚,序号为:0-19,21-23,25-27,32-39。其中GPIO34-39仅用作输入管脚,其他的既可以作为输入又可以作为输出管脚,GPIO2为启动引脚,最好也好不要接东西。
以下是 ESP32 上的基本外设列表。外设列表可能因每个 ESP32 SoC 系列而异。要查看 ESP32-S2 和 ESP32-C3 上可用的所有外设,请查看每个数据表。
Type 类型 |
Function 功能 |
---|---|
ADC |
Dedicated GPIOs 专用 GPIO |
DAC |
Dedicated GPIOs 专用 GPIO |
Touch Sensor 触摸传感器 |
Dedicated GPIOs 专用 GPIO |
JTAG |
Dedicated GPIOs 专用 GPIO |
SD/SDIO/MMC HostController |
Dedicated GPIOs 专用 GPIO |
Motor PWM 电机 PWM |
Any GPIO 任何 GPIO |
SDIO/SPI SlaveController SDIO/SPI 从控制器 |
Dedicated GPIOs 专用 GPIO |
UART |
Any GPIO[1] 任何 GPIO[1] |
I2C |
Any GPIO 任何 GPIO |
I2S |
Any GPIO 任何 GPIO |
LED PWM |
Any GPIO 任何 GPIO |
RMT |
Any GPIO 任何 GPIO |
GPIO |
Any GPIO 任何 GPIO |
Parallel QSPI 并行 QSPI |
Dedicated GPIOs 专用 GPIO |
EMAC |
Dedicated GPIOs 专用 GPIO |
Pulse Counter 脉冲计数器 |
Any GPIO 任何 GPIO |
TWAI |
Any GPIO 任何 GPIO |
USB |
Dedicated GPIOs 专用 GPIO |
[1] 除了由 bootloader 决定的下载/编程模式。
该表格位于 Espressif 提供的每个数据表中。
在 Arduino Uno 中,我们有由硬件定义的 I2C 引脚,A4 是 SDA,A5 是 SCL。在这种情况下,我们不需要在 Wire.begin(); 函数中设置这些引脚,因为它们已经在 Wire 库中。
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
}
现在,对于 ESP32,I2C 的默认引脚是 SDA (GPIO21) 和 SCL (GPIO22)。如果您需要更改引脚,我们可以使用不同的引脚作为默认引脚的替代。要更改引脚,我们必须在调用 Wire.begin(); 之前调用 Wire.setPins(int sda, int scl); 该函数。
int sda_pin = 16; // GPIO16 as I2C SDA
int scl_pin = 17; // GPIO17 as I2C SCL
void setup()
{
Wire.setPins(sda_pin, scl_pin); // Set the I2C pins before begin
Wire.begin(); // join i2c bus (address optional for master)
}
PID控制算法是结合比例、积分和微分三种环节于一体的控制算法,它是连续系统中技术最为成熟、应用最为广泛的一种控制算法。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
ESP32Encoder库是一个利用ESP32脉冲计数器硬件外设实现高效旋转编码器读取的软件库。
本文对比了几款适合物联网开发的盒子硬件参数,供大家参考。
乐动掌控采用掌控板作为主控,塑胶一体式外壳,侧面和底面开具多个乐高扩展孔位,兼容乐高积木,可完成多种创意应用。
在MicroPython的ESP32库中,NVS类用于管理非易失性存储,支持 32 位有符号整数和 二进制blob。
Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。
本方案是一个基于ESP32-CAM + 物联网的图像采集方案。
ESP32-CAM与MicroPython结合可实现摄像头图像采集、视频流传输等功能,不过Micropython官方没有支持ESP32-CAM的固件,需要烧录第三方的专有固件。
相信很多人都有把绿植给养死的经历,可能是浇水过多、忘记浇水、较长时间不在家不能浇水等,本文介绍一种可以灵活定制的智能浇花方案。
MicroPython 在 ESP32 上支持线程(Thread)功能,通过_thread模块实现。线程允许程序并发执行多个任务,适合处理需要同时运行的场景,例如传感器数据采集和网络通信。