Подключение модуля инфракрасного датчика (IR Sensor) к плате Arduino
Датчик приближения (proximity sensor) или инфракрасный датчик (IR Sensor) – это электронное устройство, которое излучает инфракрасные лучи и на основе последующего приема отраженных от препятствий лучей может сделать определенные выводы об окружающей обстановке, например, может использоваться для обнаружения движения. Подобные датчики находят широкое применение в современной электронике и особенно в проектах робототехники, например, его можно использовать для создания робота, следующего вдоль линии или робота, объезжающего препятствия.
На нашем сайте ранее мы рассматривали использование инфракрасного датчика в следующих проектах:
- тахометр на Arduino;
- аналоговый спидометр на основе Arduino и инфракрасного датчика;
- робот-пылесос на Arduino для автоматической уборки помещений;
- подключение инфракрасного датчика к Raspberry Pi.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль инфракрасного датчика (IR Sensor) (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Распиновка инфракрасного датчика
Модуль инфракрасного датчика содержит 3-пиновый коннектор для связи с “внешним миром”. Его распиновка показана на следующем рисунке.
VCC – контакт, через который подается питания на датчик. В нашем случае его необходимо подключить к контакту 5V платы Arduino.
OUT – выходной контакт датчика, работающий с логическими уровнями 5V TTL. Уровень LOW на этом контакте свидетельствует о том, что движения не выявлено, уровень HIGH свидетельствует о наличии движения.
GND – общий провод (земля). Его необходимо подключить к контакту земли платы Arduino.
Как работает модуль инфракрасного датчика
Принцип работы инфракрасного датчика достаточно прост, он состоит из двух основных компонентов: инфракрасного передатчика и инфракрасного приемника. Инфракрасным передатчиком служит излучающий ИК диод, а инфракрасным приемником – фотодиод.
Модуль инфракрасного датчика начинает работу когда на его излучающий ИК диод подано напряжение, при этом он испускает инфракрасные лучи. Лучи распространяются в пространстве, отражаются от препятствий и снова возвращаются к датчику, где улавливаются фотодиодом. Если препятствие (объект) находится близко, уровень отраженного света будет высок, если же объект находится далеко, то уровень отраженного света будет составлять небольшую величину.
При подаче питания на инфракрасный датчик на свой выходной контакт он выдает уровень Low, который может быть считан платой Arduino или любым другим микроконтроллером.
В большинстве электронных проектов данный датчик используется для обнаружения каких либо препятствий. Он находит широкое применение у радиолюбителей благодаря своей низкой стоимости и низкого энергопотребления, при этом он отличается достаточно большим диапазоном обнаружения препятствий.
Кроме передающего ИК диода и фотодиода модуль инфракрасного датчика содержит компаратор на основе операционного усилителя, который используется для преобразования поступающего аналогового сигнала в цифровой сигнал. Также в составе датчика есть потенциометр, с помощью которого можно отрегулировать его чувствительность.
Схема модуля инфракрасного датчика приведена на следующем рисунке.
Как видите, его схема достаточно проста и содержит набор простых, “массовых” компонентов. При желании вы даже можете собрать эту схему самостоятельно.
Схема проекта
Схема подключения инфракрасного датчика к плате Arduino Uno представлена на следующем рисунке.
Выход датчика необходимо подключить к любому цифровому контакту платы Arduino. В нашем случае это контакт D9. Считывать состояние этого контакта в плате Arduino можно потом двумя способами: обычным путем, в бесконечном цикле проверяя состояние этого контакта (high или low), либо с помощью прерываний (рекомендуется для сложных проектов).
Запитать инфракрасный датчик можно от 5V или 3.3V. Внешний вид собранной конструкции проекта приведен на следующем рисунке.
Объяснение программы для Arduino для подключения инфракрасного датчика
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Код программы достаточно прост – в нем нам будет необходимо непрерывно проверять состояние (HIGH или LOW) контакта D9 платы Arduino, к которому подключен инфракрасный датчик. Код программы начнем с объявления двух глобальных переменных, в одной из которых будет храниться номер контакта, к которому подключен инфракрасный датчик, а во второй – номер контакта, к которому подключен светодиод.
ИК датчик KY-022 Ардуино, подключение ик пульта
Рассмотрим подключение ИК приемника и пульта к Ардуино. Расскажем какую библиотеку использовать для ИК-приемника, продемонстрируем программу для проверки работы IR приемника с пульта дистанционного управления и разберем команды библиотеки IRremote.h. Обратите внимание, что инфракрасный датчик KY-022 подходит не для всех пультов дистанционного управления, так как частота сигнала может отличаться.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- IR пульт и IR приемник KY-022
- светодиод и резистор
- сервопривод
- макетная плата
- коннекторы
- библиотека IRremote.h
- Включение светодиодов от ИК пульта Arduino
- Управление светильником от датчика HC-SR04
- Плавное включение и выключение светодиодов
IR receiver широко используются в бытовой технике благодаря своей доступности и простоте использования. Эти устройства позволяют дистанционно управлять приборами и могут быть найдены во всех типах устройств. ИК сенсор способен принимать и обрабатывать сигнал в виде импульсов заданной длительности и частоты. Несмотря на все эти преимущества, модуль Bluetooth постепенно набирает большую популярность.
ИК датчик Ардуино распиновка, характеристики
Характеристики ИК-пульта управления и ИК-приемника
- Максимальное расстояние: до 8 м
- Частота модуляции: 38 кГц
- Эффективный угол: 60 градусов
- Количество кнопок управления: 17
- Потребляемый ток в режиме покоя: 3-5uA
- Потребляемый ток в режиме передачи: 3-5mA
ИК датчик обычно имеет три ножки и состоит из следующих компонентов: фотодиод, усилитель, полосовой фильтр, амплитудный детектор, интегрирующий фильтр и выходной транзистор. Сигнал поступает на усилитель, а затем на полосовой фильтр, который настроен на фиксированную частоту 30, 33, 36, 38, 40 и 56 кГц и защищает приемник KY-022 от помех. Помехи могут быть вызваны радиоволнами и любым бытовым прибором.
Как подключить пульт и ИК приемник к Ардуино
Для подключения ИК-приемника используйте три вывода, которые подключаются к — GND, 5V и любому цифровому выводу. Для начала рекомендуется использовать напряжение 3,3 В, чтобы не повредить датчик. Подключите IR приемник (модуль KY-022) к Ардуино в соответствии со схемой и подключите светодиод к пину 12. Перед загрузкой программы необходимо установить IRremote.h, которая не входит в состав стандартных библиотек.
Скетч управление светодиодом от ИК пульта Ардуино
#include "IRremote.h" IRrecv irrecv(A1); // ir receiver arduino decode_results results; #define LED 12 void setup() < Serial.begin(9600); irrecv.enableIRIn(); pinMode(LED, OUTPUT); >void loop() < if (irrecv.decode(&results)) < Serial.println(results.value); if (results.value == 16718055) < digitalWrite(LED, HIGH); >if (results.value == 16724175) < digitalWrite(LED, LOW); >irrecv.resume(); > >
Подключение сервомотора и ИК датчика к Arduino
ИК пульт Arduino может использоваться во многих проектах, включая управление сервоприводом от ИК-приемника (пульта дистанционного управления). При настройке необходимо открыть последовательный монитор IDE-порта Arduino и выяснить, какой сигнал подает на микроконтроллер кнопка от пульта ДУ. Полученные уникальные коды следует использовать в программе в условии if после двойного знака равенства.
Скетч для управления серво от IR пульта Arduino
#include "IRremote.h" IRrecv irrecv(A1); // ir receiver arduino decode_results results; #include "Servo.h" Servo myservo; void setup() < Serial.begin(9600); irrecv.enableIRIn(); myservo.attach(9); >void loop() < if (irrecv.decode(&results)) < Serial.println(results.value); if (results.value == 16718055) < myservo.write(10); >if (results.value == 16724175) < myservo.write(90); >irrecv.resume(); > >
Заключение. Чтобы сигнал пульта от дистанционного управления был принят ИК-приемником Arduino, сигнал пульта должен быть на той же частоте, что и фильтр ИК приемника. Поэтому не все пульты ДУ для Ардуино работают. Вы должны выбрать ИК сенсор ky 022 и ИК пульт с одинаковой частотой сигнала, чтобы можно было управлять освещением в комнате или машинкой с моторами постоянного тока дистанционно.
ИК-пульт и ИК-приемник на Arduino
Инфракрасная (ИК) связь — это широко используемая и простая в реализации беспроводная технология, имеющая множество полезных применений. Наиболее яркими примерами в повседневной жизни являются пульты дистанционного управления телевизором, датчики движения и инфракрасные термометры.
Существует множество интересных проектов Arduino, которые также используют ИК-связь. С помощью простого ИК-передатчика и приемника вы можете создавать роботов с дистанционным управлением, датчики расстояния, мониторы сердечного ритма, пульты дистанционного управления телевизором и многое другое.
В этой статье сначала рассмотрим, что такое инфракрасное излучение и как оно работает. А затем рассмотрим, как подключить ИК-приемник к Ардуино.
Что значит инфракрасный?
Инфракрасное излучение — это форма света, похожая на тот, который мы видим вокруг себя. Единственное различие между ИК-излучением и видимым светом заключается в частоте и длине волны. Инфракрасное излучение находится за пределами диапазона видимого света, поэтому люди не могут его видеть:
Поскольку ИК — это тип света, ИК-связь требует прямой видимости от приемника к передатчику. Он не может передавать данные через стены или другие материалы, такие как Wi-Fi или Bluetooth.
Как работают ИК-пульты и ИК-приемники
Типичная система инфракрасной связи требует ИК-передатчика и ИК-приемника. Передатчик выглядит как стандартный светодиод, за исключением того, что он излучает свет в ИК-спектре, а не в видимом спектре. Если вы посмотрите на переднюю часть пульта телевизора, вы увидите светодиод ИК-передатчика:
Светодиоды такого же типа используется в модулях ИК-передатчика для Arduino. Вот один из них, KY-005:
ИК-приемник представляет собой фотодиод и предварительный усилитель, преобразующий ИК-излучение в электрический сигнал. Диоды ИК-приемника обычно выглядят следующим образом:
Можно встретить вот такой готовый модуль, KY-022:
Модуляция ИК-сигнала
Инфракрасный свет излучается солнцем, лампочками и всем остальным, что выделяет тепло. Это означает, что вокруг нас много шума от инфракрасного излучения. Чтобы этот шум не мешал ИК-сигналу, используется метод модуляции сигнала.
При модуляции ИК-сигнала происходит следующее:
- энкодер на пульте дистанционного управления преобразует двоичный сигнал в модулированный электрический сигнал;
- этот электрический сигнал отправляется на передающий светодиод;
- передающий светодиод преобразует модулированный электрический сигнал в модулированный ИК-световой сигнал;
- затем ИК-приемник демодулирует ИК-световой сигнал и преобразует его обратно в двоичный формат перед передачей информации в микроконтроллер.
Модулированный ИК-сигнал представляет собой серию импульсов инфракрасных световых импульсов, включаемых и выключаемых на высокой частоте, известной как несущая частота. Несущая частота, используемая большинством передатчиков, составляет 38 кГц, поскольку она встречается редко в природе и ее можно отличить от окружающего шума.
Диод приемника обнаруживает все частоты ИК-излучения, но он оснащен полосовым фильтром и пропускает ИК-излучение только на частоте 38 кГц. Затем он усиливает модулированный сигнал с помощью предусилителя и преобразует его в двоичный сигнал.
Протоколы ИК-передачи
Схема, по которой модулированный ИК-сигнал преобразуется в двоичный, определяется протоколом передачи. Существует множество протоколов ИК-передачи. NEC, RC5, Sony и Panasonic являются одними из наиболее распространенных протоколов.
Протокол NEC также является наиболее распространенным ИК протоколом в проектах Arduino, поэтому рассмотрим его на примере.
Логическая 1 начинается с высокого импульса (HIGH) длительностью 562,5 мкс при ИК-диапазоне 38 кГц, за которым следует низкий импульс (LOW) длительностью 1687,5 мкс.
Логический 0 передается с высоким импульсом (HIGH) длительностью 562,5 мкс, за которым следует низкий импульс (LOW) длительностью 562,5 мкс:
Так протокол NEC кодирует и декодирует двоичные данные в модулированный сигнал. Другие протоколы отличаются только длительностью отдельных импульсов HIGH и LOW.
ИК-коды
Каждый раз, когда вы нажимаете кнопку на пульте дистанционного управления, генерируется уникальный шестнадцатеричный код. Это информация, которая модулируется и передается по ИК-каналу на приемник. Чтобы расшифровать, какая кнопка нажата, принимающему микроконтроллеру необходимо знать, какой код соответствует каждой кнопке на пульте.
Разные пульты отправляют разные коды при нажатии клавиш, поэтому вам нужно будет определить код, сгенерированный для каждой клавиши на вашем пульте. Если вы сможете найти техническую документацию на пульт, то там должны быть указаны коды. Если нет, то есть простой скетч для Arduino, который считывает большинство популярных пультов и выводит шестнадцатеричные коды в монитор порта. Я покажу вам, как это настроить, через минуту, но сначала нам нужно подключить приемник к Arduino
Как подключить ИК-приемник к Arduino
Существует различные типы ИК-приемников. Лучше всего, конечно, найти техническое описание вашего конкретного ИК-приемника, поскольку контакты могут быть расположены иначе, чем у модуля ИК-приемника KY-022 (на базе HX1838) или ИК-диода TSOP312. Однако все ИК-приемники будут иметь три контакта: сигнал S, земля GND и питание Vcc.
Как подключить инфракрасный сенсор к Arduino
1 Описание и принцип действия ИК датчика препятствий
Инфракрасное ( ИК ) или infrared ( IR ) излучение – это невидимое человеческим глазом электромагнитное излучение в диапазоне длин волн от 0,7 до 2000 мкм . Вокруг нас существуют огромное количество объектов, которые излучают в данном диапазоне. Его иногда называют «тепловое излучение», т.к. все тёплые предметы генерируют ИК излучение.
Модули на основе ИК излучения используются, в основном, как детекторы препятствий для различного рода электронных устройств, начиная от роботов и заканчивая «умным домом». Они позволяют обнаруживать препятствия на расстоянии от нескольких сантиметров до десятков сантиметров. Расстояние до препятствия при этом определить с помощью ИК-сенсора невозможно.
Если оснастить, для примера, своего робота несколькими такими ИК модулями, можно определять направление приближения препятствия и менять траекторию движения робота в нужном направлении.
Модуль сенсора обычно имеет излучатель (светодиод) и детектор (фотодиод) в инфракрасном диапазоне. Инфракрасный светодиод излучает в пространство ИК излучение. Приёмник улавливает отражённое от препятствий излучение и при определённой интенсивности отражённого излучения происходит срабатывание. Чтобы защититься от видимого излучения, фотодиод имеет светофильтр (он выглядит почти чёрным), который пропускает только волны в инфракрасном диапазоне. Разные поверхности по-разному отражают ИК излучение, из-за чего дистанция срабатывания для разных препятствий будет отличаться. Выглядеть ИК модуль может, например, вот так:
Когда перед сенсором нет препятствия, на выходе OUT модуля напряжение логической единицы. Когда сенсор детектирует отражённое от препятствия ИК излучение, на выходе модуля напряжение становится равным нулю, и загорается зелёный светодиод модуля.
Помимо инфракрасного свето- и фотодиода важная часть модуля – это компаратор LM393 (скачать техническое описание на LM393 можно в конце статьи). С помощью компаратора сенсор сравнивает интенсивность отражённого излучения с некоторым заданным порогом и устанавливает «1» или «0» на выходе. Потенциометр позволяет задать порог срабатывания ИК датчика (и, соответственно, дистанцию до препятствия).
2 Подключение ИК датчика препятствийк Arduino
Подключение ИК модуля к Arduino предельно простое: VCC и GND модуля подключаем к +5V и GND Arduino, а выход OUT сенсора – к любому цифровому или аналоговому выводу Arduino. Я подключу его к аналоговому входу A7.
3 Скетч Arduino для инфракрасного датчика препятствий
Скетч для работы с инфракрасным сенсором препятствий также предельно простой: мы будем читать показания с выхода модуля и выводить в монитор порта. А также, если ИК модуль обнаружил препятствие, будем сообщать об этом.
const int ir = A7; void setup() Serial.begin(115200); > void loop() int r = analogRead(ir); // r в диапазоне от 0 до 1023 Serial.println(r); if (r < 100) < // т.к. используется аналоговый пин Arduino Serial.println("Detected!"); >delay(100); >
Напомню, в Arduino используется 10-разрядный АЦП , поэтому значение аналогового сигнала кодируется числом в диапазоне от 0 до 1023. При использовании аналогового входа Arduino предельные значения «0» или «1023» мы вряд ли получим с датчика, поэтому лучше использовать некоторый порог, например, равный 100 (поэтому в скетче r < 100). При использовании же цифрового вывода Arduino для чтения показаний инфракрасного датчика, можно можно написать (r == LOW) или (r == 0) или (r < 1).
Думаю, довольно понятно, как найти применение такому модулю в ваших проектах. Необходимо периодически опрашивать состояние на выходе модуля, и как только напряжение меняется с HIGH на LOW, предпринимать необходимые действия: менять направление движения робота, включать свет в помещении и т.п.
4 Подключение к Arduino модуля с инфракрасным приёмником
ИК датчик может состоять из одного только инфракрасного приёмника, как в этом случае:
Такой сенсор используется для детектирования и считывания различных инфракрасных сигналов. Например, таким датчиком можно принять управляющие сигналы ИК пульта от телевизора или другой бытовой техники. На модуле присутствует светодиод, который загорается, когда на приёмник попадает инфракрасное излучение. На выхода модуля – цифровой сигнал, который показывает, падает ли на сенсор ИК излучение или нет.
К Arduino модуль с ИК приёмником подключается тоже очень просто:
Пин модуля | Пин Arduino | Назначение |
---|---|---|
DAT | Любой цифровой | Признак наличия ИК излучения на входе приёмника |
VCC | +5V | Питание |
GND | GND | Земля |
Напишем скетч, в котором будем просто показывать с помощью встроенного светодиода, что на входе приёмника присутствует ИК излучение. В данном модуле аналогично с ранее рассмотренным на выходе DAT уровень «0», когда ИК излучение попадает на приёмник, и «1» когда ИК излучения нет.
const int ir = 2; void setup() < pinMode(LED_BUILTIN, OUTPUT); // это 13-ый вывод Arduino со встроенным светодиодом pinMode(ir, INPUT); >void loop() < int r = digitalRead(ir); digitalWrite(LED_BUILTIN, r!=HIGH); // зажигаем светодиод, если модуль среагировал на ИК излучение // в противном случае - гасим >
Если загрузить этот скетч в Arduino, направить на ИК приёмник ИК пульт и нажимать на нём разные кнопки, то мы увидим, что светодиод нашего индикатора быстро мигает. Разные кнопки – по-разному мигает.
Очевидно, что каждая команда закодирована своей бинарной последовательностью. Хотелось бы увидеть, какие именно команды приходят от пульта. Но прежде чем ответить на этот вопрос, нужно посмотреть другим способом, что же отправляет пульт. А именно – с помощью осциллографа. Подключим осциллограф DS203 к тому месту, где сигнал непосредственно излучается в пространство: к аноду инфракрасного светодиода.
На осциллограмме видна серия «пачек» импульсов примерно одинаковой длительности. Каждая «пачка» состоит из 24-х импульсов.
В таком виде довольно трудно увидеть, какой сигнал передаётся от пульта ДУ . Прелесть нашего приёмника в том, что он выполняет рутинную работу по оцифровке аналогового инфракрасного сигнала и выдаёт уже «красивый» цифровой сигнал. Давайте посмотрим его на осциллографе.
Вот так выглядит посылка пульта целиком. Здесь жёлтая линия – аналоговый сигнал пульта ДУ, голубая – цифровой сигнал с выхода ИК приёмника. Видно, что продолжительность передачи составляет примерно 120 мс. Очевидно, время будет несколько варьироваться исходя из того, какие биты присутствуют в пакете.
При большем приближении видно, что высокочастотное заполнение, которое имеется в аналоговом сигнале, в цифровом сигнале с ИК приёмника отсутствует. Приёмник прекрасно справляется со своей задачей и показывает чистый цифровой сигнал. Видна последовательность коротких и длинных прямоугольных импульсов. Длительность коротких импульсов примерно 1,2 мс, длинных – в 2 раза больше.
Мы уже видели подобный сигнал, когда разбирали сигнал комнатной метеостанции. Возможно, здесь применяется тот же способ кодирования информации: короткие импульсы – это логический ноль, длинные – логическая единица. На следующем видео можно посмотреть пакет целиком:
Если зарисовать этот пакет, то получится как-то так:
Дальнейшие исследования показали, что все пакеты данного пульта ДУ состоят из двух пачек импульсов. Причём первая всегда содержит 35 бит, вторая – 32.
Есть несколько вариантов, как поступить для получения цифровых данных пакета:
- опрашивать пакет через равные промежутки времени (т.н. «стробирование»), а затем принимать решение, это логический «0» или «1»;
- ловить фронты импульсов (детектор фронта), затем определять их длительность и также принимать решение, какой это бит.
Напомню, что будем считать короткие импульсы логическим нулём, длинные – логической единицей.
Для реализации первого варианта понятно, с какой частотой необходимо опрашивать ИК датчик, чтобы принимать с него корректные данные: 600 мкс. Это время в два раза меньшее, чем длительность коротких импульсов сигнала (логических нулей). Или, если рассматривать с точки зрения частоты, опрашивать приёмник нужно в 2 раза большей частотой (вспомним Найквиста и Котельникова). Напишем скетч, реализующий вариант со стробированием.
Скетч для чтения пакета от ИК пульта методом стробирования
const int ir = 2; // с выхода ИК приёмника int t = 600; // период стробирования, мкс void setup() < Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); pinMode(ir, INPUT); >void loop() < int r = digitalRead(ir); // читаем значение ИК сенсора digitalWrite(LED_BUILTIN, r!=HIGH); // зажигаем светодиод, если сенсор сработал // Если зафиксировали ИК излучение, обрабатываем команду с пульта: if (r==LOW) < precess_ir(); >> // читает пакет ИК пульта void precess_ir() < delay(13); // пропустим стандартное начало пакета byte bits[100]; // 100 бит должно хватить // читаем пакет for (int i=0; i// выводим пакет в монитор; for (int i=0; i Serial.println(); > // читает 1 бит пакета int readBit() < // дожидаемся уровня HIGH и ставим первый строб int r1; do < r1 = digitalRead(ir); >while (r1 != HIGH); delayMicroseconds(t); // ждём // затем ставим второй строб int r2 = digitalRead(ir); delayMicroseconds(t); // ждём if (r2 == LOW) < return 0; >else < // третий строб delayMicroseconds(t); // ждём return 1; >>
Поэкспериментируем с данным скетчем и ИК приёмником. Загрузим скетч в память Ардуино. Запустим последовательный монитор. Нажмём на пульте несколько раз одну и ту же кнопку и посмотрим, что мы увидим в мониторе.
Это похоже на пакет, который мы видели на осциллограмме, но всё-таки есть ошибки. Между одинаковыми пакетами также встречаются различия, которых быть не должно. Можно улучшить результат, если увеличить частоту стробирования, чтобы точнее определять биты пакета. Для безошибочного приёма необходимо чтобы строб попадал ближе к середине импульса. Но мы не можем гарантировать это, т.к. импульсы могут распространяться с варьирующимися задержками; Arduio выполняет код также не моментально, каждый цикл требует малого, но всё же времени, поэтому с каждым битом мы немного будем уходить от исходной позиции посередине импульса и рано или поздно «промахнёмся» (определим бит с ошибкой).
Перепишем скетч, используя метеод детекции фронтов.
Скетч для чтения пакета от ИК пульта методом детекции фронтов
const int ir = 2; int t_low = 600+10; // длительность "0" (с запасом), мкс int t_max = t_low * 4; // таймаут, мкс void setup() < Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); pinMode(ir, INPUT); >void loop() < int r = digitalRead(ir); digitalWrite(LED_BUILTIN, r!=HIGH); // если зафиксировали ИК излучение, обрабатываем команду пульта if (r==LOW) < precess_ir(); >> // читает пакет ИК пульта void precess_ir() < delay(13); // пропустим стандартное начало пакета byte bits[100]; for (int i=0; ifor (int i=0; i Serial.println(); > // читает 1 бит пакета int readBit() < int r1; do < r1 = digitalRead(ir); >while (r1 != HIGH); // ждём передний фронт импульса int t1 = micros(); // запоминаем время начала импульса int t2; int t; do < r1 = digitalRead(ir); t2 = micros(); // запоминаем время опроса (оно же длительность импульса) t = t2 - t1; // длительность импульса >while ((r1 != LOW) && (t < t_max)); // ждём задний фронт импульса, но не больше таймаута //Serial.println(t); // можно вывести длительность импульса if (t < t_low) < return 0; >else < return 1; >>
Здесь мы ввели таймаут, чтобы выходить из цикла в любом случае, даже если фронт импульса не пришёл. Это гарантирует, что мы не окажемся в бесконечном цикле ожидания.
Загрузим скетч, запустим монитор, нажмём несколько раз ту же кнопку пульта.
Результат, как видно, более стабильный.