idf环境下ESP32外接WS2812B的驱动实例

上一节,使用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起航,打完收工!

                发表评论

                此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据