实际上,就是通过占空比,来进行控制脉冲的持续发送时间。
虽然,文档里面写的是用来发送和接收红外遥控信号,但同样可以用于控制LED。
首先,我们需要引入库文件:(见附件包:
)
led_strip_rmt_ws2812.c和led_strip.h
led_strip_rmt_ws2812.c:封装了rmt_ws2812具体的操作逻辑,使得不我们不用关心具体的RMT操作处理,专心于我们自己的LED逻辑处理即可。
led_strip.h:提供了操作的接口,便于我们在程序中调用。
上述两个文件,不仅适用于Arduino,直接在ESP-IDF下进行开发,也同样可以使用。
然后,就是我们Arduino的代码:
- /*! MIT License. Copyright 2021-2021 HonestQiao . See LICENSE.txt. */
- #include
- #include "esp_system.h"
- #include "led_strip.h"
- // FireBeetle Board ESP32-E 开发版板载三色LED
- #define CONFIG_BLINK_LED_RMT_CHANNEL 0
- #define BLINK_GPIO D8
- // 循环处理参数
- static uint8_t s_led_idx = 0;
- // LED处理
- static uint8_t s_led_state = 0;
- static led_strip_t *pStrip_a;
- // LED 像素点
- static uint8_t i_R = 0;
- static uint8_t i_G = 0;
- static uint8_t i_B = 0;
- // 设置LED
- static void configure_led(void) {
- Serial.print("Configured to blink addressable LED!");
- /* 初始化通道和端口 */
- pStrip_a = led_strip_init(CONFIG_BLINK_LED_RMT_CHANNEL, BLINK_GPIO, 1);
- /* 关闭所有LED以清除所有颜色像素 */
- pStrip_a->clear(pStrip_a, 50);
- }
- // 点亮LED
- static void blink_led(void) {
- if (s_led_state) {
- Serial.print("LED ONn");
- /* 清零 */
- i_R = i_G = i_B = 0;
-
- /* 使用RGB将每种颜色的LED像素从0(0%)设置为255(100%)*/
- i_R = s_led_idx==0 ? 32 : i_R; // 0-红色
- i_G = s_led_idx==1 ? 32 : i_G; // 1-绿色
- i_B = s_led_idx==2 ? 32 : i_B; // 2-蓝色
- /* 检查是否白色 */
- i_R = s_led_idx==3 ? 32 : i_R; // 3-白色,全部点亮
- i_G = s_led_idx==3 ? 32 : i_G; // 3-白色,全部点亮
- i_B = s_led_idx==3 ? 32 : i_B; // 3-白色,全部点亮
- Serial.printf("LED Color:R=%d G=%d B=%dn", i_R, i_G, i_B);
- /* 设置RGB颜色 */
- pStrip_a->set_pixel(pStrip_a, 0, i_R, i_G, i_B);
-
- /* 刷新条带以发送数据 */
- pStrip_a->refresh(pStrip_a, 100);
- /* 自增,如果大于3则返回1 */
- s_led_idx++;
- s_led_idx = s_led_idx>3 ? 0 : s_led_idx;
- } else {
- Serial.print("LED OFFn");
- /* 关闭所有LED以清除所有颜色像素 */
- pStrip_a->clear(pStrip_a, 50);
- }
- }
- void setup() {
- Serial.begin(115200);
- Serial.println("Scanning...");
- // 配置LED
- configure_led();
- }
- void loop() {
- /* 交替点亮,达到闪烁效果 */
- s_led_state = 0; //!s_led_state;
- /* 处理LED显示 */
- blink_led();
-
- delay(1000);
- }
复制代码
代码讲解:
上述代码中,核心在于两个部分:
configure_led():用于初始化LED,我们选用RMT通道0,GPIP端口D8进行初始化
blink_led():处理LED的显示。
在LED显示部分,为了达到交替显示的效果,或者说闪烁,我们用了一个变量s_led_state,每次loop()时,取反,从而控制LED是否点亮。
我们还有了一个变量s_led_idx,取值为0-3,分别代表:
0-红色
1-绿色
2-蓝色
3-白色(以上三色全部点亮)
初始化部分,调用的led_strip库函数,没有需要多与解释的,重点在于控制显示部分。
1. 初始化:
pStrip_a = led_strip_init(CONFIG_BLINK_LED_RMT_CHANNEL, BLINK_GPIO, 1);
2. 清空显示:
pStrip_a->clear(pStrip_a, 50);:表示清空显示,第二个参数表示操作返回时间,一般为50或者100
3. 设置RGB:
pStrip_a->set_pixel(pStrip_a, 0, i_R, i_G, i_B):表示设置RGB颜色值,i_R、i_G、i_B设置范围为0~255
4. 显示对应的颜色:
pStrip_a->refresh(pStrip_a, 100); 刷新输出设置的颜色,并显示出来
最终,实际的运行效果如下:
串口输出结果:
实际效果视频:
RMT_LED