开发板设计了一个共阳极的 RGB 彩灯,彩灯实际上由三盏 LED 灯组成,LED 灯颜色分别为: 红色、绿色和蓝色,这个实验我们学习如何控制亮和灭。我们的彩灯是共阳极的,阴极通过电阻后连接到拨码开关上,经过拨码开 关才连接到 ESP32 上。我们这里的拨码开关的作用是控制 ESP32 的 IO 口和彩灯之间连接和断开。
ESP32 的 ESP-IDF 编程指南可以从官网上查询:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/index.html
在这个实验里,实际上就是要设置 IO 口为输出功能,然后拉高拉低就可以了,分三步:选择 IO 口、 设置为输出功能和控制高低。
(1) 选择 IO 口
选择 IO 口是通过函数 gpio_pad_select_gpio()来实现的,这个函数只有一个参数,即 IO 口的序号。 比如选择 IO32,可以这样写:
gpio_pad_select_gpio(32);
(2) 设置为输出功能
设置 IO 口方向是通过函数 gpio_set_direction()来实现的,这个函数有二个参数,第一个参数是 IO 口的序号,第二个参数是方向(输出:GPIO_MODE_OUTPUT,输入:GPIO_MODE_INPUT),比如设置 IO32 为输出功能,可以这样写:
gpio_set_direction(32,GPIO_MODE_OUTPUT);
(3) 控制高低
控制 IO 口的电平是通过函数 gpio_set_level 来实现,这个函数有二个参数,第一个参数是 IO 口的 序号,第二个参数是高或者低(也就是 0 和 1),比如设置 IO32 输出高电平,可以这样写:
gpio_set_level(32,1);
(4) 任务睡眠函数
为了实现 LED 闪烁功能,我们在这里引入了任务睡眠函数,定义如下:
void vTaskDelay(portTickType xTicksToDelay);
该函数目的在于告诉操作系统,现在无任务在做,请告诉 kernel 将时间分配给其他任务,并在某 个时间点将该任务唤醒。这个时间点就是函数的入参,一般都是以 tick 为单位。
vTaskDelay(1)约等于 10 毫秒,如果要延时 1 秒可以写 vTaskDelay(100)。
//控制红灯
void led_red(int on)
{
if(on==LED_ON)
{
gpio_set_level(LED_RED_IO, LED_ON);//开灯
}
else
{
gpio_set_level(LED_RED_IO, LED_OFF);//关灯
}
}
//控制绿灯
void led_green(int on)
{
if(on==LED_ON)
{
gpio_set_level(LED_GREEN_IO, LED_ON);//开灯
}
else
{
gpio_set_level(LED_GREEN_IO, LED_OFF);//关灯
}
}
//控制蓝灯
void led_blue(int on)
{
if(on==LED_ON)
{
gpio_set_level(LED_BLUE_IO, LED_ON);//开灯
}
else
{
gpio_set_level(LED_BLUE_IO, LED_OFF);//关灯
}
}
//LED 初始化 void initLed()
{
//初始化彩灯的 IO 口,
//红灯:GPIO32,绿灯:GPIO15,蓝灯:GPIO16 gpio_pad_select_gpio(LED_RED_IO); gpio_pad_select_gpio(LED_GREEN_IO); gpio_pad_select_gpio(LED_BLUE_IO); gpio_set_direction(LED_RED_IO, GPIO_MODE_OUTPUT); gpio_set_direction(LED_GREEN_IO, GPIO_MODE_OUTPUT); gpio_set_direction(LED_BLUE_IO, GPIO_MODE_OUTPUT);
//关红绿蓝三色灯 led_red(LED_OFF); led_green(LED_OFF);
按下开发板的复位键,观察板子上的彩灯变化。
最后推荐一款开发套件,可以手淘扫码查看。