Espruino:Примеры/Чем отличается код Arduino и Espruino: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{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() == | |||
Это сделано намеренно, так как из-за [[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/ форуме]... | |||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 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() задаются с точностью до микросекунды.
Нашли какие-то другие отличия?
Расскажите о них на форуме...
См.также
Внешние ссылки