Espruino:Примеры/Тональный набор телефонного номера: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...»)
 
Нет описания правки
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


=<ref>[ www.espruino.com - ]</ref>=
=Тональный набор телефонного номера<ref>[https://www.espruino.com/Dial+Tones www.espruino.com - Dial Tones]</ref>=


В телефонах (в обычных, а не в мобильных) для набора телефонных номеров используется [https://ru.wikipedia.org/wiki/DTMF тональный набор]. Это система, при которой звук издаётся при помощи двух разных частот (соответственно, у каждой кнопки свой собственная комбинация этих частот). В странице на ''«Википедии»'' выше это объясняется более подробно, но если уместить всё в одну таблицу, то выглядит это следующим образом:


{| class="wikitable"
|-
!  !! 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]] не умеет генерировать два звука одновременно, но зато у неё несколько контактов, каждый из которых может генерировать по звуку. То есть подключив динамик к двум сигнальным контактам и сгенерировав на каждом из этих контактов свой звук, мы можем воспользоваться динамиком, чтобы скомбинировать два этих звука!
== Нам понадобятся ==
* Одна [https://www.espruino.com/Original плата Espruino]
* [https://www.espruino.com/KeyPad Кнопочная панель] (но это необязательно – см. последний раздел руководства)
* [https://www.espruino.com/Speaker Динамик]
== Подсоединение ==
* Подключите два провода динамика к контактам '''C6''' и '''C9''' на [[Espruino]]
* О том, как подключить кнопочную панель, читайте в [https://www.espruino.com/KeyPad этой статье]
== Код ==
Просто скопируйте и вставьте код ниже в правую часть [[Web IDE]], а затем кликните на кнопку загрузки кода в [[Web IDE]].


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript" enclose="div">
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);
</syntaxhighlight>
Теперь просто нажимайте на разные кнопки на панели и динамик будет издавать соответствующие звуки. Более того, если вы возьмёте свой стационарный телефон и приложите его микрофон к динамику, то, нажимая на кнопки, сможете набирать телефонные номера.
== Автоматический набор ==
Кнопочную панель использовать необязательно – вы можете просто прописать нужный телефонный номер в коде, и он будет набираться автоматически. Например:
<syntaxhighlight lang="javascript" enclose="div">
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");
</syntaxhighlight>
'''Примечание:''' Если у вас нет кнопочной панели, и вы хотите проигнорировать код, использующий её, просто удалите из оригинального кода строчку, начинающуюся с '''require("KeyPad")'''.
А если вы хотите набирать нужный номер при нажатии на кнопку на [[Espruino]], просто воспользуйтесь вот этим кодом:
<syntaxhighlight lang="javascript" enclose="div">
setWatch(function() {
  fastDial("01234123123");
}, BTN, {edge:"rising", repeat: true});
</syntaxhighlight>
</syntaxhighlight>



Версия от 18:04, 10 июля 2021

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Тональный набор телефонного номера[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});

См.также

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