#include <Keypad.h>
#include <Tone.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
const int speakerPin1 = 10;
const int speakerPin2 = 11;
const int switchPin = 12;
Tone tone1; // 创建Tone对象
Tone tone2; // 创建Tone对象
String phoneNumber = "";
String correctNumber = "12345";
const int rowFreqs[4] = {697, 770, 852, 941};
const int colFreqs[4] = {1209, 1336, 1477, 1633};
void setup() {
Serial.begin(9600);
pinMode(switchPin, INPUT_PULLUP);
tone1.begin(speakerPin1); // 初始化Tone在指定的引脚
tone2.begin(speakerPin2);
}
void loop() {
if (digitalRead(switchPin) == LOW) { // 如果电话被拿起
char key = keypad.getKey();
if (key) {
phoneNumber += key;
playDTMFTone(key);
}
if(phoneNumber.length() == correctNumber.length()) {
if(phoneNumber == correctNumber) {
Serial.println("Number is correct");
} else {
Serial.println("Number is incorrect");
}
phoneNumber = "";
}
} else {
phoneNumber = "";
}
}
void playDTMFTone(char key) {
int row, col;
switch (key) {
case '1': row = 0; col = 0; break;
case '2': row = 0; col = 1; break;
case '3': row = 0; col = 2; break;
case 'A': row = 0; col = 3; break;
case '4': row = 1; col = 0; break;
case '5': row = 1; col = 1; break;
case '6': row = 1; col = 2; break;
case 'B': row = 1; col = 3; break;
case '7': row = 2; col = 0; break;
case '8': row = 2; col = 1; break;
case '9': row = 2; col = 2; break;
case 'C': row = 2; col = 3; break;
case '*': row = 3; col = 0; break;
case '0': row = 3; col = 1; break;
case '#': row = 3; col = 2; break;
case 'D': row = 3; col = 3; break;
default: return;
}
// 同时播放行和列的频率
tone1.play(rowFreqs[row], 200);
tone2.play(colFreqs[col], 200);
delay(200);
}