產品介紹:
Arduino Mega 2560是基於ATmega2560的主控開發板。Arduino Mega2560是採用USB介面的核心電路板。具有54路數字輸入輸出,適合需要大量IO介面的設計。處理器核心是ATmega2560,同時具有54路數字輸入/輸出口,16路模擬輸入,4路UART介面,一個16MHz晶體振盪器,一個USB口,一個電源插座,一個ICSP header和一個復位按鈕。板上有支援一個主控板的所有資源。Arduino Mega2560也能相容為Arduino NUO設計的擴充套件板。可以自動選擇3中供電方式:外部直流電源通過電源插座供電;電池連線電源聯結器的GND和VIN引腳;USB介面直流供電 。
下方之程式碼主要用途為:
得知遙控器之編碼數值好做進一步的測試
#include <IRremote.h>
int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構
int LedMode =0;
void setup()
{
Serial.begin(115200);
irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
irrecv.enableIRIn(); // 啟動接收
Serial.println("紅外線訊號輸入啟動接收");
}
void loop() {
if (irrecv.decode(&results)) { // 接收紅外線訊號並解碼
Serial.print("results value is "); // 輸出解碼後的資料
Serial.print(results.value, HEX);
Serial.print(", bits is ");
Serial.print(results.bits);
Serial.print(", decode_type is ");
Serial.println(results.decode_type);
switch (results.value){
case 0xc101E57B:Serial.println("Press 0");LedMode =0;break;
case 0x9716BE3F:Serial.println("Press 1");LedMode =1;break;
}
irrecv.resume(); // 準備接收下一個訊號
}
}
下方程式碼主要用途為:
用遙控器操控發抒藍芽,MEGA-2560接收要數值轉換成頻率與時間,輸出到蜂鳴器,使其發出聲音。
#include <IRremote.h>
int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構
int LedMode = 0;
void setup()
{ pinMode(9, OUTPUT);
Serial.begin(115200);
irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
irrecv.enableIRIn(); // 啟動接收
Serial.println("紅外線訊號輸入啟動接收");
}
void loop() {
if (irrecv.decode(&results)) { // 接收紅外線訊號並解碼
Serial.print("results value is "); // 輸出解碼後的資料
Serial.print(results.value, HEX);
Serial.print(", bits is ");
Serial.print(results.bits);
Serial.print(", decode_type is ");
Serial.println(results.decode_type);
switch (results.value) {
case 0xFF6897: Serial.println("Press 0"); LedMode = 0; tone(9, 200, 500); break;
case 0xFF30CF: Serial.println("Press 1"); LedMode = 1; tone(9, 300, 500);break;
case 0xFF18E7: Serial.println("Press 2"); LedMode = 2; tone(9, 400, 500);break;
case 0xFF7A85: Serial.println("Press 3"); LedMode = 3; tone(9, 500, 500);break;
case 0xFF10EF: Serial.println("Press 4"); LedMode = 4; tone(9, 600, 500);break;
case 0xFF38C7: Serial.println("Press 5"); LedMode = 5; tone(9, 700, 500);break;
case 0xFF5AA5: Serial.println("Press 6"); LedMode = 6; tone(9, 800, 500);break;
case 0xFF42BD: Serial.println("Press 7"); LedMode = 7; tone(9, 900, 500);break;
case 0xFF4AB5: Serial.println("Press 8"); LedMode = 8; tone(9, 1000, 500);break;
case 0xFF52AD: Serial.println("Press 9"); LedMode = 9; tone(9, 1100, 500);break;
}
irrecv.resume(); // 準備接收下一個訊號
}
}
接線圖
至C:\Users\user-1\Documents\Arduino\libraries\IRremotebo\arddefs.h
修改成
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
//#define IR_USE_TIMER1 // tx = pin 11
//#define IR_USE_TIMER2 // tx = pin 9
#define IR_USE_TIMER3 // tx = pin 5
//#define IR_USE_TIMER4 // tx = pin 6
//#define IR_USE_TIMER5 // tx = pin 46
實作影片
#include <IRremote.h>
#include <SimpleTimer.h>
#include "pitches.h"
#include <Adafruit_NeoPixel.h>
#define LEDPIN 8
#define sp 9
#define RECV_PIN 2 // 使用數位腳位2接收紅外線訊號
#define NUMPIXELS 12
SimpleTimer ABC;
Adafruit_NeoPixel strip(NUMPIXELS, LEDPIN, NEO_GRB + NEO_KHZ800);
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構
int LedMode = 0;
int red = 50 , green = 50, blue = 50 ;
int melody_donkey[] = {
_C6, _C6, _C6, _E6, _G6, _G6, _G6, _G6, _A6, _A6, _A6, _C7, _G6, 0, _F6, _F6, _A6, _E6, _E6, _E6, _E6, _D6, _D6, _D6, _D6, _G6, _G6, _C6, _C6, _C6, _E6, _G6, _G6, _G6 , _G6, _A6, _A6, _A6, _C7, _G6, 0, _F6, _F6, _F6, _A6, _E6, _E6, _E6, _E6, _E6, _E6, _D6, _D6, _D6, _E6, _C6, 0
};
byte noteDurations_donkey[] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4
};
void Playdonkey() {
if (LedMode == 0)PlayMusicV1(melody_donkey,
noteDurations_donkey,
sizeof(noteDurations_donkey),
1);
}
int melody_BABY[] = {
_C6, _C6, _D6, _E6, _E6, _D6, _C6, _D6, _C6, 0, _E6, _E6, _F6, _G6, _G6, _G6, _F6, _E6, _F6, _E6, 0, _G6, 0, _C6, 0, _G6, 0, _C6, 0, _E6, 0, _D6, 0, _C6 , 0, 0, 0
};
byte noteDurations_BABY[] = {
2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
};
void PlayBABY() {
if (LedMode == 1)PlayMusicV1(melody_BABY,
noteDurations_BABY,
sizeof(noteDurations_BABY),
1);
}
int melody_Star[] = {
_C6, _C6, _G6, _G6, _A6, _A6, _G6, 0, _F6, _F6, _E6, _E6, _D6, _D6, _C6, 0, _G6, _G6, _F6, _F6, _E6, _E6, _D6, 0, _G6, _G6, _F6, _F6, _E6, _E6, _D6, 0, _C6, _C6, _G6, _G6, _A6, _A6, _G6, 0, _F6, _F6, _E6, _E6, _D6, _D6, _C6, 0
};
byte noteDurations_Star[] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
};
void PlayStar() {
if (LedMode == 2)PlayMusicV1(melody_Star,
noteDurations_Star,
sizeof(noteDurations_Star),
1);
}
int melody_TwoTiger[] = {
_C6, _D6, _E6, _C6, _C6, _D6, _E6, _C6, _E6, _F6, _G6, _E6, _F6, _G6, _G6, _A6, _G6, _F6, _E6, _C6, _G6, _A6, _G6, _F6, _E6, _C6, _D6, _G5, _C6, 0, _D6, _G5, _C6, 0
};
byte noteDurations_TwoTiger[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1
};
void PlayTwoTiger() {
if (LedMode == 3)PlayMusicV1(melody_TwoTiger,
noteDurations_TwoTiger,
sizeof(noteDurations_TwoTiger),
1);
}
void LeftRotate() {
int static count = 0;
count = count + 1;
if (count > 12)count = 0;
Serial.print("LeftRotate=");
Serial.println(count);
AllLedColor(0, 0, 0);
LedFromToColor(count, 3, red, green, blue);
}
void RightRotate() {
int static count = 12;
count = count - 1;
if (count < 0)count = 12;
Serial.print("RightRotate=");
Serial.println(count);
AllLedColor(0, 0, 0);
LedFromToColor(count, 3, red, green, blue);
}
void Pili() {
int static count = 0;
count = count + 1;
if (count > 12)count = 0;
Serial.print("Pili=");
Serial.println(count);
AllLedColor(0, 0, 0);
LedFromToColor(count, 1, red, green, blue);
LedFromToColor(NUMPIXELS - 2 - count, 3, red, green, blue);
}
void Custom() {
int static count = 12;
count = count - 1;
if (count < 0)count = 12;
Serial.print("Custom=");
Serial.println(count);
AllLedColor(0, 0, 0);
LedFromToColor(count, 12, red, green, blue);
}
void lighton() {
int static count = 12;
Serial.print("Custom=");
Serial.println(count);
AllLedColor(55, 55, 55);
LedFromToColor(count, 12, 255, 255, 255);
}
void lightoff() {
int static count = 12;
Serial.print("Custom=");
Serial.println(count);
AllLedColor(0, 0, 0);
LedFromToColor(count, 12, 0, 0, 0);
}
void WS2812Control()
{
switch (LedMode)
{ case 0: LeftRotate(); break;
case 1: RightRotate(); break;
case 2: Pili(); break;
case 3: Custom(); break;
case 4: lighton(); break;
case 5: lightoff(); break;
}
}
void setup()
{ strip.begin();
pinMode(sp, OUTPUT);
Serial.begin(115200);
irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
irrecv.enableIRIn(); // 啟動接收
Serial.println("紅外線訊號輸入啟動接收");
ABC.setInterval(100, Playdonkey);
ABC.setInterval(150, PlayBABY);
ABC.setInterval(150, PlayStar);
ABC.setInterval(200, PlayTwoTiger);
ABC.setInterval(100, WS2812Control);
}
void loop()
{
ABC.run();
if (irrecv.decode(&results)) { // 接收紅外線訊號並解碼
Serial.print("results value is "); // 輸出解碼後的資料
Serial.print(results.value, HEX);
Serial.print(", bits is ");
Serial.print(results.bits);
Serial.print(", decode_type is ");
Serial.println(results.decode_type);
switch (results.value) {
case 0xFF6897: Serial.println("Press 0"); LedMode = 0; tone(9, 100, 200); break;//(pin,hz,long)
case 0xFF30CF: Serial.println("Press 1"); LedMode = 1; tone(9, 200, 200); break;
case 0xFF18E7: Serial.println("Press 2"); LedMode = 2; tone(9, 300, 200); break;
case 0xFF7A85: Serial.println("Press 3"); LedMode = 3; tone(9, 400, 200); break;
case 0xFF10EF: Serial.println("Press 4"); LedMode = 4; tone(9, 500, 200); break;
case 0xFF38C7: Serial.println("Press 5"); LedMode = 5; tone(9, 600, 200); break;
case 0xFF5AA5: Serial.println("Press 6"); LedMode = 6; tone(9, 700, 200); break;
case 0xFF42BD: Serial.println("Press 7"); LedMode = 7; tone(9, 800, 200); break;
case 0xFF4AB5: Serial.println("Press 8"); LedMode = 8; tone(9, 900, 200); break;
case 0xFF52AD: Serial.println("Press 9"); LedMode = 9; tone(9, 1000, 200); break;
case 0xFF9867: Serial.println("Press 100+"); LedMode = 10; tone(9, 1500, 200); break; //100+
case 0xFFB04F: Serial.println("Press 200+"); LedMode = 20; tone(9, 2000, 200); break; //200+
case 0xFFA25D: Serial.println("Press CH-"); LedMode = 30; break; //CH-
case 0xFF629D: Serial.println("Press CH"); LedMode = 40; break;
case 0xFFE21D: Serial.println("Press CH+"); LedMode = 50; break; //CH+
case 0xFF22DD: Serial.println("Press PREV"); LedMode = 60; break;
case 0xFF02FD: Serial.println("Press NEXT"); LedMode = 70; break;
case 0xFFC23D: Serial.println("Press PLAY"); LedMode = 80; break;
case 0xFFE01F: Serial.println("Press VOL-"); LedMode = 90; break; //VOL-
case 0xFFA857: Serial.println("Press VOL+"); LedMode = 100; break; //VOL+
case 0xFF906F: Serial.println("Press EQ"); LedMode = 200; tone(9, 2000, 2000); break;
}
irrecv.resume(); // 準備接收下一個訊號
}
}
void AllLedColor(byte red, byte green, byte blue) {
LedFromToColor(0, NUMPIXELS, red, green, blue);
}
void LedFromToColor(byte from, byte len, byte red, byte green, byte blue) {
for (int i = from; i < from + len; i++) {
strip.setPixelColor(i, strip.Color(red, green, blue));
}
strip.show();
}
void PlayMusicV1(int melody[], byte duration[], int melodyLen, float freMul) {
int static count = 0;
Serial.print("melodyLen count=");
Serial.print(count);
tone(sp, melody[count]*freMul);
byte static NextCount = 0;
if (NextCount < duration[count]) {
NextCount++;
}
else {
count = count + 1;
NextCount = 0;
}
if (count > melodyLen) count = 0;
}