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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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


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

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

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

См.также

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