|
|
|
|
|
|
|
|
|
|
|
// Dial Tone (DTMF) decoding example. |
|
|
|
|
|
// |
|
|
|
|
|
// The audio with dial tones is connected to analog input A0, |
|
|
|
|
|
// without using the audio shield. See the "DialTone_DTMF" |
|
|
|
|
|
// example for using the audio shield. |
|
|
|
|
|
|
|
|
|
|
|
#include <Audio.h> |
|
|
|
|
|
#include <Wire.h> |
|
|
|
|
|
#include <SD.h> |
|
|
|
|
|
|
|
|
|
|
|
// Create the Audio components. These should be created in the |
|
|
|
|
|
// order data flows, inputs/sources -> processing -> outputs |
|
|
|
|
|
// |
|
|
|
|
|
AudioInputAnalog audioIn(A0); |
|
|
|
|
|
AudioAnalyzeToneDetect row1; // 7 tone detectors are needed |
|
|
|
|
|
AudioAnalyzeToneDetect row2; // to receive DTMF dial tones |
|
|
|
|
|
AudioAnalyzeToneDetect row3; |
|
|
|
|
|
AudioAnalyzeToneDetect row4; |
|
|
|
|
|
AudioAnalyzeToneDetect column1; |
|
|
|
|
|
AudioAnalyzeToneDetect column2; |
|
|
|
|
|
AudioAnalyzeToneDetect column3; |
|
|
|
|
|
|
|
|
|
|
|
// Create Audio connections between the components |
|
|
|
|
|
// |
|
|
|
|
|
AudioConnection c01(audioIn, 0, row1, 0); |
|
|
|
|
|
AudioConnection c02(audioIn, 0, row2, 0); |
|
|
|
|
|
AudioConnection c03(audioIn, 0, row3, 0); |
|
|
|
|
|
AudioConnection c04(audioIn, 0, row4, 0); |
|
|
|
|
|
AudioConnection c05(audioIn, 0, column1, 0); |
|
|
|
|
|
AudioConnection c06(audioIn, 0, column2, 0); |
|
|
|
|
|
AudioConnection c07(audioIn, 0, column3, 0); |
|
|
|
|
|
|
|
|
|
|
|
// pins where the 7 segment LEDs are connected |
|
|
|
|
|
const int sevenseg_a = 17; // aaa |
|
|
|
|
|
const int sevenseg_b = 9; // f b |
|
|
|
|
|
const int sevenseg_c = 11; // f b |
|
|
|
|
|
const int sevenseg_d = 12; // ggg |
|
|
|
|
|
const int sevenseg_e = 15; // e c |
|
|
|
|
|
const int sevenseg_f = 16; // e c |
|
|
|
|
|
const int sevenseg_g = 10; // ddd |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void setup() { |
|
|
|
|
|
// Audio connections require memory to work. For more |
|
|
|
|
|
// detailed information, see the MemoryAndCpuUsage example |
|
|
|
|
|
AudioMemory(3); |
|
|
|
|
|
|
|
|
|
|
|
//while (!Serial) ; |
|
|
|
|
|
//delay(100); |
|
|
|
|
|
|
|
|
|
|
|
// Configure the tone detectors with the frequency and number |
|
|
|
|
|
// of cycles to match. These numbers were picked for match |
|
|
|
|
|
// times of approx 30 ms. Longer times are more precise. |
|
|
|
|
|
row1.frequency(697, 21); |
|
|
|
|
|
row2.frequency(770, 23); |
|
|
|
|
|
row3.frequency(852, 25); |
|
|
|
|
|
row4.frequency(941, 28); |
|
|
|
|
|
column1.frequency(1209, 36); |
|
|
|
|
|
column2.frequency(1336, 40); |
|
|
|
|
|
column3.frequency(1477, 44); |
|
|
|
|
|
|
|
|
|
|
|
// The 7 segment display is "common anode), where the |
|
|
|
|
|
// common pin connects to +3.3V. LOW turns the LED on |
|
|
|
|
|
// and HIGH turns the LED off. If you use a common |
|
|
|
|
|
// cathode display, you will need to change all the HIGH |
|
|
|
|
|
// to LOW and LOW to HIGH. |
|
|
|
|
|
pinMode(sevenseg_a, OUTPUT); |
|
|
|
|
|
pinMode(sevenseg_b, OUTPUT); |
|
|
|
|
|
pinMode(sevenseg_c, OUTPUT); |
|
|
|
|
|
pinMode(sevenseg_d, OUTPUT); |
|
|
|
|
|
pinMode(sevenseg_e, OUTPUT); |
|
|
|
|
|
pinMode(sevenseg_f, OUTPUT); |
|
|
|
|
|
pinMode(sevenseg_g, OUTPUT); |
|
|
|
|
|
digitalWrite(sevenseg_a, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_b, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_c, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_d, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_g, HIGH); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const float row_threshold = 0.2; |
|
|
|
|
|
const float column_threshold = 0.2; |
|
|
|
|
|
|
|
|
|
|
|
void loop() { |
|
|
|
|
|
float r1, r2, r3, r4, c1, c2, c3; |
|
|
|
|
|
char digit=0; |
|
|
|
|
|
|
|
|
|
|
|
// read all seven tone detectors |
|
|
|
|
|
r1 = row1.read(); |
|
|
|
|
|
r2 = row2.read(); |
|
|
|
|
|
r3 = row3.read(); |
|
|
|
|
|
r4 = row4.read(); |
|
|
|
|
|
c1 = column1.read(); |
|
|
|
|
|
c2 = column2.read(); |
|
|
|
|
|
c3 = column3.read(); |
|
|
|
|
|
|
|
|
|
|
|
// print the raw data, for troubleshooting |
|
|
|
|
|
Serial.print("tones: "); |
|
|
|
|
|
Serial.print(r1); |
|
|
|
|
|
Serial.print(", "); |
|
|
|
|
|
Serial.print(r2); |
|
|
|
|
|
Serial.print(", "); |
|
|
|
|
|
Serial.print(r3); |
|
|
|
|
|
Serial.print(", "); |
|
|
|
|
|
Serial.print(r4); |
|
|
|
|
|
Serial.print(", "); |
|
|
|
|
|
Serial.print(c1); |
|
|
|
|
|
Serial.print(", "); |
|
|
|
|
|
Serial.print(c2); |
|
|
|
|
|
Serial.print(", "); |
|
|
|
|
|
Serial.print(c3); |
|
|
|
|
|
|
|
|
|
|
|
// check all 12 combinations for key press |
|
|
|
|
|
if (r1 >= row_threshold) { |
|
|
|
|
|
if (c1 > column_threshold) { |
|
|
|
|
|
digit = '1'; |
|
|
|
|
|
digitalWrite(sevenseg_a, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_g, HIGH); |
|
|
|
|
|
} else if (c2 > column_threshold) { |
|
|
|
|
|
digit = '2'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_d, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_e, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_f, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} else if (c3 > column_threshold) { |
|
|
|
|
|
digit = '3'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} |
|
|
|
|
|
} else if (r2 >= row_threshold) { |
|
|
|
|
|
if (c1 > column_threshold) { |
|
|
|
|
|
digit = '4'; |
|
|
|
|
|
digitalWrite(sevenseg_a, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} else if (c2 > column_threshold) { |
|
|
|
|
|
digit = '5'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} else if (c3 > column_threshold) { |
|
|
|
|
|
digit = '6'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_e, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_f, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} |
|
|
|
|
|
} else if (r3 >= row_threshold) { |
|
|
|
|
|
if (c1 > column_threshold) { |
|
|
|
|
|
digit = '7'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_g, HIGH); |
|
|
|
|
|
} else if (c2 > column_threshold) { |
|
|
|
|
|
digit = '8'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_e, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_f, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} else if (c3 > column_threshold) { |
|
|
|
|
|
digit = '9'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} |
|
|
|
|
|
} else if (r4 >= row_threshold) { |
|
|
|
|
|
if (c1 > column_threshold) { |
|
|
|
|
|
digit = '*'; |
|
|
|
|
|
digitalWrite(sevenseg_a, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_b, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_c, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_d, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_e, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_f, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} else if (c2 > column_threshold) { |
|
|
|
|
|
digit = '0'; |
|
|
|
|
|
digitalWrite(sevenseg_a, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_e, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_f, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_g, HIGH); |
|
|
|
|
|
} else if (c3 > column_threshold) { |
|
|
|
|
|
digit = '#'; |
|
|
|
|
|
digitalWrite(sevenseg_a, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_b, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_c, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_d, HIGH); |
|
|
|
|
|
digitalWrite(sevenseg_e, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_f, LOW); |
|
|
|
|
|
digitalWrite(sevenseg_g, LOW); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// print the key, if any found |
|
|
|
|
|
if (digit > 0) { |
|
|
|
|
|
Serial.print(" --> Key: "); |
|
|
|
|
|
Serial.print(digit); |
|
|
|
|
|
} |
|
|
|
|
|
Serial.println(); |
|
|
|
|
|
|
|
|
|
|
|
// uncomment these lines to see how much CPU time |
|
|
|
|
|
// the tone detectors and audio library are using |
|
|
|
|
|
//Serial.print("CPU="); |
|
|
|
|
|
//Serial.print(AudioProcessorUsage()); |
|
|
|
|
|
//Serial.print("%, max="); |
|
|
|
|
|
//Serial.print(AudioProcessorUsageMax()); |
|
|
|
|
|
//Serial.print("% "); |
|
|
|
|
|
|
|
|
|
|
|
delay(25); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|