WAVEGO-WS2812 LED

来自Waveshare Wiki
跳转至: 导航搜索

WS2812 LED

简介

  • 本章主要介绍在二次开发上一些控制RGB_LED的函数,通过本章的学习,您可以了解如何控制RGB_LED的颜色以及亮度输出。

原理

  • RGB_LED灯光色三原色原理:颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高。
  • 有色光可被无色光冲淡并变亮,但只有三原色以相同亮度混合是才会出现白光。
  • 查看下官方的原理图可知
    RGB原理图.png

安装依赖库

  • 在Arduino IDE中安装依赖库Adafruit_NeoPixel
    Arduino2.0-2812管理库.jpg
    Arduino2.0-2812库安装.jpg

代码

代码解析

初始化

  • 导入库函数的格式为#include <库函数>,库函数指被封装好的函数,将一系列常用的函数封装好,方便调用;用GPIO26控制RGB_LED,设备板载有两颗RGB灯珠,默认为GPIO26控制。
    #include <Adafruit_NeoPixel.h>          // 导入库函数Adafruit_NeoPixel
    #define BRIGHTNESS  255                 // 定义最大亮度,取值范围 0 - 255
    #define RGB_LED   26                    // 定义用来控制 WS2812 RGB LED 的引脚
    #define NUMPIXELS 2                     // 控制灯珠的数量
    
    Adafruit_NeoPixel matrix = Adafruit_NeoPixel(NUMPIXELS, RGB_LED, NEO_GRB + NEO_KHZ800);   // 实例化matrix
  • 声明函数InitRGB,调用函数setBrightness设置LED最大亮度,改变BRIGHTNESS的值可调节灯珠最大亮度,调节范围为0-255,调用函数begin初始化matrix函数,调用show函数将RAM中的像素数据传输到新像素,即更新灯珠颜色。
    // 初始化RGB控制
    void InitRGB(){
      matrix.setBrightness(BRIGHTNESS); // 设置最大亮度
      matrix.begin(); // 开始
      matrix.show();  // 每次设置更改,都需要使用这个函数来应用。
    }

灯珠颜色控制

  • 输入三个数字为灯珠的颜色亮度,R为红,G为绿,B为蓝,取值为0-255。
    matrix.Color(R,G,B);
  • 声明colorWipe(颜色刷)函数,作用是给所有灯珠(NUMPIXELS的数值)设置颜色。用于设置灯珠的颜色。for()循环用法:for(初始化变量;判断真假的条件,为真时执行循环,为假时跳出循环;执行循环前/后需要改变的数值){循环执行的内容}。
    // 调用该函数来将所有灯(数量为上面设置的 NUMPIXELS)设置为某一种颜色
    // Rinput、Ginput、Binput用来设置红绿黄三个颜色通道的亮度,取值范围为0-255
    void colorWipe(byte Rinput, byte Ginput, byte Binput) {
      for(uint16_t i=0; i<matrix.numPixels(); i++) {
        matrix.setPixelColor(i, matrix.Color(Rinput, Ginput, Binput));
      }
      matrix.show();
    }
  • 声明setSingleLED函数,调用该函数来设置某一个灯的颜色。
    // 调用该函数来设置某一个灯的颜色
    // LEDnum,要控制的灯的编号,取值范围为 0-NUMPIXELS
    // Rinput、Ginput、Binput用来设置红绿黄三个颜色通道的亮度,取值范围为0-255
    void setSingleLED(uint16_t LEDnum, byte Rinput, byte Ginput, byte Binput){
      matrix.setPixelColor(LEDnum, matrix.Color(Rinput, Ginput, Binput));
      matrix.show();
    }

完整代码

  • 完整代码如下:
    #include <Adafruit_NeoPixel.h>          // 导入库函数Adafruit_NeoPixel
    #define BRIGHTNESS  255                 // 定义最大亮度,取值范围 0 - 255
    #define RGB_LED   26                    // 定义用来控制 WS2812 RGB LED 的引脚
    #define NUMPIXELS 2                     // 控制灯珠的数量
    
    Adafruit_NeoPixel matrix = Adafruit_NeoPixel(NUMPIXELS, RGB_LED, NEO_GRB + NEO_KHZ800);   // 实例化matrix
    
    // 初始化RGB控制
    void InitRGB(){
      matrix.setBrightness(BRIGHTNESS); // 设置最大亮度
      matrix.begin(); // 开始
      matrix.show();  // 每次设置更改,都需要使用这个函数来应用。
    }
    
    // 调用该函数来将所有灯(数量为上面设置的 NUMPIXELS)设置为某一种颜色
    // Rinput、Ginput、Binput用来设置红绿黄三个颜色通道的亮度,取值范围为0-255
    void colorWipe(byte Rinput, byte Ginput, byte Binput) {
      for(uint16_t i=0; i<matrix.numPixels(); i++) {
        matrix.setPixelColor(i, matrix.Color(Rinput, Ginput, Binput));
      }
      matrix.show();
    }
    
    // 调用该函数来设置某一个灯的颜色
    // LEDnum,要控制的灯的编号,取值范围为 0-NUMPIXELS
    // Rinput、Ginput、Binput用来设置红绿黄三个颜色通道的亮度,取值范围为0-255
    void setSingleLED(uint16_t LEDnum, byte Rinput, byte Ginput, byte Binput){
      matrix.setPixelColor(LEDnum, matrix.Color(Rinput, Ginput, Binput));
      matrix.show();
    }
    
    void setup(){
      InitRGB();  // LED灯初始化
    }
    
    void loop(){
      // 亮一秒白光(三个颜色通道全部为最大亮度 255)
      colorWipe(255, 255, 255);
      delay(1000);
      
      // 灭一秒钟(三个颜色通道全部为最低亮度 0)
      colorWipe(0, 0, 0);
      delay(1000);
      
      // 编号为0的灯亮一秒红色
      setSingleLED(0, 255, 0, 0);
      delay(1000);
      setSingleLED(0, 0, 0, 0);
      
      // 编号为1的灯亮一秒蓝色
      setSingleLED(0, 0, 0, 255);
      delay(1000);
      setSingleLED(0, 0, 0, 0);
    }

上传程序

  • 复制粘贴代码后,用USB连接设备与计算机,用Arduino IDE打开RGB_LED.ino,选择开发板和端口,点击上传程序。

程序运行效果

  • 设备两个灯珠先亮一秒白光,后熄灭一秒,随后0号灯亮一秒红光后熄灭,1号灯亮一秒蓝光后熄灭。
    RGB现象-1.gif

全部章节