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() задаются с точностью до микросекунды.
Нашли какие-то другие отличия?
Расскажите о них на форуме...
См.также
Внешние ссылки