Espruino:Примеры/Тональный набор телефонного номера: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 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 не умеет генерировать два звука одновременно, но зато у неё несколько контактов, каждый из которых может генерировать по звуку. То есть подключив динамик к двум сигнальным контактам и сгенерировав на каждом из этих контактов свой звук, мы можем воспользоваться динамиком, чтобы скомбинировать два этих звука!
Нам понадобятся
- Одна плата 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});
См.также
Внешние ссылки