代码如下:
主体
- #include <SCoop.h>
-
- char style = 'd';//灯环样式 style 默认为关闭状,按 d 键或 遥控 EQ关闭
-
- //初始化功能
- void setup() {
- Serial.begin(9600);
- mySCoop.start();//启用“多线程”
- }
- void loop()
- {
- yield();
- }
复制代码
遥控接收
- #include <IRremote.h>
-
- int RECV_PIN = A0;
- IRrecv irrecv(RECV_PIN);
- decode_results results;
-
- defineTask(IRremote);
- void IRremote::setup()
- {
- irrecv.enableIRIn(); // 开始接收信号
- }
-
- void IRremote::loop()
- {
- if (irrecv.decode(&results))
- {
- switch (results.value)
- {
- //灯环样式 style 默认为关闭状态,按 d 键或 遥控 EQ关闭
- case 16761405: style = 'd'; break; // PLAY
- case 16769055: style = 'c'; break; // VOL-
- case 16754775: style = 'b'; break; // VLO+
- case 16748655: style = 'a'; break; // EQ
- case 16738455: style = '0'; break; // 0
- case 16750695: style = '*'; break; // 100+
- case 16756815: style = '#'; break; // 200+
- case 16724175: style = '1'; break; // 1
- case 16718055: style = '2'; break; // 2
- case 16743045: style = '3'; break; // 3
- case 16716015: style = '4'; break; // 4
- case 16726215: style = '5'; break; // 5
- case 16734885: style = '6'; break; // 6
- case 16728765: style = '7'; break; // 7
- case 16730805: style = '8'; break; // 8
- case 16732845: style = '9'; break; // 9
- default : break;
- }
- //Serial.println(style + " " + results.value);
- Serial.print(style);
- Serial.print(" ");
- Serial.println(results.value);
- irrecv.resume(); //接收下一个信号
- }
- }
复制代码
按键部分
- //按键4*4定义
- const int numRows = 4;//定义4行
- const int numCols = 4;//定义4列
- const int rowPins[numRows] = {4, 5, 6, 7}; //设置4*4按键对应的引脚
- const int colPins[numCols] = {8, 9, 10, 11};
- const int debounceTime = 20;//去抖动时间长度 20ms
- const char keymap[numRows][numCols] = { //键值,可以按需要更改
- { '1', '2', '3', 'a' },
- { '4', '5', '6', 'b' },
- { '7', '8', '9', 'c' },
- { '*', '0', '#', 'd' }
- };
-
- defineTask(Key);
- void Key::setup()
- {
- for (int row = 0; row < numRows; row++)
- {
- pinMode(rowPins[row], INPUT);
- digitalWrite(rowPins[row], HIGH);
- }
- for (int column = 0; column < numCols; column++)
- {
- pinMode(colPins[column], OUTPUT);
- digitalWrite(colPins[column], HIGH);
- }
- }
- void Key::loop()
- {
- char key = getkey();
- if (key != 0)
- {
- Serial.print("Got key ");//串口打印键值
- Serial.println(key);
- style = key;
- }
- }
-
- //读取键值程序
- char getkey()
- {
- char key = 0;
- for (int column = 0; column < numCols; column++) {
- digitalWrite(colPins[column], LOW);
- for (int row = 0 ; row < numRows; row++) {
- if (digitalRead(rowPins[row]) == LOW) { //是否有按键按下
- sleep(debounceTime);
- while (digitalRead(rowPins[row]) == LOW) //等待按键释放
- ;
- key = keymap[row][column];
- }
- }
- digitalWrite(colPins[column], HIGH); //De-active the current column
- }
- return key;
- }
复制代码
灯环样式部分
- #include <Adafruit_NeoPixel.h>//灯环支持库
- #include <stdlib.h>
- #define PIN A1 //灯环使用了Arduino的12号端口
-
- // 参数 1 = 条带中的像素数
- // 参数 2 = Arduino 的引脚号 (most are valid)
- // 参数 3 = 像素类型的标志,根据需要添加在一起:
- // NEO_KHZ800 800 KHz 位流 (most NeoPixel products w/WS2812 ColorLEDs)
- // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
- // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
- // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
- //Adafruit_NeoPixel ColorLED = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
-
- Adafruit_NeoPixel ColorLED = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800); // 定义灯环为 ColorLED
-
-
- defineTask(Style);
- void Style::setup()
- {
- //灯初始化
- ColorLED.begin();
- ColorLED.show(); // 初始化所有像素'关闭'
- }
- void Style::loop()
- {
- //这是是loop的内容
- switch (style)
- {
- case '1': sj(62); break;
- case '2': colorWipe(ColorLED.Color(255, 0, 0), 62); // 红
- break;
- case '3': colorWipe(ColorLED.Color(0, 255, 0), 62); // 绿
- break;
- case '4': colorWipe(ColorLED.Color(0, 0, 255), 62); // 蓝
- break;
- case '5': theaterChase(ColorLED.Color(127, 127, 127), 100); // 白
- break;
- case '6': theaterChase(ColorLED.Color(127, 0, 0), 100); // 红
- break;
- case '7': theaterChase(ColorLED.Color(0, 127, 0), 100); // 绿
- break;
- case '8': theaterChase(ColorLED.Color(0, 0, 127), 100); // 蓝
- break;
- case '9': theaterChase(ColorLED.Color(255, 64, 127), 100);
- break;
- case '0': theaterChase(ColorLED.Color(0, 255, 127), 100);
- break;
- case '*': rainbow(20);
- break;
- case '#': rainbowCycle(20);
- break;
- case 'a': theaterChaseRainbow(50);
- break;
- case 'b': ab(100);
- break;
- case 'c': sj(200);
- break;
- case 'd': off();
- break;
- }
- }
-
- //////////// 灯光模式
-
- //随机模式
- void sj(uint8_t wait)
- {
- for ( int l = 0; l < 12; l++)
- {
- ColorLED.setPixelColor(l, ColorLED.Color(random(0, 255), random(0, 255), random(0, 255)));
- ColorLED.show();
- sleep(wait);
- }
- }
-
- void ab(uint8_t wait)
- {
- ColorLED.setPixelColor(0, ColorLED.Color(255, 0, 0));
- ColorLED.setPixelColor(1, ColorLED.Color(0, 255, 0));
- ColorLED.setPixelColor(2, ColorLED.Color(0, 0, 255));
- ColorLED.setPixelColor(3, ColorLED.Color(255, 255, 0));
- ColorLED.setPixelColor(4, ColorLED.Color(255, 0, 255));
- ColorLED.setPixelColor(5, ColorLED.Color(0, 255, 255));
- ColorLED.setPixelColor(6, ColorLED.Color(128, 0, 0));
- ColorLED.setPixelColor(7, ColorLED.Color(0, 128, 0));
- ColorLED.setPixelColor(8, ColorLED.Color(0, 0, 128));
- ColorLED.setPixelColor(9, ColorLED.Color(128, 128, 0));
- ColorLED.setPixelColor(10, ColorLED.Color(128, 0, 128));
- ColorLED.setPixelColor(11, ColorLED.Color(0, 128, 128));
- ColorLED.show();
- sleep(wait);
- }
-
- void off()
- {
- for ( int l = 0; l < 12; l++)
- {
- ColorLED.setPixelColor(l, ColorLED.Color(0, 0, 0));
- ColorLED.show();
- }
- }
-
- // Fill the dots one after the other with a color
- void colorWipe(uint32_t c, uint8_t wait)
- {
- for (uint16_t i = 0; i < ColorLED.numPixels(); i++)
- {
- ColorLED.setPixelColor(i, c);
- ColorLED.show();
- sleep(wait);
- }
- }
-
- void rainbow(uint8_t wait)
- {
- uint16_t i, j;
-
- for (j = 0; j < 256; j++)
- {
- for (i = 0; i < ColorLED.numPixels(); i++)
- ColorLED.setPixelColor(i, Wheel((i + j) & 255));
- ColorLED.show();
- sleep(wait);
- }
- }
-
- // Slightly different, this makes the rainbow equally distributed throughout
- void rainbowCycle(uint8_t wait)
- {
- uint16_t i, j;
-
- for (j = 0; j < 256 * 5; j++) // 5 cycles of all colors on wheel
- {
- for (i = 0; i < ColorLED.numPixels(); i++)
- ColorLED.setPixelColor(i, Wheel(((i * 256 / ColorLED.numPixels()) + j) & 255));
- ColorLED.show();
- sleep(wait);
- }
- }
-
- //Theatre-style crawling lights.
- void theaterChase(uint32_t c, uint8_t wait)
- {
- for (int j = 0; j < 10; j++) //do 10 cycles of chasing
- for (int q = 0; q < 3; q++)
- {
- for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
- ColorLED.setPixelColor(i + q, c); //turn every third pixel on
- ColorLED.show();
- sleep(wait);
- for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
- ColorLED.setPixelColor(i + q, 0); //turn every third pixel off
- }
- }
-
- //Theatre-style crawling lights with rainbow effect
- void theaterChaseRainbow(uint8_t wait)
- {
- for (int j = 0; j < 256; j++) // cycle all 256 colors in the wheel
- for (int q = 0; q < 3; q++)
- {
- for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
- ColorLED.setPixelColor(i + q, Wheel((i + j) % 255)); //turn every third pixel on
- ColorLED.show();
- sleep(wait);
-
- for (int i = 0; i < ColorLED.numPixels(); i = i + 3)
- ColorLED.setPixelColor(i + q, 0); //turn every third pixel off
- }
- }
-
- // Input a value 0 to 255 to get a color value.
- // The colours are a transition r - g - b - back to r.
- uint32_t Wheel(byte WheelPos)
- {
- if (WheelPos < 85)
- return ColorLED.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
- else if (WheelPos < 170)
- {
- WheelPos -= 85;
- return ColorLED.Color(255 - WheelPos * 3, 0, WheelPos * 3);
- }
- else
- {
- WheelPos -= 170;
- return ColorLED.Color(0, WheelPos * 3, 255 - WheelPos * 3);
- }
- }
复制代码