基于Firebeetle開發(fā)板的遙控型彩色燈帶
網(wǎng)站:bbs.21ic.com
Firebeetle開發(fā)板是一款體型小巧、功能豐富的開發(fā)板,并可以Arduino IDE來開發(fā),從而有效地化解編程的復(fù)雜性。
1.硬件構(gòu)成:以Firebeetle開發(fā)板為核心,在紅外接收模塊和W2812彩色燈帶的配合下即可完成一個(gè)遙控型彩色燈帶顯示裝置。由于W2812彩色燈帶是一種單總線型的器件,因此可以級(jí)聯(lián)起來使用,以形成一條長度可以進(jìn)行延伸的彩色燈帶。
至于紅外接收模塊的模塊的使用,則是為了便于進(jìn)行非接觸性的操控。紅外接收模塊的引腳也非常簡單,除了信號(hào)輸出引腳外,就只是2個(gè)電源引腳了。
所用的遙控器則是一款為太陽能充電燈所配置的遙控器,按鍵不是很多,其主要作用就是對(duì)于電源開關(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---開發(fā)板的SCLW2812彩色燈帶的DI---開發(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)使用開發(fā)板上的按鍵可切換LED燈的亮滅;2)使用遙控器的電源開關(guān)鍵可控制LED燈的亮滅;3)使用遙控器的模式鍵可進(jìn)行彩色燈帶的色彩變換及演示效果的切換。為了便于后續(xù)的程序設(shè)計(jì),先進(jìn)行了遙控器的鍵值檢測,經(jīng)檢測該遙控器的相應(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所示,說明識(shí)別有效。
圖4 測試結(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);
其測試效果如圖5至圖8所示,其演示效果為按指定的色彩從前至后依次遞進(jìn)點(diǎn)亮。當(dāng)然我們也可以按自己意愿來設(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種控制方式的并行不背。若將上面的條件語句改為:if(digitalRead(KEY_PIN)==LOW) F=(F 1)%5;則按鍵與遙控器的作用是等價(jià)的,否則只是在控制LED燈時(shí)作用相同。
有了前面的這些介紹,再了解下面的完整程序就不困難了。此外,在此框架的基礎(chǔ)上若再添加或修改程序,則可適應(yīng)自己的功能需求,例如以遙控器控制一個(gè)MP3語音播放器等。
3.程序內(nèi)容該設(shè)計(jì)的完整程序如下:
#include
#define NUM_LEDS 7
#define DATA_PIN SCL
CRGB leds[NUM_LEDS];
#include
#if defined(ESP32)
int IR_RECEIVE_PIN = 15;
int SEND_BUTTON_PIN = 16;
#endif
int 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
#endif
void 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 receiver
pinMode(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