//引用头文件
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_NeoPixel.h>
//定义音符
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 375
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556
#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278
#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112
//创建数组
float yinfu[]={
NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,
NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,
NOTE_DH1,NOTE_D5,NOTE_D0,NOTE_D3,NOTE_D3,NOTE_D4,
NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D3,NOTE_D0,NOTE_DH1,
NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,
NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,
NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D0,NOTE_D3,NOTE_D3,
NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D0,
NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,
NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_D0,NOTE_DH1,
NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,
NOTE_D0,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,
NOTE_DH5,NOTE_DH2,NOTE_D0,NOTE_D5,NOTE_D5,NOTE_DH1,
NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_D0,NOTE_D0,
NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,
NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D0,NOTE_DH4,NOTE_DH3,
NOTE_DH2,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_D0,NOTE_DH3,
NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,
NOTE_D0,NOTE_DH1,NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,
NOTE_DH5,NOTE_DH3,NOTE_D0,NOTE_DH3,NOTE_DH6,NOTE_DH5,
NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_D0,NOTE_DH1,NOTE_DH2,
NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_D7,NOTE_D6,NOTE_D0,
NOTE_D6,NOTE_D7,NOTE_D6
};
float jiepai[]={
0.5,0.5,1.5,0.5,1,1,3,0.5,0.5,1.5,0.5,1,1,2,1,0.5,0.5,
1.5,0.5,0.5,1.5,2,0.5,0.5,0.5,0.5,1.5,0.5,1,1,2,1,0.5,
0.5,1.5,0.5,1,1,2,1,0.5,0.5,1.5,0.5,1,1,3,0.5,0.5,1,
0.5,0.5,1,1,0.5,0.5,0.5,1,1,1,0.5,0.5,0.5,1,1,2,1,0.5,
0.5,1.5,0.5,1,1,2,1,0.5,0.5,0.5,0.5,1,1,2,1,1,0.5,
0.5,1,1,0.5,0.5,1.5,0.5,1,1,1,1,1,1,4,2,1,1,2,1,1,
0.5,0.5,1,0.5,0.5,1,0.5,0.5,0.5,1,2,1,1,2,2,0.5,0.5,
2,0.5,0.5,1,0.5,0.5,0.5,1,2,1,0.5,0.5,4
};
int mylist[8]={0,262,294,330,349,392,440,494};
int yinfushu;
const int buttonPin = A2;// 将按钮接口定义为 A2
bool play = false;//初始播放状态为false,用于监控播放状态
// 创建 LiquidCrystal_I2C 对象
LiquidCrystal_I2C mylcd(0x27,20,4);
//定义了一个名为 rgb_display_A3 的 Adafruit_NeoPixel 对象,并设置参数
Adafruit_NeoPixel rgb_display_A3 = Adafruit_NeoPixel(16,A3,NEO_GRB + NEO_KHZ800);
void setup(){
// 初始化引脚为输出/输出引脚
pinMode(12, INPUT);
pinMode(2, OUTPUT);
pinMode(2, INPUT);
pinMode(0, OUTPUT);
pinMode(11, INPUT);
pinMode(1, OUTPUT);
pinMode(10, INPUT);
pinMode(4, OUTPUT);
pinMode(9, INPUT);
pinMode(3, OUTPUT);
pinMode(8, INPUT);
pinMode(5, OUTPUT);
pinMode(7, INPUT);
pinMode(A0, INPUT);
pinMode(6, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
mylcd.init();
mylcd.backlight();
rgb_display_A3.begin();
}
void loop(){
if (digitalRead(buttonPin) == HIGH) {
// 如果按钮按下
mylcd.setCursor(9-1, 1-1);
mylcd.print("ECHO");
mylcd.setCursor(5-1, 2-1);
mylcd.print("MUSIC PLAYER");
mylcd.setCursor(3-1, 3-1);
mylcd.print("Castle in the Sky");
mylcd.setCursor(5-1, 4-1);
mylcd.print("Joe Hisaishi");
yinfushu= sizeof(yinfu)/sizeof(yinfu[0]);
//音乐播放器,播放《天空之城》
if (!play) { // 没有正在播放时,按下按钮开始播放
play = true;
for (int i = (0); i <= (yinfushu); i = i + (1)) {
tone(2,yinfu[i]);
delay((550 * jiepai[i]));
noTone(2);
for(int RGB_RAINBOW_i = 0; RGB_RAINBOW_i < rgb_display_A3.numPixels(); RGB_RAINBOW_i++){
rgb_display_A3.setPixelColor(RGB_RAINBOW_i, Wheel(((RGB_RAINBOW_i * 256 / rgb_display_A3.numPixels()) + 20) & 255));
}
rgb_display_A3.show();
rgb_display_A3.show();
for(int j=0; j<8; j++){
for(int RGB_RAINBOW_i = 0; RGB_RAINBOW_i < rgb_display_A3.numPixels(); RGB_RAINBOW_i++){
rgb_display_A3.setPixelColor(RGB_RAINBOW_i, Wheel(((RGB_RAINBOW_i * 256 / rgb_display_A3.numPixels()) + j*25) & 255));
}
delay(8);
rgb_display_A3.show();
}
if (!digitalRead(A2)) { // 当播放过程中再次按下按钮,停止播放
play = false;
break;
}
}
play = false; // 播放完毕后将播放状态设置为false
}
} else { // 如果按钮没有按下,则清除所有文本并停止播放和彩虹灯
mylcd.clear();
noTone(2);
play = false;
for(int RGB_RAINBOW_i = 0; RGB_RAINBOW_i < rgb_display_A3.numPixels(); RGB_RAINBOW_i++){
rgb_display_A3.setPixelColor(RGB_RAINBOW_i, 0); // 将所有颜色设置为黑色,即关闭灯带
}
rgb_display_A3.show();
rgb_display_A3.show();
}
//迷你电子琴与按钮灯的结合
if (digitalRead(12) == HIGH) {
tone(2,mylist[1]);
delay(20);
if (digitalRead(12) == HIGH) {
while (digitalRead(12)) {
}
digitalWrite(0,(!digitalRead(0)));
}
} else if (digitalRead(11) == HIGH) {
tone(2,mylist[2]);
delay(20);
if (digitalRead(11) == HIGH) {
while (digitalRead(11)) {
}
digitalWrite(1,(!digitalRead(1)));
}
} else if (digitalRead(10) == HIGH) {
tone(2,mylist[3]);
delay(20);
if (digitalRead(10) == HIGH) {
while (digitalRead(10)) {
}
digitalWrite(4,(!digitalRead(4)));
}
} else if (digitalRead(9) == HIGH) {
tone(2,mylist[4]);
delay(20);
if (digitalRead(9) == HIGH) {
while (digitalRead(9)) {
}
digitalWrite(3,(!digitalRead(3)));
}
} else if (digitalRead(8) == HIGH) {
tone(2,mylist[5]);
delay(20);
if (digitalRead(8) == HIGH) {
while (digitalRead(8)) {
}
digitalWrite(5,(!digitalRead(5)));
}
} else if (digitalRead(7) == HIGH) {
tone(2,mylist[6]);
delay(20);
if (digitalRead(7) == HIGH) {
while (digitalRead(7)) {
}
pinMode(A0, OUTPUT);
digitalWrite(A0,(!digitalRead(A0)));
}
} else if (digitalRead(6) == HIGH) {
tone(2,mylist[7]);
delay(20);
if (digitalRead(6) == HIGH) {
while (digitalRead(6)) {
}
pinMode(A1, OUTPUT);
digitalWrite(A1,(!digitalRead(A1)));
}
} else {
noTone(2);
}
digitalRead(12);
digitalRead(11);
}
//生成RGB颜色条
uint32_t Wheel(byte WheelPos){
if(WheelPos < 85){
return rgb_display_A3.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
else if(WheelPos < 170){
WheelPos -= 85;
return rgb_display_A3.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else{
WheelPos -= 170;return rgb_display_A3.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}