• Arduino程序设计(九)WS2812B彩灯实验



    前言

    • 本文主要介绍WS2812B彩灯实验,主要内容有:
    • 1、介绍WS2812B及灯环,灯环由32个彩灯组成;
    • 2、灯环显示三基色;
    • 3、顺时针、逆时针的彩色流水灯;
    • 4、彩虹灯环,循环显示赤橙黄绿青蓝紫七色。

    一、WS2812B及灯环

    1、WS2812B简介

    • (1)基本组成:

    • WS2812B是一款智能控制LED光源,控制电路和RGB芯片集成在一个5050个组件的封装中。内部包括智能数字端口数据锁存器和信号整形放大驱动电路。还包括一个精密的内部振荡器和一个12V电压可编程恒流控制部分,有效地保证像素点光的颜色高度一致。

    • (2)通信方式:

    • 数据传输协议采用单一NZR通信方式(单总线)。像素上电复位后,DIN端口接收控制器的数据,第一个像素采集初始的24位数据,然后发送给内部数据锁存器,另一个由内部信号整形放大电路整形的数据通过DO端口发送给下一个级联像素。每个像素传输后,信号减少24位。像素采用自动整形传输技术,使得像素级联数不受信号传输的限制,只依赖于信号传输的速度。

    • (3)优点:

    • WS2812B具有驱动电压低、环保节能、亮度高、散射角大、一致性好、功耗低、寿命长等优点。集成在LED上的控制芯片电路更加简单,体积小,安装方便。

    • (4)机械尺寸:
      在这里插入图片描述

    • (5)管脚说明:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    2、灯环介绍

    • (1)本文采用的RGB灯环是自制灯环,由32个WS2812彩灯组成,电路原理图如下:
      在这里插入图片描述
    • (2)灯环说明:
    • ① 32个WS2812按(1)串联后组成灯环,外接引脚三个:VCC_5V0、GND、DIN。
    • ② 灯环的DIN是第1颗灯珠的信号输入引脚DIN,灯环的DOUT是第32颗灯珠的信号输入引脚DOUT,DOUT悬空不接。

    二、彩色流水灯实验

    1、三基色流水灯

    • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

    • (2)三基色流水灯的电路图,如下图所示:
      在这里插入图片描述

    • (3)实验准备:安装下载安装 “Adafruit_NeoPixel” 库文件。

    • (4)实现功能:三基色流水灯,第一圈红色,第二圈绿色,第三圈蓝色,第四圈红色,循环显示。

    代码实现:

    //WS2812,RGB灯环
    //炫彩流水灯,第一圈红色,第二圈绿色,第三圈蓝色,第四圈红色,循环显示
    
    #include 
    
    #define PIN 7    // 控制灯带的引脚
    #define NUM_LEDS 32  // 灯带上灯的数量
    
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
    
    void setup() {
      strip.begin();           // 初始化灯带
      strip.show();            // 所有LED灯关闭
    }
    
    void loop() {
      for (int i = 0; i < NUM_LEDS; i++)
      {
        strip.setPixelColor(i, 20, 0, 0);  // 设置颜色为红色
        strip.show();              // 展示颜色
        delay(50);                 // 50毫秒的延迟
      }
      for (int i = 0; i < NUM_LEDS; i++)
      {
        strip.setPixelColor(i, 0, 20, 0);  // 设置颜色为绿色
        strip.show();              // 展示颜色
        delay(50);                 // 50毫秒的延迟
      }
      for (int i = 0; i < NUM_LEDS; i++)
      {
        strip.setPixelColor(i, 0, 0, 20);  // 设置颜色为蓝色
        strip.show();              // 展示颜色
        delay(50);                 // 50毫秒的延迟
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • (5)实现现象(部分展示):
      在这里插入图片描述
      在这里插入图片描述

    2、彩色流水灯(顺时针、逆时针)

    • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

    • (2)彩色流水灯(顺时针、逆时针)的电路图,如下图所示:
      在这里插入图片描述

    • (3)实验准备:下载安装 “FastLED” 库文件。

    • (4)实现功能:炫彩流水灯,先是6圈顺时针彩色流水灯,再是6圈逆时针的彩色流水灯,最后重复操作,6圈顺时针、6圈逆时针彩色流水灯效果。

    代码实现:

    //WS2812,RGB灯环
    //炫彩流水灯,顺时针、逆时针的彩色流水灯
    
    #include 
    
    #define LED_PIN 7
    #define NUM_LEDS 32
    
    CRGB leds[NUM_LEDS];
    
    void setup()
    {
      FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
      FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
      FastLED.clear();
      FastLED.show();
    }
    
    void loop()
    {
      //深色,红色→绿色,顺时针
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(255 - 7 * i, 7 * i, 0 );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //深色,绿色→蓝色,顺时针
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(0, 255 - 7 * i, 7 * i );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //深色,蓝色→红色,顺时针
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(7 * i, 0, 255 - 7 * i );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //浅色,红色→绿色,顺时针
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(255 - 7 * i, 7 * i, 255);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //浅色,绿色→蓝色,顺时针
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(255, 255 - 7 * i, 7 * i);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //浅色,蓝色→红色,顺时针
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(7 * i, 255, 255 - 7 * i);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //深色,红色→蓝色,逆时针
      for (int i = NUM_LEDS; i > 0; i-- )
      {
        leds[i] = CRGB(255 - 7 * i, 0, 7 * i );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //深色,蓝色→绿色,逆时针
      for (int i = NUM_LEDS; i > 0; i-- )
      {
        leds[i] = CRGB(0, 7 * i, 255 - 7 * i );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //深色,绿色→红色,逆时针
      for (int i = NUM_LEDS; i > 0; i-- )
      {
        leds[i] = CRGB(7 * i , 255 - 7 * i, 0);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //浅色,红色→蓝色,逆时针
      for (int i = NUM_LEDS; i > 0; i-- )
      {
        leds[i] = CRGB(255 - 7 * i, 255, 7 * i );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //浅色,蓝色→绿色,逆时针
      for (int i = NUM_LEDS; i > 0; i-- )
      {
        leds[i] = CRGB(255, 7 * i, 255 - 7 * i );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //浅色,绿色→红色,逆时针
      for (int i = NUM_LEDS; i > 0; i-- )
      {
        leds[i] = CRGB(7 * i , 255 - 7 * i, 255);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • (5)实现现象(部分展示):
      在这里插入图片描述
      在这里插入图片描述

    3、彩虹灯环

    • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

    • (2)彩虹灯环的电路图,如下图所示:
      在这里插入图片描述

    • (3)实验准备:下载安装 “FastLED” 库文件。

    • (4)实现功能:炫彩流水灯,灯环呈现彩虹色,依次显示赤橙黄绿青蓝紫。

    //WS2812,RGB灯环
    //炫彩流水灯,灯环呈现彩虹色:赤橙黄绿青蓝紫
    
    #include 
    
    #define LED_PIN 7
    #define NUM_LEDS 32
    
    CRGB leds[NUM_LEDS];
    
    void setup()
    {
      FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
      FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
      FastLED.clear();
      FastLED.show();
    }
    
    void loop()
    {
      //红色→橙色→黄色
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(255, 7 * i + 31, 0 );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //黄色→绿色
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(224 - 7 * i, 255, 0 );
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //绿色→青色→蓝色
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(0, 224 - 7 * i, 7 * i + 31);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //蓝色→紫色
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(7 * i, 0, 255);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    
      //紫色→红色
      for (int i = 0; i < NUM_LEDS; i++ )
      {
        leds[i] = CRGB(255, 0, 224 - 7 * i);
        FastLED.setBrightness(20);
        FastLED.show();
        delay (50);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • (5)实现现象(部分展示):
      在这里插入图片描述
      在这里插入图片描述

    总结

    • 通过上述三个实验,实现了Arduino控制WS2812B灯环,从电路原理到编程实现,进一步了解RGB彩灯的控制原理。

    参考资料1: WS2812B引脚图及功能,应用电路和原理说明
    参考资料2: 用Arduino制作溢彩流光的LED梦幻灯带
    参考资料3: 【雕爷学编程】Arduino动手做(124)—24位WS2812环形灯板
    参考资料4: 秒上手!使用Arduino控制基于WS2812B的LED灯条

  • 相关阅读:
    iText实战--根据绝对位置添加内容
    封装形式,进化,DIP封装及键出方法
    客户听不进去,很强势,太难沟通了,怎么办?
    【Linux】快捷键
    10 种常用的字符串方法
    什么是WordPress
    图片Base64编码解码的优缺点及应用场景分析
    96-Java的打印流、打印流重定向、补充知识:Properties、commons-io框架
    将conda环境打包成docker步骤
    北大学者发现,经常喝牛奶,增加中国人肝癌和乳腺癌风险
  • 原文地址:https://blog.csdn.net/weixin_44887565/article/details/132874517