為了控制全彩LED燈串或燈條,我們在上一篇 文章 中引入了“NeoPixel”庫。這次我們繼續使用NeoPixel。
以下是以近接感測器為輸入的LED燈串控製程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
#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); //如果所用LED燈帶的控制IC是WS2812,那麼第三個參數是NEO_KHZ800,如果控制IC是WS2811則是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); //當獲取感測器值時 if (rc == 0) { Serial.print("PS:"); Serial.print(ps_val); Serial.println(); //接近時LED燈亮起 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 // //逐個點亮 // 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 顏色轉變函數 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); } } |
我們修改了最後一個程式中的一些東西。首先,我們添加了近接感測器的輸入處理。其次,我們改變了LED的點亮方式。
近接感測器的輸入應檢查感測器評估套件(Sensor Evaluation Kit)的示例程式。其目的是處理來自感測器的數值。如果您只用if語句來響應感測器,那麼只能實現LED的開啟/斷路。如果將感測器的值傳遞給點亮LED並改變LED點亮方式的函數,就可以創建更多的互動式照明效果。
1 2 3 4 5 |
//接近時LED燈亮起 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的位置開始計數。
1 |
int LEDtale[10]; //安排LED的軌跡 |
修改程式的這個部分非常有趣。您可以根據自己的喜好定製程式。