返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[技术讨论] 基于Firebeetle开发板的遥控型彩色灯带

[复制链接]
19501|1
 楼主| jinglixixi 发表于 2021-9-12 23:48 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2021-9-13 17:14 编辑

#申请原创#
Firebeetle开发板是一款体型小巧、功能丰富的开发板,并可以Arduino IDE来开发,从而有效地化解编程的复杂性。
1.硬件构成:
以Firebeetle开发板为核心,在红外接收模块和W2812彩色灯带的配合下即可完成一个遥控型彩色灯带显示装置。由于W2812彩色灯带是一种单总线型的器件,因此可以级联起来使用,以形成一条长度可以进行延伸的彩色灯带。
至于红外接收模块的模块的使用,则是为了便于进行非接触性的操控。红外接收模块的引脚也非常简单,除了信号输出引脚外,就只是2个电源引脚了。
所用的遥控器则是一款为太阳能充电灯所配置的遥控器,按键不是很多,其主要作用就是对于电源开关及工作模式的切换。
硬件的整体构成如图1所示,其结构框图则如图2所示。
图1 整体构成

图2结构框图

根据 NEC 协议的标准,每一帧数据的周期为 110 ms,且逻辑 0 和 逻辑 1的波形如图3所示。其中逻辑 1 对应的两个高电平的时间间隔为 2.25ms,同样地逻辑 0 对应的两个高电平的时间间隔为 1.12ms。
图3  NEC 协议波形

2.程序设计
在引脚的连接方面,其对应关系如下:
红外接收模块的OUT---开发板的SCL
W2812彩色灯带的DI---开发板的A4

因此对相关的引脚对应如下:
int IR_RECEIVE_PIN = 15;
#define DATA_PIN SCL
int  LED_PIN= D9;
int KEY_PIN = D4;
所实现的功能为:
1)使用开发板上的按键可切换LED灯的亮灭;
2)使用遥控器的电源开关键可控制LED灯的亮灭;
3)使用遥控器的模式键可进行彩色灯带的色彩变换及演示效果的切换。
为了便于后续的程序设计,先进行了遥控器的键值检测,经检测该遥控器的相应键值为:
ON键---0xFFA25D
OFF键---0xFFE21D
MODE1---0xFFE01F
MODE2---0xFFA857
MODE3---0xFF906F

故该遥控器的键值识别处理程序如下:
  1. if(codeValue==0xFFA25D)
  2. {
  3. Serial.println("ON");
  4. F=1;
  5. }
  6. if(codeValue==0xFFE21D)
  7. {
  8. Serial.println("OFF");
  9. F=0;
  10. }
  11. if(codeValue==0xFFE01F)
  12. {
  13. Serial.println("R");
  14. F=2;
  15. }
  16. if(codeValue==0xFFA857)
  17. {
  18. Serial.println("G");
  19. F=3;
  20. }
  21. if(codeValue==0xFF906F)
  22. {
  23. Serial.println("B");
  24. F=4;
  25. }
  26. }
  27. }

其中变量F的作用是标识所要执行的处理功能,所输出的提示信息则是为了便于进行验证,其验证结果如图4所示,说明识别有效。
图4 测试结果

为此,所设计的各模式切换处理程序如下:
  1. if(F==2)
  2. {
  3. for(i=0;i<NUM_LEDS;i++)
  4. {
  5. //灯珠显示红色依次点亮
  6. leds[i] = CRGB::Red;
  7. FastLED.show();
  8. delay(500);
  9. }
  10. }
  11. if(F==3)
  12. {
  13. for(i=0;i<NUM_LEDS;i++)
  14. {
  15. //灯珠显示绿色依次点亮
  16. leds[i] = CRGB::Green;
  17. FastLED.show();
  18. delay(500);
  19. }
  20. }
  21. if(F==4)
  22. {
  23. for(i=0;i<NUM_LEDS;i++)
  24. {
  25. //灯珠显示蓝色依次点亮
  26. leds[i] = CRGB::Blue;
  27. FastLED.show();
  28. delay(500);
  29. }

其测试效果如图5至图8所示,其演示效果为按指定的色彩从前至后依次递进点亮。当然我们也可以按自己意愿来设计所需的效果。
图5 模式1的效果
图6模式2的效果
图7 模式3的效果


除了前面介绍的遥控方式外,它还支持按键的操控方式,实现两种操控方式的兼容,其执行效果如图8所示。

图8 电源键效果

这种与遥控方式兼容的处理程序为:
    if(digitalRead(KEY_PIN)==LOW) F=(F+1)%2;
    if(F==1)  digitalWrite(LED_PIN,HIGH);
    else     digitalWrite(LED_PIN,LOW);

这里由于是按照变量F的值进行判别处理,故达到了2种控制方式的并行不背。
若将上面的条件语句改为:if(digitalRead(KEY_PIN)==LOW) F=(F+1)%5;
则按键与遥控器的作用是等价的,否则只是在控制LED灯时作用相同。

有了前面的这些介绍,再了解下面的完整程序就不困难了。此外,在此框架的基础上若再添加或修改程序,则可适应自己的功能需求,例如以遥控器控制一个MP3语音播放器等。

3.程序内容
该设计的完整程序如下:
  1. #include <FastLED.h>
  2. #define NUM_LEDS 7
  3. #define DATA_PIN SCL
  4. CRGB leds[NUM_LEDS];
  5. #include <IRremote.h>
  6. #if defined(ESP32)
  7. int IR_RECEIVE_PIN = 15;
  8. int SEND_BUTTON_PIN = 16;
  9. #endif
  10. int STATUS_PIN = LED_BUILTIN;
  11. IRrecv irrecv(IR_RECEIVE_PIN);
  12. IRsend irsend;
  13. decode_results results;
  14. int  LED_PIN = D9;
  15. int  KEY_PIN = D4;
  16. int  F=0;
  17. #if defined(ARDUINO_ARCH_SAMD)
  18. #define Serial SerialUSB
  19. #endif

  20. void setup() {
  21. pinMode(LED_PIN, OUTPUT);
  22. pinMode(KEY_PIN, INPUT_PULLUP);
  23. digitalWrite(LED_PIN, HIGH);
  24. FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  25. Serial.begin(115200);
  26. irrecv.enableIRIn(); // Start the receiver
  27. pinMode(SEND_BUTTON_PIN, INPUT_PULLUP);
  28. pinMode(STATUS_PIN, OUTPUT);
  29. Serial.print(F("Ready to receive IR signals at pin "));
  30. Serial.println(IR_RECEIVE_PIN);
  31. Serial.print(F("Ready to send IR signals at pin "));
  32. Serial.println(IR_SEND_PIN);
  33. }

  34. int codeType = -1;
  35. unsigned long codeValue;
  36. unsigned int rawCodes[RAW_BUFFER_LENGTH];
  37. int codeLen;
  38. int toggle = 0;
  39. void storeCode(decode_results *results) {
  40. codeType = results->decode_type;
  41. if (codeType == UNKNOWN) {
  42. Serial.println("");
  43. } else {
  44. if (codeType == NEC) {
  45. Serial.print("Received NEC: ");
  46. if (results->value == REPEAT) {
  47. // Don't record a NEC repeat value as that's useless.
  48. //Serial.println("repeat; ignoring.");
  49. Serial.println("");
  50. return;
  51. }
  52. }
  53. Serial.println(results->value, HEX);
  54. codeValue = results->value;
  55. codeLen = results->bits;
  56. if(codeValue==0xFFA25D)
  57. {
  58. Serial.println("ON");
  59. F=1;
  60. }
  61. if(codeValue==0xFFE21D)
  62. {
  63. Serial.println("OFF");
  64. F=0;
  65. }
  66. if(codeValue==0xFFE01F)
  67. {
  68. Serial.println("R");
  69. F=2;
  70. }
  71. if(codeValue==0xFFA857)
  72. {
  73. Serial.println("G");
  74. F=3;
  75. }
  76. if(codeValue==0xFF906F)
  77. {
  78. Serial.println("B");
  79. F=4;
  80. }
  81. }
  82. }
  83. void sendCode(int repeat) {
  84. }
  85. int lastButtonState;
  86. void loop() {
  87. int i;
  88. // If button pressed, send the code.
  89. int buttonState = digitalRead(SEND_BUTTON_PIN);
  90. if (lastButtonState == LOW && buttonState == HIGH) {
  91. Serial.println("Released");
  92. irrecv.enableIRIn(); // Re-enable receiver
  93. }
  94. if (buttonState == LOW) {
  95. Serial.println("Pressed, sending");
  96. digitalWrite(STATUS_PIN, HIGH);
  97. sendCode(lastButtonState == buttonState);
  98. digitalWrite(STATUS_PIN, LOW);
  99. delay(50);
  100. } else if (irrecv.decode(&results)) {
  101. digitalWrite(STATUS_PIN, HIGH);
  102. storeCode(&results);
  103. irrecv.resume();    // resume receiver
  104. digitalWrite(STATUS_PIN, LOW);
  105. }
  106. lastButtonState = buttonState;
  107. if(digitalRead(KEY_PIN)==LOW) F=(F+1)%2;
  108. if(F==1) digitalWrite(LED_PIN, HIGH);
  109. else     digitalWrite(LED_PIN, LOW);
  110. if(F==2)
  111. {
  112. for(i=0;i<NUM_LEDS;i++)
  113. {
  114. //灯珠显示红色
  115. leds[i] = CRGB::Red;
  116. FastLED.show();
  117. delay(500);
  118. }
  119. }
  120. if(F==3)
  121. {
  122. for(i=0;i<NUM_LEDS;i++)
  123. {
  124. //灯珠显示绿色
  125. leds[i] = CRGB::Green;
  126. FastLED.show();
  127. delay(500);
  128. }
  129. }
  130. if(F==4)
  131. {
  132. for(i=0;i<NUM_LEDS;i++)
  133. {
  134. //灯珠显示蓝色
  135. leds[i] = CRGB::Blue;
  136. FastLED.show();
  137. delay(500);
  138. }
  139. }
  140. }

动画效果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21小跑堂 打赏了 50.00 元 2021-09-16
理由:恭喜通过原创文章审核!请多多加油哦!

 楼主| jinglixixi 发表于 2021-9-13 17:16 | 显示全部楼层
本帖最后由 jinglixixi 于 2021-9-13 20:26 编辑


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部