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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...»)
 
Нет описания правки
 
(не показаны 3 промежуточные версии 2 участников)
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


=<ref>[ www.espruino.com - ]</ref>=
=Чем отличается код Arduino и Espruino<ref>[https://www.espruino.com/Arduino+Differences www.espruino.com - Differences between Arduino and Espruino code]</ref>=


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


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


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


То есть в результате вот это:
<syntaxhighlight lang="javascript">
// Первый фрагмент кода
delay(500);
// Второй фрагмент кода
Становится вот этим:
// Первый фрагмент кода
setTimeout(function() {
// Второй фрагмент кода
}, 500);
</syntaxhighlight>
== Время ==
В языке [[Espruino]] нет функции [[millis()]], но есть [[getTime()]], которая возвращает текущее время в секундах в виде числа с плавающей точкой.
В отличие от большинства [[Arduino]], в платах [[Espruino]], как правило, есть часы реального времени, которые позволяют очень точно отслеживать время и дату. Таким образом, внешний [[RTC-чип]] вам не понадобится. Кроме того, вместо [[getTime()]] можно  воспользоваться классом [http://wikihandbk.com/wiki/Espruino:Справочник_по_API/Класс_Date Date].
== Нет функции loop() ==
В коде для Arduino часто используется вот такой паттерн:
<syntaxhighlight lang="javascript">
void call_me_from_loop() {
  if (millis() > last_time_called+1000) {
    last_time_called = millis();
    // делаем что-нибудь
  }
}
</syntaxhighlight>
Для [[Espruino]] такой подход очень неэффективен, потому что из-за него [[Espruino]] пробуждается из режима сна, даже зная, что ей ничего делать не нужно. Кроме того, он без нужды сложный.
Вместо этого пользуйтесь вот таким кодом:
<syntaxhighlight lang="javascript">
setInterval(function() {
  // делаем что-нибудь
}, 1000);
</syntaxhighlight>
</syntaxhighlight>
== Работа с аналоговыми контактами ==
* В языке [[Espruino]] функция [[analogWrite()]] принимает число с плавающей точкой в диапазоне между 0 и 1, а в [[Arduino]] – целое число в диапазоне между 0 и 255.
* В языке [[Espruino]] функция [[analogRead()]] возвращает число с плавающей точкой в диапазоне между 0 и 1, а в [[Arduino]] – целое число в диапазоне между 0 и 1023.
* [[Espruino]] работает на 3.3 (а не на 5) вольтах, поэтому чтобы рассчитать напряжение при помощи результата от [[analogRead()]], вам нужно умножить его на 3.3, а не на 5. Но мы бы порекомендовали умножить его на [[E.getAnalogVRef()]] – эта функция измеряет напряжение чипа на основе внутреннего опорного напряжения.
* Если вам нужно прочесть или записать аудиосигнал, загляните в [https://www.espruino.com/Waveform эту статью] – если напрямую воспользоваться [[setInterval()]], то это вряд ли сработает.
== Работа с другими контактами ==
* В функциях [[digitalRead()]] и [[digitalWrite()]] можно задать массив контактов, и в этом случае значение будет восприниматься как бинарное число.
* Для [[SPI]] нет нужды использовать bit-banging. Вы можете создать экземпляр для программной [[SPI]] на любом контакте при помощи '''new SPI()'''.
== Функции библиотек ==
* Строки можно объединять, а числа автоматически конвертируются в строки. Поэтому вам не придётся вызывать [[print()]] для каждого значения.
* Если вам нужно вернуть значение с 2 цифрами после запятой, просто воспользуйтесь '''console.log(value.toFixed(2))''', потому что '''console.log(x,2)''' просто вернёт значение '''x''', а затем ''2''.
== Язык ==
* Обычные массивы занимают слишком много места и потому не особо эффективны. Лучше использовать [[Uint8Array]] или прочее в таком духе.
* Скорость выполнения кода не особо впечатляющая, так что советуем ознакомиться с [https://www.espruino.com/Performance этой статьёй]. Вместо написания своего кода лучше, где это возможно, использовать функции библиотек.
* Нельзя писать код, запускаемый внутри прерываний, и ваш код никогда не получит приоритет. Но вы, впрочем, по-прежнему можете отслеживать импульсы с большой точностью, потому что временные метки событий [[setWatch()]] задаются с точностью до микросекунды.
== Нашли какие-то другие отличия? ==
Расскажите о них на [http://forum.espruino.com/ форуме]...


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


{{ads}}
 


=Внешние ссылки=
=Внешние ссылки=
Строка 19: Строка 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() задаются с точностью до микросекунды.

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

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

См.также

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