一板网电子技术论坛

风筝
发表于: 2018-1-10 11:26:41 | 显示全部楼层

image001-3.jpg

在本文中,我们将使用Arduino开发板和一个全彩色的LED灯条制作假日装饰灯光。同时我们还会使用一个ROHM接近传感器,使得灯光更加具有互动性,这样一旦有物体在附近,LED就会发出炫丽的色彩!


使用到的材料

■    Arduino UNO R3开发板

■    WS2811 LED灯条 SMD 5050

■    ROHM传感器评估套件


1.  连接接近传感器

我们将使用罗姆传感器评估套件中的ALS /接近传感器(RPR-0521RS)。然后将传感器扩展板和传感器连接到Arduino开发板。

当物体(例如你的手)靠近接近传感器时,放射状排列的LED被触发,并且会发出炫丽的花样照明效果。

RPR-0521RS proximity sensor added to the sensor shield and Arduino.jpg

图1. 添加到传感器扩展板和Arduino的RPR-0521RS接近传感器


让我们来看看传感器所需的位置和电压,如下所示。由于接近传感器是I2C接口,因此它位于蓝色区域,所需电压为3V,因此我们需要将跳线引脚设置为3V。

Sensor placement location on Sensor Shield.jpg

图2. 传感器扩展板上的传感器放置位置

至于LED灯条的电源,我们还需要另一个5V电源,与Arduino不同。如果我们试图从Arduino的VCC或5V获得电源,Arduino可能会由于LED灯串消耗大量的电流而损坏。

Power is supplied via external power adapter separately from Arduino.jpg

图3.  电源通过与Arduino分开的外部电源适配器提供


这次我们将并联使用3个LED灯条。由于连接方法是并联的,电源和GND共用公共点。我们可以连接更多的LED,但有多少取决于可以实际使用LED灯条发光的LED数量以及电源适配器的电流容量。

LED灯条上的每个LED的工作电流约为20mA。由于供电电流为1.3A,所以可以点亮65个左右的LED灯。

Parallel connection of LED tapes.gif

图4. LED灯条的并行连接

LED strings extending from Arduino body.jpg

图5. Arduino延伸的LED灯串

现在硬件部分已经完成了,然后对LED灯条进行编程。


2.  自定义程序

这次我们将使用“NeoPixel”库,来控制全彩LED灯条。

以下是LED灯条的程序,接近传感器作为输入信号:

  1. #include <Wire.h>
  2. #include <RPR-0521RS.h>
  3. #include <Adafruit_NeoPixel.h>


  4. #define PIN 6           //pin number of the signal terminal
  5. #define LED_NUM 50  //number of LEDs

  6. RPR0521RS rpr0521rs;
  7. Adafruit_NeoPixel ledtape = Adafruit_NeoPixel(LED_NUM, PIN, NEO_GRB + NEO_KHZ800);  //if the control IC of the LED tape used is WS2812, the third parameter is NEO_KHZ800 and if WS2811 then NEO_KHZ400

  8. int wait = 200;

  9. void setup() {
  10.   ledtape.begin();
  11.   ledtape.show();   //reflects once in all OFF state
  12.    
  13.   byte rc;
  14.   Serial.begin(9600);
  15.   while (!Serial);
  16.   Wire.begin();
  17.   rc = rpr0521rs.init();
  18. }

  19. void loop() {
  20.   byte rc;
  21.   unsigned short ps_val;
  22.   float als_val;
  23.   byte near_far;
  24.   Serial.println("=============================");
  25.    
  26.   rc = rpr0521rs.get_psalsval(&ps_val, &als_val);
  27.   //when the sensor value is acquired
  28.   if (rc == 0) {
  29.     Serial.print("PS:");
  30.     Serial.print(ps_val);
  31.     Serial.println();

  32.     //LEDs light up when approaching
  33.     if(ps_val > 5){
  34.       ps_val  = 500 - ps_val;
  35.       if(ps_val < 0){
  36.          ps_val = 0;
  37.       }
  38.       simpleLED(ps_val/10);
  39.     }
  40.    
  41.     if (als_val != RPR0521RS_ERROR) {
  42.       Serial.print("ALS:");
  43.       Serial.print(als_val);
  44.       Serial.println();
  45.     }
  46.   }
  47.   delay(5);
  48. }

  49. int LEDtale[10];  //arrangement for the trajectory of LED

  50. //
  51. //Lights individually
  52. //
  53. void simpleLED(int delaytime){
  54.   uint16_t i, j;
  55.   j=0;
  56.   for(i=0; i < ledtape.numPixels(); i++) {
  57.     ledtape.setPixelColor(i, rotateColor(((i) * 256 / ledtape.numPixels()) & 255));
  58.     LEDtale[0]  = rotateColor(((i) * 256 * 9/10 / ledtape.numPixels()) & 255);

  59.     for(j=1; j < 10; j++){
  60.       LEDtale[j]  = rotateColor(((i) * 256 * (10-j)/10 / ledtape.numPixels()) & 255);
  61.       uint16_t m = i-j;
  62.       if(m < 0){
  63.         m += 50;
  64.       }
  65.       ledtape.setPixelColor(m, LEDtale[j]);
  66.     }

  67.     ledtape.show();
  68.     for(j=1; j < 10; j++){
  69.       uint16_t m = i-j;
  70.       if(m < 0){
  71.         m += 50;
  72.       }
  73.       delay(0);
  74.       ledtape.setPixelColor(m, ledtape.Color(0,0,0));
  75.       ledtape.show();
  76.     }
  77.     ledtape.setPixelColor(i, ledtape.Color(0,0,0));
  78.     ledtape.show();
  79.   }
  80.   ledtape.show();
  81.   delay(delaytime);
  82. }


  83. //RGB color transition function
  84. uint32_t rotateColor(byte WheelPos) {
  85.   if(WheelPos < 85) {
  86.    return ledtape.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  87.   } else if(WheelPos < 170) {
  88.    WheelPos -= 85;
  89.    return ledtape.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  90.   } else {
  91.    WheelPos -= 170;
  92.    return ledtape.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  93.   }
  94. }
复制代码

接近传感器的输入应检查来自传感器评估套件的采样。 目的是处理从传感器输入的数值。 如果您只需用if语句对传感器作出响应,则只需打开/关闭LED即可。 通过将传感器的值传递给点亮LED并改变LED点亮方式的功能,可以创建更多的交互式照明效果。


  1. //LEDs light up when approaching
  2.     if(ps_val > 5){
  3.       ps_val  = 500 - ps_val;
  4.       simpleLED(ps_val/10); //Use the sensor value to light the LEDs
  5.     }
复制代码

simpleLED函数用于是点亮LED灯条,但是我们需要更改它,以便从LED灯条的开始到结束逐一点亮LED。 这可能是不够的,所以这次我们使用一个数组来使LED灯条在一定程度上线性地发光。

在数组中,我们保持照明方法10次,然后从当前发光的LED的位置开始计数。

  1. int LEDtale[10];  //arrangement for the trajectory of LED
复制代码

程序的这个部分是非常好玩的。 请随意根据您的喜好进行定制。


3.  让我们点亮吧!

让我们看看实际的灯光!

maxresdefault (1).jpg

随着接近距离的改变,LED灯条的光速也变化。

maxresdefault.jpg

你可以在黑暗的房间试试,灯光看起来会更棒!


今天,我们通过使用传感器评估套件的接近传感器,制作了一个交互式的LED灯条。 你可以进一步做一个大规模的LED灯条,或添加更多的LED来制作灯带。 这些灯光很容易把你的家变成一个假日仙境!

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 94 | 回复: 126



Archiver|手机版|小黑屋|

GMT+8, 2018-6-22 17:18 , Processed in 0.046875 second(s), 34 queries . Powered by Discuz! X3.4

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

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