pulseInLong()

Описание

pulseInLong() – это альтернатива pulseIn(), которая лучше справляется с длинными импульсами и сценариями, затронутыми прерываниями.

Считывает импульс (HIGH или LOW) на пине. Например, если value равен HIGH, pulseInLong() ожидает перехода пина из LOW в HIGH, начинает отсчёт времени, затем ожидает перехода пина в LOW и останавливает отсчёт. Возвращает длительность импульса в микросекундах или сдаётся и возвращает 0, если полный импульс не был получен в течение таймаута.

Тайминг этой функции определён эмпирически и, вероятно, будет содержать ошибки на более коротких импульсах. Работает с импульсами длительностью от 10 микросекунд до 3 минут. Эту функцию можно использовать только при активированных прерываниях. Кроме того, наивысшее разрешение достигается при больших интервалах.

Синтаксис

Используйте следующие функции для измерения длительности импульса на конкретном пине:

  • pulseInLong(pin, value)

  • pulseInLong(pin, value, timeout)

Параметры

Функция принимает следующие параметры:

  • pin: номер пина Arduino, на котором нужно измерить импульс. Допустимые типы данных: int.

  • value: тип считываемого импульса: HIGH или LOW. Допустимые типы данных: int.

  • timeout (необязательный): время ожидания начала импульса в микросекундах; по умолчанию одна секунда. Допустимые типы данных: unsigned long.

Возвращаемое значение

Возвращает длительность импульса (в микросекундах) или 0, если импульс не начался до истечения таймаута. Тип данных: unsigned long.

Пример кода

Пример выводит длительность импульса на пине D1.

int pin = D1;
unsigned long duration;

void setup() {
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop() {
  duration = pulseInLong(pin, HIGH);
  Serial.println(duration);
}

Примечания и предупреждения

Предупреждение

Эта функция зависит от micros(), поэтому не может использоваться в контексте noInterrupts().

См. также