/*
程序名称:Blynk_Test
描述:
Blynk控制ESP32连接的LED亮度
1. 所需硬件:
- ESP32 开发板 *1
3. 本程序需要安装如下库(括号里是库的作者):
- Blynk ( by Volodymyr Shymanskyy ) V1.2.0
作者:ChantionLAB·开物室
*/
/*--------------------------------------------------------------------------1--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------本程序所引用库--------------------------------------------------------------------*/
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
/*--------------------------------------------------------------------------2--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------声明定义-----------------------------------------------------------------------*/
/*****************************< 常量声明 >*****************************/
const byte KEYPAD_ROWS = 4; // 4行
const byte KEYPAD_COLS = 4; // 4列
#define Membrane_Debounce_Time 200 // 薄膜按键消抖时间
// 为键盘上的每个位置赋值
const char Key_Map[KEYPAD_ROWS][KEYPAD_COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte yinfu[] = {
B00010,
B00011,
B00010,
B00010,
B00010,
B01110,
B11110,
B01100
};
const char TITLE[] = "MUSIC-PLAYER";
/*****************************< 引脚定义 >*****************************/
const int Buzzer_Pin = 10;
// 4*4薄膜按键正对用户,从左往右分别为行-列,对应引脚分别为 10,9,8,7, 6,5,4,3
const byte Row_Pins[KEYPAD_ROWS] = { 9, 8, 7,6 };
const byte Col_Pins[KEYPAD_COLS] = { 5, 4, 3,2 };
/*****************************< 变量声明 >*****************************/
int state = 0;
int Music_Record[100];
int Music_Times;
/*****************************< 对象声明 >*****************************/
LiquidCrystal_I2C lcd(0x27, 16, 2);
Keypad keypad = Keypad(makeKeymap(Key_Map), Row_Pins, Col_Pins, KEYPAD_ROWS, KEYPAD_COLS);
/*--------------------------------------------------------------------------3--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------setup()程序初始化------------------------------------------------------------------*/
void setup() {
/******************************< 启动串口通讯 >******************************/
Serial.begin(9600); // 初始化串口通信,并设置波特率为9600
/******************************< 设置引脚模式 >******************************/
pinMode(Buzzer_Pin, OUTPUT); // 设置 引脚为输出模式
/*******************************< 初始化LCD >********************************/
init_IIC_LCD();
default_Display();
}
/*--------------------------------------------------------------------------4--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------loop()基础循环体-------------------------------------------------------------------*/
void loop() {
char key = keypad.getKey();
if (key) {
Serial.println(key);
switch (key) {
case '1':
setTone(1);
Music_Record[Music_Times] = 1;
Music_Times++;
break;
case '2':
setTone(2);
Music_Record[Music_Times] = 2;
Music_Times++;
break;
case '3':
setTone(3);
Music_Record[Music_Times] = 3;
Music_Times++;
break;
case '4':
setTone(4);
Music_Record[Music_Times] = 4;
Music_Times++;
break;
case '5':
setTone(5);
Music_Record[Music_Times] = 5;
Music_Times++;
break;
case '6':
setTone(6);
Music_Record[Music_Times] = 6;
Music_Times++;
break;
case '7':
setTone(7);
Music_Record[Music_Times] = 7;
Music_Times++;
break;
case 'B': // 播放记录的音乐
lcd.clear();
default_Display();
for (int i = 0; i < 100; i++) {
if (Music_Record[i] > 0) {
lcd.setCursor(i + 1, 1);
lcd.print(Music_Record[i]);
setTone(Music_Record[i]);
} else {
Music_Times = 0;
}
}
break;
case 'C': // 清除记录
for (int i = 0; i < 100; i++) {
if (Music_Record[i] > 0) {
Music_Record[i] = 0;
}
}
Music_Times = 0;
lcd.clear();
break;
case 'A': // 退出
for (int i = 0; i < 100; i++) {
if (Music_Record[i] > 0) {
Music_Record[i] = 0;
}
}
Music_Times = 0;
lcd.clear();
ONF = 0;
break;
}
for (int i = 0; i < 100; i++) {
if (Music_Record[i] > 0) {
lcd.setCursor(i + 1, 1);
lcd.print(Music_Record[i]);
}
}
}
}
/*--------------------------------------------------------------------------5--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------函数定义-----------------------------------------------------------------------*/
void init_IIC_LCD() {
lcd.init();
lcd.backlight();
lcd.createChar(0, yinfu);
}
void default_Display() {
lcd.setCursor((16 - strlen(TITLE)) / 2 - 1, 0);
lcd.write(1);
lcd.setCursor((16 - strlen(TITLE)) / 2 + strlen(TITLE), 0);
lcd.write(1);
for (int i = 0; i < strlen(TITLE); i++) {
lcd.setCursor((16 - strlen(TITLE)) / 2 + i, 0);
lcd.print(TITLE[i]);
}
}
void playTone(int tonePin, int period, int duration) {
int pulse = period / 2;
for (long i = 0; i < duration * 1000L; i += period) {
digitalWrite(tonePin, HIGH);
delayMicroseconds(pulse);
digitalWrite(tonePin, LOW);
delayMicroseconds(pulse);
}
}
void setTone(int num) {
playTone(Buzzer_Pin, 15289 / (pow(2, num - 1)), 200);
// noTone(Buzzer_Pin);
}