基于Firebeetle開(kāi)發(fā)板的遙控型彩色燈帶
網(wǎng)站:bbs.21ic.com
Firebeetle開(kāi)發(fā)板是一款體型小巧、功能豐富的開(kāi)發(fā)板,并可以Arduino IDE來(lái)開(kāi)發(fā),從而有效地化解編程的復(fù)雜性。
1.硬件構(gòu)成:以Firebeetle開(kāi)發(fā)板為核心,在紅外接收模塊和W2812彩色燈帶的配合下即可完成一個(gè)遙控型彩色燈帶顯示裝置。由于W2812彩色燈帶是一種單總線型的器件,因此可以級(jí)聯(lián)起來(lái)使用,以形成一條長(zhǎng)度可以進(jìn)行延伸的彩色燈帶。
至于紅外接收模塊的模塊的使用,則是為了便于進(jìn)行非接觸性的操控。紅外接收模塊的引腳也非常簡(jiǎn)單,除了信號(hào)輸出引腳外,就只是2個(gè)電源引腳了。
所用的遙控器則是一款為太陽(yáng)能充電燈所配置的遙控器,按鍵不是很多,其主要作用就是對(duì)于電源開(kāi)關(guān)及工作模式的切換。
硬件的整體構(gòu)成如圖1所示,其結(jié)構(gòu)框圖則如圖2所示。
圖1 整體構(gòu)成
圖2結(jié)構(gòu)框圖根據(jù) NEC 協(xié)議的標(biāo)準(zhǔn),每一幀數(shù)據(jù)的周期為 110 ms,且邏輯 0 和 邏輯 1的波形如圖3所示。其中邏輯 1 對(duì)應(yīng)的兩個(gè)高電平的時(shí)間間隔為 2.25ms,同樣地邏輯 0 對(duì)應(yīng)的兩個(gè)高電平的時(shí)間間隔為 1.12ms。
圖3? NEC 協(xié)議波形2.程序設(shè)計(jì)在引腳的連接方面,其對(duì)應(yīng)關(guān)系如下:紅外接收模塊的OUT---開(kāi)發(fā)板的SCLW2812彩色燈帶的DI---開(kāi)發(fā)板的A4
因此對(duì)相關(guān)的引腳對(duì)應(yīng)如下:int IR_RECEIVE_PIN = 15;#define DATA_PIN SCLint? LED_PIN= D9;int KEY_PIN = D4;所實(shí)現(xiàn)的功能為:1)使用開(kāi)發(fā)板上的按鍵可切換LED燈的亮滅;2)使用遙控器的電源開(kāi)關(guān)鍵可控制LED燈的亮滅;3)使用遙控器的模式鍵可進(jìn)行彩色燈帶的色彩變換及演示效果的切換。為了便于后續(xù)的程序設(shè)計(jì),先進(jìn)行了遙控器的鍵值檢測(cè),經(jīng)檢測(cè)該遙控器的相應(yīng)鍵值為:ON鍵---0xFFA25DOFF鍵---0xFFE21DMODE1---0xFFE01FMODE2---0xFFA857MODE3---0xFF906F
故該遙控器的鍵值識(shí)別處理程序如下:
if(codeValue==0xFFA25D){Serial.println("ON");F=1;}if(codeValue==0xFFE21D){Serial.println("OFF");F=0;}if(codeValue==0xFFE01F){Serial.println("R");F=2;}if(codeValue==0xFFA857){Serial.println("G");F=3;}if(codeValue==0xFF906F){Serial.println("B");F=4;}}}其中變量F的作用是標(biāo)識(shí)所要執(zhí)行的處理功能,所輸出的提示信息則是為了便于進(jìn)行驗(yàn)證,其驗(yàn)證結(jié)果如圖4所示,說(shuō)明識(shí)別有效。
圖4 測(cè)試結(jié)果
為此,所設(shè)計(jì)的各模式切換處理程序如下:
if(F==2){for(i=0;i{//燈珠顯示紅色依次點(diǎn)亮leds[i] = CRGB::Red;FastLED.show();delay(500);}}if(F==3){for(i=0;i{//燈珠顯示綠色依次點(diǎn)亮leds[i] = CRGB::Green;FastLED.show();delay(500);}}if(F==4){for(i=0;i{//燈珠顯示藍(lán)色依次點(diǎn)亮leds[i] = CRGB::Blue;FastLED.show();delay(500);其測(cè)試效果如圖5至圖8所示,其演示效果為按指定的色彩從前至后依次遞進(jìn)點(diǎn)亮。當(dāng)然我們也可以按自己意愿來(lái)設(shè)計(jì)所需的效果。

圖5 模式1的效果

圖6模式2的效果

圖7 模式3的效果
除了前面介紹的遙控方式外,它還支持按鍵的操控方式,實(shí)現(xiàn)兩種操控方式的兼容,其執(zhí)行效果如圖8所示。

圖8 電源鍵效果
這種與遙控方式兼容的處理程序?yàn)椋?/span>? ? if(digitalRead(KEY_PIN)==LOW) F=(F 1)%2;? ? if(F==1)? digitalWrite(LED_PIN,HIGH);? ? else? ? ?digitalWrite(LED_PIN,LOW);
這里由于是按照變量F的值進(jìn)行判別處理,故達(dá)到了2種控制方式的并行不背。若將上面的條件語(yǔ)句改為:if(digitalRead(KEY_PIN)==LOW) F=(F 1)%5;則按鍵與遙控器的作用是等價(jià)的,否則只是在控制LED燈時(shí)作用相同。
有了前面的這些介紹,再了解下面的完整程序就不困難了。此外,在此框架的基礎(chǔ)上若再添加或修改程序,則可適應(yīng)自己的功能需求,例如以遙控器控制一個(gè)MP3語(yǔ)音播放器等。
3.程序內(nèi)容該設(shè)計(jì)的完整程序如下:
#include #define NUM_LEDS 7#define DATA_PIN SCLCRGB leds[NUM_LEDS];#include #if defined(ESP32)int IR_RECEIVE_PIN = 15;int SEND_BUTTON_PIN = 16;#endifint STATUS_PIN = LED_BUILTIN;IRrecv irrecv(IR_RECEIVE_PIN);IRsend irsend;decode_results results;int??LED_PIN = D9;int??KEY_PIN = D4;int??F=0;#if defined(ARDUINO_ARCH_SAMD)#define Serial SerialUSB#endifvoid setup() {pinMode(LED_PIN, OUTPUT);pinMode(KEY_PIN, INPUT_PULLUP);digitalWrite(LED_PIN, HIGH);FastLED.addLeds(leds, NUM_LEDS); Serial.begin(115200);irrecv.enableIRIn(); // Start the receiverpinMode(SEND_BUTTON_PIN, INPUT_PULLUP);pinMode(STATUS_PIN, OUTPUT);Serial.print(F("Ready to receive IR signals at pin "));Serial.println(IR_RECEIVE_PIN);Serial.print(F("Ready to send IR signals at pin "));Serial.println(IR_SEND_PIN);}int codeType = -1;unsigned long codeValue;unsigned int rawCodes[RAW_BUFFER_LENGTH];int codeLen;int toggle = 0;void storeCode(decode_results *results) {codeType = results->decode_type;if (codeType == UNKNOWN) {Serial.println("");} else {if (codeType == NEC) {Serial.print("Received NEC: ");if (results->value == REPEAT) {// Don't record a NEC repeat value as that's useless.//Serial.println("repeat; ignoring.");Serial.println("");return;}}Serial.println(results->value, HEX);codeValue = results->value;codeLen = results->bits;if(codeValue==0xFFA25D){Serial.println("ON");F=1;}if(codeValue==0xFFE21D){Serial.println("OFF");F=0;}if(codeValue==0xFFE01F){Serial.println("R");F=2;}if(codeValue==0xFFA857){Serial.println("G");F=3;}if(codeValue==0xFF906F){Serial.println("B");F=4;}}}void sendCode(int repeat) {}int lastButtonState;void loop() {int i;// If button pressed, send the code.int buttonState = digitalRead(SEND_BUTTON_PIN);if (lastButtonState == LOW 





