Espruino:Примеры/Тональный набор телефонного номера
Тональный набор телефонного номера[1]
В телефонах (в обычных, а не в мобильных) для набора телефонных номеров используется тональный набор. Это система, при которой звук издаётся при помощи двух разных частот (соответственно, у каждой кнопки свой собственная комбинация этих частот). В странице на «Википедии» выше это объясняется более подробно, но если уместить всё в одну таблицу, то выглядит это следующим образом:
1209 Гц | 1336 Гц | 1477 Гц | 1633 Гц | |
---|---|---|---|---|
697 Гц | 1 | 2 | 3 | A |
770 Гц | 4 | 5 | 6 | B |
852 Гц | 7 | 8 | 9 | C |
941 Гц | * | 0 | # | D |
Давайте попробуем сэмулировать эту систему при помощи Espruino. В результате звуки не будут точно такими же, как у телефона (потому что Espruino генерирует квадратные, а не синусоидальные волны), но система будет рабочей.
Как мы будем смешивать частоты?
Espruino не умеет генерировать два звука одновременно, но зато у неё несколько контактов, каждый из которых может генерировать по звуку. То есть подключив динамик к двум сигнальным контактам и сгенерировав на каждом из этих контактов свой звук, мы можем воспользоваться динамиком, чтобы скомбинировать два этих звука!
Нам понадобятся
- Одна плата Espruino
- Кнопочная панель (но это необязательно – см. последний раздел руководства)
- Динамик
Подсоединение
- Подключите два провода динамика к контактам C6 и C9 на Espruino
- О том, как подключить кнопочную панель, читайте в этой статье
Код
Просто скопируйте и вставьте код ниже в правую часть Web IDE, а затем кликните на кнопку загрузки кода в Web IDE.
var SPEAKERA = C6;
var SPEAKERB = C9;
var silenceTimeout;
function onKeyPad(key) {
// Частоты в столбцах и рядах:
var tone_col = [1209, 1336, 1477, 1633];
var tone_row = [697, 770, 852, 941];
// Нажимаемая клавиша – это число в диапазоне между 0 и 15.
// Рассчитываем ряд и столбец.
var col = key&3;
var row = key>>2;
// Теперь генерируем две частоты – по одной на каждом контакте:
analogWrite(SPEAKERA,0.5,{freq:tone_col[col]});
analogWrite(SPEAKERB,0.5,{freq:tone_row[row]});
// Наконец, проверяем, не длится ли писк больше секунды:
if (silenceTimeout!==undefined) clearTimeout(silenceTimeout);
silenceTimeout = setTimeout(function() {
silenceTimeout = undefined;
// Перестаём генерировать писк:
digitalRead(SPEAKERA);
digitalRead(SPEAKERB);
}, 100);
}
require("KeyPad").connect([B2,B3,B4,B5],[B6,B7,B8,B9], onKeyPad);
Теперь просто нажимайте на разные кнопки на панели и динамик будет издавать соответствующие звуки. Более того, если вы возьмёте свой стационарный телефон и приложите его микрофон к динамику, то, нажимая на кнопки, сможете набирать телефонные номера.
Автоматический набор
Кнопочную панель использовать необязательно – вы можете просто прописать нужный телефонный номер в коде, и он будет набираться автоматически. Например:
function fastDial(num) {
var dial = function() {
// Набираем первую цифру номера:
onKeyPad("123A456B789C*0#D".indexOf(num[0]));
// «Отрезаем» первую цифру
// и через 0.5 секунд набираем новую цифру:
num = num.substr(1);
if (num.length>0) setTimeout(dial, 500);
};
dial();
}
fastDial("01234123123");
См.также
Внешние ссылки