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 не умеет генерировать два звука одновременно, но зато у неё несколько контактов, каждый из которых может генерировать по звуку. То есть подключив динамик к двум сигнальным контактам и сгенерировав на каждом из этих контактов свой звук, мы можем воспользоваться динамиком, чтобы скомбинировать два этих звука!

Нам понадобятся

Подсоединение

  • Подключите два провода динамика к контактам 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");
Примечание

Если у вас нет кнопочной панели, и вы хотите проигнорировать код, использующий её, просто удалите из оригинального кода строчку, начинающуюся с require("KeyPad"). А если вы хотите набирать нужный номер при нажатии на кнопку на Espruino, просто воспользуйтесь вот этим кодом:

setWatch(function() {
  fastDial("01234123123");
}, BTN, {edge:"rising", repeat: true});

См.также

Внешние ссылки