我用的 ESP32 DEVKIT V1引脚图
一、GPIO
1、初始化GPIO
pinMode(pin, mode)
作用:设置一个引脚(pin)作为GPIO时的I/O模式。
参数:
pin:引脚编号
mode:GPIO的I/O模式,取值有3种
INPUT :作为数字输入
OUTPUT :作为数字输出
INPUT_PULLUP:作为数字输入,且使能引脚的内部上拉电阻
注意:
a、引脚作为PWM输出时,无需先前使用pinMode配置其模式,因为PWM本身就代表了输出的意思。且官方库源代码中可以发现,它已经帮我们配置为输出了。
b、模拟引脚也可以作为数字引脚使用,完全OK。这在数字引脚不够用的情况下非常有用。
2、GPIO数字输出
digitalWrite(pin,value)
作用:设置一个数字输出引脚的输出电平值,HIGH或者LOW。
参数:
pin:引脚编号。此引脚必须在之前使用pinMode设置为OUTPUT模式。
value:2个值
LOW:输出低电平
HIGH:输出高电平
3、GPIO数字输入
int digitalRead(pin)
作用:读取一个数字输入引脚的电平值。
返回:HIGH(高电平)或者LOW(低电平)。
参数:
pin:引脚编号。
示例 : 按键控制灯亮灭
void setup()
{
pinMode(2,OUTPUT);
pinMode(0,INPUT_PULLUP);
}
void loop()
{
if(digitalRead(0))
{
while(digitalRead(0));
digitalWrite(2,!digitalRead(2));
}
}
4、GPIO模拟输入:analogRead(pin)
注意 : 模拟输入是通过PWM实现的, 所以不需要初始化PIN
analogRead(4)
5. 模拟信号输入分辨率: analogSetWidth(bit);
bit的值 | 范围 |
---|---|
9 | 0~511 |
10 | 0~1023 |
11 | 0~2047 |
12(默认) | 0~4095 |
6. 模拟信号输出 (基于LEDC)
LEDC是基于PWM调制实现模拟输出的.
与arduino uno主板不同, ESP32的PWM模拟是一个个通道 共16个, 通道可以映射到引脚上. 引脚就可以输出PWM信号了.
6.1 设置通道 ledcSetup(channel,freq,bit_num)
参数:
- channel : LEDC的PWM通道参数,可选0~15
- freq : 10Hz到40MHz , 但较高的频率精确度低
- bit_num: 占空比分辨率(可选1~16), 比如bit_num=8 则范围 0~2的8次方 , 也就是0~255
推荐的配置:
频率 | 位深 | 过渡的可用步骤 |
---|---|---|
1220赫兹 | 16 | 65536 |
2441赫兹 | 15 | 32768 |
4882赫兹 | 14 | 16384 |
9765Hz | 13 | 8192 |
19531赫兹 | 12 | 4096 |
ledcSetup(1,1200,16);
6.2 通道与引脚映射 ledcAttachPin(pin,channel)
ledcAttachPin(5,1);
注意: 一个通道可以同时映射多个引脚
6.3 取消引脚的PWM映射 ledcDetachPin(pin)
ledcDetachPin(5);
6.4 向指定通道写入占空比 ledcWrite(channel,duty)
例: 呼吸灯
bool add_status = true;
void setup()
{
pinMode(2,OUTPUT);
ledcSetup(2,1200,8);
ledcAttachPin(2,2);
}
void loop()
{
for(int i = 0 ; i<256; i++)
{
if(add_status)
{
ledcWrite(2,i);
}
else
{
ledcWrite(2,256-i);
}
delay(5);
}
add_status = !add_status;
}
例子, 全彩呼吸灯
#include <Arduino.h>
#define LED_R 27
#define LED_G 33
#define LED_B 32
void setup()
{
Serial.begin(115200);
ledcSetup(1, 1200, 8);
ledcSetup(2, 1200, 8);
ledcSetup(3, 1200, 8);
ledcAttachPin(LED_R, 1);
ledcAttachPin(LED_G, 2);
ledcAttachPin(LED_B, 3);
ledcWrite(1, 255);
ledcWrite(2, 255);
ledcWrite(3, 255);
}
void loop()
{
f