WAVEGO-WS2812 LED
来自Waveshare Wiki
WS2812 LED
简介
- 本章主要介绍在二次开发上一些控制RGB_LED的函数,通过本章的学习,您可以了解如何控制RGB_LED的颜色以及亮度输出。
原理
- RGB_LED灯光色三原色原理:颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高。
- 有色光可被无色光冲淡并变亮,但只有三原色以相同亮度混合是才会出现白光。
- 查看下官方的原理图可知
安装依赖库
代码
代码解析
初始化
- 导入库函数的格式为#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,选择开发板和端口,点击上传程序。