开启左侧

Arduino 与 WS2812 之库的使用

[复制链接]
发表于 2017-4-15 12:52:29 | 显示全部楼层 |阅读模式
  上一章我们讲到了WS2812的内部结构、以及WS2812与WS2813的区别,我们将在这一章讲一下有关上一章提到的库的使用。这里注意,WS2812与WS2813的控制都可以使用我上一章共享的那个库。
  1. #include <Adafruit_NeoPixel.h>
  2. #define PIN            6
  3. #define NUMPIXELS      16
  4. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

  5. int delayval = 500;

  6. void setup()
  7. {
  8.   pixels.begin();
  9. }

  10. void loop()
  11. {
  12.   for(int i=0;i<NUMPIXELS;i++)
  13.   {
  14.     pixels.setPixelColor(i, pixels.Color(0,150,0));
  15.     pixels.show();
  16.     delay(delayval);
  17.   }
  18. }
复制代码
  我们一行一行的来学习这个最基本的Example。


  1. #include <Adafruit_NeoPixel.h>
复制代码

  引用Lib


  1. #define PIN 6
复制代码

  采用预处理宏定义的形式定义一个我们连接2812的那个IO口,这里注意,预处理在程序编译的时候就由编译器处理掉了,并不占用程序的Flash与RAM。


  1. #define NUMPIXELS 16
复制代码

  定义2812的数量,程序中定义的是16颗2812,我们可以自行修改。

  1. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
复制代码
  实例化类,括号内的参数就是2812的控制参数,包含了数量,所用IO,颜色模式及刷新速率等(这两个参数一般不用修改)。


  1. int delayval = 500;
复制代码

  定义一个整型变量,用来设定LED逐个点亮的间隔时间(这里的解释只对于这个程序,如果程序小改,就不是这么解释了)。
  1. void setup()
  2. {
  3. pixels.begin();
  4. }
复制代码

  在setup函数中,初始化2812。


  1. void loop()
  2. {
  3. for(int i=0;i<NUMPIXELS;i++)
  4. {
  5. pixels.setPixelColor(i, pixels.Color(0,150,0));
  6. pixels.show();
  7. delay(delayval);
  8. }
复制代码

  在loop函数中,定义了一个for循环,从0开始,一直循环到2812的个数减1个位置结束。这里注意,为什么程序中使用小于号而不是小于等于号。因为在2812的灯带中,第一颗灯的编号是从0开始的,而不是1;1是第二颗2812。如果是小于等于,那么就是从0开始到16(程序中定义LED数量为16)结束,一共具有17个数,而我们只有16个灯,所以应该是小于,而不是小于等于。


  关键的部分来了,如果我们想成功的使用WS2812,请一定要知道这三个函数的作用!
  1. pixels.setPixelColor(a, b);
复制代码
  这里注意,这个函数需要区分两部分看,pixels 和 setPixelColor。其中,pixels是你实例化类的名字,应该和你开头的名称一样;而 setPixelColor 是类中固有的函数,不可随意更改(下同)。这一个函数中具有两个参数,其中 a 是表示你所需要控制的LED的编号,也就是从第一颗LED开始数,一直到你需要控制的第N颗LED。而在 a 中填写的数据是 N - 1。原因如刚刚在for循环中解释的一样。b则是颜色,可以直接填写十六进制的颜色,也可以配合配合pixels.Color使用。
这里贴一个16进制颜色的查询表http://www.atool.org/colorpicker.php

  1. pixels.Color(a, b, c);
复制代码
  这一个函数是用来转换颜色的。a, b, c 三个参数分别是R, G, B三个颜色的值,范围是0 - 255。他可以帮助我们转化RGB颜色至16进制的颜色。

  1. pixels.show();
复制代码
  该函数没有参数,但是show的用法决定了2812的灯如何点亮。按照程序中的举例,当 show 这个函数放在for循环中的时候,你可以看到LED是依次间隔100ms以后点亮。但是若果你把show 函数放在 for 循环外的话,则会看到LED要16 * 100 ms 以后才会点亮,如下程序
  1. void loop()
  2. {
  3. for(int i=0;i<NUMPIXELS;i++)
  4. {
  5. pixels.setPixelColor(i, pixels.Color(0,150,0));
  6. delay(delayval);
  7. }
  8. pixels.show();
复制代码
  
  也就是说明,其实对于 setPixelColor 这个函数来说,他仅仅只是设定了哪个LED显示什么颜色罢了,并不是让LED去显示出来,而 show 则是让LED去显示。就好比你告诉别人要十一点钟去吃饭,但是现在没到十一点,所以他也就不去吃饭,等到了十一点,他就去吃饭了。其中,吃饭就相当于是 setPixelColor 而十一点,则是 show !




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩课程推荐

关于我们

帮助中心

商务合作

点击这里给我发消息

关注微信公众号

Copyright © 2016-2017 i创学院 - 上海享渔教育科技有限公司 Powered by Discuz!     ( 沪ICP备16033954号-1 )