6274浏览
查看: 6274|回复: 3

[求助] 红外遥控支持库与“多线程”支持库冲突导致接收红外乱变

[复制链接]
本帖最后由 hejie13250 于 2016-7-29 17:32 编辑

在淘宝上买了一个RGB灯环,每个灯(12个)都带有微型控制器,只用一个IO就可以搞定。
想通过一个4*4的矩阵键盘控制灯环的变色样式,其中按键“D”为关闭所有灯。
现在增加红外遥控来控制,和4*4的矩阵键盘一样。

红外遥控支持库与“多线程”支持库冲突导致接收红外乱变图1

此时问题来了,不加“多线程”库,读取的红外信号是正常的,加上后读取的信号值就会乱变,下图为多次按下遥控上的“9”后接收到的信号

红外遥控支持库与“多线程”支持库冲突导致接收红外乱变图2

经排除确认是红外遥控支持库与“多线程”支持库冲突导致,还望大神支招!!!


代码如下
主体
  1. #include <SCoop.h>
  2. char style = 'd';//灯环样式 style 默认为关闭状,按 d 键或 遥控 EQ关闭
  3. //初始化功能
  4. void setup() {
  5.   Serial.begin(9600);
  6.   mySCoop.start();//启用“多线程”
  7. }
  8. void loop()
  9. {
  10.   yield();
  11. }
复制代码

遥控接收
  1. #include <IRremote.h>
  2. int RECV_PIN = A0;
  3. IRrecv irrecv(RECV_PIN);
  4. decode_results results;
  5. defineTask(IRremote);
  6. void IRremote::setup()
  7. {
  8.   irrecv.enableIRIn(); // 开始接收信号
  9. }
  10. void IRremote::loop()
  11. {
  12.   if (irrecv.decode(&results))
  13.   {
  14.     switch (results.value)
  15.     {
  16.       //灯环样式 style 默认为关闭状态,按 d 键或 遥控 EQ关闭
  17.       case 16761405:        style = 'd'; break;        // PLAY
  18.       case 16769055:        style = 'c'; break;        // VOL-
  19.       case 16754775:        style = 'b'; break;        // VLO+
  20.       case 16748655:        style = 'a'; break;        // EQ
  21.       case 16738455:        style = '0'; break;        // 0
  22.       case 16750695:        style = '*'; break;        // 100+
  23.       case 16756815:        style = '#'; break;        // 200+
  24.       case 16724175:        style = '1'; break;        // 1
  25.       case 16718055:        style = '2'; break;        // 2
  26.       case 16743045:        style = '3'; break;        // 3
  27.       case 16716015:        style = '4'; break;        // 4
  28.       case 16726215:        style = '5'; break;        // 5
  29.       case 16734885:        style = '6'; break;        // 6
  30.       case 16728765:        style = '7'; break;        // 7
  31.       case 16730805:        style = '8'; break;        // 8
  32.       case 16732845:        style = '9'; break;        // 9
  33.       default : break;
  34.     }
  35.     //Serial.println(style + "  " + results.value);
  36.     Serial.print(style);
  37.     Serial.print("  ");
  38.     Serial.println(results.value);
  39.     irrecv.resume(); //接收下一个信号
  40.   }
  41. }
复制代码

按键部分
  1. //按键4*4定义
  2. const int numRows = 4;//定义4行
  3. const int numCols = 4;//定义4列
  4. const int rowPins[numRows] = {4, 5, 6, 7}; //设置4*4按键对应的引脚
  5. const int colPins[numCols] = {8, 9, 10, 11};
  6. const int debounceTime = 20;//去抖动时间长度 20ms
  7. const char keymap[numRows][numCols] = { //键值,可以按需要更改
  8.                                         { '1', '2', '3', 'a' },
  9.                                         { '4', '5', '6', 'b' },
  10.                                         { '7', '8', '9', 'c' },
  11.                                         { '*', '0', '#', 'd' }
  12.                                       };
  13. defineTask(Key);
  14. void Key::setup()
  15. {
  16.   for (int row = 0; row < numRows; row++)
  17.   {
  18.     pinMode(rowPins[row], INPUT);
  19.     digitalWrite(rowPins[row], HIGH);
  20.   }
  21.   for (int column = 0; column < numCols; column++)
  22.   {
  23.     pinMode(colPins[column], OUTPUT);
  24.     digitalWrite(colPins[column], HIGH);
  25.   }
  26. }
  27. void Key::loop()
  28. {
  29.   char key = getkey();
  30.   if (key != 0)
  31.   {
  32.     Serial.print("Got key ");//串口打印键值
  33.     Serial.println(key);
  34.     style = key;
  35.   }
  36. }
  37. //读取键值程序
  38. char getkey()
  39. {
  40.   char key = 0;
  41.   for (int column = 0; column < numCols; column++) {
  42.     digitalWrite(colPins[column], LOW);
  43.     for (int row = 0 ; row < numRows; row++) {
  44.       if (digitalRead(rowPins[row]) == LOW) { //是否有按键按下
  45.         sleep(debounceTime);
  46.         while (digitalRead(rowPins[row]) == LOW) //等待按键释放
  47.           ;
  48.         key = keymap[row][column];
  49.       }
  50.     }
  51.     digitalWrite(colPins[column], HIGH); //De-active the current column
  52.   }
  53.   return key;
  54. }
复制代码

灯环样式部分
  1. #include <Adafruit_NeoPixel.h>//灯环支持库
  2. #include <stdlib.h>
  3. #define PIN A1 //灯环使用了Arduino的12号端口
  4. // 参数 1 = 条带中的像素数
  5. // 参数 2 = Arduino 的引脚号 (most are valid)
  6. // 参数 3 = 像素类型的标志,根据需要添加在一起:
  7. //   NEO_KHZ800  800 KHz 位流 (most NeoPixel products w/WS2812 ColorLEDs)
  8. //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
  9. //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
  10. //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
  11. //Adafruit_NeoPixel ColorLED = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
  12. Adafruit_NeoPixel ColorLED = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800); // 定义灯环为 ColorLED
  13. defineTask(Style);
  14. void Style::setup()
  15. {
  16.   //灯初始化
  17.   ColorLED.begin();
  18.   ColorLED.show(); // 初始化所有像素'关闭'
  19. }
  20. void Style::loop()
  21. {
  22.   //这是是loop的内容
  23.   switch (style)
  24.   {
  25.     case '1': sj(62);      break;
  26.     case '2': colorWipe(ColorLED.Color(255, 0, 0), 62); // 红
  27.       break;
  28.     case '3': colorWipe(ColorLED.Color(0, 255, 0), 62); // 绿
  29.       break;
  30.     case '4': colorWipe(ColorLED.Color(0, 0, 255), 62); // 蓝
  31.       break;
  32.     case '5': theaterChase(ColorLED.Color(127, 127, 127), 100); // 白
  33.       break;
  34.     case '6': theaterChase(ColorLED.Color(127, 0, 0), 100); // 红
  35.       break;
  36.     case '7': theaterChase(ColorLED.Color(0, 127, 0), 100); // 绿
  37.       break;
  38.     case '8': theaterChase(ColorLED.Color(0, 0, 127), 100); // 蓝
  39.       break;
  40.     case '9': theaterChase(ColorLED.Color(255, 64, 127), 100);
  41.       break;
  42.     case '0': theaterChase(ColorLED.Color(0, 255, 127), 100);
  43.       break;
  44.     case '*': rainbow(20);
  45.       break;
  46.     case '#': rainbowCycle(20);
  47.       break;
  48.     case 'a': theaterChaseRainbow(50);
  49.       break;
  50.     case 'b': ab(100);
  51.       break;
  52.     case 'c': sj(200);
  53.       break;
  54.     case 'd': off();
  55.       break;
  56.   }
  57. }
  58. ////////////  灯光模式
  59. //随机模式
  60. void sj(uint8_t wait)
  61. {
  62.   for ( int l = 0; l < 12; l++)
  63.   {
  64.     ColorLED.setPixelColor(l, ColorLED.Color(random(0, 255), random(0, 255), random(0, 255)));
  65.     ColorLED.show();
  66.     sleep(wait);
  67.   }
  68. }
  69. void ab(uint8_t wait)
  70. {
  71.   ColorLED.setPixelColor(0, ColorLED.Color(255, 0, 0));
  72.   ColorLED.setPixelColor(1, ColorLED.Color(0, 255, 0));
  73.   ColorLED.setPixelColor(2, ColorLED.Color(0, 0, 255));
  74.   ColorLED.setPixelColor(3, ColorLED.Color(255, 255, 0));
  75.   ColorLED.setPixelColor(4, ColorLED.Color(255, 0, 255));
  76.   ColorLED.setPixelColor(5, ColorLED.Color(0, 255, 255));
  77.   ColorLED.setPixelColor(6, ColorLED.Color(128, 0, 0));
  78.   ColorLED.setPixelColor(7, ColorLED.Color(0, 128, 0));
  79.   ColorLED.setPixelColor(8, ColorLED.Color(0, 0, 128));
  80.   ColorLED.setPixelColor(9, ColorLED.Color(128, 128, 0));
  81.   ColorLED.setPixelColor(10, ColorLED.Color(128, 0, 128));
  82.   ColorLED.setPixelColor(11, ColorLED.Color(0, 128, 128));
  83.   ColorLED.show();
  84.   sleep(wait);
  85. }
  86. void off()
  87. {
  88.   for ( int l = 0; l < 12; l++)
  89.   {
  90.     ColorLED.setPixelColor(l, ColorLED.Color(0, 0, 0));
  91.     ColorLED.show();
  92.   }
  93. }
  94. // Fill the dots one after the other with a color
  95. void colorWipe(uint32_t c, uint8_t wait)
  96. {
  97.   for (uint16_t i = 0; i < ColorLED.numPixels(); i++)
  98.   {
  99.     ColorLED.setPixelColor(i, c);
  100.     ColorLED.show();
  101.     sleep(wait);
  102.   }
  103. }
  104. void rainbow(uint8_t wait)
  105. {
  106.   uint16_t i, j;
  107.   for (j = 0; j < 256; j++)
  108.   {
  109.     for (i = 0; i < ColorLED.numPixels(); i++)
  110.       ColorLED.setPixelColor(i, Wheel((i + j) & 255));
  111.     ColorLED.show();
  112.     sleep(wait);
  113.   }
  114. }
  115. // Slightly different, this makes the rainbow equally distributed throughout
  116. void rainbowCycle(uint8_t wait)
  117. {
  118.   uint16_t i, j;
  119.   for (j = 0; j < 256 * 5; j++) // 5 cycles of all colors on wheel
  120.   {
  121.     for (i = 0; i < ColorLED.numPixels(); i++)
  122.       ColorLED.setPixelColor(i, Wheel(((i * 256 / ColorLED.numPixels()) + j) & 255));
  123.     ColorLED.show();
  124.     sleep(wait);
  125.   }
  126. }
  127. //Theatre-style crawling lights.
  128. void theaterChase(uint32_t c, uint8_t wait)
  129. {
  130.   for (int j = 0; j < 10; j++) //do 10 cycles of chasing
  131.     for (int q = 0; q < 3; q++)
  132.     {
  133.       for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
  134.         ColorLED.setPixelColor(i + q, c);  //turn every third pixel on
  135.       ColorLED.show();
  136.       sleep(wait);
  137.       for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
  138.         ColorLED.setPixelColor(i + q, 0);      //turn every third pixel off
  139.     }
  140. }
  141. //Theatre-style crawling lights with rainbow effect
  142. void theaterChaseRainbow(uint8_t wait)
  143. {
  144.   for (int j = 0; j < 256; j++)  // cycle all 256 colors in the wheel
  145.     for (int q = 0; q < 3; q++)
  146.     {
  147.       for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
  148.         ColorLED.setPixelColor(i + q, Wheel((i + j) % 255)); //turn every third pixel on
  149.       ColorLED.show();
  150.       sleep(wait);
  151.       for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
  152.         ColorLED.setPixelColor(i + q, 0);      //turn every third pixel off
  153.     }
  154. }
  155. // Input a value 0 to 255 to get a color value.
  156. // The colours are a transition r - g - b - back to r.
  157. uint32_t Wheel(byte WheelPos)
  158. {
  159.   if (WheelPos < 85)
  160.     return ColorLED.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  161.   else if (WheelPos < 170)
  162.   {
  163.     WheelPos -= 85;
  164.     return ColorLED.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  165.   }
  166.   else
  167.   {
  168.     WheelPos -= 170;
  169.     return ColorLED.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  170.   }
  171. }
复制代码

代码和要用的库

hejie13250  见习技师
 楼主|

发表于 2016-7-30 07:50:49

自己顶!!!!!!
回复

使用道具 举报

谭峰  学徒

发表于 2016-11-12 09:30:56

我才刚刚接触Arduino,还暂时不能回答您的这个问题。

不过,我正在到处找多线程库SCoop.h,想开发一个小程序。

您能不能把这个SCoop.h库发给我一份?非常感谢!

我的邮箱是:deak1970@163.com
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-15 07:53:39

谭峰 发表于 2016-11-12 09:30
我才刚刚接触Arduino,还暂时不能回答您的这个问题。

不过,我正在到处找多线程库SCoop.h,想开发一个小程 ...

希望在df上挂个链接
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail