Espruino:Примеры/Мигание светодиодами

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Мигание светодиодами[1]

Это руководство подразумевает, что вы уже умеете загружать код на Espruino. Если пока не умеете, ознакомьтесь с инструкциями здесь.

Введение

Если вы проходили это руководство, то уже знаете, как мигать светодиодами. В этом руководстве мы расскажем вам о том, как это делать другими способами.

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

Мы воспользуемся светодиодами на самой плате. Но если вы хотите управлять чем-то побольше (например, ёлочной гирляндой), для этого придётся смастерить небольшую цепь.

Мы планируем сделать такое руководство в будущем, так что не отключайтесь!

Код

Пример 1

В примере из этой статьи показывается, как мигать светодиодом «правильно» – но мы можем сделать это и с помощью одной строки. Просто скопируйте и вставьте:

var l;setInterval("digitalWrite(LED1,l=!l);",200);

Как видите, функция setInterval() вызывает первый аргумент (либо функцию, либо строку, содержащую код для выполнения) каждые 200 мс. В данном случае этот код просто меняет состояние переменной l (которую мы задаем в самом начале с помощью var l) между true и false при помощи l=!l, а также задает эти состояния для светодиода. Мы не рекомендуем использовать этот способ, т.к. такой код плохо читается.

Чтобы остановить мигание, просто вызовите clearInterval().

Пример 2

В примере 1 было показано, как переключать светодиод с заданной частотой. Но что, если вы хотите мигать двумя светодиодами на двух разных частотах?

На этот раз мы напишем более удобочитаемый код. Во-первых, пишем две функции:

var on1,on2;
function toggle1() {
  on1 = !on1;
  digitalWrite(LED1, on1);
}
function toggle2() {
  on2 = !on2;
  digitalWrite(LED2, on2); 
}

Обратите внимание, что каждая функция использует собственную переменную, чтобы отслеживать то, когда светодиод должен быть включен, а когда – выключен:

setInterval(toggle1, 400);
setInterval(toggle2, 456);

Это создает интересный эффект – светодиоды ненадолго мигают одновременно друг с другом, но затем начинают расходиться. К ним можно добавить и третий светодиод – просто создайте третью функцию и снова вызовите функцию setInterval().

Каждый раз, когда вы будете вызывать функцию setInterval(), она будет возвращать разное число. Если вы хотите изменить частоту интервала (или вообще его отключить), вам нужно будет воспользоваться вот этими числами:

changeInterval(1,1000);

Или:

clearInterval(1);

Пример 3

Но этот процесс можно сделать ещё проще. В JavaScript вы можете задавать переменные внутри функций, поэтому мы можем использовать одну и ту же функцию и для хранения переменной on для каждого светодиода, и для запуска таймера.

Но сначала выполняем сброс Espruino, чтобы вернуть всё к исходным настройкам:

reset()

Затем создаём функцию:

function startFlashing(pin, period) {
  var on = false;
  setInterval(function() {
    on = !on;
    digitalWrite(pin, on);
  }, period);
}

Теперь мы можем вызывать эту функцию для любого количества светодиодов:

startFlashing(LED1, 400);
startFlashing(LED2, 456);

Пример 4

Поскольку JavaScript – это объектно-ориентированный язык, а каждый светодиод – это экземпляр класса, мы также можем сделать вот так:

Pin.prototype.startFlashing = function(period) { 
  var on = false;
  var pin = this;
  setInterval(function() {
    on = !on;
    digitalWrite(pin, on);
  }, period);
}
LED1.startFlashing(100);

Помните, что переменные для контактов, как числа и строки, сами по себе не могут содержать каких-либо дополнительных значений. Поэтому если мы хотим, чтобы у нас была возможность вызывать несколько раз на одном и том же светодиоде, нам нужно хранить интервалы где-то ещё (например, в объектах Pin):

Pin.prototype.startFlashing = function(period) {
  if (Pin.intervals==undefined) Pin.intervals = [];
  if (Pin.intervals[this]) clearInterval(Pin.intervals[this]);
  var on = false;
  var pin = this;
  Pin.intervals[this] = setInterval(function() {
    on = !on;
    digitalWrite(pin, on);
  }, period);
}

Теперь вы можете вызывать несколько раз:

LED1.startFlashing(10);
LED1.startFlashing(100);

Пример 5

Кроме того, сам паттерн мигания можно сделать другим. Например, можно написать такой код, который каждые 1/50 секунды будет в случайном порядке решать, мигать ли светодиодом мили нет (но перед этим не забудьте выполнить сброс Espruino при помощи или просто делайте это на другом светодиоде, если на вашей плате их больше двух):

setInterval(function() {
  digitalWrite(LED1, Math.random()>0.5);
}, 20);

Функция Math.random() возвращает случайное число в диапазоне между 0 и 1. То есть проверяя, является ли оно больше или меньше 0.5, мы получаем шанс 50/50 на выключение/выключение светодиода. В этом коде 20 означает 20 миллисекунд. Миллисекунда – это 1/1000 секунды, благодаря чему интервал в 20 мс – это 1/50 секунды.

Пример 6

Обычно JavaScript и функции setTimeout() и setInterval() хорошо подходят для мигания светодиодами, но если ваш JavaScript-код также выполняет какие-то другие действия, тайминг может сбиться.

У Espruino есть встроенная функция для генерирования точных волновых сигналов – при помощи аппаратных таймеров. Но если вам не важна точность, удобным способом для мигания светодиодами будет использование функции digitalPulse() – просто задайте в ней нужный контакт, полярность для начального импульса, а затем интервал (или интервалы) для мигания в миллисекундах:

digitalPulse(LED1,1,[10,500,10,500,10]);

Эта функция будет мигать светодиодом LED1, начиная с включённого состояния: светодиод сначала будет включен на 0.01 с, выключен на 0.5 с, включен на 0.01 с, выключен на 0.5 с и выключен на 0.01 с.

См.также

Ссылки на полезные ресурсы

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