【实验】ESP32驱动WS2812芯片RGB灯光实现

设计简介

本设计是直接在图灵哥ESP32S3最小系统核心板上完成的,板子上已经有了WS2812的驱动芯片和RGB灯珠了,因此我们就不用再外接任何设备了,非常方便。

WS2812驱动芯片简介

WS2812是一款集成了控制电路和RGB发光单元的智能外控LED光源,采用单总线通信方式,广泛应用于全彩LED灯带、灯条、模块等产品的生产。WS2812具有以下特点:

  1. 单线传输:只需一根信号线即可实现数据的接收与传输,简化了电路设计,降低了生产成本
  2. 高集成度:WS2812内置了恒流驱动、温度补偿、颜色调光等功能,无需外接其他驱动电路
  3. 高亮度:采用高性能的RGB发光单元,发光亮度高,色彩鲜艳
  4. 可调光:通过软件设置,可实现256级亮度调节,满足不同场景的需求
  5. 高刷新率:支持高达400Hz的刷新率,画面稳定,无闪烁
  6. 宽电压范围:输入电压范围在4.5-5.5V,兼容性强,可适用于各类电子产品
  7. 灵活性:WS2812灯珠可任意弯曲、裁剪,满足各种复杂场景的安装需求
  8. 兼容性:WS2812可与WS2811、WS2813等型号的灯珠兼容,方便升级和维护
  9. 节能环保:低功耗设计,符合节能减排的要求

凭借以上优势,WS2812在全彩LED领域得到了广泛应用,如智能家居、舞台灯光、户外广告、景观照明等场景。随着技术的不断进步,WS2812将为人们的生活带来更多美好光影体验。

WS2812时序特性

WS2812的时序特性是其通信协议的核心,它通过特定的时序来编码数据,从而控制每个LED的颜色和亮度。以下是WS2812的时序特性:

1.数据传输格式

  • WS2812使用单线串行通信协议;
  • 数据以GRB(绿色、红色、蓝色)的顺序传输,每个颜色通道8位(即一个字节)

2.数据编码

  • 数据传输采用NRZ(Non-Return-to-Zero)编码方式;
  • 逻辑高(1)和逻辑低(0)通过不同的脉冲宽度来表示;

3.逻辑高(1):逻辑高由一个高电平脉冲组成,持续时间为0.85微秒(±150ns)

4.逻辑低(0):逻辑低由一个高电平脉冲组成,持续时间为0.4微秒(±150ns)

5.复位脉冲:在发送数据之前,需要提供一个低电平的复位脉冲,持续至少50微秒,以初始化LED链

6.颜色数据传输:

  • 每个颜色通道的数据从最高位(MSB)开始传输
  • 在每个颜色通道的数据传输完毕后,WS2812会自动将数据锁存并显示

7.刷新率:WS2812支持高达400Hz的刷新率,这意味着每秒可以更新颜色数据400次

8.数据传输率:数据传输速率大约为800kbps(千比特每秒)

9.数据传输顺序:数据从第一个WS2812开始,依次通过每个LED的DI(数据输入)引脚传输到下一个LED,直到链中的最后一个LED

10.级联能力:WS2812具有级联能力,可以连接多个LED,但总长度受限于数据传输速率和信号完整性

程序设计

实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果;

硬件资源及引脚分配:LED --> IO48;

实验现象:RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果;

注意事项:编译代码之前先下载库文件<Adafruit_NeoPixel.h>

 1 点击工具---管理库;

 2 在筛选搜索结果中 输入 Adafruit_NeoPixel ;

 3 选择 Adafruit NeoPixel by Adafruit 库安装;

代码文件如下

led_rgb.ino

/**
 ******************************************************************************
 * @file     01_led_rgb.ino
 * @author   Turringer software group
 * @version  V1.0
 * @date     2024-09-20
 * @brief    RGB灯炫彩实验
 ******************************************************************************
 * 
 * 实验平台:图灵哥 TRGESP32S3核心板
 * 实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果
 *
 * 硬件资源及引脚分配: 
 * 1, LED --> ESP32S3 IO
 *    LED --> IO48
 *
 * 实验现象:
 * 1, RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果
 * 
 * 注意事项:
 * 编译代码之前先下载库文件<Adafruit_NeoPixel.h>
 ******************************************************************************
 */
#include "led_rgb.h"
/**
 * @brief    当程序开始执行时,将调用setup()函数,通常用来初始化变量、函数等
 * @param    无
 * @retval   无
 */


void setup() 
{
  led_init();
}

/**
 * @brief    循环函数,通常放程序的主体或者需要不断刷新的语句
 * @param    无
 * @retval   无
 */
 
void loop() 
{
  led_flash();       

}

led_rgb.cpp

/**
****************************************************************************************************
 * @file     led_rgb.cpp
 * @author   charles
 * @version  V1.0
 * @date     2024-09-20
 * @brief    RGB灯炫彩实验
 ******************************************************************************
 * 
 * 实验平台:图灵哥 TRGESP32S3核心板
 * 实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果
 *
 * 硬件资源及引脚分配: 
 * 1, LED --> ESP32S3 IO
 *    LED --> IO48
 *
 * 实验现象:
 * 1, RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果
 * 
 * 注意事项:
 * 编译代码之前先下载库文件<Adafruit_NeoPixel.h>
 *
 ******************************************************************************
 */

#include "led_rgb.h"

/**
* @brief       初始化LED相关IO口
* @param       无
* @retval      无
*/

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void led_init(void) 
{
  delay(500);
  strip.begin();           // 初始化灯带
  strip.show();            // 所有LED灯关闭
}

void led_flash()
{
  int i;
  for (i = 0; i < NUM_LEDS; i++)
  {
    strip.setPixelColor(i, 20, 0, 0);  // 设置颜色为红色
    strip.show();              // 展示颜色
    delay(50);                 // 50毫秒的延迟
  }
  for (i = 0; i < NUM_LEDS; i++)
  {
    strip.setPixelColor(i, 0, 20, 0);  // 设置颜色为绿色
    strip.show();              // 展示颜色
    delay(50);                 // 50毫秒的延迟
  }
  for (i = 0; i < NUM_LEDS; i++)
  {
    strip.setPixelColor(i, 0, 0, 20);  // 设置颜色为蓝色
    strip.show();              // 展示颜色
    delay(50);                 // 50毫秒的延迟
  }
}

rgb_led.h

#include <Adafruit_NeoPixel.h>

/**
****************************************************************************************************
 * @file     led_rgb.h
 * @author   charles
 * @version  V1.0
 * @date     2024-09-20
 * @brief    RGB灯炫彩实验
 ******************************************************************************
 * 实验平台:图灵哥 TRGESP32S3核心板
 * 实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果
 *
 * 硬件资源及引脚分配: 
 * 1, LED --> ESP32S3 IO
 *    LED --> IO48
 *
 * 实验现象:
 * 1, RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果
 * 
 * 注意事项:
 * 编译代码之前先下载库文件<Adafruit_NeoPixel.h>
 * 
 ******************************************************************************
 */
#ifndef __LED_H
#define __LED_H

#include "Adafruit_NeoPixel.h"

#define PIN 48    // 控制灯带的引脚
#define NUM_LEDS 1  // 灯带上灯的数量

void led_init(void);
void led_flash(void);

#endif

实验效果如下

实验到此结束,感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值