ESP32点亮RGBLED(或者叫ws2812)

        兄弟们,咱平时挺喜欢花里胡哨。

        最近买了一个ws2812,于是,今天一起简简单单点个灯。嘿嘿嘿。

一、环境:

arduino IDE或VS Code PlatformIO (我是后者)

二、硬件准备:

一个esp32

一台电脑

一根数据线

ws2812款的RGBLED,其他型号的RGBLED也可以(我猜)。

 接线:

ESP32WS2812
IO4IN
GNDGND
VNVCC

三、代码功能:

        点亮一个RGBLED:

什么?为什么是绿灯,可能是渴望青青草原的力量吧。狗头。

四、下载FastLED库:

这里是VS Code PlatformIO 上fastLED库的下载方式。(作为鱼香ROS受众,吹一句大佬好强。)

这里介绍了三种安装方法。

我用了方法一。

见图:

五、最简代码

#include <FastLED.h>
#include <Arduino.h>
// 设置灯条上有多少个LED,假如有一个灯条有10个LED,那么NUM_LEDS的值就是10
#define NUM_LEDS 1
// 控制引脚
#define DATA_PIN 4

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
    // 灯初始化
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);  // GRB ordering is assumed


void loop() { 
  // Turn the LED on, then pause
  leds[0] = CRGB::Green;
  FastLED.show();
  delay(500);
  // Now turn the LED off, then pause
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(500);
}                    

六、实用代码

这里也许是一个更实用的代码。

/// @file    Blink.ino
/// @brief   Blink the first LED of an LED strip
/// @example Blink.ino

#include <FastLED.h>

// How many leds in your strip?
// 设置灯条上有多少个LED,假如有一个灯条有10个LED,那么NUM_LEDS的值就是10
#define NUM_LEDS 1

// For led chips like WS2812, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
// Clock pin only needed for SPI based chipsets when not using hardware SPI
#define DATA_PIN 4
// #define CLOCK_PIN 13

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
    // Uncomment/edit one of the following lines for your leds arrangement.
    // ## Clockless types ##
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);  // GRB ordering is assumed
    // FastLED.addLeds<SM16703, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1829, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1812, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS1904, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS2903, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<WS2852, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<GS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<SK6812, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<APA106, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<PL9823, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2813, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<APA104, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2811_400, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<GE8822, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<LPD1886, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<LPD1886_8BIT, DATA_PIN, RGB>(leds, NUM_LEDS);
    // ## Clocked (SPI) types ##
    // FastLED.addLeds<LPD6803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<P9813, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
    // FastLED.addLeds<DOTSTAR, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
    // FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
    // FastLED.addLeds<SK9822, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
}

void loop() { 
  // Turn the LED on, then pause
  leds[0] = CRGB::Green;
  FastLED.show();
  delay(500);
  // Now turn the LED off, then pause
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(500);
}                    

        没错,这是这个库的一个demo。优雅地微笑。

        不解释啦,自己读代码吧。

        库里有很多例子,可以实现炫酷的功能,感兴趣自己去探索吧。

最后,我有话说:

        如果文章对你有帮助,我很开心。有疑问请留言,看到后,我会回复。

### 使用 MicroPython 在 ESP32 上控制 WS2812 彩灯 #### 安装必要的库文件 为了能够顺利运行代码,在使用 MicroPython 控制 WS2812 彩灯之前,需要安装 `neopixel` 库。该库提供了对 NeoPixel LED 驱动的支持,使得设置颜色、亮度以及创建动画变得简单而直观[^1]。 ```python from machine import Pin from neopixel import NeoPixel import time ``` 这段导入语句包含了操作硬件引脚所需的类和用于管理 NeoPixels 的模块。 #### 初始化 NeoPixel 对象 定义一个函数来初始化 NeoPixel 实例,指定数据线所连接的 GPIO 引脚编号及链上的像素数量: ```python def init_neopixel(pin_num, num_pixels): pin = Pin(pin_num, Pin.OUT) # 设置GPIO模式为输出 strip = NeoPixel(pin, num_pixels) return strip ``` 此部分配置了物理接口并实例化了一个代表整个 LED 条带的对象,允许后续对其进行编程控制。 #### 基本色彩填充功能实现 下面是一个简单的例子,展示如何改变所有 LEDs 的颜色至红色,并保持一段时间后再关闭它们: ```python strip = init_neopixel(14, 8) # 假设D14作为数据输入端口且有8颗LED for i in range(len(strip)): strip[i] = (255, 0, 0) # 设定RGB值分别为红绿蓝分量强度;这里表示纯红色 strip.write() # 更新实际显示状态 time.sleep_ms(1000) # 清除所有灯光 for i in range(len(strip)): strip[i] = (0, 0, 0) strip.write() ``` 上述代码片段展示了基本的操作流程——先设定各像素的颜色属性,再调用 `.write()` 方法刷新到硬件上生效。 #### 创建动态效果 除了静态着色外,还可以轻松构建更复杂的视觉特效,比如彩虹渐变循环播放的效果如下所示: ```python def wheel(pos): """Generate rainbow colors across 0-255 positions.""" if pos < 85: return (pos * 3, 255 - pos * 3, 0) elif pos < 170: pos -= 85 return (255 - pos * 3, 0, pos * 3) else: pos -= 170 return (0, pos * 3, 255 - pos * 3) def rainbow_cycle(wait=20): n = len(strip) for j in range(256): # one cycle of all hues for i in range(n): rc_index = (i * 256 // n) + j strip[i] = wheel(rc_index & 255) strip.write() time.sleep_ms(wait) rainbow_cycle() ``` 这个名为 `wheel` 辅助函数负责计算给定位移处对应的 RGB 色彩坐标,而主逻辑则遍历每一个可能的位置偏移量,从而形成连续变化的光谱过渡现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值