Espruino:Примеры/Азбука Морзе

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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


Азбука Морзе[1]

Если вы матёрый радиолюбитель, то, возможно, знаете азбуку Морзе назубок. Но что если вам нужно сымитировать её, но всё, что у вас есть – это клавиатура? Поможет Espruino!

С помощью кода ниже мы создадим маленькое устройство, позволяющее печатать сообщения (не по принципу T9), а затем конвертирующее их в сообщения на азбуке Морзе, которые затем при помощи звуков будут переданы через динамик.

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

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

  • Подключите динамик между контактами GND и A1
  • Подключите кнопочную панель как описывается в этой статье

Код

Просто скопируйте код ниже в правую часть Web IDE и кликните на кнопку загрузки кода.

// Список букв, представленных на каждой кнопке панели:
var letters = {"0":" 0","1":" 1","2":"ABC2","3":"DEF3","4":"GHI4","5":"JKL5","6":"MNO6","7":"PQRS7","8":"TUV8","9":"WXYZ9"};
// Код Морзе для каждой буквы:
var morse = {
  "A":".-", "B":"-...", "C":"-.-.", "D":"-..", "E":".",
  "F":"..-.", "G":"--.", "H":"....", "I":"..", "J":".---",
  "K":"-.-", "L":".-..", "M":"--", "N":"-.", "O":"---",
  "P":".--.", "Q":"--.-", "R":".-.", "S":"...", "T":"-",
  "U":"..-", "V":"...-", "W":".--", "X":"-..-", "Y":"-.--",
  "Z":"--..", 
  "0":"-----", "1":".---", "2":"..---", "3":"...--", "4":"....-",
  "5":".....", "6":"-....", "7":"--...", "8":"---..", "9":"----."
};
// Контакт для подключения динамика:
var SPEAKER = A1;

// Выводимый код Морзе:
var morseInProgress = "";
// Функция для генерации писка кода Морзе:
function doMorseCode(str) {
  // Если мы уже что-то делаем,
  // просто добавляем дополнительный код и возвращаем результат:
  if (morseInProgress.length>0) {
    morseInProgress += str+" ";
    return;
  }
  // В противном случае начинаем генерировать писк...
  morseInProgress = str+" ";
  // Издаём писк и перемещаемся к следующему символу:
  var beeper = function () {
    var time = 0;
    // Ищем первый символ, чтобы понять, какой писк использовать:
    if (morseInProgress[0]==".") time = 100; // короткий писк
    else if (morseInProgress[0]=="-") time = 400; // длинный писк
    // Символ ' ' просто делает паузу:
    if (time>0) {
      // Начинаем пищать:
      analogWrite(SPEAKER,0.5,{freq:500});
      // выключаем динамик после «time»:
      setTimeout(function() {
        digitalRead(A1); 
      }, time);
    }
    // Удаляем первый символ:
    morseInProgress = morseInProgress.substr(1);
    // Если что-то осталось, продолжаем:
    if (morseInProgress.length>0)
      setTimeout(beeper,500);
  };
  beeper();
}

function finalChar(ch) {
  var code = morse[ch];
  console.log("Chosen '"+ch+"' -> '"+code+"'");
  if (code!==undefined)
    doMorseCode(code);
}

var charTimeout; // таймаут после нажатия клавиши
var charCurrent; // текущий символ (индекс в «letters»)
var charIndex;   // индекс в «letters[charCurrent]»

function newCharacter(ch) {
  console.log("newCharacter "+ch);
  // Отправляем старый символ:
  if (charCurrent!==undefined)
    finalChar(letters[charCurrent][charIndex]);
  // Выполняем сброс значений:
  charCurrent = ch;
  charIndex = 0;
}

function onKeyPad(key) {
  // Удаляем таймаут (если он есть):
  if (charTimeout!==undefined) {
    clearTimeout(charTimeout);
    charTimeout = undefined;
  }
  // Определяем, какая кнопка была нажата:
  var ch = "123A456B789C*0#D"[key];
  if (ch==charCurrent) {
    charIndex = (charIndex+1) % letters[charCurrent].length;
  } else {
    newCharacter(ch);
  }
  console.log("... '"+letters[charCurrent][charIndex]+"'");
  // Задаём таймаут:
  charTimeout = setTimeout(function() {
    charTimeout = undefined;
    newCharacter();
  }, 1500);
}

require("KeyPad").connect([B2,B3,B4,B5],[B6,B7,B8,B9], onKeyPad);

Теперь попробуйте понажимать на кнопки на панели. Этот проект работает по принципу кнопочных телефонов, где печать нужной буквы осуществляется при помощи нужного количества нажатий на кнопку, что позволяет, соответственно, печатать большие сообщения.

Если вы хотите напечатать «Espruino», нажмите 37777, подождите, нажмите 7, подождите, нажмите 7778844466, подождите, нажмите 666.

Когда символ будет выбран (это произойдёт спустя 1.5 секунду после завершения нажатия на кнопку или когда вы нажмёте на другую кнопку), Espruino пропищит в динамике код Морзе для этой буквы.

См.также

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