|
在本文中,我们将使用Arduino开发板和一个全彩色的LED灯条制作假日装饰灯光。同时我们还会使用一个ROHM接近传感器,使得灯光更加具有互动性,这样一旦有物体在附近,LED就会发出炫丽的色彩!
使用到的材料
■ Arduino UNO R3开发板
■ WS2811 LED灯条 SMD 5050 ■ ROHM传感器评估套件
1. 连接接近传感器
我们将使用罗姆传感器评估套件中的ALS /接近传感器(RPR-0521RS)。然后将传感器扩展板和传感器连接到Arduino开发板。
当物体(例如你的手)靠近接近传感器时,放射状排列的LED被触发,并且会发出炫丽的花样照明效果。
图1. 添加到传感器扩展板和Arduino的RPR-0521RS接近传感器
让我们来看看传感器所需的位置和电压,如下所示。由于接近传感器是I2C接口,因此它位于蓝色区域,所需电压为3V,因此我们需要将跳线引脚设置为3V。
图2. 传感器扩展板上的传感器放置位置
至于LED灯条的电源,我们还需要另一个5V电源,与Arduino不同。如果我们试图从Arduino的VCC或5V获得电源,Arduino可能会由于LED灯串消耗大量的电流而损坏。
图3. 电源通过与Arduino分开的外部电源适配器提供
这次我们将并联使用3个LED灯条。由于连接方法是并联的,电源和GND共用公共点。我们可以连接更多的LED,但有多少取决于可以实际使用LED灯条发光的LED数量以及电源适配器的电流容量。
LED灯条上的每个LED的工作电流约为20mA。由于供电电流为1.3A,所以可以点亮65个左右的LED灯。
图4. LED灯条的并行连接
图5. Arduino延伸的LED灯串
现在硬件部分已经完成了,然后对LED灯条进行编程。
2. 自定义程序
这次我们将使用“NeoPixel”库,来控制全彩LED灯条。
以下是LED灯条的程序,接近传感器作为输入信号: - #include <Wire.h>
- #include <RPR-0521RS.h>
- #include <Adafruit_NeoPixel.h>
-
-
- #define PIN 6 //pin number of the signal terminal
- #define LED_NUM 50 //number of LEDs
-
- RPR0521RS rpr0521rs;
- 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
-
- int wait = 200;
-
- void setup() {
- ledtape.begin();
- ledtape.show(); //reflects once in all OFF state
-
- byte rc;
- Serial.begin(9600);
- while (!Serial);
- Wire.begin();
- rc = rpr0521rs.init();
- }
-
- void loop() {
- byte rc;
- unsigned short ps_val;
- float als_val;
- byte near_far;
- Serial.println("=============================");
-
- rc = rpr0521rs.get_psalsval(&ps_val, &als_val);
- //when the sensor value is acquired
- if (rc == 0) {
- Serial.print("PS:");
- Serial.print(ps_val);
- Serial.println();
-
- //LEDs light up when approaching
- if(ps_val > 5){
- ps_val = 500 - ps_val;
- if(ps_val < 0){
- ps_val = 0;
- }
- simpleLED(ps_val/10);
- }
-
- if (als_val != RPR0521RS_ERROR) {
- Serial.print("ALS:");
- Serial.print(als_val);
- Serial.println();
- }
- }
- delay(5);
- }
-
- int LEDtale[10]; //arrangement for the trajectory of LED
-
- //
- //Lights individually
- //
- void simpleLED(int delaytime){
- uint16_t i, j;
- j=0;
- for(i=0; i < ledtape.numPixels(); i++) {
- ledtape.setPixelColor(i, rotateColor(((i) * 256 / ledtape.numPixels()) & 255));
- LEDtale[0] = rotateColor(((i) * 256 * 9/10 / ledtape.numPixels()) & 255);
-
- for(j=1; j < 10; j++){
- LEDtale[j] = rotateColor(((i) * 256 * (10-j)/10 / ledtape.numPixels()) & 255);
- uint16_t m = i-j;
- if(m < 0){
- m += 50;
- }
- ledtape.setPixelColor(m, LEDtale[j]);
- }
-
- ledtape.show();
- for(j=1; j < 10; j++){
- uint16_t m = i-j;
- if(m < 0){
- m += 50;
- }
- delay(0);
- ledtape.setPixelColor(m, ledtape.Color(0,0,0));
- ledtape.show();
- }
- ledtape.setPixelColor(i, ledtape.Color(0,0,0));
- ledtape.show();
- }
- ledtape.show();
- delay(delaytime);
- }
-
-
- //RGB color transition function
- uint32_t rotateColor(byte WheelPos) {
- if(WheelPos < 85) {
- return ledtape.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
- } else if(WheelPos < 170) {
- WheelPos -= 85;
- return ledtape.Color(255 - WheelPos * 3, 0, WheelPos * 3);
- } else {
- WheelPos -= 170;
- return ledtape.Color(0, WheelPos * 3, 255 - WheelPos * 3);
- }
- }
复制代码
接近传感器的输入应检查来自传感器评估套件的采样。 目的是处理从传感器输入的数值。 如果您只需用if语句对传感器作出响应,则只需打开/关闭LED即可。 通过将传感器的值传递给点亮LED并改变LED点亮方式的功能,可以创建更多的交互式照明效果。
- //LEDs light up when approaching
- if(ps_val > 5){
- ps_val = 500 - ps_val;
- simpleLED(ps_val/10); //Use the sensor value to light the LEDs
- }
复制代码
simpleLED函数用于是点亮LED灯条,但是我们需要更改它,以便从LED灯条的开始到结束逐一点亮LED。 这可能是不够的,所以这次我们使用一个数组来使LED灯条在一定程度上线性地发光。
在数组中,我们保持照明方法10次,然后从当前发光的LED的位置开始计数。 - int LEDtale[10]; //arrangement for the trajectory of LED
复制代码
程序的这个部分是非常好玩的。 请随意根据您的喜好进行定制。
3. 让我们点亮吧!
让我们看看实际的灯光!
随着接近距离的改变,LED灯条的光速也变化。
你可以在黑暗的房间试试,灯光看起来会更棒!
今天,我们通过使用传感器评估套件的接近传感器,制作了一个交互式的LED灯条。 你可以进一步做一个大规模的LED灯条,或添加更多的LED来制作灯带。 这些灯光很容易把你的家变成一个假日仙境!
|