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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показаны 2 промежуточные версии 2 участников)
Строка 5: Строка 5:
=Мигание светодиодами<ref>[https://www.espruino.com/Flashing+Lights www.espruino.com - Flashing Lights]</ref>=
=Мигание светодиодами<ref>[https://www.espruino.com/Flashing+Lights www.espruino.com - Flashing Lights]</ref>=


Это руководство подразумевает, что вы уже умеете загружать код на Espruino. Если пока не умеете, ознакомьтесь с инструкциями [https://www.espruino.com/Quick+Start здесь].
Это руководство подразумевает, что вы уже умеете загружать код на [http://Espruino Espruino]. Если пока не умеете, ознакомьтесь с инструкциями [https://www.espruino.com/Quick+Start здесь].


== Введение ==
== Введение ==


Если вы проходили [https://www.espruino.com/Quick+Start это руководство], то уже знаете, как мигать светодиодами. В этом руководстве мы расскажем вам о том, как это делать другими способами.
Если вы проходили [https://www.espruino.com/Quick+Start это руководство], то уже знаете, как мигать [[светодиод]]ами. В этом руководстве мы расскажем вам о том, как это делать другими способами.


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


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


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


В примере из [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>


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


Чтобы остановить мигание, просто вызовите clearInterval().
Чтобы остановить мигание, просто вызовите clearInterval().
Строка 33: Строка 33:
=== Пример 2 ===
=== Пример 2 ===


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


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


<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>
Строка 72: Строка 72:
=== Пример 3 ===
=== Пример 3 ===


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


Но сначала выполняем сброс 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;
Строка 92: Строка 92:
</syntaxhighlight>
</syntaxhighlight>


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


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
startFlashing(LED1, 400);
startFlashing(LED1, 400);
startFlashing(LED2, 456);
startFlashing(LED2, 456);
Строка 101: Строка 101:
=== Пример 4 ===
=== Пример 4 ===


Поскольку 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;
Строка 115: Строка 115:
</syntaxhighlight>
</syntaxhighlight>


Помните, что переменные для контактов, как числа и строки, сами по себе не могут содержать каких-либо дополнительных значений. Поэтому если мы хотим, чтобы у нас была возможность вызывать несколько раз на одном и том же светодиоде, нам нужно хранить интервалы где-то ещё (например, в объектах 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);
Строка 139: Строка 139:
=== Пример 5 ===
=== Пример 5 ===


Кроме того, сам паттерн мигания можно сделать другим. Например, можно написать такой код, который каждые 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);
Строка 147: Строка 147:
</syntaxhighlight>
</syntaxhighlight>


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


=== Пример 6 ===
=== Пример 6 ===


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


У 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>


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


=См.также=
=См.также=


{{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 с.

См.также

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