上一节,使用ESP32的IO实现了单个LED的闪烁。其实,在工程中还有一部分代码,由于条件编译的原因,没有执行。它们实现的功能是,使用单个GPIO,驱动一个或多个WS2812,实现不同颜色的灯光显示。
使用方法如下:
一、进入menuconfig配置页面
打开ESP-IDF终端,并输入命令:idf.py menuconfig,然后敲回车,进入menuconfig页面。
如下所示:
二、配置IO工作模式
进入Example Configuration选项,列表第一行当前显示的是:Blink LED type(GPIO)。
敲回车,在弹出的选项中,选择第二个:LED strip,然后敲回车。
返回上一级菜单后,可以看到第一行变为了:Blink LED type(LED strip),第二行新加了一行内容,如图:
IO编号那里,之前是26,现在我改为了16,因为我的板子16管脚可以外接一串WS2812。
三、保存、退出
键盘输入S,保存;输入Q,退出。
四、工程编译
点击屏幕左下方的扳手图标,进行编译。
这时,重新查看代码,可以看到strip部分的代码显示有效,如下图:
五、程序烧录
编译成功后,点击旁边闪电样式的按钮,进行烧录。我这里是一串WS2812,共12个,可以看到第一个灯亮了。基本上一秒亮,一秒灭。
现在我想改一下,一次亮10个,怎么改?
六、修改WS2812数量
需要修改两个位置,一个是灯的数量,一个是灯的颜色。
6.1 灯的数量
修改第50行这里,之前是1,表示只点亮一个。现在改成10,表示要点亮10个。
6.2 灯的颜色
函数:blink_led 这里,之前是这样:
主要看第35行,函数:led_strip_set_pixel()。第二个参数“0”,表示要点亮的是第“0”个LED,后面的三个参数表示RGB,三原色的值,0~255。
修改函数(颜色这里我随便写的),如下:
static void blink_led(void)
{
/* If the addressable LED is enabled */
if (s_led_state) {
/* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */
led_strip_set_pixel(led_strip, 0, 50, 0, 0);
led_strip_set_pixel(led_strip, 1, 0, 50, 0);
led_strip_set_pixel(led_strip, 2, 0, 0, 50);
led_strip_set_pixel(led_strip, 3, 0, 20, 20);
led_strip_set_pixel(led_strip, 4, 0, 30, 30);
led_strip_set_pixel(led_strip, 5, 20, 20, 0);
led_strip_set_pixel(led_strip, 6, 30, 30, 0);
led_strip_set_pixel(led_strip, 7, 20, 0, 20);
led_strip_set_pixel(led_strip, 8, 30, 0, 30);
led_strip_set_pixel(led_strip, 9, 10, 50, 0);
/* Refresh the strip to send data */
led_strip_refresh(led_strip);
} else {
/* Set all LED off to clear all pixels */
led_strip_clear(led_strip);
}
}
七、再次编译、烧录
保存后,再次编译、下载。可以看到10个LED,分别显示不同的颜色,一秒亮,一秒灭,如图:
不得不说,乐鑫的SDK中提供的例程源码还是很丰富的。我是单片机爱好者-MCU起航,打完收工!