/*
ESP32 Keypad薄膜式(4x4)鍵盤
按鍵->蜂鳴器發音-DTMF複頻音效(電話按鍵音)
*/
#include <Keypad.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'}
};
uint8_t rowPins[ROWS] = {27, 26, 25, 33}; // 鍵盤列接腳
uint8_t colPins[COLS] = {19, 18, 5, 17}; // 鍵盤行接腳
#define bz 15 //buzzer
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// 定義DTMF頻率表
const int ROW_FREQS[] = {697, 770, 852, 941}; // 列頻率
const int COL_FREQS[] = {1209, 1336, 1477, 1633}; // 行頻率
void setup(){;
Serial.begin(115200);
Serial.println("DTMF Keypad Ready");
pinMode(bz, OUTPUT);
}
void loop(){
char key = keypad.getKey();
if(key) {
Serial.print("Pressed Key: ");
Serial.println(key);
playDTMF(key);// 播放對應key的 DTMF 複合音
}
}
void playDTMF(char key) {// 播放 DTMF 複合音
int row = -1, col = -1;
// 找到按鍵的行和列索引
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (keys[i][j] == key) {
row = i;
col = j;
break;
}
}
}
// 如果找到對應行列值,則找到對應頻率值
if (row != -1 && col != -1) {
int rowFreq = ROW_FREQS[row]; // 取得行頻率
Serial.println(rowFreq);
int colFreq = COL_FREQS[col]; // 取得列頻率
unsigned long startTime = millis();
while (millis() - startTime < 200) {
tone(bz, rowFreq,10); // 播放行頻率
delay(10);
tone(bz, colFreq,10); // 播放列頻率
delay(10);
}
noTone(bz); // 停止蜂鳴器输出
} else {
Serial.println("無效的 key!");
}
}