Espruino:Примеры/Чем отличается код Arduino и Espruino: различия между версиями

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


Здесь описаны несколько подводных камней, которые могут возникнуть при переезде с Arduino-программирования на Espruino-программирование. Эта статья, в частности, будет полезна при портировании кода с одного языка на другой.
Здесь описаны несколько подводных камней, которые могут возникнуть при переезде с [[Arduino]]-программирования на [[Espruino]]-программирование. Эта статья, в частности, будет полезна при портировании кода с одного языка на другой.


== Нет функции delay() ==
== Нет функции delay() ==


Это сделано намеренно, так как из-за delay() Espruino перестанет делать другие действия. Поэтому для больших задержек (более 5 мс) используйте функцию setTimeout() – с её помощью задаётся выполнение какого-либо кода через заданный промежуток времени.  
Это сделано намеренно, так как из-за [[delay()]] [[Espruino]] перестанет делать другие действия. Поэтому для больших задержек (более 5 мс) используйте функцию [[setTimeout()]] – с её помощью задаётся выполнение какого-либо кода через заданный промежуток времени.  


То есть в результате вот это:
То есть в результате вот это:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
// Первый фрагмент кода
// Первый фрагмент кода
delay(500);
delay(500);
Строка 26: Строка 26:
== Время ==  
== Время ==  


В языке Espruino нет функции millis(), но есть getTime(), которая возвращает текущее время в секундах в виде числа с плавающей точкой.  
В языке [[Espruino]] нет функции [[millis()]], но есть [[getTime()]], которая возвращает текущее время в секундах в виде числа с плавающей точкой.  


В отличие от большинства Arduino, в платах Espruino, как правило, есть часы реального времени, которые позволяют очень точно отслеживать время и дату. Таким образом, внешний RTC-чип вам не понадобится. Кроме того, вместо getTime() можно  воспользоваться классом [http://wikihandbk.com/wiki/Espruino:Справочник_по_API/Класс_Date Date].
В отличие от большинства [[Arduino]], в платах [[Espruino]], как правило, есть часы реального времени, которые позволяют очень точно отслеживать время и дату. Таким образом, внешний [[RTC-чип]] вам не понадобится. Кроме того, вместо [[getTime()]] можно  воспользоваться классом [http://wikihandbk.com/wiki/Espruino:Справочник_по_API/Класс_Date Date].


== Нет функции loop() ==
== Нет функции loop() ==
Строка 34: Строка 34:
В коде для Arduino часто используется вот такой паттерн:
В коде для Arduino часто используется вот такой паттерн:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
void call_me_from_loop() {
void call_me_from_loop() {
   if (millis() > last_time_called+1000) {
   if (millis() > last_time_called+1000) {
Строка 44: Строка 44:
</syntaxhighlight>
</syntaxhighlight>


Для Espruino такой подход очень неэффективен, потому что из-за него Espruino пробуждается из режима сна, даже зная, что ей ничего делать не нужно. Кроме того, он без нужды сложный.  
Для [[Espruino]] такой подход очень неэффективен, потому что из-за него [[Espruino]] пробуждается из режима сна, даже зная, что ей ничего делать не нужно. Кроме того, он без нужды сложный.  


Вместо этого пользуйтесь вот таким кодом:
Вместо этого пользуйтесь вот таким кодом:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
setInterval(function() {
setInterval(function() {
   // делаем что-нибудь
   // делаем что-нибудь
Строка 56: Строка 56:
== Работа с аналоговыми контактами ==
== Работа с аналоговыми контактами ==


* В языке Espruino функция analogWrite() принимает число с плавающей точкой в диапазоне между 0 и 1, а в Arduino – целое число в диапазоне между 0 и 255.
* В языке [[Espruino]] функция [[analogWrite()]] принимает число с плавающей точкой в диапазоне между 0 и 1, а в [[Arduino]] – целое число в диапазоне между 0 и 255.
* В языке Espruino функция analogRead() возвращает число с плавающей точкой в диапазоне между 0 и 1, а в Arduino – целое число в диапазоне между 0 и 1023.
* В языке [[Espruino]] функция [[analogRead()]] возвращает число с плавающей точкой в диапазоне между 0 и 1, а в [[Arduino]] – целое число в диапазоне между 0 и 1023.
* Espruino работает на 3.3 (а не на 5) вольтах, поэтому чтобы рассчитать напряжение при помощи результата от analogRead(), вам нужно умножить его на 3.3, а не на 5. Но мы бы порекомендовали умножить его на E.getAnalogVRef() – эта функция измеряет напряжение чипа на основе внутреннего опорного напряжения.
* [[Espruino]] работает на 3.3 (а не на 5) вольтах, поэтому чтобы рассчитать напряжение при помощи результата от [[analogRead()]], вам нужно умножить его на 3.3, а не на 5. Но мы бы порекомендовали умножить его на [[E.getAnalogVRef()]] – эта функция измеряет напряжение чипа на основе внутреннего опорного напряжения.
* Если вам нужно прочесть или записать аудиосигнал, загляните в [https://www.espruino.com/Waveform эту статью] – если напрямую воспользоваться setInterval(), то это вряд ли сработает.
* Если вам нужно прочесть или записать аудиосигнал, загляните в [https://www.espruino.com/Waveform эту статью] – если напрямую воспользоваться [[setInterval()]], то это вряд ли сработает.


== Работа с другими контактами ==
== Работа с другими контактами ==


* В функциях digitalRead() и digitalWrite() можно задать массив контактов, и в этом случае значение будет восприниматься как бинарное число.
* В функциях [[digitalRead()]] и [[digitalWrite()]] можно задать массив контактов, и в этом случае значение будет восприниматься как бинарное число.
* Для SPI нет нужды использовать bit-banging. Вы можете создать экземпляр для программной SPI на любом контакте при помощи new SPI().
* Для [[SPI]] нет нужды использовать bit-banging. Вы можете создать экземпляр для программной [[SPI]] на любом контакте при помощи '''new SPI()'''.


== Функции библиотек ==
== Функции библиотек ==


* Строки можно объединять, а числа автоматически конвертируются в строки. Поэтому вам не придётся вызывать print() для каждого значения.
* Строки можно объединять, а числа автоматически конвертируются в строки. Поэтому вам не придётся вызывать [[print()]] для каждого значения.
* Если вам нужно вернуть значение с 2 цифрами после запятой, просто воспользуйтесь console.log(value.toFixed(2)), потому что console.log(x,2) просто вернёт значение x, а затем 2.
* Если вам нужно вернуть значение с 2 цифрами после запятой, просто воспользуйтесь '''console.log(value.toFixed(2))''', потому что '''console.log(x,2)''' просто вернёт значение '''x''', а затем ''2''.


== Язык ==
== Язык ==


* Обычные массивы занимают слишком много места и потому не особо эффективны. Лучше использовать Uint8Array или прочее в таком духе.
* Обычные массивы занимают слишком много места и потому не особо эффективны. Лучше использовать [[Uint8Array]] или прочее в таком духе.
* Скорость выполнения кода не особо впечатляющая, так что советуем ознакомиться с [https://www.espruino.com/Performance этой статьёй]. Вместо написания своего кода лучше, где это возможно, использовать функции библиотек.
* Скорость выполнения кода не особо впечатляющая, так что советуем ознакомиться с [https://www.espruino.com/Performance этой статьёй]. Вместо написания своего кода лучше, где это возможно, использовать функции библиотек.
* Нельзя писать код, запускаемый внутри прерываний, и ваш код никогда не получит приоритет. Но вы, впрочем, по-прежнему можете отслеживать импульсы с большой точностью, потому что временные метки событий setWatch() задаются с точностью до микросекунды.
* Нельзя писать код, запускаемый внутри прерываний, и ваш код никогда не получит приоритет. Но вы, впрочем, по-прежнему можете отслеживать импульсы с большой точностью, потому что временные метки событий [[setWatch()]] задаются с точностью до микросекунды.


== Нашли какие-то другие отличия? ==
== Нашли какие-то другие отличия? ==
Строка 83: Строка 83:
=См.также=
=См.также=


{{ads}}
 


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


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

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

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


Чем отличается код Arduino и Espruino[1]

Здесь описаны несколько подводных камней, которые могут возникнуть при переезде с Arduino-программирования на Espruino-программирование. Эта статья, в частности, будет полезна при портировании кода с одного языка на другой.

Нет функции delay()

Это сделано намеренно, так как из-за delay() Espruino перестанет делать другие действия. Поэтому для больших задержек (более 5 мс) используйте функцию setTimeout() – с её помощью задаётся выполнение какого-либо кода через заданный промежуток времени.

То есть в результате вот это:

// Первый фрагмент кода
delay(500);
// Второй фрагмент кода
Становится вот этим:
// Первый фрагмент кода
setTimeout(function() {
// Второй фрагмент кода
}, 500);

Время

В языке Espruino нет функции millis(), но есть getTime(), которая возвращает текущее время в секундах в виде числа с плавающей точкой.

В отличие от большинства Arduino, в платах Espruino, как правило, есть часы реального времени, которые позволяют очень точно отслеживать время и дату. Таким образом, внешний RTC-чип вам не понадобится. Кроме того, вместо getTime() можно воспользоваться классом Date.

Нет функции loop()

В коде для Arduino часто используется вот такой паттерн:

void call_me_from_loop() {
  if (millis() > last_time_called+1000) {
    last_time_called = millis();

    // делаем что-нибудь
  }
}

Для Espruino такой подход очень неэффективен, потому что из-за него Espruino пробуждается из режима сна, даже зная, что ей ничего делать не нужно. Кроме того, он без нужды сложный.

Вместо этого пользуйтесь вот таким кодом:

setInterval(function() {
  // делаем что-нибудь
}, 1000);

Работа с аналоговыми контактами

  • В языке Espruino функция analogWrite() принимает число с плавающей точкой в диапазоне между 0 и 1, а в Arduino – целое число в диапазоне между 0 и 255.
  • В языке Espruino функция analogRead() возвращает число с плавающей точкой в диапазоне между 0 и 1, а в Arduino – целое число в диапазоне между 0 и 1023.
  • Espruino работает на 3.3 (а не на 5) вольтах, поэтому чтобы рассчитать напряжение при помощи результата от analogRead(), вам нужно умножить его на 3.3, а не на 5. Но мы бы порекомендовали умножить его на E.getAnalogVRef() – эта функция измеряет напряжение чипа на основе внутреннего опорного напряжения.
  • Если вам нужно прочесть или записать аудиосигнал, загляните в эту статью – если напрямую воспользоваться setInterval(), то это вряд ли сработает.

Работа с другими контактами

  • В функциях digitalRead() и digitalWrite() можно задать массив контактов, и в этом случае значение будет восприниматься как бинарное число.
  • Для SPI нет нужды использовать bit-banging. Вы можете создать экземпляр для программной SPI на любом контакте при помощи new SPI().

Функции библиотек

  • Строки можно объединять, а числа автоматически конвертируются в строки. Поэтому вам не придётся вызывать print() для каждого значения.
  • Если вам нужно вернуть значение с 2 цифрами после запятой, просто воспользуйтесь console.log(value.toFixed(2)), потому что console.log(x,2) просто вернёт значение x, а затем 2.

Язык

  • Обычные массивы занимают слишком много места и потому не особо эффективны. Лучше использовать Uint8Array или прочее в таком духе.
  • Скорость выполнения кода не особо впечатляющая, так что советуем ознакомиться с этой статьёй. Вместо написания своего кода лучше, где это возможно, использовать функции библиотек.
  • Нельзя писать код, запускаемый внутри прерываний, и ваш код никогда не получит приоритет. Но вы, впрочем, по-прежнему можете отслеживать импульсы с большой точностью, потому что временные метки событий setWatch() задаются с точностью до микросекунды.

Нашли какие-то другие отличия?

Расскажите о них на форуме...

См.также

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