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");
См.также
Внешние ссылки