风筝
发表于: 2019-8-17 14:26:04 | 显示全部楼层

由于出色的视觉效果,NeoPixel LED目前在电子项目中被广泛使用。这些LED有各种尺寸和形状。在本篇文章中,您将了解NeoPixel LED以及如何使用Arduino控制它们。


什么是NeoPixel?

1962年,当第一颗LED制造和测试时,这件有价值的产品成为我们生活中不可分割的一部分。在大多数电子项目中,您至少可以找到一个LED。使用不同颜色的LED非常吸引人,因此它产生了多色LED或RGB LED。


RGB LED根据红色、绿色和蓝色三种颜色创建所有颜色。例如,红色和蓝色组合产生品红色。在此模型中,每种颜色的红色、绿色和蓝色均为0到255之间的值。例如,洋红色(Magenta)的这些值为255 0 255(红色最大值,蓝色最大值和绿色最小值值)。该数值由十六进制代码表示(2550255 =#FF00FF)。 RGB LED根据此模型制作各种颜色。

rgb-colors.png

要控制每个RGB LED,您需要微控制器的三个数字引脚。例如,如果要控制包含60个LED的RGB LED灯串,为了分别控制每个LED的颜色,您需要180个数字引脚!因此,您必须单独控制每个LED或使用可寻址的LED。


除RGB LED外,可寻址LED是新一代LED,包括控制器IC。该控制器IC(通常为WS2812)允许您通过为每个LED分配地址并提供单线通信来访问具有单个数字引脚的多个LED。但与简单的LED不同,这些类型的LED不能仅通过施加电压来打开,它们还需要微控制器。 NeoPixel是Adafruit的可寻址LED品牌。


为何选择NeoPixel?

能够控制LED灯条中每个LED将为您的项目创造出极佳的视觉效果。但应该注意的是,在像POV这样的非常快速的过程中,不推荐使用NeoPixels。与其他可寻址LED相比,NeoPixels的另一个重要优势是价格更低。 NeoPixels还有环形、条形、方形和圆形等形状,您可以根据您的项目选择合适的形状。


NeoPixels也是可级联的,因此您只需一条命令线和一条电源线即可控制多个NeoPixels。


注意:增加NeoPixel LED的数量将需要更多的RAM,更高的功耗和更多的处理时间,因此请根据微控制器类型选择最佳的NeoPixel。

rgb-module.jpg


所需的材料

●    WS2812环形RGB LED模块

●    Arduino Uno R3开发板

●    Arduino IDE

rgb-required-material.jpg


NeoPixel与Arduino连接

引脚分布

rgb-pinout.jpg

下面是NeoPixel与Arduino连接的电路图:

rgb-circuit-734x1000.jpg


示例1:使用Arduino设置NeoPixel

在本例中,您将打开NeoPixels并使用Arduino UNO分别控制每个LED的颜色和强度。通过NeoPixel Adafruit库使用Arduino设置NeoPixel。

以下是本示例使用的代码:

  1. /*
  2.   NeoPixel LEDs

  3.   modified on 7 May 2019
  4.   by Saeed Hosseini @ Electropeak
  5. **This code is based on Adafruit NeoPixel library Example**
  6.   https://electropeak.com/learn/

  7. */

  8. #include <Adafruit_NeoPixel.h>
  9. #ifdef __AVR__
  10. #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
  11. #endif

  12. #define PIN      6
  13. #define NUMPIXELS 7


  14. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

  15. #define DELAYVAL 500 // Time (in milliseconds) to pause between pixels

  16. void setup() {
  17.   pixels.begin();
  18. }

  19. void loop() {
  20.   pixels.clear();
  21.   pixels.setBrightness(10);
  22.   pixels.setPixelColor(0, pixels.Color(255, 255, 255));
  23.   pixels.setPixelColor(1, pixels.Color(255, 0, 0));
  24.   pixels.setPixelColor(2, pixels.Color(0, 255, 0));
  25.   pixels.setPixelColor(3, pixels.Color(0, 0, 255));
  26.   pixels.setPixelColor(4, pixels.Color(255, 0, 255));
  27.   pixels.setPixelColor(5, pixels.Color(255, 255, 0));
  28.   pixels.setPixelColor(6, pixels.Color(0, 255, 255));
  29.   pixels.show();
  30. }
复制代码

代码说明:

  1. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
复制代码

上述函数了LED的数量和Arduino引脚。

  1. pixels.begin();
复制代码

此函数执行初始化。

  1. pixel.setBrightness(b);
复制代码

上述函数设定光照亮度。 (最小数字为1,最大数字为255。)

  1. pixels.setPixelColor(Wich LED,Wich color(Red,Green,Blue));
复制代码

在指定LED编号(从0到NUMPIXELS-1)后,使用RGB系统定义LED颜色。

  1. pixels.show();
复制代码

显示应用的值。


示例2:使用Arduino实现NeoPixel闪烁模式

在此示例中,我们以闪烁模式设置NeoPixels。 要制作闪烁灯光,必须同时打开和关闭所有LED,并且它们在打开时可以有不同的颜色。

  1. /*

  2.   NeoPixel LEDs

  3.   modified on 7 May 2019
  4.   by Saeed Hosseini @ Electropeak
  5.   https://electropeak.com/learn/

  6. */

  7. #include <Adafruit_NeoPixel.h>
  8. #ifdef __AVR__
  9. #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
  10. #endif

  11. #define PIN        6
  12. #define NUMPIXELS 7


  13. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

  14. void NeoBlink(int num, int wait)
  15. {
  16.   for (int i = 0; i < num; i++)
  17.   {
  18.     pixels.setPixelColor(i, 35, 35, 35);
  19.   }
  20.   pixels.show();
  21.   delay(wait);
  22.   for (int j = 0; j < num; j++)
  23.   {
  24.     pixels.setPixelColor(j, 0, 255, 0);
  25.   }
  26.   pixels.show();
  27.   delay(wait);
  28. }

  29. void setup()
  30. {
  31.   pixels.begin();
  32.   pixels.setBrightness(50);
  33. }

  34. void loop()
  35. {
  36.   NeoBlink(7, 500);
  37. }
复制代码

示例3:使用Arduino实现NeoPixel渐变色模式

色彩渐变是NeoPixels令人着迷的效果之一。渐变速度越慢,效果越好。

  1. /*

  2.   NeoPixel LEDs

  3.   modified on 7 May 2019
  4.   by Saeed Hosseini @ Electropeak
  5.   https://electropeak.com/learn/

  6. */

  7. #include <Adafruit_NeoPixel.h>
  8. #ifdef __AVR__
  9. #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
  10. #endif

  11. #define PIN        6
  12. #define NUMPIXELS 7


  13. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

  14. #define DELAYVAL 500 // Time (in milliseconds) to pause between pixels

  15. void NeoFade(int FadeSpeed)
  16. {
  17.   int fspeed;
  18.   for (int i = 0; i < NUMPIXELS; i++) { pixels.setPixelColor(i, 165, 242, 243); } for (int j = 255; j > 0; j=j-2)
  19.   {
  20.     pixels.setBrightness(j);
  21.     pixels.show();
  22.     delay(FadeSpeed);
  23.   }
  24. }

  25. void setup() {
  26.   pixels.begin();
  27. }

  28. void loop() {
  29.   NeoFade(100);
  30. }
复制代码

示例4:使用Arduino的NeoPixel随机模式

在此示例中,我们使用random(num1, num2)函数生成并显示num1和num2之间的随机数,以选择颜色和LED。

  1. /*

  2.   NeoPixel LEDs
  3.   modified on 7 May 2019
  4.   by Saeed Hosseini @ Electropeak
  5.   https://electropeak.com/learn/

  6. */

  7. #include <Adafruit_NeoPixel.h>
  8. #ifdef __AVR__
  9. #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
  10. #endif

  11. #define PIN        6
  12. #define NUMPIXELS 7


  13. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

  14. #define DELAYVAL 500 // Time (in milliseconds) to pause between pixels

  15. void setup() {
  16.   pixels.begin();
  17. }

  18. void loop() {
  19.   pixels.clear();
  20.   pixels.setPixelColor(random(0, 7), random(0, 255), random(0, 255), random(0, 255));
  21.   pixels.show();
  22.   delay(500);
  23. }
复制代码

示例5:使用Arduino的NeoPixel彩虹模式

要在NeoPixels上创建效果,网络上最有趣的工具之一是NeoPixel Effects Generator,可让您指定LED和Arduino引脚的数量,在创建效果和所需设置后,您可以点击generate Arduino code然后将生成的代码复制到IDE。 为此,请执行以下步骤:

1.    进入网站后点击Add Led Strip

rgb-gen-3.jpg

2.    单击添加的NeoPixel Strip并指定LED和Arduino引脚的数量。

rgb-string.jpg

3.    单击loop部分中的“Add Effect”,然后选择一种效果。

rgb-effect.jpg

4.    在“Animation”和“Color”部分中应用想要的设置。

rgb-rainbow.jpg

5.  单击generate Arduino code并将生成的代码复制到Arduino IDE。

rgb-generate-code.jpg

  1. /*
  2. This code is generated by:
  3. https://adrianotiger.github.io/NeoPixel-Effect-Generator/

  4. */
  5. #include <Adafruit_NeoPixel.h>

  6. class Strip
  7. {
  8. public:
  9.   uint8_t   effect;
  10.   uint8_t   effects;
  11.   uint16_t  effStep;
  12.   unsigned long effStart;
  13.   Adafruit_NeoPixel strip;
  14.   Strip(uint16_t leds, uint8_t pin, uint8_t toteffects) : strip(leds, pin, NEO_GRB + NEO_KHZ800) {
  15.     effect = -1;
  16.     effects = toteffects;
  17.     Reset();
  18.   }
  19.   void Reset(){
  20.     effStep = 0;
  21.     effect = (effect + 1) % effects;
  22.     effStart = millis();
  23.   }
  24. };

  25. struct Loop
  26. {
  27.   uint8_t currentChild;
  28.   uint8_t childs;
  29.   bool timeBased;
  30.   uint16_t cycles;
  31.   uint16_t currentTime;
  32.   Loop(uint8_t totchilds, bool timebased, uint16_t tottime) {currentTime=0;currentChild=0;childs=totchilds;timeBased=timebased;cycles=tottime;}
  33. };

  34. Strip strip_0(7, 6, 7 );
  35. struct Loop strip0loop0(1, false, 1);

  36. //[GLOBAL_VARIABLES]

  37. void setup() {

  38.   //Your setup here:

  39.   strip_0.strip.begin();
  40. }

  41. void loop() {

  42.   //Your code here:

  43.   strips_loop();
  44. }

  45. void strips_loop() {
  46.   if(strip0_loop0() & 0x01)
  47.     strip_0.strip.show();
  48. }

  49. uint8_t strip0_loop0() {
  50.   uint8_t ret = 0x00;
  51.   switch(strip0loop0.currentChild) {
  52.     case 0:
  53.            ret = strip0_loop0_eff0();break;
  54.   }
  55.   if(ret & 0x02) {
  56.     ret &= 0xfd;
  57.     if(strip0loop0.currentChild + 1 >= strip0loop0.childs) {
  58.       strip0loop0.currentChild = 0;
  59.       if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;}
  60.     }
  61.     else {
  62.       strip0loop0.currentChild++;
  63.     }
  64.   };
  65.   return ret;
  66. }

  67. uint8_t strip0_loop0_eff0() {
  68.     // Strip ID: 0 - Effect: Rainbow - LEDS: 7
  69.     // Steps: 8 - Delay: 87
  70.     // Colors: 7 (255.0.0, 0.255.0, 0.0.255, 255.157.0, 255.0.255, 0.255.255, 255.255.255, )
  71.     // Options: toLeft=true,
  72.   if(millis() - strip_0.effStart < 87 * (strip_0.effStep)) return 0x00;
  73.   float factor1, factor2;
  74.   uint16_t ind;
  75. ......
复制代码

以上就是本篇文章的全部内容。如果遇到问题,请随时在本帖下面进行回复。

跳转到指定楼层
azi1974
发表于: 2020-1-6 01:30:17 | 显示全部楼层

好资料@!辛苦了楼主!解决了半年来我的困惑!
回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-28 16:45 , Processed in 0.090989 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表