Espruino:Примеры/Мигание светодиодами: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показана 1 промежуточная версия этого же участника)
Строка 23: Строка 23:
В примере из [https://www.espruino.com/Quick+Start этой статьи] показывается, как мигать [[светодиод]]ом ''«правильно»'' – но мы можем сделать это и с помощью одной строки. Просто скопируйте и вставьте:
В примере из [https://www.espruino.com/Quick+Start этой статьи] показывается, как мигать [[светодиод]]ом ''«правильно»'' – но мы можем сделать это и с помощью одной строки. Просто скопируйте и вставьте:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var l;setInterval("digitalWrite(LED1,l=!l);",200);
var l;setInterval("digitalWrite(LED1,l=!l);",200);
</syntaxhighlight>
</syntaxhighlight>
Строка 37: Строка 37:
На этот раз мы напишем более удобочитаемый код. Во-первых, пишем две функции:
На этот раз мы напишем более удобочитаемый код. Во-первых, пишем две функции:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var on1,on2;
var on1,on2;
function toggle1() {
function toggle1() {
Строка 51: Строка 51:
Обратите внимание, что каждая функция использует собственную переменную, чтобы отслеживать то, когда светодиод должен быть включен, а когда – выключен:
Обратите внимание, что каждая функция использует собственную переменную, чтобы отслеживать то, когда светодиод должен быть включен, а когда – выключен:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
setInterval(toggle1, 400);
setInterval(toggle1, 400);
setInterval(toggle2, 456);
setInterval(toggle2, 456);
Строка 60: Строка 60:
Каждый раз, когда вы будете вызывать функцию setInterval(), она будет возвращать разное число. Если вы хотите изменить частоту интервала (или вообще его отключить), вам нужно будет воспользоваться вот этими числами:
Каждый раз, когда вы будете вызывать функцию setInterval(), она будет возвращать разное число. Если вы хотите изменить частоту интервала (или вообще его отключить), вам нужно будет воспользоваться вот этими числами:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
changeInterval(1,1000);
changeInterval(1,1000);
</syntaxhighlight>
</syntaxhighlight>
Строка 66: Строка 66:
Или:
Или:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
clearInterval(1);
clearInterval(1);
</syntaxhighlight>
</syntaxhighlight>
Строка 76: Строка 76:
Но сначала выполняем сброс [[Espruino]], чтобы вернуть всё к исходным настройкам:
Но сначала выполняем сброс [[Espruino]], чтобы вернуть всё к исходным настройкам:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
reset()
reset()
</syntaxhighlight>
</syntaxhighlight>
Строка 82: Строка 82:
Затем создаём функцию:
Затем создаём функцию:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
function startFlashing(pin, period) {
function startFlashing(pin, period) {
   var on = false;
   var on = false;
Строка 94: Строка 94:
Теперь мы можем вызывать эту функцию для любого количества [[светодиод]]ов:
Теперь мы можем вызывать эту функцию для любого количества [[светодиод]]ов:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
startFlashing(LED1, 400);
startFlashing(LED1, 400);
startFlashing(LED2, 456);
startFlashing(LED2, 456);
Строка 103: Строка 103:
Поскольку [[JavaScript]] – это объектно-ориентированный язык, а каждый [[светодиод]] – это экземпляр класса, мы также можем сделать вот так:
Поскольку [[JavaScript]] – это объектно-ориентированный язык, а каждый [[светодиод]] – это экземпляр класса, мы также можем сделать вот так:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
Pin.prototype.startFlashing = function(period) {  
Pin.prototype.startFlashing = function(period) {  
   var on = false;
   var on = false;
Строка 117: Строка 117:
Помните, что переменные для контактов, как числа и строки, сами по себе не могут содержать каких-либо дополнительных значений. Поэтому если мы хотим, чтобы у нас была возможность вызывать несколько раз на одном и том же [[светодиод]]е, нам нужно хранить интервалы где-то ещё (например, в объектах Pin):
Помните, что переменные для контактов, как числа и строки, сами по себе не могут содержать каких-либо дополнительных значений. Поэтому если мы хотим, чтобы у нас была возможность вызывать несколько раз на одном и том же [[светодиод]]е, нам нужно хранить интервалы где-то ещё (например, в объектах Pin):


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
Pin.prototype.startFlashing = function(period) {
Pin.prototype.startFlashing = function(period) {
   if (Pin.intervals==undefined) Pin.intervals = [];
   if (Pin.intervals==undefined) Pin.intervals = [];
Строка 132: Строка 132:
Теперь вы можете вызывать несколько раз:
Теперь вы можете вызывать несколько раз:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
LED1.startFlashing(10);
LED1.startFlashing(10);
LED1.startFlashing(100);
LED1.startFlashing(100);
Строка 141: Строка 141:
Кроме того, сам паттерн мигания можно сделать другим. Например, можно написать такой код, который каждые ''1/50 секунды'' будет в случайном порядке решать, мигать ли [[светодиод]]ом мили нет (но перед этим не забудьте выполнить сброс [[Espruino]] при помощи или просто делайте это на другом светодиоде, если на вашей плате их больше двух):
Кроме того, сам паттерн мигания можно сделать другим. Например, можно написать такой код, который каждые ''1/50 секунды'' будет в случайном порядке решать, мигать ли [[светодиод]]ом мили нет (но перед этим не забудьте выполнить сброс [[Espruino]] при помощи или просто делайте это на другом светодиоде, если на вашей плате их больше двух):


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
setInterval(function() {
setInterval(function() {
   digitalWrite(LED1, Math.random()>0.5);
   digitalWrite(LED1, Math.random()>0.5);
Строка 155: Строка 155:
У [[Espruino]] есть встроенная функция для генерирования точных волновых сигналов – при помощи аппаратных таймеров. Но если вам не важна точность, удобным способом для мигания [[светодиод]]ами будет использование функции digitalPulse() – просто задайте в ней нужный контакт, полярность для начального импульса, а затем интервал (или интервалы) для мигания в миллисекундах:
У [[Espruino]] есть встроенная функция для генерирования точных волновых сигналов – при помощи аппаратных таймеров. Но если вам не важна точность, удобным способом для мигания [[светодиод]]ами будет использование функции digitalPulse() – просто задайте в ней нужный контакт, полярность для начального импульса, а затем интервал (или интервалы) для мигания в миллисекундах:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
digitalPulse(LED1,1,[10,500,10,500,10]);
digitalPulse(LED1,1,[10,500,10,500,10]);
</syntaxhighlight>
</syntaxhighlight>
Строка 163: Строка 163:
=См.также=
=См.также=


{{ads}}
 


=Внешние ссылки=
=Внешние ссылки=
Строка 169: Строка 169:
<references />
<references />


{{Навигационная таблица/Espruino}}
{{Навигационная таблица/Портал/Espruino}}
{{Навигационная таблица/Телепорт}}

Текущая версия от 15:07, 20 мая 2023

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


Мигание светодиодами[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 с.

См.также

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